using System; using UnitTestSharp; namespace Amphora.UnitTests { public class FailureKindOfPayloadTests : TestFixture { public class FailTests : TestFixture { public void MakesAFailureOfThisKind() { Status failure = BlockedCellKind.Instance.Fail(FailureTestKinds.Wall); CheckEqual(BlockedCellKind.Instance, failure.Kind); } public void StoresWhatPackProduced() { Status failure = BlockedCellKind.Instance.Fail(FailureTestKinds.Wall); CheckEqual("a wall", failure.Ref); CheckEqual((-3L << 32) | 7L, failure.Bits); } public void AllocatesNothing() { CheckEqual(0L, Allocations.During( () => Allocations.StatusSink = BlockedCellKind.Instance.Fail(FailureTestKinds.Wall))); } } public class ReadTests : TestFixture { public void ReturnsThePayloadItWasFailedWith() { Status failure = BlockedCellKind.Instance.Fail(FailureTestKinds.Wall); BlockedCell payload = BlockedCellKind.Instance.Read(failure); CheckEqual(-3, payload.X); CheckEqual(7, payload.Y); CheckEqual("a wall", payload.Blocker); } public void OtherKind_Throws() { Status other = FailureTestKinds.Unreachable.Fail(); CheckThrow(typeof(ArgumentException)); BlockedCellKind.Instance.Read(other); } public void NoFailure_Throws() { CheckThrow(typeof(ArgumentException)); BlockedCellKind.Instance.Read(default); } public void AllocatesNothing() { Allocations.StatusSink = BlockedCellKind.Instance.Fail(FailureTestKinds.Wall); CheckEqual(0L, Allocations.During( () => Allocations.PayloadSink = BlockedCellKind.Instance.Read(Allocations.StatusSink))); } } public class DescribeTests : TestFixture { public void DescribesThePayloadWithTheContext() { Status failure = BlockedCellKind.Instance.Fail(FailureTestKinds.Wall); CheckEqual("The pawn can't reach (-3, 7) past a wall.", BlockedCellKind.Instance.Describe(failure, context: "The pawn")); } public void OtherKind_Throws() { Status other = FailureTestKinds.Unreachable.Fail(); CheckThrow(typeof(ArgumentException)); BlockedCellKind.Instance.Describe(other, context: null); } } } }