Skip to content

Commit 89fb24b

Browse files
author
Paul Dicker
committed
Clean up isaac tests
1 parent 15060d9 commit 89fb24b

File tree

2 files changed

+128
-74
lines changed

2 files changed

+128
-74
lines changed

src/prng/isaac.rs

+61-35
Original file line numberDiff line numberDiff line change
@@ -387,67 +387,93 @@ impl fmt::Debug for IsaacRng {
387387
#[cfg(test)]
388388
mod test {
389389
use {Rng, SeedableRng, iter};
390-
use distributions::ascii_word_char;
391390
use super::IsaacRng;
392391

393392
#[test]
394-
fn test_rng_32_rand_seeded() {
395-
let s = iter(&mut ::test::rng()).map(|rng| rng.next_u32()).take(256).collect::<Vec<u32>>();
396-
let mut ra: IsaacRng = SeedableRng::from_seed(&s[..]);
397-
let mut rb: IsaacRng = SeedableRng::from_seed(&s[..]);
398-
assert!(::test::iter_eq(iter(&mut ra).map(|rng| ascii_word_char(rng)).take(100),
399-
iter(&mut rb).map(|rng| ascii_word_char(rng)).take(100)));
393+
fn test_isaac_from_seed() {
394+
let seed = iter(&mut ::test::rng())
395+
.map(|rng| rng.next_u32())
396+
.take(256)
397+
.collect::<Vec<u32>>();
398+
let mut rng1 = IsaacRng::from_seed(&seed[..]);
399+
let mut rng2 = IsaacRng::from_seed(&seed[..]);
400+
for _ in 0..100 {
401+
assert_eq!(rng1.next_u32(), rng2.next_u32());
402+
}
400403
}
401404

402405
#[test]
403-
fn test_rng_32_seeded() {
406+
fn test_isaac_from_seed_fixed() {
404407
let seed: &[_] = &[1, 23, 456, 7890, 12345];
405-
let mut ra: IsaacRng = SeedableRng::from_seed(seed);
406-
let mut rb: IsaacRng = SeedableRng::from_seed(seed);
407-
assert!(::test::iter_eq(iter(&mut ra).map(|rng| ascii_word_char(rng)).take(100),
408-
iter(&mut rb).map(|rng| ascii_word_char(rng)).take(100)));
408+
let mut rng1 = IsaacRng::from_seed(&seed[..]);
409+
let mut rng2 = IsaacRng::from_seed(&seed[..]);
410+
for _ in 0..100 {
411+
assert_eq!(rng1.next_u32(), rng2.next_u32());
412+
}
409413
}
410414

411415
#[test]
412-
fn test_rng_32_reseed() {
413-
let s = iter(&mut ::test::rng()).map(|rng| rng.next_u32()).take(256).collect::<Vec<u32>>();
414-
let mut r: IsaacRng = SeedableRng::from_seed(&s[..]);
415-
let string1: String = iter(&mut r).map(|rng| ascii_word_char(rng)).take(100).collect();
416-
417-
r.reseed(&s[..]);
418-
419-
let string2: String = iter(&mut r).map(|rng| ascii_word_char(rng)).take(100).collect();
420-
assert_eq!(string1, string2);
416+
fn test_isaac_reseed() {
417+
let seed = iter(&mut ::test::rng())
418+
.map(|rng| rng.next_u32())
419+
.take(256)
420+
.collect::<Vec<u32>>();
421+
let mut rng = IsaacRng::from_seed(&seed[..]);
422+
let vec1 = (0..100).map(|_| rng.next_u32()).collect::<Vec<_>>();
423+
424+
rng.reseed(&seed[..]);
425+
426+
let vec2 = (0..100).map(|_| rng.next_u32()).collect::<Vec<_>>();
427+
assert_eq!(vec1, vec2);
421428
}
422429

423430
#[test]
424-
fn test_rng_32_true_values() {
431+
fn test_isaac_true_values() {
425432
let seed: &[_] = &[1, 23, 456, 7890, 12345];
426-
let mut ra: IsaacRng = SeedableRng::from_seed(seed);
433+
let mut rng1 = IsaacRng::from_seed(seed);
427434
// Regression test that isaac is actually using the above vector
428-
let v = (0..10).map(|_| ra.next_u32()).collect::<Vec<_>>();
435+
let v = (0..10).map(|_| rng1.next_u32()).collect::<Vec<_>>();
429436
assert_eq!(v,
430-
vec!(2558573138, 873787463, 263499565, 2103644246, 3595684709,
431-
4203127393, 264982119, 2765226902, 2737944514, 3900253796));
437+
vec!(2558573138, 873787463, 263499565, 2103644246,
438+
3595684709, 4203127393, 264982119, 2765226902,
439+
2737944514, 3900253796));
432440

433441
let seed: &[_] = &[12345, 67890, 54321, 9876];
434-
let mut rb: IsaacRng = SeedableRng::from_seed(seed);
442+
let mut rng2 = IsaacRng::from_seed(seed);
435443
// skip forward to the 10000th number
436-
for _ in 0..10000 { rb.next_u32(); }
444+
for _ in 0..10000 { rng2.next_u32(); }
437445

438-
let v = (0..10).map(|_| rb.next_u32()).collect::<Vec<_>>();
446+
let v = (0..10).map(|_| rng2.next_u32()).collect::<Vec<_>>();
439447
assert_eq!(v,
440-
vec!(3676831399, 3183332890, 2834741178, 3854698763, 2717568474,
441-
1576568959, 3507990155, 179069555, 141456972, 2478885421));
448+
vec!(3676831399, 3183332890, 2834741178, 3854698763,
449+
2717568474, 1576568959, 3507990155, 179069555,
450+
141456972, 2478885421));
451+
}
452+
453+
#[test]
454+
fn test_isaac_new_uninitialized() {
455+
// Compare the results from initializing `IsaacRng` with
456+
// `new_from_u64(0)`, to make sure it is the same as the reference
457+
// implementation when used uninitialized.
458+
// Note: We only test the first 16 integers, not the full 256 of the
459+
// first block.
460+
let mut rng = IsaacRng::new_from_u64(0);
461+
let vec = (0..16).map(|_| rng.next_u32()).collect::<Vec<_>>();
462+
let expected: [u32; 16] = [
463+
0x71D71FD2, 0xB54ADAE7, 0xD4788559, 0xC36129FA,
464+
0x21DC1EA9, 0x3CB879CA, 0xD83B237F, 0xFA3CE5BD,
465+
0x8D048509, 0xD82E9489, 0xDB452848, 0xCA20E846,
466+
0x500F972E, 0x0EEFF940, 0x00D6B993, 0xBC12C17F];
467+
assert_eq!(vec, expected);
442468
}
443469

444470
#[test]
445-
fn test_rng_clone() {
471+
fn test_isaac_clone() {
446472
let seed: &[_] = &[1, 23, 456, 7890, 12345];
447-
let mut rng: IsaacRng = SeedableRng::from_seed(seed);
448-
let mut clone = rng.clone();
473+
let mut rng1 = IsaacRng::from_seed(seed);
474+
let mut rng2 = rng1.clone();
449475
for _ in 0..16 {
450-
assert_eq!(rng.next_u32(), clone.next_u32());
476+
assert_eq!(rng1.next_u32(), rng2.next_u32());
451477
}
452478
}
453479
}

src/prng/isaac64.rs

+67-39
Original file line numberDiff line numberDiff line change
@@ -345,71 +345,99 @@ impl fmt::Debug for Isaac64Rng {
345345
#[cfg(test)]
346346
mod test {
347347
use {Rng, SeedableRng, iter};
348-
use distributions::ascii_word_char;
349348
use super::Isaac64Rng;
350349

351350
#[test]
352-
fn test_rng_64_rand_seeded() {
353-
let s = iter(&mut ::test::rng()).map(|rng| rng.next_u64()).take(256).collect::<Vec<u64>>();
354-
let mut ra: Isaac64Rng = SeedableRng::from_seed(&s[..]);
355-
let mut rb: Isaac64Rng = SeedableRng::from_seed(&s[..]);
356-
assert!(::test::iter_eq(iter(&mut ra).map(|rng| ascii_word_char(rng)).take(100),
357-
iter(&mut rb).map(|rng| ascii_word_char(rng)).take(100)));
351+
fn test_isaac64_from_seed() {
352+
let seed = iter(&mut ::test::rng())
353+
.map(|rng| rng.next_u64())
354+
.take(256)
355+
.collect::<Vec<u64>>();
356+
let mut rng1 = Isaac64Rng::from_seed(&seed[..]);
357+
let mut rng2 = Isaac64Rng::from_seed(&seed[..]);
358+
for _ in 0..100 {
359+
assert_eq!(rng1.next_u64(), rng2.next_u64());
360+
}
358361
}
359362

360363
#[test]
361-
fn test_rng_64_seeded() {
364+
fn test_isaac64_from_seed_fixed() {
362365
let seed: &[_] = &[1, 23, 456, 7890, 12345];
363-
let mut ra: Isaac64Rng = SeedableRng::from_seed(seed);
364-
let mut rb: Isaac64Rng = SeedableRng::from_seed(seed);
365-
assert!(::test::iter_eq(iter(&mut ra).map(|rng| ascii_word_char(rng)).take(100),
366-
iter(&mut rb).map(|rng| ascii_word_char(rng)).take(100)));
366+
let mut rng1 = Isaac64Rng::from_seed(&seed[..]);
367+
let mut rng2 = Isaac64Rng::from_seed(&seed[..]);
368+
for _ in 0..100 {
369+
assert_eq!(rng1.next_u64(), rng2.next_u64());
370+
}
367371
}
368372

369373
#[test]
370-
fn test_rng_64_reseed() {
371-
let s = iter(&mut ::test::rng()).map(|rng| rng.next_u64()).take(256).collect::<Vec<u64>>();
372-
let mut r: Isaac64Rng = SeedableRng::from_seed(&s[..]);
373-
let string1: String = iter(&mut r).map(|rng| ascii_word_char(rng)).take(100).collect();
374-
375-
r.reseed(&s[..]);
376-
377-
let string2: String = iter(&mut r).map(|rng| ascii_word_char(rng)).take(100).collect();
378-
assert_eq!(string1, string2);
374+
fn test_isaac64_reseed() {
375+
let seed = iter(&mut ::test::rng())
376+
.map(|rng| rng.next_u64())
377+
.take(256)
378+
.collect::<Vec<u64>>();
379+
let mut rng = Isaac64Rng::from_seed(&seed[..]);
380+
let vec1 = (0..100).map(|_| rng.next_u64()).collect::<Vec<_>>();
381+
382+
rng.reseed(&seed[..]);
383+
384+
let vec2 = (0..100).map(|_| rng.next_u64()).collect::<Vec<_>>();
385+
assert_eq!(vec1, vec2);
379386
}
380387

381388
#[test]
382-
fn test_rng_64_true_values() {
389+
fn test_isaac64_true_values() {
383390
let seed: &[_] = &[1, 23, 456, 7890, 12345];
384-
let mut ra: Isaac64Rng = SeedableRng::from_seed(seed);
391+
let mut rng1 = Isaac64Rng::from_seed(seed);
385392
// Regression test that isaac is actually using the above vector
386-
let v = (0..10).map(|_| ra.next_u64()).collect::<Vec<_>>();
393+
let v = (0..10).map(|_| rng1.next_u64()).collect::<Vec<_>>();
387394
assert_eq!(v,
388-
vec!(547121783600835980, 14377643087320773276, 17351601304698403469,
389-
1238879483818134882, 11952566807690396487, 13970131091560099343,
390-
4469761996653280935, 15552757044682284409, 6860251611068737823,
391-
13722198873481261842));
395+
vec!(547121783600835980, 14377643087320773276,
396+
17351601304698403469, 1238879483818134882,
397+
11952566807690396487, 13970131091560099343,
398+
4469761996653280935, 15552757044682284409,
399+
6860251611068737823, 13722198873481261842));
392400

393401
let seed: &[_] = &[12345, 67890, 54321, 9876];
394-
let mut rb: Isaac64Rng = SeedableRng::from_seed(seed);
402+
let mut rng2 = Isaac64Rng::from_seed(seed);
395403
// skip forward to the 10000th number
396-
for _ in 0..10000 { rb.next_u64(); }
404+
for _ in 0..10000 { rng2.next_u64(); }
397405

398-
let v = (0..10).map(|_| rb.next_u64()).collect::<Vec<_>>();
406+
let v = (0..10).map(|_| rng2.next_u64()).collect::<Vec<_>>();
399407
assert_eq!(v,
400-
vec!(18143823860592706164, 8491801882678285927, 2699425367717515619,
401-
17196852593171130876, 2606123525235546165, 15790932315217671084,
402-
596345674630742204, 9947027391921273664, 11788097613744130851,
403-
10391409374914919106));
408+
vec!(18143823860592706164, 8491801882678285927,
409+
2699425367717515619, 17196852593171130876,
410+
2606123525235546165, 15790932315217671084,
411+
596345674630742204, 9947027391921273664,
412+
11788097613744130851, 10391409374914919106));
413+
}
414+
415+
#[test]
416+
fn test_isaac_new_uninitialized() {
417+
// Compare the results from initializing `IsaacRng` with
418+
// `new_from_u64(0)`, to make sure it is the same as the reference
419+
// implementation when used uninitialized.
420+
// Note: We only test the first 16 integers, not the full 256 of the
421+
// first block.
422+
let mut rng = Isaac64Rng::new_from_u64(0);
423+
let vec = (0..16).map(|_| rng.next_u64()).collect::<Vec<_>>();
424+
let expected: [u64; 16] = [
425+
0x4DEA9153AEBB43A4, 0x04CB0071A1E74A08, 0xE2B0602EF74897B2,
426+
0x2F13C484446CC310, 0xB9AEB510A0D0D3A9, 0xA4D98E3601C9195C,
427+
0xB605E59670053265, 0xCD99EA9092B2596B, 0xB16531BD0B42016A,
428+
0x43EBB06085E9AB15, 0xA8ABEE66D363E63B, 0xEAD6F4E8559693C1,
429+
0xD00A468BE2791B2B, 0xF0526C1E115C3978, 0x841E403158CA3FF9,
430+
0x6453665DCC16DA88];
431+
assert_eq!(vec, expected);
404432
}
405433

406434
#[test]
407-
fn test_rng_clone() {
435+
fn test_isaac64_clone() {
408436
let seed: &[_] = &[1, 23, 456, 7890, 12345];
409-
let mut rng: Isaac64Rng = SeedableRng::from_seed(seed);
410-
let mut clone = rng.clone();
437+
let mut rng1 = Isaac64Rng::from_seed(seed);
438+
let mut rng2 = rng1.clone();
411439
for _ in 0..16 {
412-
assert_eq!(rng.next_u64(), clone.next_u64());
440+
assert_eq!(rng1.next_u64(), rng2.next_u64());
413441
}
414442
}
415443
}

0 commit comments

Comments
 (0)