public TestRunResult(string testName, AuditVariablePlaceholder[] auditVariables, string errorMessage, bool assertionFailed)
 {
     _assertionFailed = assertionFailed;
     TestName = testName;
     AuditVariables = auditVariables;
     ErrorMessage = errorMessage;
 }
        public void ShouldNot_RemoveOriginalNodeContainingLocalVariable()
        {
            const string sourceCode = @"namespace SampleNamespace
                                {
                                    class SampleClass
                                    {
                                        public void SampleMethod()
                                        {
                                            int a=4;
                                        }
                                    }
                                }";

            var tree = CSharpSyntaxTree.ParseText(sourceCode);

            AuditVariablePlaceholder[] auditVariablePlaceholders = new AuditVariablePlaceholder[1];
            auditVariablePlaceholders[0] = new AuditVariablePlaceholder(null, null, 0);
            _auditVariablesWalkerMock.Walk(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<SyntaxNode>()).Returns(auditVariablePlaceholders);

            var rewrittenDoc = _rewriter.Rewrite("projectName", "documentPath", tree.GetRoot());

            SyntaxNode originalNode = rewrittenDoc.SyntaxTree.
                GetRoot().
                DescendantNodes().OfType<BlockSyntax>().First().ChildNodes().Last();

            Assert.That(originalNode.ToString().Trim(), Is.EqualTo("int a=4;"));
        }
        public void GenerateInitAuditVariableCode_Should_CreateValidCode()
        {
            const string expectedSourceCode =
                "new AuditVariable(){NodePath=\"A.B.C.D\",DocumentPath=@\"HelloWorld.cs\",Span=123, ExecutionCounter=AuditVariablesAutoGenerated941C.ExecutionCounter++}";

            var variable = new AuditVariablePlaceholder("HelloWorld.cs", "A.B.C.D", 123);

            string classSourceCode = variable.GetInitializationCode();

            Assert.That(classSourceCode, Is.EqualTo(expectedSourceCode));
        }
        public void EvaluateAuditVariable_Should_Extract_Span()
        {
            // arrange
            var variable = new AuditVariablePlaceholder(@"c:\HelloWorld.cs", "node_path", 243);
            var testNode = CSharpSyntaxTree.ParseText("");

            // act
            var coverage = LineCoverage.EvaluateAuditVariable(variable, testNode.GetRoot(), "HelloWorldTestsSample", "HelloWorldTests");

            // act
            Assert.That(coverage.Span, Is.EqualTo(243));
        }
        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 EvaluateAuditVariable_Should_Extract_TestPath()
        {
            // arrange
            var variable = new AuditVariablePlaceholder(null,"HelloWorldSample.HelloWorld.HelloWorld.Method_243",1);
            var testNode = CSharpSyntaxTree.ParseText("class HelloWorldTests{" +
                                                      " public void Method()" +
                                                      "{}" +
                                                      "}");

            var testMethodNode = testNode.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>().First();

            // act
            var coverage = LineCoverage.EvaluateAuditVariable(variable, testMethodNode, "HelloWorldTestsSample", "HelloWorldTests");

            // act
            Assert.That(coverage.TestPath,Is.EqualTo("HelloWorldTestsSample.HelloWorldTests.HelloWorldTests.Method"));
        }
        public void GetCoverage_ShouldReturnEmptyCoverage_When_ThereAreNoAuditVariables()
        {
            // arrange
            var variables = new AuditVariablePlaceholder[0];

            var testResult = new TestRunResult("test_name", variables, "error", false);

            var testNode = CSharpSyntaxTree.ParseText("class HelloWorldTests{" +
                                                      " public void TestMethod()" +
                                                      "{}" +
                                                      "}");

            var testMethodNode = testNode.GetRoot().DescendantNodes().OfType<MethodDeclarationSyntax>().Single();

            // act
            LineCoverage[] totalCoverage = testResult.GetCoverage(testMethodNode, "SampleHelloWorldTests", @"c:\HelloWorldTests.cs");

            // assert
            Assert.That(totalCoverage.Length, Is.EqualTo(0));
        }
        public void Should_CallNodeWalker()
        {
            const string sourceCode = @"namespace SampleNamespace
                                {
                                    class SampleClass
                                    {
                                        public void SampleMethod()
                                        {
                                            if(true)
                                            {
                                               if(true)
                                               {

                                               }
                                            }
                                        }
                                    }
                                }";
            const string documentPath = "documentPath";
            const string projectName = "projectName";

            var tree = CSharpSyntaxTree.ParseText(sourceCode);

            AuditVariablePlaceholder[] auditVariablePlaceholders = new AuditVariablePlaceholder[2];
            auditVariablePlaceholders[0] = new AuditVariablePlaceholder(null, null, 0);
            auditVariablePlaceholders[1] = new AuditVariablePlaceholder(null, null, 0);

            _auditVariablesWalkerMock.Walk(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<SyntaxNode>())
                .Returns(auditVariablePlaceholders);

            SyntaxNode root = tree.GetRoot();
            _rewriter.Rewrite(projectName, documentPath, root);

            _auditVariablesWalkerMock.Received(1).Walk(projectName, documentPath, root);
        }
        public void Should_RewriteInlineWhile_To_BlockStatementWithAuditVariable()
        {
            const string sourceCode = @"namespace SampleNamespace
                                {
                                    class SampleClass
                                    {
                                        public void SampleMethod()
                                        {
                                            while(true)
                                                a++;
                                        }
                                    }
                                }";

            var tree = CSharpSyntaxTree.ParseText(sourceCode);

            AuditVariablePlaceholder[] auditVariablePlaceholders = new AuditVariablePlaceholder[2];
            auditVariablePlaceholders[0] = new AuditVariablePlaceholder(null, null, 0);
            auditVariablePlaceholders[1] = new AuditVariablePlaceholder(null, "WhileNode", 0);

            _auditVariablesWalkerMock.Walk(Arg.Any<string>(), Arg.Any<string>(), Arg.Any<SyntaxNode>())
                .Returns(auditVariablePlaceholders);

            // act
            var rewrittenDoc = _rewriter.Rewrite("projectName", "documentPath", tree.GetRoot());

            // assert
            var whileStatement = rewrittenDoc.SyntaxTree.GetRoot().
                DescendantNodes().OfType<WhileStatementSyntax>().Single();
            var statements =
                whileStatement.ChildNodes()
                    .OfType<BlockSyntax>()
                    .Single()
                    .DescendantNodes()
                    .OfType<StatementSyntax>()
                    .ToArray();

            Assert.That(statements.Length, Is.EqualTo(2));
            Assert.That(statements[0].ToFullString(), Is.StringContaining("WhileNode"));
        }
        private void CreateAuditVariable(StatementSyntax statement)
        {
            string documentName = Path.GetFileNameWithoutExtension(_documentPath);
            int span = statement.SpanStart - statement.GetParentMethod().SpanStart;
            string nodePath = NodePathBuilder.BuildPath(statement, documentName, _projectName);
            var auditVariablePlaceholder = new AuditVariablePlaceholder(_documentPath,
                nodePath,
                span);

            _auditVariablePlaceholders.Add(auditVariablePlaceholder);
        }