/// Assert that the given expected values are all generated. /// /// Exhaustively enumerates all buffers up to length 10 containing the /// following bytes: `0x00`, `0x01`, `0x61` (aka ASCII 'a'), and `0xff` fn assert_generates<T>(expected_values: impl IntoIterator<Item = T>) where
T: Clone + Debug + Hash + Eq + for<'a> Arbitrary<'a>,
{ let expected_values: HashSet<_> = expected_values.into_iter().collect(); letmut arbitrary_expected = expected_values.clone(); letmut arbitrary_take_rest_expected = expected_values;
let bytes = [0, 1, b'a', 0xff]; let max_len = 10;
letmut buf = Vec::with_capacity(max_len);
letmut g = exhaustigen::Gen::new(); while !g.done() { let len = g.gen(max_len);
buf.clear();
buf.extend(
std::iter::repeat_with(|| { let index = g.gen(bytes.len() - 1);
bytes[index]
})
.take(len),
);
letmut u = Unstructured::new(&buf); let val = T::arbitrary(&mut u).unwrap();
arbitrary_expected.remove(&val);
let u = Unstructured::new(&buf); let val = T::arbitrary_take_rest(u).unwrap();
arbitrary_take_rest_expected.remove(&val);
if arbitrary_expected.is_empty() && arbitrary_take_rest_expected.is_empty() { return;
}
}
panic!( "failed to generate all expected values!\n\n\
T::arbitrary did not generate: {arbitrary_expected:#?}\n\n\
T::arbitrary_take_rest did not generate {arbitrary_take_rest_expected:#?}"
)
}
/// Generates an arbitrary `T`, and checks that the result is consistent with the /// `size_hint()` reported by `T`. fn checked_arbitrary<'a, T: Arbitrary<'a>>(u: &mut Unstructured<'a>) -> Result<T> { let (min, max) = T::size_hint(0);
let len_before = u.len(); let result = T::arbitrary(u);
#[test] fn arbitrary_for_bytes() { let x = [1, 2, 3, 4, 4]; letmut buf = Unstructured::new(&x); let expected = &[1, 2, 3, 4]; let actual = checked_arbitrary::<&[u8]>(&mut buf).unwrap();
assert_eq!(expected, actual);
}
#[test] fn arbitrary_take_rest_for_bytes() { let x = [1, 2, 3, 4]; let buf = Unstructured::new(&x); let expected = &[1, 2, 3, 4]; let actual = checked_arbitrary_take_rest::<&[u8]>(buf).unwrap();
assert_eq!(expected, actual);
}
// Cannot consume all but can consume part of the input
assert_eq!(
checked_arbitrary_take_rest::<String>(Unstructured::new(&[1, 0xFF, 2])).unwrap(), "\x01"
);
}
#[test] fn size_hint_for_tuples() {
assert_eq!(
(7, Some(7)),
<(bool, u16, i32) as Arbitrary<'_>>::size_hint(0)
);
assert_eq!((1, None), <(u8, Vec<u8>) as Arbitrary>::size_hint(0));
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-08-27)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.