public void GetBaseline_UsesBaselineFallbackVersion_WhenReportForCurrentVersionNotFound()
        {
            // Arrange
            var branchName = "refs/heads/master";
            var baselineProvider = new Mock<IBaselineProvider>();
            var gitInfoProvider = new Mock<IGitInfoProvider>();
            var baselineMutantHelperMock = new Mock<IBaselineMutantHelper>();

            var options = new StrykerOptions()
            {
                WithBaseline = true,
                DashboardApiKey = "Acces_Token",
                ProjectName = "github.com/JohnDoe/project",
                ProjectVersion = "version/human/readable",
                Reporters = new[] { Reporter.Dashboard },
                FallbackVersion = "fallback/version"
            };

            var inputComponent = new Mock<IReadOnlyProjectComponent>().Object;

            var jsonReport = JsonReport.Build(options, inputComponent);

            gitInfoProvider.Setup(x => x.GetCurrentBranchName()).Returns(branchName);

            baselineProvider.Setup(x => x.Load($"baseline/{branchName}")).Returns(Task.FromResult<JsonReport>(null));
            baselineProvider.Setup(x => x.Load($"baseline/{options.FallbackVersion}")).Returns(Task.FromResult(jsonReport));

            // Act
            var target = new BaselineMutantFilter(options, baselineProvider.Object, gitInfoProvider.Object);

            // Assert
            baselineProvider.Verify(x => x.Load($"baseline/{branchName}"), Times.Once);
            baselineProvider.Verify(x => x.Load($"baseline/{options.FallbackVersion}"), Times.Once);
            baselineProvider.VerifyNoOtherCalls();
        }
        public void FilterMutantsReturnAllMutantsWhenCompareToDashboardEnabledAndBaselineNotAvailable()
        {
            // Arrange
            var baselineProvider = new Mock<IBaselineProvider>();
            var branchProvider = new Mock<IGitInfoProvider>();

            var options = new StrykerOptions()
            {
                WithBaseline = true,
                ProjectVersion = "version",
            };

            var target = new BaselineMutantFilter(options, baselineProvider.Object, branchProvider.Object);

            var file = new CsharpFileLeaf();

            var mutants = new List<Mutant>
            {
                new Mutant(),
                new Mutant(),
                new Mutant()
            };

            // Act
            var results = target.FilterMutants(mutants, file, options);

            // Assert
            results.Count().ShouldBe(3);
        }
        public static void ShouldHaveName()
        {
            // Arrange
            var gitInfoProvider = new Mock<IGitInfoProvider>(MockBehavior.Loose);
            var baselineProviderMock = new Mock<IBaselineProvider>(MockBehavior.Loose);
            var baselineMutantHelperMock = new Mock<IBaselineMutantHelper>(MockBehavior.Loose);

            // Act
            var target = new BaselineMutantFilter(new StrykerOptions(), baselineProviderMock.Object, gitInfoProvider.Object, baselineMutantHelperMock.Object) as IMutantFilter;

            // Assert
            target.DisplayName.ShouldBe("baseline filter");
        }
        public void FilterMutants_WhenMutantSourceCodeIsNull_MutantIsReturned()
        {
            // Arrange
            var branchProvider = new Mock<IGitInfoProvider>();
            var baselineProvider = new Mock<IBaselineProvider>();
            var baselineMutantHelper = new Mock<IBaselineMutantHelper>();

            var options = new StrykerOptions()
            {
                WithBaseline = true,
                ProjectVersion = "version",
            };
            var file = new CsharpFileLeaf
            {
                RelativePath = "foo.cs"
            };

            var mutants = new List<Mutant>
            {
                new Mutant()
            };

            var jsonMutants = new HashSet<JsonMutant>
            {
                new JsonMutant()
            };

            // Setup Mocks
            var jsonReportFileComponent = new MockJsonReportFileComponent("", "", jsonMutants);

            var jsonFileComponents = new Dictionary<string, SourceFile>
            {
                ["foo.cs"] =  jsonReportFileComponent
            };

            var baseline = new MockJsonReport(null, jsonFileComponents);

            baselineProvider.Setup(mock => mock.Load(It.IsAny<string>()))
                .Returns(Task.FromResult((JsonReport) baseline));

            baselineMutantHelper.Setup(mock => mock.GetMutantSourceCode(It.IsAny<string>(), It.IsAny<JsonMutant>())).Returns(string.Empty);

            // Act
            var target = new BaselineMutantFilter(options, baselineProvider.Object, branchProvider.Object, baselineMutantHelper.Object);

            var results = target.FilterMutants(mutants, file, options);

            // Assert
            results.ShouldHaveSingleItem();
        }
        public void FilterMutants_WhenMultipleMatchingMutants_ResultIsSetToNotRun()
        {
            // Arrange
            var branchProvider = new Mock<IGitInfoProvider>();
            var baselineProvider = new Mock<IBaselineProvider>();
            var baselineMutantHelper = new Mock<IBaselineMutantHelper>();

            var options = new StrykerOptions()
            {
                WithBaseline = true,
                ProjectVersion = "version",
            };
            var file = new CsharpFileLeaf
            {
                RelativePath = "foo.cs"
            };

            var mutants = new List<Mutant>
            {
                new Mutant
                {
                    ResultStatus = MutantStatus.NotRun
                },
                new Mutant
                {
                    ResultStatus = MutantStatus.NotRun
                }
            };

            var jsonMutants = new HashSet<JsonMutant>
            {
                new JsonMutant
                {
                    Status = "Killed"
                }
            };

            // Setup Mocks
            var jsonReportFileComponent = new MockJsonReportFileComponent("", "", jsonMutants);

            var jsonFileComponents = new Dictionary<string, SourceFile>
            {
                ["foo.cs"] = jsonReportFileComponent
            };

            var baseline = new MockJsonReport(null, jsonFileComponents);

            baselineProvider.Setup(mock => mock.Load(It.IsAny<string>()))
                .Returns(Task.FromResult(baseline as JsonReport));

            baselineMutantHelper.Setup(mock => mock.GetMutantSourceCode(It.IsAny<string>(), It.IsAny<JsonMutant>())).Returns("var foo = \"bar\";");
            baselineMutantHelper.Setup(mock => mock.GetMutantMatchingSourceCode(
                It.IsAny<IEnumerable<Mutant>>(),
                It.Is<JsonMutant>(m => m == jsonMutants.First()),
                It.Is<string>(source => source == "var foo = \"bar\";"))).Returns(mutants).Verifiable();

            // Act
            var target = new BaselineMutantFilter(options, baselineProvider.Object, branchProvider.Object, baselineMutantHelper.Object);

            var results = target.FilterMutants(mutants, file, options);

            // Assert
            foreach(var result in results)
            {
                result.ResultStatus.ShouldBe(MutantStatus.NotRun);
                result.ResultStatusReason.ShouldBe("Result based on previous run was inconclusive");
            }
            results.Count().ShouldBe(2);

            baselineMutantHelper.Verify();
        }