@@ -440,6 +440,7 @@ macro_rules! impl_range {
440440
441441 #[ inline]
442442 fn size_hint( depth: usize ) -> ( usize , Option <usize >) {
443+ #[ allow( clippy:: redundant_closure_call) ]
443444 $size_hint_closure( depth)
444445 }
445446 }
@@ -1161,6 +1162,56 @@ impl<'a> Arbitrary<'a> for IpAddr {
11611162mod test {
11621163 use super :: * ;
11631164
1165+ /// Assert that the given expected values are all generated.
1166+ ///
1167+ /// Exhaustively enumerates all buffers up to length 10 containing the
1168+ /// following bytes: `0x00`, `0x01`, `0x61` (aka ASCII 'a'), and `0xff`
1169+ fn assert_generates < T > ( expected_values : impl IntoIterator < Item = T > )
1170+ where
1171+ T : Clone + std:: fmt:: Debug + std:: hash:: Hash + Eq + for < ' a > Arbitrary < ' a > ,
1172+ {
1173+ let expected_values: HashSet < _ > = expected_values. into_iter ( ) . collect ( ) ;
1174+ let mut arbitrary_expected = expected_values. clone ( ) ;
1175+ let mut arbitrary_take_rest_expected = expected_values;
1176+
1177+ let bytes = [ 0 , 1 , b'a' , 0xff ] ;
1178+ let max_len = 10 ;
1179+
1180+ let mut buf = Vec :: with_capacity ( max_len) ;
1181+
1182+ let mut g = exhaustigen:: Gen :: new ( ) ;
1183+ while !g. done ( ) {
1184+ let len = g. gen ( max_len) ;
1185+
1186+ buf. clear ( ) ;
1187+ buf. extend (
1188+ std:: iter:: repeat_with ( || {
1189+ let index = g. gen ( bytes. len ( ) - 1 ) ;
1190+ bytes[ index]
1191+ } )
1192+ . take ( len) ,
1193+ ) ;
1194+
1195+ let mut u = Unstructured :: new ( & buf) ;
1196+ let val = T :: arbitrary ( & mut u) . unwrap ( ) ;
1197+ arbitrary_expected. remove ( & val) ;
1198+
1199+ let u = Unstructured :: new ( & buf) ;
1200+ let val = T :: arbitrary_take_rest ( u) . unwrap ( ) ;
1201+ arbitrary_take_rest_expected. remove ( & val) ;
1202+
1203+ if arbitrary_expected. is_empty ( ) && arbitrary_take_rest_expected. is_empty ( ) {
1204+ return ;
1205+ }
1206+ }
1207+
1208+ panic ! (
1209+ "failed to generate all expected values!\n \n \
1210+ T::arbitrary did not generate: {arbitrary_expected:#?}\n \n \
1211+ T::arbitrary_take_rest did not generate {arbitrary_take_rest_expected:#?}"
1212+ )
1213+ }
1214+
11641215 /// Generates an arbitrary `T`, and checks that the result is consistent with the
11651216 /// `size_hint()` reported by `T`.
11661217 fn checked_arbitrary < ' a , T : Arbitrary < ' a > > ( u : & mut Unstructured < ' a > ) -> Result < T > {
@@ -1231,6 +1282,16 @@ mod test {
12311282 let expected = 1 | ( 2 << 8 ) | ( 3 << 16 ) | ( 4 << 24 ) ;
12321283 let actual = checked_arbitrary :: < i32 > ( & mut buf) . unwrap ( ) ;
12331284 assert_eq ! ( expected, actual) ;
1285+
1286+ assert_generates ( [
1287+ i32:: from_ne_bytes ( [ 0 , 0 , 0 , 0 ] ) ,
1288+ i32:: from_ne_bytes ( [ 0 , 0 , 0 , 1 ] ) ,
1289+ i32:: from_ne_bytes ( [ 0 , 0 , 1 , 0 ] ) ,
1290+ i32:: from_ne_bytes ( [ 0 , 1 , 0 , 0 ] ) ,
1291+ i32:: from_ne_bytes ( [ 1 , 0 , 0 , 0 ] ) ,
1292+ i32:: from_ne_bytes ( [ 1 , 1 , 1 , 1 ] ) ,
1293+ i32:: from_ne_bytes ( [ 0xff , 0xff , 0xff , 0xff ] ) ,
1294+ ] ) ;
12341295 }
12351296
12361297 #[ test]
@@ -1251,6 +1312,74 @@ mod test {
12511312 assert_eq ! ( expected, actual) ;
12521313 }
12531314
1315+ #[ test]
1316+ fn arbitrary_for_vec_u8 ( ) {
1317+ assert_generates :: < Vec < u8 > > ( [
1318+ vec ! [ ] ,
1319+ vec ! [ 0 ] ,
1320+ vec ! [ 1 ] ,
1321+ vec ! [ 0 , 0 ] ,
1322+ vec ! [ 0 , 1 ] ,
1323+ vec ! [ 1 , 0 ] ,
1324+ vec ! [ 1 , 1 ] ,
1325+ vec ! [ 0 , 0 , 0 ] ,
1326+ vec ! [ 0 , 0 , 1 ] ,
1327+ vec ! [ 0 , 1 , 0 ] ,
1328+ vec ! [ 0 , 1 , 1 ] ,
1329+ vec ! [ 1 , 0 , 0 ] ,
1330+ vec ! [ 1 , 0 , 1 ] ,
1331+ vec ! [ 1 , 1 , 0 ] ,
1332+ vec ! [ 1 , 1 , 1 ] ,
1333+ ] ) ;
1334+ }
1335+
1336+ #[ test]
1337+ fn arbitrary_for_vec_vec_u8 ( ) {
1338+ assert_generates :: < Vec < Vec < u8 > > > ( [
1339+ vec ! [ ] ,
1340+ vec ! [ vec![ ] ] ,
1341+ vec ! [ vec![ 0 ] ] ,
1342+ vec ! [ vec![ 1 ] ] ,
1343+ vec ! [ vec![ 0 , 1 ] ] ,
1344+ vec ! [ vec![ ] , vec![ ] ] ,
1345+ vec ! [ vec![ 0 ] , vec![ ] ] ,
1346+ vec ! [ vec![ ] , vec![ 1 ] ] ,
1347+ vec ! [ vec![ 0 ] , vec![ 1 ] ] ,
1348+ vec ! [ vec![ 0 , 1 ] , vec![ ] ] ,
1349+ vec ! [ vec![ ] , vec![ 1 , 0 ] ] ,
1350+ vec ! [ vec![ ] , vec![ ] , vec![ ] ] ,
1351+ ] ) ;
1352+ }
1353+
1354+ #[ test]
1355+ fn arbitrary_for_vec_vec_vec_u8 ( ) {
1356+ assert_generates :: < Vec < Vec < Vec < u8 > > > > ( [
1357+ vec ! [ ] ,
1358+ vec ! [ vec![ ] ] ,
1359+ vec ! [ vec![ vec![ 0 ] ] ] ,
1360+ vec ! [ vec![ vec![ 1 ] ] ] ,
1361+ vec ! [ vec![ vec![ 0 , 1 ] ] ] ,
1362+ vec ! [ vec![ ] , vec![ ] ] ,
1363+ vec ! [ vec![ ] , vec![ vec![ ] ] ] ,
1364+ vec ! [ vec![ vec![ ] ] , vec![ ] ] ,
1365+ vec ! [ vec![ vec![ ] ] , vec![ vec![ ] ] ] ,
1366+ vec ! [ vec![ vec![ 0 ] ] , vec![ ] ] ,
1367+ vec ! [ vec![ ] , vec![ vec![ 1 ] ] ] ,
1368+ vec ! [ vec![ vec![ 0 ] ] , vec![ vec![ 1 ] ] ] ,
1369+ vec ! [ vec![ vec![ 0 , 1 ] ] , vec![ ] ] ,
1370+ vec ! [ vec![ ] , vec![ vec![ 0 , 1 ] ] ] ,
1371+ vec ! [ vec![ ] , vec![ ] , vec![ ] ] ,
1372+ vec ! [ vec![ vec![ ] ] , vec![ ] , vec![ ] ] ,
1373+ vec ! [ vec![ ] , vec![ vec![ ] ] , vec![ ] ] ,
1374+ vec ! [ vec![ ] , vec![ ] , vec![ vec![ ] ] ] ,
1375+ ] ) ;
1376+ }
1377+
1378+ #[ test]
1379+ fn arbitrary_for_string ( ) {
1380+ assert_generates :: < String > ( [ "" . into ( ) , "a" . into ( ) , "aa" . into ( ) , "aaa" . into ( ) ] ) ;
1381+ }
1382+
12541383 #[ test]
12551384 fn arbitrary_collection ( ) {
12561385 let x = [
@@ -1284,11 +1413,11 @@ mod test {
12841413 ) ;
12851414 assert_eq ! (
12861415 checked_arbitrary_take_rest:: <Vec <u8 >>( Unstructured :: new( & x) ) . unwrap( ) ,
1287- & [ 1 , 2 , 3 , 4 ]
1416+ & [ 2 , 4 ]
12881417 ) ;
12891418 assert_eq ! (
12901419 checked_arbitrary_take_rest:: <Vec <u32 >>( Unstructured :: new( & x) ) . unwrap( ) ,
1291- & [ 0x4030201 ]
1420+ & [ 0x040302 ]
12921421 ) ;
12931422 assert_eq ! (
12941423 checked_arbitrary_take_rest:: <String >( Unstructured :: new( & x) ) . unwrap( ) ,
0 commit comments