rd-net/Test.Lifetimes/Core/TestResult.cs (89 lines of code) (raw):

using System; using JetBrains.Annotations; using JetBrains.Core; using NUnit.Framework; namespace Test.Lifetimes.Core { public class TestResult : LifetimesTestBase { [Test] public void TestSuccess() { var x = Result.Success(1); Assert.True(x.Succeed); Assert.False(x.Canceled); Assert.False(x.FailedNotCanceled); Assert.Null(x.Exception); Assert.Null(x.FailMessage); } [Test] public void TestFail() { var x = Result.Fail(); Assert.False(x.Succeed); Assert.False(x.Canceled); Assert.True(x.FailedNotCanceled); Assert.NotNull(x.Exception); Assert.AreEqual(Result.EmptyFailMessage, x.FailMessage); } [Test] public void TestCanceled() { var x = Result.Canceled(); Assert.False(x.Succeed); Assert.True(x.Canceled); Assert.False(x.FailedNotCanceled); Assert.NotNull(x.Exception); } public class TestResultInnerClass { public int Number { get; set; } [AssertionMethod] public static void Check([NotNull] TestResultInnerClass foo) { Assert.NotNull(foo); } } [Test] public void NewTest() { void A() { B(); } void B() { C(); } void C() { Nothing.Unreachable(); } Result<TestResultInnerClass> CalcFoo(bool success) { if (success) return Result.Success(new TestResultInnerClass {Number = 1}); return Result.Fail("Fail"); } var result1 = CalcFoo(true); Assert.AreEqual(true, result1.Succeed); Assert.AreEqual(1, result1.Value.Number); Assert.AreEqual(1, result1.Unwrap().Number); TestResultInnerClass.Check(result1.Unwrap()); var result2 = CalcFoo(false); Assert.AreEqual(false, result2.Succeed); Assert.AreEqual("Fail", result2.FailMessage); Assert.Throws<ResultException>(() => result2.Unwrap()); Assert.Throws<InvalidOperationException>(() => Result.Wrap(A).Unwrap()); } [Test] public void TestFailValue() { // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local void AssertFail(Result<Nothing> res) { Assert.True(res.FailedNotCanceled); } // ReSharper disable once ParameterOnlyUsedForPreconditionCheck.Local void AssertFailForInt(Result<int> res) { Assert.True(res.FailedNotCanceled); } var debugInfo = Result.Success(42); var fail = Result.Fail("Fail", debugInfo); var failedDebugInfo = fail.FailValue; Assert.AreEqual(debugInfo.Value, failedDebugInfo.Value); AssertFail(fail); AssertFailForInt((Result<Nothing>)fail); } } }