namespace Amphora.UnitTests { public class Sfc64Tests : UnitTestSharp.TestFixture { public static Sfc64 OneTwoThreeFour() { return new Sfc64(state0: 1, state1: 2, state2: 3, counter: 4); } public class SeedCtorTests : UnitTestSharp.TestFixture { public void MatchesTheReferenceSeededFrom42() { var generator = new Sfc64(42); CheckEqual(0x74445bc8d8c88b03UL, generator.NextUInt64()); CheckEqual(0xc2f7e2538f4899c6UL, generator.NextUInt64()); CheckEqual(0x05d131045418b46bUL, generator.NextUInt64()); CheckEqual(0x5210a499c6b5a485UL, generator.NextUInt64()); } public void LeavesTheCounterPastTheSeedingRounds() { CheckEqual(1UL + Sfc64.SeedingRounds, new Sfc64(42).Counter); } } public class StateCtorTests : UnitTestSharp.TestFixture { public void KeepsTheStateAsGiven() { Sfc64 generator = OneTwoThreeFour(); CheckEqual(1UL, generator.State0); CheckEqual(2UL, generator.State1); CheckEqual(3UL, generator.State2); CheckEqual(4UL, generator.Counter); } } public class NextUInt64Tests : UnitTestSharp.TestFixture { public void MatchesTheReference() { Sfc64 generator = OneTwoThreeFour(); CheckEqual(0x0000000000000007UL, generator.NextUInt64()); CheckEqual(0x0000000000000022UL, generator.NextUInt64()); CheckEqual(0x000000001b000060UL, generator.NextUInt64()); CheckEqual(0x001b00005a036178UL, generator.NextUInt64()); CheckEqual(0x005a03626407ff9aUL, generator.NextUInt64()); CheckEqual(0x03570803af636aa4UL, generator.NextUInt64()); CheckEqual(0x27cca0434a7b0461UL, generator.NextUInt64()); CheckEqual(0x647c3edbad20110dUL, generator.NextUInt64()); } public void TheCounterKeepsTheAllZeroStateMoving() { var generator = default(Sfc64); CheckEqual(0UL, generator.NextUInt64()); CheckEqual(1UL, generator.NextUInt64()); } } public class NextUInt32Tests : UnitTestSharp.TestFixture { public void IsTheUpperHalfOfTheNext64BitDraw() { Sfc64 generator = OneTwoThreeFour(); for (int i = 0; i < 6; i++) { generator.NextUInt64(); } CheckEqual(0x27cca043U, generator.NextUInt32()); CheckEqual(0x647c3edbU, generator.NextUInt32()); } } } }