namespace Amphora.UnitTests { public class SplitMix64Tests : UnitTestSharp.TestFixture { public class CtorTests : UnitTestSharp.TestFixture { public void StartsTheCounterAtTheSeed() { CheckEqual(1234567UL, new SplitMix64(1234567).State); } } public class NextUInt64Tests : UnitTestSharp.TestFixture { public void MatchesTheReferenceFromSeedZero() { var generator = new SplitMix64(0); CheckEqual(0xe220a8397b1dcdafUL, generator.NextUInt64()); CheckEqual(0x6e789e6aa1b965f4UL, generator.NextUInt64()); CheckEqual(0x06c45d188009454fUL, generator.NextUInt64()); CheckEqual(0xf88bb8a8724c81ecUL, generator.NextUInt64()); } public void MatchesTheReferenceFromSeed1234567() { var generator = new SplitMix64(1234567); CheckEqual(0x599ed017fb08fc85UL, generator.NextUInt64()); CheckEqual(0x2c73f08458540fa5UL, generator.NextUInt64()); CheckEqual(0x883ebce5a3f27c77UL, generator.NextUInt64()); CheckEqual(0x3fbef740e9177b3fUL, generator.NextUInt64()); } public void AdvancesTheCounterByTheIncrement() { var generator = new SplitMix64(5); generator.NextUInt64(); CheckEqual(5 + SplitMix64.Increment, generator.State); } public void TheCounterWrapsPastTheTop() { var generator = new SplitMix64(ulong.MaxValue); generator.NextUInt64(); CheckEqual(SplitMix64.Increment - 1, generator.State); } } public class NextUInt32Tests : UnitTestSharp.TestFixture { public void IsTheUpperHalfOfTheNext64BitDraw() { var generator = new SplitMix64(0); CheckEqual(0xe220a839U, generator.NextUInt32()); CheckEqual(0x6e789e6aU, generator.NextUInt32()); } } } }