namespace Amphora.UnitTests { public class Xoshiro256PlusTests : UnitTestSharp.TestFixture { public class SeedCtorTests : UnitTestSharp.TestFixture { public void FillsTheStateFromSplitMix64() { var generator = new Xoshiro256Plus(42); var fromWords = new Xoshiro256Plus(0xbdd732262feb6e95UL, 0x28efe333b266f103UL, 0x47526757130f9f52UL, 0x581ce1ff0e4ae394UL); CheckEqual(fromWords.NextUInt64(), generator.NextUInt64()); } public void MatchesTheRecurrenceFromSeed42() { var generator = new Xoshiro256Plus(42); CheckEqual(0x15f414253e365229UL, generator.NextUInt64()); CheckEqual(0x4f771f08f4211387UL, generator.NextUInt64()); CheckEqual(0x100492bd8828891eUL, generator.NextUInt64()); CheckEqual(0x4e743fce495374aeUL, generator.NextUInt64()); } } public class StateCtorTests : UnitTestSharp.TestFixture { public void StartsFromTheGivenWords() { var generator = new Xoshiro256Plus(1, 2, 3, 4); CheckEqual(0x0000000000000005UL, generator.NextUInt64()); CheckEqual(0x0000c00000000007UL, generator.NextUInt64()); } } public class NextUInt64Tests : UnitTestSharp.TestFixture { public void MatchesTheRecurrenceFromStateOneTwoThreeFour() { var generator = new Xoshiro256Plus(1, 2, 3, 4); CheckEqual(0x0000000000000005UL, generator.NextUInt64()); CheckEqual(0x0000c00000000007UL, generator.NextUInt64()); CheckEqual(0x0000c00018000007UL, generator.NextUInt64()); CheckEqual(0x8001600018040302UL, generator.NextUInt64()); CheckEqual(0x8061900024040305UL, generator.NextUInt64()); CheckEqual(0xc0617014120f0583UL, generator.NextUInt64()); } } public class NextUInt32Tests : UnitTestSharp.TestFixture { public void IsTheUpperHalfOfTheNext64BitDraw() { var generator = new Xoshiro256Plus(1, 2, 3, 4); for (int i = 0; i < 4; i++) { generator.NextUInt64(); } CheckEqual(0x80619000U, generator.NextUInt32()); CheckEqual(0xc0617014U, generator.NextUInt32()); } } } }