dandelion-random 0.3.1

a high performance non-cryptographic random number generator
Documentation
#![allow(unused_must_use)]

//! tests

use dandelion::Rng;
use expect_test::expect;
use std::array;
use std::fmt::Write;
use std::mem::MaybeUninit;
use std::num::NonZeroU128;

#[test]
fn test_api() {
  let mut out = String::new();
  let mut rng = Rng::new(NonZeroU128::MIN);
  let mut buf = [0u8; 9];
  let mut buf_uninit = [MaybeUninit::uninit(); 9];

  write!(&mut out, "{:?}\n", Rng::from_u64(0));
  write!(&mut out, "{:?}\n", Rng::from_state(NonZeroU128::MIN));
  write!(&mut out, "{}\n", rng.state());
  write!(&mut out, "{}\n", rng.bernoulli(0.5));
  write!(&mut out, "{}\n", rng.bool());
  write!(&mut out, "{}\n", rng.i32());
  write!(&mut out, "{}\n", rng.i64());
  write!(&mut out, "{}\n", rng.i128());
  write!(&mut out, "{}\n", rng.u32());
  write!(&mut out, "{}\n", rng.u64());
  write!(&mut out, "{}\n", rng.u128());
  write!(&mut out, "{}\n", rng.non_zero_u32());
  write!(&mut out, "{}\n", rng.non_zero_u64());
  write!(&mut out, "{}\n", rng.non_zero_u128());
  write!(&mut out, "{}\n", rng.bounded_u32(5));
  write!(&mut out, "{}\n", rng.bounded_u64(5));
  write!(&mut out, "{}\n", rng.bounded_usize(5));
  write!(&mut out, "{}\n", rng.range_i32(1, 6));
  write!(&mut out, "{}\n", rng.range_i64(1, 6));
  write!(&mut out, "{}\n", rng.range_isize(1, 6));
  write!(&mut out, "{}\n", rng.range_u32(1, 6));
  write!(&mut out, "{}\n", rng.range_u64(1, 6));
  write!(&mut out, "{}\n", rng.range_usize(1, 6));
  write!(&mut out, "{}\n", rng.f32());
  write!(&mut out, "{}\n", rng.f64());
  write!(&mut out, "{}\n", rng.biunit_f32());
  write!(&mut out, "{}\n", rng.biunit_f64());
  write!(&mut out, "{:?}\n", { rng.fill(&mut buf); buf });
  write!(&mut out, "{:?}\n", unsafe { rng.fill_unchecked(buf.as_mut_ptr(), buf.len()); buf });
  write!(&mut out, "{:?}\n", rng.fill_uninit(&mut buf_uninit));
  write!(&mut out, "{:?}\n", rng.byte_array::<9>());

  expect![[r#"
      Rng { .. }
      Rng { .. }
      5678343348967320566895565595396776803
      false
      false
      -717114844
      5104952185819808942
      120316169471476648951082652869775879076
      2247926904
      7056292569151375162
      115805744251978050665992955241888459289
      3652014633
      15645028836979063904
      82802582606552591543897730281005687440
      1
      1
      4
      2
      4
      1
      4
      2
      4
      0.49345005
      0.43060277777625683
      0.10148114
      0.13280605192768077
      [18, 216, 14, 156, 103, 65, 178, 57, 94]
      [221, 83, 241, 111, 57, 62, 163, 136, 80]
      [111, 57, 151, 3, 4, 233, 178, 58, 29]
      [177, 217, 36, 241, 125, 155, 71, 61, 102]
  "#]].assert_eq(out.drain(..).as_str());
}

#[cfg(feature = "getrandom")]
#[test]
fn test_api_getrandom() {
  let _ = Rng::from_operating_system();
}

#[cfg(feature = "rand_core")]
#[test]
fn test_api_rand_core() {
  let mut rng = <Rng as rand_core::SeedableRng>::from_seed([0; 16]);
  let _ = <Rng as rand_core::SeedableRng>::seed_from_u64(0);
  let _ = <Rng as rand_core::SeedableRng>::from_rng(&mut rng);
  let _ = <Rng as rand_core::Rng>::next_u32(&mut rng);
  let _ = <Rng as rand_core::Rng>::next_u64(&mut rng);
  <Rng as rand_core::Rng>::fill_bytes(&mut rng, &mut [0; 21]);
  let Ok(_) = <Rng as rand_core::TryRng>::try_next_u32(&mut rng);
  let Ok(_) = <Rng as rand_core::TryRng>::try_next_u64(&mut rng);
  let Ok(()) = <Rng as rand_core::TryRng>::try_fill_bytes(&mut rng, &mut [0; 21]);
}

#[cfg(feature = "thread_local")]
#[test]
fn test_api_thread_local() {
  let mut buf = [0u8; 21];
  let mut buf_uninit = [MaybeUninit::uninit(); 21];
  let _ = dandelion::thread_local::bernoulli(0.5);
  let _ = dandelion::thread_local::bool();
  let _ = dandelion::thread_local::i32();
  let _ = dandelion::thread_local::i64();
  let _ = dandelion::thread_local::i128();
  let _ = dandelion::thread_local::u32();
  let _ = dandelion::thread_local::u64();
  let _ = dandelion::thread_local::u128();
  let _ = dandelion::thread_local::non_zero_u32();
  let _ = dandelion::thread_local::non_zero_u64();
  let _ = dandelion::thread_local::non_zero_u128();
  let _ = dandelion::thread_local::bounded_u32(5);
  let _ = dandelion::thread_local::bounded_u64(5);
  let _ = dandelion::thread_local::bounded_usize(5);
  let _ = dandelion::thread_local::range_i32(1, 6);
  let _ = dandelion::thread_local::range_i64(1, 6);
  let _ = dandelion::thread_local::range_isize(1, 6);
  let _ = dandelion::thread_local::range_u32(1, 6);
  let _ = dandelion::thread_local::range_u64(1, 6);
  let _ = dandelion::thread_local::range_usize(1, 6);
  let _ = dandelion::thread_local::f32();
  let _ = dandelion::thread_local::f64();
  let _ = dandelion::thread_local::biunit_f32();
  let _ = dandelion::thread_local::biunit_f64();
  dandelion::thread_local::fill(&mut buf);
  unsafe { dandelion::thread_local::fill_unchecked(buf.as_mut_ptr(), buf.len()) };
  let _ = dandelion::thread_local::fill_uninit(&mut buf_uninit);
  let _ = dandelion::thread_local::byte_array::<21>();
}

#[test]
fn test_vectors() {
  let mut out = String::new();
  let mut rng = Rng::from_state(NonZeroU128::MIN);
  for _ in 0 .. 10 { write!(&mut out, "{:#018x}\n", rng.u64()); }

  expect![[r#"
      0x0000000000000001
      0x0000000000000001
      0x0000000000000081
      0x0000000000008001
      0x0000000010248051
      0x0000040110104009
      0x0100481631489551
      0x10034c891d376419
      0xe1264b8568380085
      0x02712a405d633118
  "#]].assert_eq(out.drain(..).as_str());

  let mut rng = Rng::new(NonZeroU128::MIN);
  for _ in 0 .. 10 { write!(&mut out, "{:#018x}\n", rng.u64()); }

  expect![[r#"
      0x9ea17ffbce96bce1
      0x03f517a50cda5a84
      0x70738695d541b224
      0x46d86ef73f24c4ae
      0x0fdd2ff9ac246ba4
      0x5a840d25cab9f146
      0x1965353a85fca478
      0x61ecfcb4af7f073a
      0x502e03cfeea3aa19
      0x571f6003d8b677b7
  "#]].assert_eq(out.drain(..).as_str());

  let mut rng = Rng::new(NonZeroU128::MIN);
  write!(&mut out, "{:?}\n", array::from_fn::<_, 25, _>(|_| rng.bounded_u32(5)));
  write!(&mut out, "{:?}\n", array::from_fn::<_, 25, _>(|_| rng.bounded_u64(5)));
  write!(&mut out, "{:?}\n", array::from_fn::<_, 25, _>(|_| rng.range_i32(1, 6)));
  write!(&mut out, "{:?}\n", array::from_fn::<_, 25, _>(|_| rng.range_i64(1, 6)));
  write!(&mut out, "{:?}\n", array::from_fn::<_, 25, _>(|_| rng.range_u32(1, 6)));
  write!(&mut out, "{:?}\n", array::from_fn::<_, 25, _>(|_| rng.range_u64(1, 6)));

  expect![[r#"
      [3, 0, 2, 1, 0, 2, 0, 2, 1, 2, 4, 5, 2, 1, 1, 1, 4, 1, 3, 0, 3, 1, 3, 1, 4]
      [0, 0, 1, 5, 3, 1, 1, 4, 1, 0, 3, 2, 3, 5, 4, 4, 3, 3, 0, 1, 5, 3, 5, 3, 5]
      [2, 5, 3, 2, 2, 3, 4, 2, 5, 3, 4, 2, 4, 2, 1, 1, 3, 6, 4, 2, 6, 5, 4, 1, 5]
      [5, 5, 5, 5, 1, 1, 3, 4, 6, 6, 2, 5, 4, 1, 1, 3, 5, 5, 5, 2, 6, 5, 3, 1, 5]
      [5, 2, 1, 4, 1, 6, 5, 2, 5, 1, 1, 4, 1, 3, 4, 5, 5, 1, 1, 4, 1, 2, 5, 6, 2]
      [6, 2, 1, 2, 2, 4, 6, 3, 5, 4, 4, 3, 2, 3, 3, 3, 3, 6, 5, 1, 6, 5, 3, 5, 5]
  "#]].assert_eq(out.drain(..).as_str());

  let mut rng = Rng::new(NonZeroU128::MIN);
  for _ in 0 .. 10 { write!(&mut out, "{:+.16}\n", rng.f32()); }
  write!(&mut out, "\n");
  for _ in 0 .. 10 { write!(&mut out, "{:+.16}\n", rng.f64()); }
  write!(&mut out, "\n");
  for _ in 0 .. 10 { write!(&mut out, "{:+.16}\n", rng.biunit_f32()); }
  write!(&mut out, "\n");
  for _ in 0 .. 10 { write!(&mut out, "{:+.16}\n", rng.biunit_f64()); }

  expect![[r#"
      +0.7606964111328125
      +0.0309171248227358
      +0.8785255551338196
      +0.5534800291061401
      +0.1239376068115234
      +0.7071548700332642
      +0.1984011232852936
      +0.7650447487831116
      +0.6264042854309082
      +0.6806449890136719

      +0.3479656163368836
      +0.3037625746348934
      +0.6872424324973326
      +0.4866698404374918
      +0.5788075507144995
      +0.3458461512617954
      +0.5680237446181363
      +0.4597912936779393
      +0.8903554085636458
      +0.3186114342153271

      -0.9609075784683228
      +0.6302964091300964
      -0.9044740200042725
      +0.4934500455856323
      -0.4306027889251709
      +0.1014811396598816
      +0.1328060477972031
      +0.4507524371147156
      -0.2574387490749359
      -0.9325182437896729

      +0.6646209719661166
      +0.4585849065398920
      -0.4671673539099718
      +0.4787477841330546
      +0.1773565112826935
      -0.7041121798569313
      +0.7394071293257584
      -0.9124324180972943
      -0.2232125295662452
      -0.6007147352837630
  "#]].assert_eq(out.drain(..).as_str());
}