public void Execute_AutomaticallyOverridesImportedSingleLineSinglyOccurringDirective_MainDocument()
    {
        // Arrange
        var directive = DirectiveDescriptor.CreateSingleLineDirective(
            "custom",
            builder =>
        {
            builder.AddStringToken();
            builder.Usage = DirectiveUsage.FileScopedSinglyOccurring;
        });
        var phase  = new DefaultRazorIntermediateNodeLoweringPhase();
        var engine = RazorProjectEngine.CreateEmpty(b =>
        {
            b.Phases.Add(phase);
            b.Features.Add(new DefaultRazorCodeGenerationOptionsFeature(designTime: false));
            b.AddDirective(directive);
        });
        var options      = RazorParserOptions.Create(builder => builder.Directives.Add(directive));
        var importSource = TestRazorSourceDocument.Create("@custom \"hello\"", filePath: "import.cshtml");
        var codeDocument = TestRazorCodeDocument.Create("@custom \"world\"");

        codeDocument.SetSyntaxTree(RazorSyntaxTree.Parse(codeDocument.Source, options));
        codeDocument.SetImportSyntaxTrees(new[] { RazorSyntaxTree.Parse(importSource, options) });

        // Act
        phase.Execute(codeDocument);

        // Assert
        var documentNode     = codeDocument.GetDocumentIntermediateNode();
        var customDirectives = documentNode.FindDirectiveReferences(directive);
        var customDirective  = (DirectiveIntermediateNode)Assert.Single(customDirectives).Node;
        var stringToken      = Assert.Single(customDirective.Tokens);

        Assert.Equal("\"world\"", stringToken.Content);
    }
    public void Build_ValidatesDirectiveKeyword_InvalidCharacter()
    {
        // Arrange & Act
        var ex = Assert.Throws <InvalidOperationException>(() => DirectiveDescriptor.CreateSingleLineDirective("test_directive"));

        // Assert
        Assert.Equal("Invalid directive keyword 'test_directive'. Directives must have a non-empty keyword that consists only of letters.", ex.Message);
    }
    public void CreateSingleLineDirective_CreatesSingleLineDirective()
    {
        // Arrange & Act
        var directive = DirectiveDescriptor.CreateSingleLineDirective("test");

        // Assert
        Assert.Equal("test", directive.Directive);
        Assert.Equal(DirectiveKind.SingleLine, directive.Kind);
    }
    public void Build_ValidatesDirectiveName_NonOptionalTokenFollowsOptionalToken()
    {
        // Arrange & Act
        var ex = Assert.Throws <InvalidOperationException>(
            () => DirectiveDescriptor.CreateSingleLineDirective("test", b => { b.AddOptionalMemberToken(); b.AddMemberToken(); }));

        // Assert
        Assert.Equal("A non-optional directive token cannot follow an optional directive token.", ex.Message);
    }
    public void FindDirectiveReferences_FindsMatchingDirectives()
    {
        // Arrange
        var directive  = DirectiveDescriptor.CreateSingleLineDirective("test");
        var directive2 = DirectiveDescriptor.CreateSingleLineDirective("test");

        var document   = new DocumentIntermediateNode();
        var @namespace = new NamespaceDeclarationIntermediateNode();

        var builder = IntermediateNodeBuilder.Create(document);

        builder.Push(@namespace);

        var match1 = new DirectiveIntermediateNode()
        {
            Directive = directive,
        };

        builder.Add(match1);

        var nonMatch = new DirectiveIntermediateNode()
        {
            Directive = directive2,
        };

        builder.Add(nonMatch);

        var match2 = new DirectiveIntermediateNode()
        {
            Directive = directive,
        };

        builder.Add(match2);

        // Act
        var results = document.FindDirectiveReferences(directive);

        // Assert
        Assert.Collection(
            results,
            r =>
        {
            Assert.Same(@namespace, r.Parent);
            Assert.Same(match1, r.Node);
        },
            r =>
        {
            Assert.Same(@namespace, r.Parent);
            Assert.Same(match2, r.Node);
        });
    }
    public void CreateSingleLineDirective_WithConfigure_CreatesSingleLineDirective()
    {
        // Arrange
        var called = false;
        Action <IDirectiveDescriptorBuilder> configure = b => { called = true; };

        // Act
        var directive = DirectiveDescriptor.CreateSingleLineDirective("test", configure);

        // Assert
        Assert.Equal("test", directive.Directive);
        Assert.Equal(DirectiveKind.SingleLine, directive.Kind);
        Assert.True(called);
    }
        public void GetDirectiveCompletionItems_ReturnsCustomDirectivesAsCompletionItems()
        {
            // Arrange
            var customDirective = DirectiveDescriptor.CreateSingleLineDirective("custom", builder => builder.Description = "My Custom Directive.");
            var syntaxTree      = CreateSyntaxTree("@addTag", customDirective);

            // Act
            var completionItems = DirectiveCompletionItemProvider.GetDirectiveCompletionItems(syntaxTree);

            // Assert
            Assert.Collection(
                completionItems,
                item => AssertRazorCompletionItem(customDirective, item),
                item => AssertRazorCompletionItem(DefaultDirectives[0], item),
                item => AssertRazorCompletionItem(DefaultDirectives[1], item),
                item => AssertRazorCompletionItem(DefaultDirectives[2], item));
        }
Esempio n. 8
0
        public void GetCompletionItems_ProvidesCompletionsForDirectivesWithoutDescription()
        {
            // Arrange
            var customDirective      = DirectiveDescriptor.CreateSingleLineDirective("custom");
            var codeDocumentProvider = CreateCodeDocumentProvider("@", new[] { customDirective });
            var completionProvider   = new RazorDirectiveCompletionProvider(codeDocumentProvider);
            var document             = CreateDocument();

            codeDocumentProvider.Value.TryGetFromDocument(document, out var codeDocument);
            var syntaxTree = codeDocument.GetSyntaxTree();

            // Act
            var completionItems = completionProvider.GetCompletionItems(syntaxTree);

            // Assert
            var customDirectiveCompletion = Assert.Single(completionItems, item => item.DisplayText == customDirective.Directive);

            AssertRazorCompletionItemDefaults(customDirectiveCompletion);
            Assert.DoesNotContain(customDirectiveCompletion.Properties, property => property.Key == RazorDirectiveCompletionProvider.DescriptionKey);
        }
        public void GetDirectiveCompletionItems_UsesDisplayNamesWhenNotNull()
        {
            // Arrange
            var customDirective = DirectiveDescriptor.CreateSingleLineDirective("custom", builder =>
            {
                builder.DisplayName = "different";
                builder.Description = "My Custom Directive.";
            });
            var syntaxTree = CreateSyntaxTree("@addTag", customDirective);

            // Act
            var completionItems = DirectiveCompletionItemProvider.GetDirectiveCompletionItems(syntaxTree);

            // Assert
            Assert.Collection(
                completionItems,
                item => AssertRazorCompletionItem("different", customDirective, item),
                item => AssertRazorCompletionItem(DefaultDirectives[0], item),
                item => AssertRazorCompletionItem(DefaultDirectives[1], item),
                item => AssertRazorCompletionItem(DefaultDirectives[2], item));
        }
Esempio n. 10
0
        public void GetDesiredIndentation_ReturnsNull_IfOwningSpanIsNone()
        {
            // Arrange
            var customDirective = DirectiveDescriptor.CreateSingleLineDirective("custom");
            var source          = new StringTextSnapshot($@"
@custom
");
            var syntaxTree      = GetSyntaxTree(source, new[] { customDirective });
            var service         = new DefaultRazorIndentationFactsService();

            // Act
            var indentation = service.GetDesiredIndentation(
                syntaxTree,
                source,
                source.GetLineFromLineNumber(2),
                indentSize: 4,
                tabSize: 1);

            // Assert
            Assert.Null(indentation);
        }
Esempio n. 11
0
        public void GetDesiredIndentation_ReturnsNull_IfOwningSpanIsNone()
        {
            // Arrange
            var customDirective = DirectiveDescriptor.CreateSingleLineDirective("custom");
            var source          = $@"
@custom
";
            var syntaxTree      = GetSyntaxTree(source, new[] { customDirective });
            var service         = new DefaultRazorIndentationFactsService();

            // Act
            var indentation = service.GetDesiredIndentation(
                syntaxTree,
                previousLineEndIndex: GetLineEndIndexForLine(source, 1),
                getLineContent: line => GetLineContent(source, line),
                indentSize: 4,
                tabSize: 1);

            // Assert
            Assert.Null(indentation);
        }