namespace Amphora.UnitTests { public class MinstdTests : UnitTestSharp.TestFixture { public class SeedCtorTests : UnitTestSharp.TestFixture { public void TenThousandthDrawFromSeedOneMatchesTheCppStandard() { var generator = new Minstd(1); ulong tenThousandth = 0; for (int i = 0; i < 10000; i++) { tenThousandth = generator.NextUInt64() >> 33; } CheckEqual(1043618065UL, tenThousandth); } public void ReducesTheSeedModuloTheModulus() { var reduced = new Minstd(2147483648UL); var one = new Minstd(1); CheckEqual(one.NextUInt64(), reduced.NextUInt64()); } public void ReplacesAZeroSeedWithOne() { var zero = new Minstd(0); var one = new Minstd(1); CheckEqual(one.NextUInt64(), zero.NextUInt64()); } public void ReplacesAMultipleOfTheModulusWithOne() { var modulus = new Minstd(2147483647UL); var one = new Minstd(1); CheckEqual(one.NextUInt64(), modulus.NextUInt64()); } } public class NextUInt64Tests : UnitTestSharp.TestFixture { public void PutsThe31BitStateAtTheTop() { var generator = new Minstd(1); CheckEqual(0x0000834e00000000UL, generator.NextUInt64()); CheckEqual(0x21ac75e200000000UL, generator.NextUInt64()); CheckEqual(0xc16f59b200000000UL, generator.NextUInt64()); CheckEqual(0x756a185400000000UL, generator.NextUInt64()); } } public class NextUInt32Tests : UnitTestSharp.TestFixture { public void ShiftsTheStateUpOneBit() { var generator = new Minstd(1); CheckEqual(0x0000834eU, generator.NextUInt32()); CheckEqual(0x21ac75e2U, generator.NextUInt32()); CheckEqual(0xc16f59b2U, generator.NextUInt32()); CheckEqual(0x756a1854U, generator.NextUInt32()); } } } }