namespace Amphora.UnitTests { public class RandTests : UnitTestSharp.TestFixture { public class SeedCtorTests : UnitTestSharp.TestFixture { public void DrawsWhatSfc64DrawsFromTheSameSeed() { var rand = new Rand(42); var reference = new Sfc64(42); CheckEqual(reference.NextUInt64(), rand.NextUInt64()); CheckEqual(reference.NextUInt64(), rand.NextUInt64()); } public void DifferentSeeds_DrawDifferentNumbers() { CheckTrue(new Rand(1).NextUInt64() != new Rand(2).NextUInt64()); } } public class GeneratorCtorTests : UnitTestSharp.TestFixture { public void ResumesFromTheGeneratorsState() { var generator = new Sfc64(state0: 1, state1: 2, state2: 3, counter: 4); var rand = new Rand(generator); CheckEqual(generator.NextUInt64(), rand.NextUInt64()); CheckEqual(generator.NextUInt64(), rand.NextUInt64()); } } public class SpawnTests : UnitTestSharp.TestFixture { public void IsSeededFromTheNext64BitDraw() { var parent = new Rand(42); var reference = new Sfc64(42); var expected = new Rand(reference.NextUInt64()); Rand spawned = parent.Spawn(); CheckEqual(expected.NextUInt64(), spawned.NextUInt64()); CheckEqual(expected.NextUInt64(), spawned.NextUInt64()); } public void CostsTheParentOneDraw() { var parent = new Rand(42); var reference = new Sfc64(42); reference.NextUInt64(); parent.Spawn(); CheckEqual(reference.NextUInt64(), parent.NextUInt64()); } public void SuccessiveSpawns_DrawDifferentNumbers() { var parent = new Rand(42); CheckTrue(parent.Spawn().NextUInt64() != parent.Spawn().NextUInt64()); } } public class SharingTests : UnitTestSharp.TestFixture { public void TwoHoldersOfOneRand_DrawFromOneStream() { var shared = new Rand(42); Rand otherHolder = shared; var reference = new Sfc64(42); CheckEqual(reference.NextUInt64(), shared.NextUInt64()); CheckEqual(reference.NextUInt64(), otherHolder.NextUInt64()); CheckEqual(reference.NextUInt64(), shared.NextUInt64()); } } } }