Skip to content

Commit 2bb8594

Browse files
authored
Merge pull request #933 from dhardy/stability
Value stability tests for seq functionalty
2 parents 63d53c0 + d4444d0 commit 2bb8594

File tree

2 files changed

+140
-0
lines changed

2 files changed

+140
-0
lines changed

src/seq/index.rs

+34
Original file line numberDiff line numberDiff line change
@@ -435,4 +435,38 @@ mod test {
435435
assert!(v1.iter().all(|e| e < length));
436436
assert_eq!(v1, v2);
437437
}
438+
439+
#[test]
440+
fn value_stability_sample() {
441+
let do_test = |length, amount, values: &[u32]| {
442+
let mut buf = [0u32; 8];
443+
let mut rng = crate::test::rng(410);
444+
445+
let res = sample(&mut rng, length, amount);
446+
let len = res.len().min(buf.len());
447+
for (x, y) in res.into_iter().zip(buf.iter_mut()) {
448+
*y = x as u32;
449+
}
450+
assert_eq!(
451+
&buf[0..len],
452+
values,
453+
"failed sampling {}, {}",
454+
length,
455+
amount
456+
);
457+
};
458+
459+
do_test(10, 6, &[8, 0, 3, 5, 9, 6]); // floyd
460+
do_test(25, 10, &[18, 15, 14, 9, 0, 13, 5, 24]); // floyd
461+
do_test(300, 8, &[30, 283, 150, 1, 73, 13, 285, 35]); // floyd
462+
do_test(300, 80, &[31, 289, 248, 154, 5, 78, 19, 286]); // inplace
463+
do_test(300, 180, &[31, 289, 248, 154, 5, 78, 19, 286]); // inplace
464+
465+
do_test(1000_000, 8, &[
466+
103717, 963485, 826422, 509101, 736394, 807035, 5327, 632573,
467+
]); // floyd
468+
do_test(1000_000, 180, &[
469+
103718, 963490, 826426, 509103, 736396, 807036, 5327, 632573,
470+
]); // rejection
471+
}
438472
}

src/seq/mod.rs

+106
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,40 @@ mod test {
567567
assert_eq!(v.choose_mut(&mut r), None);
568568
}
569569

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+
570604
#[derive(Clone)]
571605
struct UnhintedIterator<I: Iterator + Clone> {
572606
iter: I,
@@ -847,4 +881,76 @@ mod test {
847881
Err(WeightedError::InvalidWeight)
848882
);
849883
}
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+
}
850956
}

0 commit comments

Comments
 (0)