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)); }
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)); }
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); }
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); }