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);
    }
    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);
    }
    public async void Messages()
    {
        var testCase = Mocks.ExecutionErrorTestCase("This is my error message");
        var runner = new ExecutionErrorTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        var result = await runner.RunAsync();

        Assert.Equal(1, result.Total);
        Assert.Equal(0m, result.Time);
        Assert.Collection(messageBus.Messages,
            msg =>
            {
                var testCaseStarting = Assert.IsAssignableFrom<ITestCaseStarting>(msg);
                Assert.Same(testCase.TestMethod.TestClass.TestCollection, testCaseStarting.TestCollection);
                Assert.Same(testCase, testCaseStarting.TestCase);
            },
            msg =>
            {
                var testStarting = Assert.IsAssignableFrom<ITestStarting>(msg);
                Assert.Same(testCase.TestMethod.TestClass.TestCollection, testStarting.TestCollection);
                Assert.Same(testCase, testStarting.TestCase);
                Assert.Equal("MockType.MockMethod", testStarting.Test.DisplayName);
            },
            msg =>
            {
                var failed = Assert.IsAssignableFrom<ITestFailed>(msg);
                Assert.Same(testCase.TestMethod.TestClass.TestCollection, failed.TestCollection);
                Assert.Same(testCase, failed.TestCase);
                Assert.Equal(0m, failed.ExecutionTime);
                Assert.Empty(failed.Output);
                Assert.Collection(failed.ExceptionTypes, type => Assert.Equal("System.InvalidOperationException", type));
                Assert.Collection(failed.Messages, type => Assert.Equal("This is my error message", type));
            },
            msg =>
            {
                var testFinished = Assert.IsAssignableFrom<ITestFinished>(msg);
                Assert.Same(testCase.TestMethod.TestClass.TestCollection, testFinished.TestCollection);
                Assert.Same(testCase, testFinished.TestCase);
                Assert.Equal("MockType.MockMethod", testFinished.Test.DisplayName);
                Assert.Equal(0m, testFinished.ExecutionTime);
                Assert.Empty(testFinished.Output);
            },
            msg =>
            {
                var testCaseFinished = Assert.IsAssignableFrom<ITestCaseFinished>(msg);
                Assert.Same(testCase.TestMethod.TestClass.TestCollection, testCaseFinished.TestCollection);
                Assert.Same(testCase, testCaseFinished.TestCase);
                Assert.Equal(0m, testCaseFinished.ExecutionTime);
                Assert.Equal(1, testCaseFinished.TestsRun);
                Assert.Equal(1, testCaseFinished.TestsFailed);
                Assert.Equal(0, testCaseFinished.TestsSkipped);
            }
        );
    }
    public async void Messages()
    {
        var testCase = Mocks.ExecutionErrorTestCase("This is my error message");
        var runner   = new ExecutionErrorTestCaseRunner(testCase, messageBus, aggregator, tokenSource);

        var result = await runner.RunAsync();

        Assert.Equal(1, result.Total);
        Assert.Equal(0m, result.Time);
        Assert.Collection(messageBus.Messages,
                          msg =>
        {
            var testCaseStarting = Assert.IsAssignableFrom <ITestCaseStarting>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testCaseStarting.TestCollection);
            Assert.Same(testCase, testCaseStarting.TestCase);
        },
                          msg =>
        {
            var testStarting = Assert.IsAssignableFrom <ITestStarting>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testStarting.TestCollection);
            Assert.Same(testCase, testStarting.TestCase);
        },
                          msg =>
        {
            var failed = Assert.IsAssignableFrom <ITestFailed>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, failed.TestCollection);
            Assert.Same(testCase, failed.TestCase);
            Assert.Equal(0m, failed.ExecutionTime);
            Assert.Empty(failed.Output);
            var exceptionType = Assert.Single(failed.ExceptionTypes);
            Assert.Equal("System.InvalidOperationException", exceptionType);
            var type = Assert.Single(failed.Messages);
            Assert.Equal("This is my error message", type);
        },
                          msg =>
        {
            var testFinished = Assert.IsAssignableFrom <ITestFinished>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testFinished.TestCollection);
            Assert.Same(testCase, testFinished.TestCase);
            Assert.Equal(0m, testFinished.ExecutionTime);
            Assert.Empty(testFinished.Output);
        },
                          msg =>
        {
            var testCaseFinished = Assert.IsAssignableFrom <ITestCaseFinished>(msg);
            Assert.Same(testCase.TestMethod.TestClass.TestCollection, testCaseFinished.TestCollection);
            Assert.Same(testCase, testCaseFinished.TestCase);
            Assert.Equal(0m, testCaseFinished.ExecutionTime);
            Assert.Equal(1, testCaseFinished.TestsRun);
            Assert.Equal(1, testCaseFinished.TestsFailed);
            Assert.Equal(0, testCaseFinished.TestsSkipped);
        }
                          );
    }