using System; namespace Amphora.UnitTests { public class Xoshiro256PlusPlusTests : UnitTestSharp.TestFixture { public static Xoshiro256PlusPlus OneTwoThreeFour() { return new Xoshiro256PlusPlus(state0: 1, state1: 2, state2: 3, state3: 4); } public class SeedCtorTests : UnitTestSharp.TestFixture { public void FillsTheStateWithSplitMix64Draws() { var seeder = new SplitMix64(42); var generator = new Xoshiro256PlusPlus(42); CheckEqual(seeder.NextUInt64(), generator.State0); CheckEqual(seeder.NextUInt64(), generator.State1); CheckEqual(seeder.NextUInt64(), generator.State2); CheckEqual(seeder.NextUInt64(), generator.State3); } public void MatchesTheReferenceSeededFrom42() { var generator = new Xoshiro256PlusPlus(42); CheckEqual(0xd0764d4f4476689fUL, generator.NextUInt64()); CheckEqual(0x519e4174576f3791UL, generator.NextUInt64()); CheckEqual(0xfbe07cfb0c24ed8cUL, generator.NextUInt64()); CheckEqual(0xb37d9f600cd835b8UL, generator.NextUInt64()); } public void MatchesTheReferenceSeededFromZero() { var generator = new Xoshiro256PlusPlus(0); CheckEqual(0x53175d61490b23dfUL, generator.NextUInt64()); CheckEqual(0x61da6f3dc380d507UL, generator.NextUInt64()); CheckEqual(0x5c0fdf91ec9a7bfcUL, generator.NextUInt64()); CheckEqual(0x02eebf8c3bbe5e1aUL, generator.NextUInt64()); } } public class StateCtorTests : UnitTestSharp.TestFixture { public void KeepsTheStateAsGiven() { Xoshiro256PlusPlus generator = OneTwoThreeFour(); CheckEqual(1UL, generator.State0); CheckEqual(2UL, generator.State1); CheckEqual(3UL, generator.State2); CheckEqual(4UL, generator.State3); } public void AcceptsOneNonzeroWord() { var generator = new Xoshiro256PlusPlus(state0: 0, state1: 0, state2: 0, state3: 1); CheckEqual(1UL, generator.State3); } public void RejectsAnAllZeroState() { CheckThrow(typeof(ArgumentException)); new Xoshiro256PlusPlus(state0: 0, state1: 0, state2: 0, state3: 0); } } public class NextUInt64Tests : UnitTestSharp.TestFixture { public void MatchesTheReference() { Xoshiro256PlusPlus generator = OneTwoThreeFour(); CheckEqual(0x0000000002800001UL, generator.NextUInt64()); CheckEqual(0x0000000003800067UL, generator.NextUInt64()); CheckEqual(0x000cc00003800067UL, generator.NextUInt64()); CheckEqual(0x000cc201994400b2UL, generator.NextUInt64()); CheckEqual(0x8012a2019ac433cdUL, generator.NextUInt64()); CheckEqual(0x8a69978acdee33baUL, generator.NextUInt64()); CheckEqual(0xc271134733154abdUL, generator.NextUInt64()); CheckEqual(0xac2ba09179169e97UL, generator.NextUInt64()); } public void TheDefaultValueDrawsOnlyZeros() { var generator = default(Xoshiro256PlusPlus); CheckEqual(0UL, generator.NextUInt64()); CheckEqual(0UL, generator.NextUInt64()); } } public class NextUInt32Tests : UnitTestSharp.TestFixture { public void IsTheUpperHalfOfTheNext64BitDraw() { Xoshiro256PlusPlus generator = OneTwoThreeFour(); for (int i = 0; i < 4; i++) { generator.NextUInt64(); } CheckEqual(0x8012a201U, generator.NextUInt32()); CheckEqual(0x8a69978aU, generator.NextUInt32()); } } public class JumpTests : UnitTestSharp.TestFixture { public void MatchesTheReferenceState() { Xoshiro256PlusPlus generator = OneTwoThreeFour(); generator.Jump(); CheckEqual(0x8c7a153956b5f3d1UL, generator.State0); CheckEqual(0x701f1a713401d85eUL, generator.State1); CheckEqual(0x6527f66a65469085UL, generator.State2); CheckEqual(0x8386b786c4408050UL, generator.State3); } public void MatchesTheReferenceDrawsAfterward() { Xoshiro256PlusPlus generator = OneTwoThreeFour(); generator.Jump(); CheckEqual(0xec879073673df437UL, generator.NextUInt64()); CheckEqual(0x20d212a39aca1eaaUL, generator.NextUInt64()); CheckEqual(0xc19d712a27e40f57UL, generator.NextUInt64()); CheckEqual(0x6ff0e08dc71026a1UL, generator.NextUInt64()); } } public class LongJumpTests : UnitTestSharp.TestFixture { public void MatchesTheReferenceDrawsAfterward() { Xoshiro256PlusPlus generator = OneTwoThreeFour(); generator.LongJump(); CheckEqual(0xb5c4ea370b330bf5UL, generator.NextUInt64()); CheckEqual(0x5173cc693c0fa533UL, generator.NextUInt64()); CheckEqual(0x1dc5df0151f7b491UL, generator.NextUInt64()); CheckEqual(0xe7b055cfeabc4661UL, generator.NextUInt64()); } } } }