Example #1
0
 public FactDiscovererTests()
 {
     aggregator = new ExceptionAggregator();
     cancellationTokenSource = new CancellationTokenSource();
     factAttribute = Mocks.FactAttribute();
     messageBus = new SpyMessageBus();
     options = TestFrameworkOptions.ForDiscovery();
 }
Example #2
0
    public static async void Cancellation_TriggersCancellationTokenSource(Type messageTypeToCancelOn)
    {
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner     = TestableTestCaseRunner.Create(messageBus);

        await runner.RunAsync();

        Assert.True(runner.TokenSource.IsCancellationRequested);
    }
    public async void Cancellation_TriggersCancellationTokenSource(Type messageTypeToCancelOn)
    {
        var testCase = Mocks.ExecutionErrorTestCase("This is my error message");
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner = new ExecutionErrorTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        await runner.RunAsync();

        Assert.True(tokenSource.IsCancellationRequested);
    }
Example #4
0
    public static async void Failing()
    {
        var messageBus = new SpyMessageBus();
        var invoker    = TestableTestInvoker.Create <NonDisposableClass>("Failing", messageBus);

        var result = await invoker.RunAsync();

        Assert.NotEqual(0m, result);
        Assert.IsType <TrueException>(invoker.Aggregator.ToException());
    }
Example #5
0
    public static async void DisposesArguments()
    {
        ClassUnderTest.DataWasDisposed = false;
        var messageBus = new SpyMessageBus();
        var runner     = TestableXunitDelayEnumeratedTheoryTestCaseRunner.Create <ClassUnderTest>("TestWithDisposableData", messageBus);

        await runner.RunAsync();

        Assert.True(ClassUnderTest.DataWasDisposed);
    }
    public async void Cancellation_TriggersCancellationTokenSource(Type messageTypeToCancelOn)
    {
        var testCase   = Mocks.ExecutionErrorTestCase("This is my error message");
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner     = new ExecutionErrorTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        await runner.RunAsync();

        Assert.True(tokenSource.IsCancellationRequested);
    }
Example #7
0
    public static async void Cancellation_TestCaseFinished_CallsExtensibilityMethods()
    {
        var messageBus = new SpyMessageBus(msg => !(msg is ITestCaseFinished));
        var runner     = TestableTestCaseRunner.Create(messageBus);

        await runner.RunAsync();

        Assert.True(runner.AfterTestCaseStarting_Called);
        Assert.True(runner.BeforeTestCaseFinished_Called);
    }
Example #8
0
    public async void Cancellation_TriggersCancellationTokenSource(Type messageTypeToCancelOn, bool shouldTestPass)
    {
        var testCase   = Mocks.LambdaTestCase(() => Assert.True(shouldTestPass));
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner     = new LambdaTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        await runner.RunAsync();

        Assert.True(tokenSource.IsCancellationRequested);
    }
Example #9
0
    public static async void Cancellation_TestMethodStarting_DoesNotCallExtensibilityMethods()
    {
        var messageBus = new SpyMessageBus(msg => !(msg is ITestMethodStarting));
        var runner     = TestableTestMethodRunner.Create(messageBus);

        await runner.RunAsync();

        Assert.True(runner.TokenSource.IsCancellationRequested);
        Assert.False(runner.AfterTestMethodStarting_Called);
        Assert.False(runner.BeforeTestMethodFinished_Called);
    }
Example #10
0
    public static async void Cancellation_TestClassFinished_CallsExtensibilityCallbacks()
    {
        var messageBus = new SpyMessageBus(msg => !(msg is ITestClassFinished));
        var runner     = TestableTestClassRunner.Create(messageBus);

        await runner.RunAsync();

        Assert.True(runner.TokenSource.IsCancellationRequested);
        Assert.True(runner.AfterTestClassStarting_Called);
        Assert.True(runner.BeforeTestClassFinished_Called);
    }
Example #11
0
    public static async void Cancellation_TestClassCleanupFailure_SetsCancellationToken()
    {
        var messageBus = new SpyMessageBus(msg => !(msg is ITestClassCleanupFailure));
        var runner     = TestableTestClassRunner.Create(messageBus);

        runner.BeforeTestClassFinished_Callback = aggregator => aggregator.Add(new Exception());

        await runner.RunAsync();

        Assert.True(runner.TokenSource.IsCancellationRequested);
    }
    public async void ThrowingEnumerator()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableXunitTheoryTestCaseRunner.Create <ClassWithThrowingEnumerator>("Test", messageBus, "Display Name");

        var summary = await runner.RunAsync();

        var passed = messageBus.Messages.OfType <ITestPassed>().Single();

        Assert.Equal("Display Name(c: [ClassWithThrowingEnumerator { }])", passed.Test.DisplayName);
    }
Example #13
0
    public static async void RunTestMethodAsync_AggregatorIncludesPassedInExceptions()
    {
        var messageBus = new SpyMessageBus();
        var ex         = new DivideByZeroException();
        var runner     = TestableTestClassRunner.Create(messageBus, aggregatorSeedException: ex);

        await runner.RunAsync();

        Assert.Same(ex, runner.RunTestMethodAsync_AggregatorResult);
        Assert.Empty(messageBus.Messages.OfType <ITestClassCleanupFailure>());
    }
Example #14
0
    public static async void NotEnoughParameterValues()
    {
        var messageBus = new SpyMessageBus();
        var invoker    = TestableTestInvoker.Create <NonDisposableClass>("FactWithParameter", messageBus);

        await invoker.RunAsync();

        var ex = Assert.IsType <InvalidOperationException>(invoker.Aggregator.ToException());

        Assert.Equal("The test method expected 1 parameter value, but 0 parameter values were provided.", ex.Message);
    }
Example #15
0
    public static async void TooManyParameterValues()
    {
        var messageBus = new SpyMessageBus();
        var invoker    = TestableTestInvoker.Create <NonDisposableClass>("Passing", messageBus, testMethodArguments: new object[] { 42 });

        await invoker.RunAsync();

        var ex = Assert.IsType <InvalidOperationException>(invoker.Aggregator.ToException());

        Assert.Equal("The test method expected 0 parameter values, but 1 parameter value was provided.", ex.Message);
    }
Example #16
0
    public static async void Cancellation_AllOthers_CallsExtensibilityMethods(Type messageTypeToCancelOn, bool shouldTestPass, string skipReason = null)
    {
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner     = TestableTestRunner.Create(messageBus, skipReason: skipReason, lambda: () => Assert.True(shouldTestPass));

        await runner.RunAsync();

        Assert.True(runner.TokenSource.IsCancellationRequested);
        Assert.True(runner.AfterTestStarting_Called);
        Assert.True(runner.BeforeTestFinished_Called);
    }
Example #17
0
    public static async void Output()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableTestRunner.Create(messageBus, output: "This is my text output");

        await runner.RunAsync();

        var passed = messageBus.Messages.OfType <ITestPassed>().Single();

        Assert.Equal("This is my text output", passed.Output);
    }
    public async void ThrowingToString()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableXunitTheoryTestCaseRunner.Create <ClassWithThrowingToString>("Test", messageBus, "Display Name");

        var summary = await runner.RunAsync();

        var passed = messageBus.Messages.OfType <ITestPassed>().Single();

        Assert.Equal("Display Name(c: TargetInvocationException was thrown formatting an object of type \"XunitTheoryTestCaseRunnerTests+ClassWithThrowingToString\")", passed.Test.DisplayName);
    }
Example #19
0
        public static async void Messages_StaticTestMethod()
        {
            var messageBus = new SpyMessageBus();
            var invoker    = TestableTestInvoker.Create <NonDisposableClass>("StaticPassing", messageBus);

            await invoker.RunAsync();

            Assert.Empty(messageBus.Messages);
            Assert.True(invoker.BeforeTestMethodInvoked_Called);
            Assert.True(invoker.AfterTestMethodInvoked_Called);
        }
Example #20
0
    public async void ThrowingToString()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableXunitDelayEnumeratedTheoryTestCaseRunner.Create <ClassWithThrowingToString>("Test", messageBus, "Display Name");

        await runner.RunAsync();

        var passed         = messageBus.Messages.OfType <_TestPassed>().Single();
        var passedStarting = messageBus.Messages.OfType <_TestStarting>().Where(ts => ts.TestUniqueID == passed.TestUniqueID).Single();

        Assert.Equal("Display Name(c: TargetInvocationException was thrown formatting an object of type \"XunitDelayEnumeratedTheoryTestCaseRunnerTests+ClassWithThrowingToString\")", passedStarting.TestDisplayName);
    }
Example #21
0
    public async void ThrowingEnumerator()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableXunitDelayEnumeratedTheoryTestCaseRunner.Create <ClassWithThrowingEnumerator>("Test", messageBus, "Display Name");

        var summary = await runner.RunAsync();

        var passed         = messageBus.Messages.OfType <_TestPassed>().Single();
        var passedStarting = messageBus.Messages.OfType <_TestStarting>().Where(ts => ts.TestUniqueID == passed.TestUniqueID).Single();

        Assert.Equal("Display Name(c: [ClassWithThrowingEnumerator { }])", passedStarting.TestDisplayName);
    }
Example #22
0
    public static async void WithPreSeededException_ReturnsTestFailed_NoCleanupFailureMessage()
    {
        var messageBus = new SpyMessageBus();
        var ex         = new DivideByZeroException();
        var runner     = TestableTestRunner.Create(messageBus, aggregatorSeedException: ex);

        await runner.RunAsync();

        var failed = Assert.Single(messageBus.Messages.OfType <ITestFailed>());

        Assert.Equal(typeof(DivideByZeroException).FullName, failed.ExceptionTypes.Single());
        Assert.Empty(messageBus.Messages.OfType <ITestCleanupFailure>());
    }
Example #23
0
        public static async void Messages_NonStaticTestMethod_NoDispose()
        {
            var messageBus = new SpyMessageBus();
            var invoker    = TestableTestInvoker.Create <NonDisposableClass>("Passing", messageBus, "Display Name");

            await invoker.RunAsync();

            Assert.Collection(
                messageBus.Messages,
                msg => Assert.IsType <_TestClassConstructionStarting>(msg),
                msg => Assert.IsType <_TestClassConstructionFinished>(msg)
                );
        }
Example #24
0
    public static async void FailureInAfterTestClassStarting_GivesErroredAggregatorToTestMethodRunner_NoCleanupFailureMessage()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableTestClassRunner.Create(messageBus);
        var ex         = new DivideByZeroException();

        runner.AfterTestClassStarting_Callback = aggregator => aggregator.Add(ex);

        await runner.RunAsync();

        Assert.Same(ex, runner.RunTestMethodAsync_AggregatorResult);
        Assert.Empty(messageBus.Messages.OfType <ITestClassCleanupFailure>());
    }
Example #25
0
    public static async void CancellationRequested_DoesNotInvokeTestMethod()
    {
        var messageBus = new SpyMessageBus();
        var invoker    = TestableTestInvoker.Create <NonDisposableClass>("Failing", messageBus);

        invoker.TokenSource.Cancel();

        var result = await invoker.RunAsync();

        Assert.Equal(0m, result);
        Assert.Null(invoker.Aggregator.ToException());
        Assert.False(invoker.BeforeTestMethodInvoked_Called);
        Assert.False(invoker.AfterTestMethodInvoked_Called);
    }
Example #26
0
        public async void DiscovererWhichThrowsReturnsASingleFailedTest()
        {
            var testCase = TestableXunitTheoryTestCase.Create(typeof(ClassUnderTest), "TestWithThrowingData");
            var bus = new SpyMessageBus<ITestCaseFinished>();

            await testCase.RunAsync(bus);
            bus.Finished.WaitOne();

            var resultMessages = bus.Messages.OfType<ITestResultMessage>();
            var failed = (ITestFailed)Assert.Single(resultMessages);
            Assert.Equal("XunitTheoryTestCaseTests+RunAsync+ClassUnderTest.TestWithThrowingData", failed.TestDisplayName);
            Assert.Equal("System.DivideByZeroException : Attempted to divide by zero.", failed.Message);
            Assert.Contains("XunitTheoryTestCaseTests.RunAsync.ClassUnderTest.get_ThrowingData()", failed.StackTrace);
        }
        public ReportDiscoveredTestCase()
        {
            messageBus = new SpyMessageBus();

            var sourceProvider = Substitute.For <_ISourceInformationProvider>();

            sourceProvider
            .GetSourceInformation(null, null)
            .ReturnsForAnyArgs(new _SourceInformation {
                FileName = "Source File", LineNumber = 42
            });

            framework = TestableXunitTestFrameworkDiscoverer.Create(sourceProvider: sourceProvider);
        }
Example #28
0
        public static async void Success()
        {
            var messageBus = new SpyMessageBus();
            var attribute  = new SpyBeforeAfterTest();
            var invoker    = TestableXunitTestInvoker.Create(messageBus, "Display Name", new List <BeforeAfterTestAttribute> {
                attribute
            });

            await invoker.RunAsync();

            Assert.Null(invoker.Aggregator.ToException());
            Assert.Collection(messageBus.Messages,
                              msg => Assert.IsAssignableFrom <ITestClassConstructionStarting>(msg),   // From TestInvoker
                              msg => Assert.IsAssignableFrom <ITestClassConstructionFinished>(msg),   // From TestInvoker
                              msg =>
            {
                var beforeStarting = Assert.IsAssignableFrom <IBeforeTestStarting>(msg);
                Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, beforeStarting.TestCollection);
                Assert.Same(invoker.TestCase, beforeStarting.TestCase);
                Assert.Equal("Display Name", beforeStarting.Test.DisplayName);
                Assert.Equal("SpyBeforeAfterTest", beforeStarting.AttributeName);
            },
                              msg =>
            {
                var beforeFinished = Assert.IsAssignableFrom <IBeforeTestFinished>(msg);
                Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, beforeFinished.TestCollection);
                Assert.Same(invoker.TestCase, beforeFinished.TestCase);
                Assert.Equal("Display Name", beforeFinished.Test.DisplayName);
                Assert.Equal("SpyBeforeAfterTest", beforeFinished.AttributeName);
            },
                              // Test method is invoked here; no directly observable message (tested below)
                              msg =>
            {
                var afterStarting = Assert.IsAssignableFrom <IAfterTestStarting>(msg);
                Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, afterStarting.TestCollection);
                Assert.Same(invoker.TestCase, afterStarting.TestCase);
                Assert.Equal("Display Name", afterStarting.Test.DisplayName);
                Assert.Equal("SpyBeforeAfterTest", afterStarting.AttributeName);
            },
                              msg =>
            {
                var afterFinished = Assert.IsAssignableFrom <IAfterTestFinished>(msg);
                Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, afterFinished.TestCollection);
                Assert.Same(invoker.TestCase, afterFinished.TestCase);
                Assert.Equal("Display Name", afterFinished.Test.DisplayName);
                Assert.Equal("SpyBeforeAfterTest", afterFinished.AttributeName);
            }
                              );
        }
        public async void EnumeratesDataAtRuntimeAndExecutesOneTestForEachDataRow()
        {
            var testCase = TestableXunitTheoryTestCase.Create(typeof(ClassUnderTest), "TestWithData");
            var bus = new SpyMessageBus<ITestCaseFinished>();

            await testCase.RunAsync(bus);
            bus.Finished.WaitOne();

            var resultMessages = bus.Messages.OfType<ITestResultMessage>();
            Assert.Equal(2, resultMessages.Count());
            var passed = (ITestPassed)Assert.Single(resultMessages, msg => msg is ITestPassed);
            Assert.Equal("XunitTheoryTestCaseTests+RunAsync+ClassUnderTest.TestWithData(x: 42, y: 21.12, z: \"Hello\")", passed.TestDisplayName);
            var failed = (ITestFailed)Assert.Single(resultMessages, msg => msg is ITestFailed);
            Assert.Equal("XunitTheoryTestCaseTests+RunAsync+ClassUnderTest.TestWithData(x: 0, y: 0, z: \"World!\")", failed.TestDisplayName);
        }
Example #30
0
        public void DiscovererWhichThrowsReturnsASingleFailedTest()
        {
            var testCase = TestableXunitTheoryTestCase.Create(typeof(ClassUnderTest), "TestWithThrowingData");
            var bus      = new SpyMessageBus <ITestCaseFinished>();

            testCase.Run(bus);
            bus.Finished.WaitOne();

            var resultMessages = bus.Messages.OfType <ITestResultMessage>();
            var failed         = (ITestFailed)Assert.Single(resultMessages);

            Assert.Equal("XunitTheoryTestCaseTests+Run+ClassUnderTest.TestWithThrowingData", failed.TestDisplayName);
            Assert.Equal("System.DivideByZeroException : Attempted to divide by zero.", failed.Message);
            Assert.Contains("XunitTheoryTestCaseTests.Run.ClassUnderTest.get_ThrowingData()", failed.StackTrace);
        }
Example #31
0
    public static async void FailureInAfterTestStarting_ReturnsTestFailed_NoCleanupFailureMessage()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableTestRunner.Create(messageBus);
        var ex         = new DivideByZeroException();

        runner.AfterTestStarting_Callback = aggregator => aggregator.Add(ex);

        await runner.RunAsync();

        var failed = Assert.Single(messageBus.Messages.OfType <ITestFailed>());

        Assert.Equal(typeof(DivideByZeroException).FullName, failed.ExceptionTypes.Single());
        Assert.Empty(messageBus.Messages.OfType <ITestCleanupFailure>());
    }
        public static async void FailedBefore()
        {
            var messageBus = new SpyMessageBus();
            var attribute = new SpyBeforeAfterTest { ThrowInBefore = true };
            var invoker = TestableXunitTestInvoker.Create(messageBus, "Display Name", new List<BeforeAfterTestAttribute> { attribute }, lambda: () => Assert.True(false));

            await invoker.RunAsync();

            Assert.IsType<SpyBeforeAfterTest.BeforeException>(invoker.Aggregator.ToException());
            Assert.Collection(messageBus.Messages,
                msg => Assert.IsAssignableFrom<ITestClassConstructionStarting>(msg),
                msg => Assert.IsAssignableFrom<ITestClassConstructionFinished>(msg),
                msg => Assert.IsAssignableFrom<IBeforeTestStarting>(msg),
                msg => Assert.IsAssignableFrom<IBeforeTestFinished>(msg)
            );
        }
        public static async void Success()
        {
            var messageBus = new SpyMessageBus();
            var attribute = new SpyBeforeAfterTest();
            var invoker = TestableXunitTestInvoker.Create(messageBus, "Display Name", new List<BeforeAfterTestAttribute> { attribute });

            await invoker.RunAsync();

            Assert.Null(invoker.Aggregator.ToException());
            Assert.Collection(messageBus.Messages,
                msg => Assert.IsAssignableFrom<ITestClassConstructionStarting>(msg),  // From TestInvoker
                msg => Assert.IsAssignableFrom<ITestClassConstructionFinished>(msg),  // From TestInvoker
                msg =>
                {
                    var beforeStarting = Assert.IsAssignableFrom<IBeforeTestStarting>(msg);
                    Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, beforeStarting.TestCollection);
                    Assert.Same(invoker.TestCase, beforeStarting.TestCase);
                    Assert.Equal("Display Name", beforeStarting.Test.DisplayName);
                    Assert.Equal("SpyBeforeAfterTest", beforeStarting.AttributeName);
                },
                msg =>
                {
                    var beforeFinished = Assert.IsAssignableFrom<IBeforeTestFinished>(msg);
                    Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, beforeFinished.TestCollection);
                    Assert.Same(invoker.TestCase, beforeFinished.TestCase);
                    Assert.Equal("Display Name", beforeFinished.Test.DisplayName);
                    Assert.Equal("SpyBeforeAfterTest", beforeFinished.AttributeName);
                },
                // Test method is invoked here; no directly observable message (tested below)
                msg =>
                {
                    var afterStarting = Assert.IsAssignableFrom<IAfterTestStarting>(msg);
                    Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, afterStarting.TestCollection);
                    Assert.Same(invoker.TestCase, afterStarting.TestCase);
                    Assert.Equal("Display Name", afterStarting.Test.DisplayName);
                    Assert.Equal("SpyBeforeAfterTest", afterStarting.AttributeName);
                },
                msg =>
                {
                    var afterFinished = Assert.IsAssignableFrom<IAfterTestFinished>(msg);
                    Assert.Same(invoker.TestCase.TestMethod.TestClass.TestCollection, afterFinished.TestCollection);
                    Assert.Same(invoker.TestCase, afterFinished.TestCase);
                    Assert.Equal("Display Name", afterFinished.Test.DisplayName);
                    Assert.Equal("SpyBeforeAfterTest", afterFinished.AttributeName);
                }
            );
        }
Example #34
0
    public void WriteLine(string outputText, string expected)
    {
        var output     = new TestOutputHelper();
        var messageBus = new SpyMessageBus();
        var testCase   = Mocks.TestCase();
        var test       = Mocks.Test(testCase, "Test Display Name");

        output.Initialize(messageBus, test);

        output.WriteLine(outputText);

        var message       = Assert.Single(messageBus.Messages);
        var outputMessage = Assert.IsAssignableFrom <ITestOutput>(message);

        Assert.Equal(expected + Environment.NewLine, outputMessage.Output);
        Assert.Equal(expected + Environment.NewLine, output.Output);
    }
Example #35
0
    public static async void EnumeratesDataAtRuntimeAndExecutesOneTestForEachDataRow()
    {
        var messageBus = new SpyMessageBus();
        var runner     = TestableXunitTheoryTestCaseRunner.Create <ClassUnderTest>("TestWithData", messageBus, "Display Name");

        var summary = await runner.RunAsync();

        Assert.NotEqual(0m, summary.Time);
        Assert.Equal(2, summary.Total);
        Assert.Equal(1, summary.Failed);
        var passed = messageBus.Messages.OfType <ITestPassed>().Single();

        Assert.Equal($"Display Name(x: 42, y: {21.12}, z: \"Hello\")", passed.Test.DisplayName);
        var failed = messageBus.Messages.OfType <ITestFailed>().Single();

        Assert.Equal("Display Name(x: 0, y: 0, z: \"World!\")", failed.Test.DisplayName);
    }
    public static async void FailureInBeforeTestCaseFinished_ReportsCleanupFailure_DoesNotIncludeExceptionsFromAfterTestCaseStarting()
    {
        var messageBus        = new SpyMessageBus();
        var testCase          = Mocks.TestCase <TestAssemblyRunnerTests.RunAsync>("Messages");
        var runner            = TestableTestCaseRunner.Create(messageBus, testCase);
        var startingException = new DivideByZeroException();
        var finishedException = new InvalidOperationException();

        runner.AfterTestCaseStarting_Callback  = aggregator => aggregator.Add(startingException);
        runner.BeforeTestCaseFinished_Callback = aggregator => aggregator.Add(finishedException);

        await runner.RunAsync();

        var cleanupFailure = Assert.Single(messageBus.Messages.OfType <_TestCaseCleanupFailure>());

        Assert.Equal(typeof(InvalidOperationException).FullName, cleanupFailure.ExceptionTypes.Single());
    }
        public async void IssuesTestCaseMessagesAndCallsRunTests()
        {
            var testCase = TestableXunitTestCase.Create();
            var bus = new SpyMessageBus<ITestCaseFinished>();

            await testCase.RunAsync(bus);
            bus.Finished.WaitOne();

            Assert.Collection(bus.Messages,
                message =>
                {
                    var testCaseStarting = Assert.IsAssignableFrom<ITestCaseStarting>(message);
                    Assert.Same(testCase, testCaseStarting.TestCase);
                },
                message => Assert.IsType<SpyMessage>(message),
                message =>
                {
                    var testCaseFinished = Assert.IsAssignableFrom<ITestCaseFinished>(message);
                    Assert.Same(testCase, testCaseFinished.TestCase);
                    Assert.Equal(0, testCaseFinished.TestsRun);
                    Assert.Equal(0, testCaseFinished.TestsFailed);
                    Assert.Equal(0, testCaseFinished.TestsSkipped);
                    Assert.Equal(0M, testCaseFinished.ExecutionTime);
                }
            );
        }
        public async void CountsTestResultMessages()
        {
            var testCase = TestableXunitTestCase.Create(msgBus =>
            {
                msgBus.QueueMessage(Substitute.For<ITestResultMessage>());
                msgBus.QueueMessage(Substitute.For<ITestPassed>());
                msgBus.QueueMessage(Substitute.For<ITestFailed>());
                msgBus.QueueMessage(Substitute.For<ITestSkipped>());
            });
            var bus = new SpyMessageBus<ITestCaseFinished>();

            await testCase.RunAsync(bus);
            bus.Finished.WaitOne();

            var testCaseFinished = Assert.IsAssignableFrom<ITestCaseFinished>(bus.Messages.Last());
            Assert.Equal(4, testCaseFinished.TestsRun);
        }
        public async void CountsTestsSkipped()
        {
            var testCase = TestableXunitTestCase.Create(msgBus =>
            {
                msgBus.QueueMessage(new TestSkipped());
                msgBus.QueueMessage(new TestSkipped());
            });
            var bus = new SpyMessageBus<ITestCaseFinished>();

            await testCase.RunAsync(bus);
            bus.Finished.WaitOne();

            var testCaseFinished = Assert.IsAssignableFrom<ITestCaseFinished>(bus.Messages.Last());
            Assert.Equal(2, testCaseFinished.TestsSkipped);
        }
        public async void AggregatesTestRunTime()
        {
            var testCase = TestableXunitTestCase.Create(msgBus =>
            {
                msgBus.QueueMessage(new TestPassed { ExecutionTime = 1.2M });
                msgBus.QueueMessage(new TestFailed { ExecutionTime = 2.3M });
            });
            var bus = new SpyMessageBus<ITestCaseFinished>();

            await testCase.RunAsync(bus);
            bus.Finished.WaitOne();

            var testCaseFinished = Assert.IsAssignableFrom<ITestCaseFinished>(bus.Messages.Last());
            Assert.Equal(3.5M, testCaseFinished.ExecutionTime);
        }
    public async void Cancellation_TriggersCancellationTokenSource(Type messageTypeToCancelOn, bool shouldTestPass)
    {
        var testCase = Mocks.LambdaTestCase(() => Assert.True(shouldTestPass));
        var messageBus = new SpyMessageBus(msg => !(messageTypeToCancelOn.IsAssignableFrom(msg.GetType())));
        var runner = new LambdaTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        await runner.RunAsync();

        Assert.True(tokenSource.IsCancellationRequested);
    }