public void CalculateForAllTests_Should_Return_OneCoverage_From_AllTests_When_There_IsOneProject_And_OneLineCoverage()
        {
            // arrange
            var rewrittenItemsByProject = new Dictionary<Project, List<RewrittenDocument>>();
            var workspace = new AdhocWorkspace();
            var project1 = workspace.AddProject("foo1.dll", LanguageNames.CSharp);

            RewriteResult rewriteResult = new RewriteResult(rewrittenItemsByProject);
            var rewrittenTree = CSharpSyntaxTree.ParseText("");

            var rewrittenDocument1 = new RewrittenDocument( rewrittenTree, null, true);
            rewriteResult.Items[project1] = new List<RewrittenDocument>() { rewrittenDocument1 };

            var semanticModel = Substitute.For<ISemanticModel>();
            var compiledItem = Substitute.For<ICompiledItem>();
            string assembly = "assembly path";

            compiledItem.Project.Returns(project1);
            compiledItem.DllPath.Returns(assembly);
            compiledItem.GetSemanticModel(rewrittenDocument1.SyntaxTree).Returns(semanticModel);
            _compiledAllItems.Add(compiledItem);

            var expectedLineCoverage = new[] {new LineCoverage()};
            _testRunnerMock.RunAllTestsInDocument(rewrittenDocument1,
                semanticModel,
                project1,
                Arg.Is<string[]>(x=>assembly==x[0]))
                .Returns(expectedLineCoverage);

            // act
            LineCoverage[] output = _sut.CalculateForAllTests(rewriteResult);

            // assert
            Assert.That(output, Is.EquivalentTo(expectedLineCoverage));
        }
        public void CalculateForAllTests_Should_CompileProvidedDocuments()
        {
            // arrange
            var rewrittenItemsByProject = new Dictionary<Project, List<RewrittenDocument>>();

            var workspace = new AdhocWorkspace();
            var project1 = workspace.AddProject("foo1.dll", LanguageNames.CSharp);

            RewriteResult rewriteResult = new RewriteResult(rewrittenItemsByProject);
            var rewrittenTree = CSharpSyntaxTree.ParseText("");

            var rewrittenDocument1 = new RewrittenDocument( rewrittenTree, null, false);
            rewriteResult.Items[project1] = new List<RewrittenDocument>() { rewrittenDocument1 };

            var compiledItem = Substitute.For<ICompiledItem>();
            compiledItem.Project.Returns(project1);
            _compiledAllItems.Add(compiledItem);

            // act
            _sut.CalculateForAllTests(rewriteResult);

            // assert
            _compilerMock.Received(1).Compile
                (Arg.Is<IEnumerable<CompilationItem>>(x => x.First().SyntaxTrees[0] ==
                rewriteResult.ToCompilationItems().First().SyntaxTrees[0]));
        }
        public LineCoverage[] CalculateForAllTests(RewriteResult rewritenResult)
        {
            var compiledItems = _compiler.Compile(rewritenResult.ToCompilationItems());
            var allAssemblies = compiledItems.Select(x => x.DllPath).ToArray();

            var finalCoverage = new List<LineCoverage>();

            foreach (Project project in rewritenResult.Items.Keys)
            {
                foreach (RewrittenDocument rewrittenItem in rewritenResult.Items[project])
                {
                    if (!rewrittenItem.ContainsTest)
                        continue;

                    var testProjectCompiltedItem = compiledItems.Single(x => x.Project == project);
                    ISemanticModel semanticModel = testProjectCompiltedItem.GetSemanticModel(rewrittenItem.SyntaxTree);

                    LineCoverage[] partialCoverage = _testRunner.RunAllTestsInDocument(rewrittenItem,
                        semanticModel,
                        project,
                        allAssemblies);

                    if (partialCoverage != null)
                        finalCoverage.AddRange(partialCoverage);
                }
            }
            return finalCoverage.ToArray();
        }
        public void CalculateForAllTests_Should_Return_TwoLinesCoverage_From_AllTests_When_There_AreTwoProjects_And_EachProjectHasOneLineCoverage()
        {
            // arrange
            var rewrittenItemsByProject = new Dictionary<Project, List<RewrittenDocument>>();
            var workspace = new AdhocWorkspace();
            var project1 = workspace.AddProject("foo1.dll", LanguageNames.CSharp);
            var project2 = workspace.AddProject("foo2.dll", LanguageNames.CSharp);

            RewriteResult rewriteResult = new RewriteResult(rewrittenItemsByProject);
            var rewrittenTree = CSharpSyntaxTree.ParseText("");

            var rewrittenDocument1 = new RewrittenDocument(rewrittenTree, null, true);
            rewriteResult.Items[project1] = new List<RewrittenDocument>() { rewrittenDocument1 };
            rewriteResult.Items[project2] = new List<RewrittenDocument>() { rewrittenDocument1 };

            var compiledItem1 = Substitute.For<ICompiledItem>();
            var compiledItem2 = Substitute.For<ICompiledItem>();

            compiledItem1.Project.Returns(project1);
            compiledItem2.Project.Returns(project2);

            _compiledAllItems.Add(compiledItem1);
            _compiledAllItems.Add(compiledItem2);

            var expectedLineCoverage = new[] { new LineCoverage() };
            _testRunnerMock.RunAllTestsInDocument(rewrittenDocument1,
                Arg.Any<ISemanticModel>(),
                project1,
                Arg.Any<string[]>())
                .Returns(expectedLineCoverage);

            _testRunnerMock.RunAllTestsInDocument(rewrittenDocument1,
                Arg.Any<ISemanticModel>(),
                project2,
                Arg.Any<string[]>())
                .Returns(expectedLineCoverage);

            // act
            LineCoverage[] output = _sut.CalculateForAllTests(rewriteResult);

            // assert
            Assert.That(output.Length, Is.EqualTo(2));
        }
        public void CalculateForDocument_Should_Execute_TestsInReferencedTestDocuments_When_ProvidedDocumentIsNotTestDocument()
        {
            // arrange
            var rewrittenItemsByProject = new Dictionary<Project, List<RewrittenDocument>>();
            var workspace = new AdhocWorkspace();
            var testProject = workspace.AddProject("TestProject.dll", LanguageNames.CSharp);
            var businessLogicProject = workspace.AddProject("BusinessLogicProject.dll", LanguageNames.CSharp);

            RewriteResult rewriteResult = new RewriteResult(rewrittenItemsByProject);
            var rewrittenTree = CSharpSyntaxTree.ParseText("");

            var businessLogicDocument = new RewrittenDocument( rewrittenTree, null, false);
            var testDocument = new RewrittenDocument( rewrittenTree, null, false);

            rewriteResult.Items[businessLogicProject] = new List<RewrittenDocument>() { businessLogicDocument };
            rewriteResult.Items[testProject] = new List<RewrittenDocument>() { testDocument };

            var compiledItem1 = Substitute.For<ICompiledItem>();
            compiledItem1.Project.Returns(testProject);
            _compiledSingleProjectItems.Add(compiledItem1);

            _testRunnerMock.RunAllTestsInDocument(businessLogicDocument,
                Arg.Any<ISemanticModel>(),
                businessLogicProject,
                Arg.Any<string[]>())
                .Returns((LineCoverage[])null);

            var expectedLineCoverage = new[] { new LineCoverage() };

            _testRunnerMock.RunAllTestsInDocument(testDocument,
                Arg.Any<ISemanticModel>(),
                testProject,
                Arg.Any<string[]>())
                .Returns(expectedLineCoverage);

            _testExplorerMock.GetReferencedTests(businessLogicDocument, businessLogicProject.Name)
                .Returns(new[] {testDocument});
            _solutionExplorerMock.GetProjectByDocument(testDocument.DocumentPath).Returns(testProject);

            // act
            LineCoverage[] output = _sut.CalculateForDocument(businessLogicProject, businessLogicDocument);

            // assert
            Assert.That(output, Is.EquivalentTo(expectedLineCoverage));
        }