public void GetReferencedTests_Should_ReturnDocumentContainingTest_When_CoverageWasBeforeCalculated()
        {
            // arrange
            var tree = CSharpSyntaxTree.ParseText("public class MathHelper" +
                                                  "{ public int Divide(int a,b) {return a/b;}}");
            var testTree = CSharpSyntaxTree.ParseText(@"class MathHelperTests{ public void DivideTest();}}");

            var lineCoverage = new LineCoverage
            {
                NodePath = "Math.MathHelper.MathHelper.Divide",
                TestDocumentPath = @"c:\\MathHelperTests.cs",
                TestPath = "MathTests.MathHelperTests.MathHelperTests.DivideTest"
            };

            _coverageStoreMock.ReadAll().Returns(new[] { lineCoverage });
            _solutionExplorerMock.OpenFile(lineCoverage.TestDocumentPath).Returns(testTree);

            var document = new RewrittenDocument( tree, @"c:\MathHelper.cs",false);

            // act
            RewrittenDocument[] output = _sut.GetReferencedTests(document, "Math");

            // assert
            Assert.That(output.Length,Is.EqualTo(1));
            Assert.That(output[0].DocumentPath,Is.EqualTo(lineCoverage.TestDocumentPath));
            Assert.That(output[0].SyntaxTree, Is.EqualTo(testTree));
        }
        public void LoadCurrentCoverage_Should_ClearPreviousCoverage_BeforeLoadingDataFromStore()
        {
            // arrange
            var doc1Coverage = new LineCoverage { DocumentPath = "doc1.cs" };

            _coverageStoreMock.ReadAll().Returns(new[] { doc1Coverage });
            _sut.SolutionCoverageByDocument.Add("oldDocument.cs", new List<LineCoverage>());

            // act
            _sut.LoadCurrentCoverage();

            // assert
            Assert.That(_sut.SolutionCoverageByDocument.Count, Is.EqualTo(1));
            Assert.That(_sut.SolutionCoverageByDocument.Keys.First(), Is.EqualTo("doc1.cs"));
        }
        public static LineCoverage EvaluateAuditVariable(
            AuditVariablePlaceholder variableName,
            SyntaxNode testMethodNode,
            string testProjectName,
            string testDocName)
        {
            LineCoverage lineCoverage = new LineCoverage
            {
                TestPath = NodePathBuilder.BuildPath(testMethodNode, testDocName, testProjectName),
                NodePath = variableName.NodePath,
                Span = variableName.SpanStart
            };

            return lineCoverage;
        }
        public void LoadCurrentCoverage_Should_LoadDataForAllDocuments()
        {
            // arrange
            var doc1Coverage = new LineCoverage { DocumentPath = "doc1.cs" };
            var doc2Coverage = new LineCoverage { DocumentPath = "doc2.cs" };

            _coverageStoreMock.ReadAll().Returns(new[] { doc1Coverage, doc2Coverage });

            // act
            _sut.LoadCurrentCoverage();

            // assert
            Assert.That(_sut.SolutionCoverageByDocument.Count, Is.EqualTo(2));
            Assert.That(_sut.SolutionCoverageByDocument["doc1.cs"].Count, Is.EqualTo(1));
            Assert.That(_sut.SolutionCoverageByDocument["doc2.cs"].Count, Is.EqualTo(1));

            Assert.That(_sut.SolutionCoverageByDocument["doc1.cs"].First(), Is.EqualTo(doc1Coverage));
            Assert.That(_sut.SolutionCoverageByDocument["doc2.cs"].First(), Is.EqualTo(doc2Coverage));
        }
        public async Task CalculateForMethod_Should_RemoveOldCoverageValues()
        {
            // arrange
            const string code = "class MathHelperTests{" +
                                " [Test] public void Test() " +
                                "{}" +
                                "}";
            var tree = CSharpSyntaxTree.ParseText(code);
            var method = tree.GetRoot().GetPublicMethods().First();

            const string testDocumentPath = "MathHelperTests.cs";

            var oldTestLineCoverage = new LineCoverage();
            oldTestLineCoverage.DocumentPath = testDocumentPath;
            oldTestLineCoverage.NodePath = "CurrentProject.MathHelperTests.Test";
            oldTestLineCoverage.TestPath = "CurrentProject.MathHelperTests.Test";

            var newTestLineCoverage = new LineCoverage();
            newTestLineCoverage.DocumentPath = testDocumentPath;
            newTestLineCoverage.NodePath = "CurrentProject.MathHelperTests.Test";
            newTestLineCoverage.TestPath = "CurrentProject.MathHelperTests.Test";

            _sut.SolutionCoverageByDocument.Add(testDocumentPath, new List<LineCoverage>() { oldTestLineCoverage });

            _solutionCoverageEngineMock.CalculateForMethod(Arg.Any<string>(), Arg.Any<MethodDeclarationSyntax>()).
                Returns(new CoverageResult(new[] { newTestLineCoverage }));

            // act
            await _sut.CalculateForSelectedMethodAsync("CurrentProject", method);

            // assert
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath].Count, Is.EqualTo(1));
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath].First(), Is.EqualTo(newTestLineCoverage));
        }
        public async Task CalculateForDocument_ShouldClearAllCoverage_When_CompilationExceptionIsThrown()
        {
            // arrange
            const string documentPath = "EmployeeRepository.cs";
            var lineCoverage = new LineCoverage();
            lineCoverage.TestPath = lineCoverage.NodePath = "CurrentProject.MathHelperTests";

            _sut.SolutionCoverageByDocument.Add(documentPath, new List<LineCoverage>() { lineCoverage });
            _solutionCoverageEngineMock.CalculateForDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).
                Returns(new CoverageResult(new LineCoverage[0]));
            // act
            await _sut.CalculateForDocumentAsync("CurrentProject", documentPath, string.Empty);

            // assert
            Assert.That(_sut.SolutionCoverageByDocument[documentPath].Count, Is.EqualTo(1));
        }
        public async Task CalculateForAllDocuments_ShouldNot_ClearCoverageOfUnrelatedDocuments()
        {
            // arrange
            var testLineCoverage = new LineCoverage();
            testLineCoverage.NodePath = "CurrentProject.MathHelperTests";
            testLineCoverage.TestPath = "CurrentProject.MathHelperTests";

            var codeLineCoverage = new LineCoverage();
            codeLineCoverage.NodePath = "CurrentProject.MathHelper";
            codeLineCoverage.TestPath = "CurrentProject.MathHelperTests";

            _sut.SolutionCoverageByDocument.Add("doc1.xml", new List<LineCoverage>() { testLineCoverage, codeLineCoverage });
            _solutionCoverageEngineMock.CalculateForAllDocumentsAsync().
                Throws(new TestCoverageCompilationException(new string[0]));

            // act
            await _sut.CalculateForAllDocumentsAsync();

            // assert
            Assert.That(_sut.SolutionCoverageByDocument.Count, Is.EqualTo(0));
        }
        public async Task CalculateForDocument_Should_PopulateCoverageWithNewData_When_NewDataIsAvailable()
        {
            // arrange
            const string newDocumentPath = "MathHelper.cs";

            var coverage = new LineCoverage { DocumentPath = newDocumentPath };

            _solutionCoverageEngineMock.CalculateForDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).
                Returns(new CoverageResult(new[] { coverage }));

            // act

            await _sut.CalculateForDocumentAsync("CurrentProject", "MathHelperTests.cs", string.Empty);

            // assert
            Assert.That(_sut.SolutionCoverageByDocument[newDocumentPath].Count, Is.EqualTo(1));
            Assert.That(_sut.SolutionCoverageByDocument[newDocumentPath][0], Is.EqualTo(coverage));
        }
        public async Task CalculateForDocument_Should_RemoveOldCoverageValues()
        {
            // arrange
            const string testDocumentPath = "MathHelperTests.cs";

            var oldTestLineCoverage = new LineCoverage();
            oldTestLineCoverage.DocumentPath = testDocumentPath;
            oldTestLineCoverage.NodePath = "CurrentProject.MathHelperTests";
            oldTestLineCoverage.TestPath = "CurrentProject.MathHelperTests";

            var newTestLineCoverage = new LineCoverage();
            newTestLineCoverage.DocumentPath = testDocumentPath;
            newTestLineCoverage.NodePath = "CurrentProject.MathHelperTests";
            newTestLineCoverage.TestPath = "CurrentProject.MathHelperTests";

            _sut.SolutionCoverageByDocument.Add(testDocumentPath, new List<LineCoverage>() { oldTestLineCoverage });

            _solutionCoverageEngineMock.CalculateForDocument(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<string>()).
                Returns(new CoverageResult(new[] { newTestLineCoverage }));

            // act
            await _sut.CalculateForDocumentAsync("CurrentProject", testDocumentPath, string.Empty);

            // assert
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath].Count, Is.EqualTo(1));
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath].First(), Is.EqualTo(newTestLineCoverage));
        }
        public async Task When_CalculateForMethod_Fails_Should_MarkCoverageAsFaileddOnlyFromExecutedPath()
        {
            // arrange
            const string code = "class MathHelperTests{" +
                                " [Test] public void Test() " +
                                "{}" +
                                " [Test] public void Test2() " +
                                "{}" +
                                "}";

            var tree = CSharpSyntaxTree.ParseText(code);
            var method = tree.GetRoot().GetPublicMethods()[1];
            const string testDocumentPath = "MathHelperTests.cs";

            var oldTestLineCoverage1 = new LineCoverage();
            oldTestLineCoverage1.DocumentPath = testDocumentPath;
            oldTestLineCoverage1.NodePath = "CurrentProject..MathHelperTests.AnotherTest";
            oldTestLineCoverage1.TestPath = "CurrentProject..MathHelperTests.AnotherTest";

            var coverageToBeRecalculated = new LineCoverage();
            coverageToBeRecalculated.DocumentPath = testDocumentPath;
            coverageToBeRecalculated.NodePath = "CurrentProject..MathHelperTests.Test2";
            coverageToBeRecalculated.TestPath = "CurrentProject..MathHelperTests.Test2";

            _sut.SolutionCoverageByDocument.Add(testDocumentPath, new List<LineCoverage>() { oldTestLineCoverage1, coverageToBeRecalculated });

            _solutionCoverageEngineMock.CalculateForMethod(Arg.Any<string>(), Arg.Any<MethodDeclarationSyntax>()).
                Throws(new TestCoverageCompilationException(new string[1]));

            // act
            await _sut.CalculateForSelectedMethodAsync("CurrentProject", method);

            // assert
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath].Count, Is.EqualTo(2));
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath][0], Is.EqualTo(oldTestLineCoverage1));

            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath][1].NodePath, Is.EqualTo(coverageToBeRecalculated.NodePath));
            Assert.That(_sut.SolutionCoverageByDocument[testDocumentPath][1].TestPath, Is.EqualTo(coverageToBeRecalculated.TestPath));
            Assert.IsFalse(_sut.SolutionCoverageByDocument[testDocumentPath][1].IsSuccess);
            Assert.IsNotNull(_sut.SolutionCoverageByDocument[testDocumentPath][1].ErrorMessage);
        }
        private void InsertLineCoverage(SqlCeConnection connection, LineCoverage[] coverage)
        {
            using (DataTable table = new DataTable())
            {
                table.Columns.Add("NodePath");
                table.Columns.Add("TestPath");
                table.Columns.Add("DocumentPath");
                table.Columns.Add("TestDocumentPath");
                table.Columns.Add("Span");
                table.Columns.Add("IsSuccess");
                table.Columns.Add("ErrorMessage");

                foreach (var lineCoverage in coverage)
                {
                    DataRow row = table.NewRow();
                    row["NodePath"] = lineCoverage.NodePath;
                    row["TestPath"] = lineCoverage.TestPath;
                    row["DocumentPath"] = lineCoverage.DocumentPath;
                    row["TestDocumentPath"] = lineCoverage.TestDocumentPath;
                    row["Span"] = lineCoverage.Span;
                    row["IsSuccess"] = lineCoverage.IsSuccess;
                    row["ErrorMessage"] = lineCoverage.ErrorMessage.Truncate(4000);

                    table.Rows.Add(row);
                }

                DoBulkCopy(connection, new DataTableReader(table));
            }
        }
 public CoverageResult(LineCoverage[] coverage)
 {
     CoverageByDocument = coverage.
         GroupBy(x => x.DocumentPath).
         ToDictionary(x => x.Key, x => x.ToArray());
 }