public async Task Syntax_Tree_Has_Extra_Statements_When_Everything_Is_Augmented()
        {
            // arrange
            var document   = Sources.GetDocument(Sources.withMultipleMethodsAndComplexLayout);
            var syntaxTree = await document.GetSyntaxTreeAsync();

            var augmentations = syntaxTree.GetRoot()
                                .DescendantNodes()
                                .Where(n => n is StatementSyntax)
                                .Select(n => new Augmentation((StatementSyntax)n, null, null, null, null));
            var augMap = new AugmentationMap(augmentations.ToArray());

            var rewriter = new InstrumentationSyntaxRewriter(
                augMap.Data.Keys,
                new VariableLocationMap(),
                augMap
                );

            // act
            var newTree           = rewriter.ApplyToTree(syntaxTree);
            var newStatementCount = newTree.GetRoot().DescendantNodes().Count(n => n is StatementSyntax);

            // assert
            Assert.Equal(24, newStatementCount);
        }
        public async Task Syntax_Tree_Has_Locals_When_Augmentation_Has_Locals()
        {
            // arrange
            var document   = Sources.GetDocument(Sources.withMultipleMethodsAndComplexLayout);
            var syntaxTree = await document.GetSyntaxTreeAsync();

            var statement = (StatementSyntax)syntaxTree.GetRoot().DescendantNodes().Single(n => n.ToString() == @"Console.WriteLine(""Entry Point"");");

            var locals        = (await document.GetSemanticModelAsync()).LookupSymbols(310).Where(s => s.Kind == SymbolKind.Local);
            var augmentations = new[] { new Augmentation(statement, locals, null, null, null) };

            var augMap   = new AugmentationMap(augmentations.ToArray());
            var rewriter = new InstrumentationSyntaxRewriter(
                augMap.Data.Keys,
                new VariableLocationMap(),
                augMap
                );

            // act
            var newTree    = rewriter.ApplyToTree(syntaxTree);
            var treeString = newTree.ToString();

            // assert
            Assert.Contains("\\\"name\\\":\\\"j\\\"", treeString);
            Assert.Contains("\\\"name\\\":\\\"k\\\"", treeString);
            Assert.Contains("\\\"name\\\":\\\"p\\\"", treeString);
        }
        public async Task Syntax_Tree_Has_A_Single_Extra_Statement_When_There_Is_One_Augmentation()
        {
            // arrange
            var document   = Sources.GetDocument(Sources.simple);
            var syntaxTree = await document.GetSyntaxTreeAsync();

            var statementCount = syntaxTree.GetRoot().DescendantNodes().Count(n => n is StatementSyntax);
            var statement      = (StatementSyntax)syntaxTree.GetRoot().DescendantNodes().Single(n => n.ToString() == @"Console.WriteLine(""Entry Point"");");

            var augmentation = new Augmentation(statement, null, null, null, null);
            var augMap       = new AugmentationMap(augmentation);

            var rewriter = new InstrumentationSyntaxRewriter(
                augMap.Data.Keys,
                new VariableLocationMap(),
                augMap
                );

            // act
            var newTree           = rewriter.ApplyToTree(syntaxTree);
            var newStatementCount = newTree.GetRoot().DescendantNodes().Count(n => n is StatementSyntax);

            // assert
            Assert.Equal(statementCount + 1, newStatementCount);
        }