diff --git a/EasyAssertions/Assertions/TaskAssertions.cs b/EasyAssertions/Assertions/TaskAssertions.cs index 4f76086..5712972 100644 --- a/EasyAssertions/Assertions/TaskAssertions.cs +++ b/EasyAssertions/Assertions/TaskAssertions.cs @@ -78,8 +78,8 @@ public static void ShouldComplete(this TTask actualTask, TimeSpan timeout /// public static ActualException ShouldFail(this Task actualTask, string message = null) { - actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(DefaultTimeout, message)); - return new ActualException(actualTask.Exception.InnerException); + Actual result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(DefaultTimeout, message)); + return new ActualException(result.Value); } /// @@ -87,8 +87,8 @@ public static ActualException ShouldFail(this Task actualTask, string /// public static ActualException ShouldFail(this Task actualTask, uint millisecondsTimeout, string message = null) { - actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(TimeSpan.FromMilliseconds(millisecondsTimeout), message)); - return new ActualException(actualTask.Exception.InnerException); + Actual result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(TimeSpan.FromMilliseconds(millisecondsTimeout), message)); + return new ActualException(result.Value); } /// @@ -96,8 +96,8 @@ public static ActualException ShouldFail(this Task actualTask, uint m /// public static ActualException ShouldFail(this Task actualTask, TimeSpan timeout, string message = null) { - actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(timeout, message)); - return new ActualException(actualTask.Exception.InnerException); + Actual result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(timeout, message)); + return new ActualException(result.Value); } /// @@ -107,8 +107,8 @@ public static ActualException ShouldFail(this Task actualTask, TimeSp public static ActualException ShouldFailWith(this Task actualTask, string message = null) where TException : Exception { - actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(DefaultTimeout, message)); - return new ActualException((TException)actualTask.Exception.InnerException); + Actual result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(DefaultTimeout, message)); + return new ActualException(result.Value); } /// @@ -117,8 +117,8 @@ public static ActualException ShouldFailWith(this Task a public static ActualException ShouldFailWith(this Task actualTask, uint millisecondsTimeout, string message = null) where TException : Exception { - actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(TimeSpan.FromMilliseconds(millisecondsTimeout), message)); - return new ActualException((TException)actualTask.Exception.InnerException); + Actual result = actualTask.RegisterAssertion(c => actualTask.ShouldFailWith(TimeSpan.FromMilliseconds(millisecondsTimeout), message)); + return new ActualException(result.Value); } /// @@ -141,8 +141,9 @@ public static ActualException ShouldFailWith(this Task a } catch (AggregateException e) { - if (e.InnerException is TException) - return new ActualException((TException)actualTask.Exception.InnerException); + TException expectedException = e.InnerException as TException; + if (expectedException != null) + return new ActualException(expectedException); throw StandardErrors.Current.WrongException(typeof(TException), e.InnerException, message: message); } diff --git a/UnitTests/Assertions/TaskAssertionTests.cs b/UnitTests/Assertions/TaskAssertionTests.cs index 6e01a2d..20ba334 100644 --- a/UnitTests/Assertions/TaskAssertionTests.cs +++ b/UnitTests/Assertions/TaskAssertionTests.cs @@ -226,6 +226,12 @@ public void ShouldFailWithType_FailsWithCorrectType_ReturnsException() AssertReturnsException(new InvalidOperationException(), TimeSpan.FromSeconds(1), () => task.ShouldFailWith()); } + [Test] + public void ShouldFailWithType_ExpectedTaskCanceledException_TaskCancelled_ReturnsException() + { + AssertReturnsTaskCanceledException(TimeSpan.FromSeconds(1), () => task.ShouldFailWith()); + } + [Test] public void ShouldFailWithType_FailsWithWrongType_FailsWithWrongExceptionMessage() { @@ -267,6 +273,12 @@ public void ShouldFailWithinMillisecondsWithType_FailsWithCorrectType_ReturnsExc AssertReturnsException(new InvalidOperationException(), TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith(1)); } + [Test] + public void ShouldFailWithinMillisecondsWithType_ExpectedTaskCanceledExcepton_TaskCancelled_ReturnsException() + { + AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith(1)); + } + [Test] public void ShouldFailWithinMillisecondsWithType_FailsWithWrongType_FailsWithWrongExceptionMessage() { @@ -307,6 +319,12 @@ public void ShouldFailWithinTimeSpanWithType_FailsWithCorrectType_ReturnsExcepti AssertReturnsException(new InvalidOperationException(), TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith(TimeSpan.FromMilliseconds(1))); } + [Test] + public void ShouldFailWithinTimeSpanWithType_ExpectedTaskCanceledException_TaskCancelled_ReturnsException() + { + AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFailWith(TimeSpan.FromMilliseconds(1))); + } + [Test] public void ShouldFailWithinTimeSpanWithType_NegativeTimeSpan_ThrowsArgumentOutOfRangeException() { @@ -355,6 +373,12 @@ public void ShouldFail_Fails_ReturnsException() AssertReturnsException(new Exception(), TimeSpan.FromSeconds(1), () => task.ShouldFail()); } + [Test] + public void ShouldFail_TaskCancelled_ReturnsException() + { + AssertReturnsTaskCanceledException(TimeSpan.FromSeconds(1), () => task.ShouldFail()); + } + [Test] public void ShouldFail_TimesOut_FailsWithTimeoutMessage() { @@ -390,6 +414,12 @@ public void ShouldFailWithinMilliseconds_Fails_ReturnsException() AssertReturnsException(new Exception(), TimeSpan.FromMilliseconds(1), () => task.ShouldFail(1)); } + [Test] + public void ShouldFailWithinMilliseconds_TaskCancelled_ReturnsException() + { + AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFail(1)); + } + [Test] public void ShouldFailWithinMilliseconds_TimesOut_FailsWithTimeoutMessage() { @@ -424,6 +454,12 @@ public void ShouldFailWithinTimeSpan_Fails_ReturnsException() AssertReturnsException(new Exception(), TimeSpan.FromMilliseconds(1), () => task.ShouldFail(TimeSpan.FromMilliseconds(1))); } + [Test] + public void ShouldFailWithinTimeSpan_TaskCancelled_ReturnsException() + { + AssertReturnsTaskCanceledException(TimeSpan.FromMilliseconds(1), () => task.ShouldFail(TimeSpan.FromMilliseconds(1))); + } + [Test] public void ShouldFailWithinTimeSpan_NegativeTimeSpan_ThrowsArgumentOutOfRangeException() { @@ -478,6 +514,17 @@ private void AssertReturnsResult(int expectedResult, TimeSpan timeout, Func(TimeSpan timeout, Func> callAssertion) + where TException : Exception + { + wait(task, timeout).Returns(c => task.Wait(timeout)); + taskSource.SetCanceled(); + + ActualException result = callAssertion(); + + Assert.IsInstanceOf(result.And); + } + private void AssertTimesOut(TimeSpan timeout, Action callAssertion) { Error.TaskTimedOut(timeout, "foo").Returns(ExpectedException);