Prüfsumme und wiederholbarer Zufall
FNV-1a für Zustandsprüfsummen und SplitMix64 als einzige Zufallsquelle des Kerns. Beide sind gegen veröffentlichte Referenzwerte geprüft. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
use grovewright_core::hash::fnv1a64;
|
||||
|
||||
#[test]
|
||||
fn matches_the_published_fnv1a_test_vectors() {
|
||||
assert_eq!(fnv1a64(b""), 0xcbf2_9ce4_8422_2325);
|
||||
assert_eq!(fnv1a64(b"a"), 0xaf63_dc4c_8601_ec8c);
|
||||
assert_eq!(fnv1a64(b"foobar"), 0x8594_4171_f739_67e8);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_order_of_bytes_matters() {
|
||||
assert_ne!(fnv1a64(&[0, 1]), fnv1a64(&[1, 0]));
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
use grovewright_core::rng::Rng;
|
||||
|
||||
#[test]
|
||||
fn matches_the_splitmix64_reference_values() {
|
||||
let mut rng = Rng::new(0);
|
||||
assert_eq!(rng.next_u64(), 0xE220_A839_7B1D_CDAF);
|
||||
assert_eq!(rng.next_u64(), 0x6E78_9E6A_A1B9_65F4);
|
||||
assert_eq!(rng.next_u64(), 0x06C4_5D18_8009_454F);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn the_same_seed_gives_the_same_sequence() {
|
||||
let mut a = Rng::new(2026);
|
||||
let mut b = Rng::new(2026);
|
||||
for _ in 0..1_000 {
|
||||
assert_eq!(a.next_u64(), b.next_u64());
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn different_seeds_give_different_sequences() {
|
||||
assert_ne!(Rng::new(1).next_u64(), Rng::new(2).next_u64());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn below_stays_inside_the_bound() {
|
||||
let mut rng = Rng::new(7);
|
||||
for bound in [1u32, 2, 3, 10, 100, 1_000_000, u32::MAX] {
|
||||
for _ in 0..1_000 {
|
||||
assert!(rng.below(bound) < bound);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn below_reaches_every_value_of_a_small_bound() {
|
||||
let mut rng = Rng::new(99);
|
||||
let mut seen = [false; 6];
|
||||
for _ in 0..1_000 {
|
||||
seen[rng.below(6) as usize] = true;
|
||||
}
|
||||
assert_eq!(seen, [true; 6]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[should_panic(expected = "bound must be greater than zero")]
|
||||
fn below_refuses_a_bound_of_zero() {
|
||||
Rng::new(1).below(0);
|
||||
}
|
||||
Reference in New Issue
Block a user