#![allow(non_snake_case)]
use goish::prelude::*;
test!{ fn TestInt63Range(t) {
for _ in 0..1000 {
let v = rand::Int63();
if v < 0 {
t.Errorf(Sprintf!("Int63 returned negative: %d", v));
return;
}
}
}}
test!{ fn TestIntn(t) {
for n in [1i64, 2, 5, 100, 1000] {
for _ in 0..200 {
let v = rand::Intn(n);
if v < 0 || v >= n {
t.Errorf(Sprintf!("Intn(%d) out of range: %d", n, v));
return;
}
}
}
}}
test!{ fn TestIntnPanicsOnZero(t) {
let r = recover!{ rand::Intn(0) };
if r.is_none() {
t.Errorf(Sprintf!("Intn(0) should have panicked"));
}
}}
test!{ fn TestIntnPanicsOnNegative(t) {
let r = recover!{ rand::Intn(-1) };
if r.is_none() {
t.Errorf(Sprintf!("Intn(-1) should have panicked"));
}
}}
test!{ fn TestFloat64Range(t) {
for _ in 0..1000 {
let v = rand::Float64();
if v < 0.0 || v >= 1.0 {
t.Errorf(Sprintf!("Float64 out of range: %g", v));
return;
}
}
}}
test!{ fn TestSeedDeterministic(t) {
rand::Seed(42);
let seq1: Vec<i64> = (0..10).map(|_| rand::Int63()).collect();
rand::Seed(42);
let seq2: Vec<i64> = (0..10).map(|_| rand::Int63()).collect();
if seq1 != seq2 {
t.Errorf(Sprintf!("Seed(42) produced different sequences"));
}
rand::Seed(1);
let seq3: Vec<i64> = (0..10).map(|_| rand::Int63()).collect();
if seq1 == seq3 {
t.Errorf(Sprintf!("Seed(1) produced same sequence as Seed(42)"));
}
}}
test!{ fn TestShuffleStability(t) {
let mut v: Vec<i64> = (0..100).collect();
let sum_before: i64 = v.iter().sum();
let len_before = v.len();
rand::Seed(7);
for i in (1..v.len()).rev() {
let j = rand::Intn((i + 1) as i64) as usize;
v.swap(i, j);
}
let sum_after: i64 = v.iter().sum();
if sum_after != sum_before || v.len() != len_before {
t.Errorf(Sprintf!("shuffle changed multiset"));
}
}}