@@ -567,6 +567,40 @@ mod test {
567
567
assert_eq ! ( v. choose_mut( & mut r) , None ) ;
568
568
}
569
569
570
+ #[ test]
571
+ fn value_stability_slice ( ) {
572
+ let mut r = crate :: test:: rng ( 413 ) ;
573
+ let chars = [
574
+ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
575
+ ] ;
576
+ let mut nums = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ] ;
577
+
578
+ assert_eq ! ( chars. choose( & mut r) , Some ( & 'l' ) ) ;
579
+ assert_eq ! ( nums. choose_mut( & mut r) , Some ( & mut 10 ) ) ;
580
+
581
+ #[ cfg( feature = "alloc" ) ]
582
+ assert_eq ! (
583
+ & chars
584
+ . choose_multiple( & mut r, 8 )
585
+ . cloned( )
586
+ . collect:: <Vec <char >>( ) ,
587
+ & [ 'd' , 'm' , 'b' , 'n' , 'c' , 'k' , 'h' , 'e' ]
588
+ ) ;
589
+
590
+ #[ cfg( feature = "alloc" ) ]
591
+ assert_eq ! ( chars. choose_weighted( & mut r, |_| 1 ) , Ok ( & 'f' ) ) ;
592
+ #[ cfg( feature = "alloc" ) ]
593
+ assert_eq ! ( nums. choose_weighted_mut( & mut r, |_| 1 ) , Ok ( & mut 5 ) ) ;
594
+
595
+ let mut r = crate :: test:: rng ( 414 ) ;
596
+ nums. shuffle ( & mut r) ;
597
+ assert_eq ! ( nums, [ 9 , 5 , 3 , 10 , 7 , 12 , 8 , 11 , 6 , 4 , 0 , 2 , 1 ] ) ;
598
+ nums = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 ] ;
599
+ let res = nums. partial_shuffle ( & mut r, 6 ) ;
600
+ assert_eq ! ( res. 0 , & mut [ 7 , 4 , 8 , 6 , 9 , 3 ] ) ;
601
+ assert_eq ! ( res. 1 , & mut [ 0 , 1 , 2 , 12 , 11 , 5 , 10 ] ) ;
602
+ }
603
+
570
604
#[ derive( Clone ) ]
571
605
struct UnhintedIterator < I : Iterator + Clone > {
572
606
iter : I ,
@@ -847,4 +881,76 @@ mod test {
847
881
Err ( WeightedError :: InvalidWeight )
848
882
) ;
849
883
}
884
+
885
+ #[ test]
886
+ fn value_stability_choose ( ) {
887
+ fn choose < I : Iterator < Item = u32 > > ( iter : I ) -> Option < u32 > {
888
+ let mut rng = crate :: test:: rng ( 411 ) ;
889
+ iter. choose ( & mut rng)
890
+ }
891
+
892
+ assert_eq ! ( choose( [ ] . iter( ) . cloned( ) ) , None ) ;
893
+ assert_eq ! ( choose( 0 ..100 ) , Some ( 33 ) ) ;
894
+ assert_eq ! ( choose( UnhintedIterator { iter: 0 ..100 } ) , Some ( 76 ) ) ;
895
+ assert_eq ! (
896
+ choose( ChunkHintedIterator {
897
+ iter: 0 ..100 ,
898
+ chunk_size: 32 ,
899
+ chunk_remaining: 32 ,
900
+ hint_total_size: false ,
901
+ } ) ,
902
+ Some ( 39 )
903
+ ) ;
904
+ assert_eq ! (
905
+ choose( ChunkHintedIterator {
906
+ iter: 0 ..100 ,
907
+ chunk_size: 32 ,
908
+ chunk_remaining: 32 ,
909
+ hint_total_size: true ,
910
+ } ) ,
911
+ Some ( 39 )
912
+ ) ;
913
+ assert_eq ! (
914
+ choose( WindowHintedIterator {
915
+ iter: 0 ..100 ,
916
+ window_size: 32 ,
917
+ hint_total_size: false ,
918
+ } ) ,
919
+ Some ( 90 )
920
+ ) ;
921
+ assert_eq ! (
922
+ choose( WindowHintedIterator {
923
+ iter: 0 ..100 ,
924
+ window_size: 32 ,
925
+ hint_total_size: true ,
926
+ } ) ,
927
+ Some ( 90 )
928
+ ) ;
929
+ }
930
+
931
+ #[ test]
932
+ fn value_stability_choose_multiple ( ) {
933
+ fn do_test < I : Iterator < Item = u32 > > ( iter : I , v : & [ u32 ] ) {
934
+ let mut rng = crate :: test:: rng ( 412 ) ;
935
+ let mut buf = [ 0u32 ; 8 ] ;
936
+ assert_eq ! ( iter. choose_multiple_fill( & mut rng, & mut buf) , v. len( ) ) ;
937
+ assert_eq ! ( & buf[ 0 ..v. len( ) ] , v) ;
938
+ }
939
+
940
+ do_test ( 0 ..4 , & [ 0 , 1 , 2 , 3 ] ) ;
941
+ do_test ( 0 ..8 , & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
942
+ do_test ( 0 ..100 , & [ 58 , 78 , 80 , 92 , 43 , 8 , 96 , 7 ] ) ;
943
+
944
+ #[ cfg( feature = "alloc" ) ]
945
+ {
946
+ fn do_test < I : Iterator < Item = u32 > > ( iter : I , v : & [ u32 ] ) {
947
+ let mut rng = crate :: test:: rng ( 412 ) ;
948
+ assert_eq ! ( iter. choose_multiple( & mut rng, v. len( ) ) , v) ;
949
+ }
950
+
951
+ do_test ( 0 ..4 , & [ 0 , 1 , 2 , 3 ] ) ;
952
+ do_test ( 0 ..8 , & [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 ] ) ;
953
+ do_test ( 0 ..100 , & [ 58 , 78 , 80 , 92 , 43 , 8 , 96 , 7 ] ) ;
954
+ }
955
+ }
850
956
}
0 commit comments