public void AtDirectiveCompletionPoint_ReturnsFalseIfSyntaxTreeNull()
        {
            // Act
            var result = DirectiveCompletionItemProvider.AtDirectiveCompletionPoint(syntaxTree: null, location: new SourceSpan(0, 0));

            // Assert
            Assert.False(result);
        }
        public void GetDirectiveCompletionItems_ComponentDocument_DoesNotReturnsDefaultDirectivesAsCompletionItems()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@addTag", FileKinds.Component);

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

            // Assert
            Assert.Empty(completionItems);
        }
        public void IsDirectiveCompletableToken_ReturnsFalseForInvalidCSharpTokens()
        {
            // Arrange
            var csharpToken = SyntaxFactory.Token(SyntaxKind.Tilde, "~");

            // Act
            var result = DirectiveCompletionItemProvider.IsDirectiveCompletableToken(csharpToken);

            // Assert
            Assert.False(result);
        }
        public void IsDirectiveCompletableToken_ReturnsTrueForCSharpIdentifiers()
        {
            // Arrange
            var csharpToken = SyntaxFactory.Token(SyntaxKind.Identifier, "model");

            // Act
            var result = DirectiveCompletionItemProvider.IsDirectiveCompletableToken(csharpToken);

            // Assert
            Assert.True(result);
        }
        public void IsDirectiveCompletableToken_ReturnsTrueForCSharpMarkerTokens()
        {
            // Arrange
            var csharpToken = SyntaxFactory.Token(SyntaxKind.Marker, string.Empty);

            // Act
            var result = DirectiveCompletionItemProvider.IsDirectiveCompletableToken(csharpToken);

            // Assert
            Assert.True(result);
        }
        public void IsDirectiveCompletableToken_ReturnsFalseForNonCSharpTokens()
        {
            // Arrange
            var token = SyntaxFactory.Token(SyntaxKind.Text, string.Empty);

            // Act
            var result = DirectiveCompletionItemProvider.IsDirectiveCompletableToken(token);

            // Assert
            Assert.False(result);
        }
        public void IsDirectiveCompletableToken_ReturnsTrueForCSharpKeywords()
        {
            // If you're typing `@inject` and stop at `@in` it will be parsed as a C# Keyword instead of an identifier, so we have to allow them too
            // Arrange
            var csharpToken = SyntaxFactory.Token(SyntaxKind.Keyword, "in");

            // Act
            var result = DirectiveCompletionItemProvider.IsDirectiveCompletableToken(csharpToken);

            // Assert
            Assert.True(result);
        }
        public void AtDirectiveCompletionPoint_ReturnsFalseIfNoOwner()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@");
            var location   = new SourceSpan(2, 0);

            // Act
            var result = DirectiveCompletionItemProvider.AtDirectiveCompletionPoint(syntaxTree, location);

            // Assert
            Assert.False(result);
        }
        public void AtDirectiveCompletionPoint_ReturnsTrueForSimpleImplicitExpressions()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@mod");
            var location   = new SourceSpan(2, 0);

            // Act
            var result = DirectiveCompletionItemProvider.AtDirectiveCompletionPoint(syntaxTree, location);

            // Assert
            Assert.True(result);
        }
        public void AtDirectiveCompletionPoint_ReturnsFalseWhenInsideDirective()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@functions { @  }", FunctionsDirective.Directive);
            var location   = new SourceSpan(14, 0);

            // Act
            var result = DirectiveCompletionItemProvider.AtDirectiveCompletionPoint(syntaxTree, location);

            // Assert
            Assert.False(result);
        }
        public void AtDirectiveCompletionPoint_ReturnsFalseWhenInsideAttributeArea()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("<p @ >");
            var location   = new SourceSpan(4, 0);

            // Act
            var result = DirectiveCompletionItemProvider.AtDirectiveCompletionPoint(syntaxTree, location);

            // Assert
            Assert.False(result);
        }
        public void AtDirectiveCompletionPoint_ReturnsFalseWhenOwnerIsExplicitExpression()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@(something)");
            var location   = new SourceSpan(4, 0);

            // Act
            var result = DirectiveCompletionItemProvider.AtDirectiveCompletionPoint(syntaxTree, location);

            // Assert
            Assert.False(result);
        }
        public void ShouldProvideCompletions_ReturnsFalseIfNoOwner()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@");
            var location   = new SourceSpan(2, 0);
            var context    = CreateRazorCompletionContext(syntaxTree);

            // Act
            var result = DirectiveCompletionItemProvider.ShouldProvideCompletions(context, location);

            // Assert
            Assert.False(result);
        }
        public void ShouldProvideCompletions_ReturnsFalseWhenInsideAttributeArea()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("<p @ >");
            var location   = new SourceSpan(4, 0);
            var context    = CreateRazorCompletionContext(syntaxTree);

            // Act
            var result = DirectiveCompletionItemProvider.ShouldProvideCompletions(context, location);

            // Assert
            Assert.False(result);
        }
        public void ShouldProvideCompletions_ReturnsFalseWhenInsideDirective()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@functions { @  }", FunctionsDirective.Directive);
            var location   = new SourceSpan(14, 0);
            var context    = CreateRazorCompletionContext(syntaxTree);

            // Act
            var result = DirectiveCompletionItemProvider.ShouldProvideCompletions(context, location);

            // Assert
            Assert.False(result);
        }
        public void ShouldProvideCompletions_ReturnsFalseWhenOwnerIsExplicitExpression()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@(something)");
            var location   = new SourceSpan(4, 0);
            var context    = CreateRazorCompletionContext(syntaxTree);

            // Act
            var result = DirectiveCompletionItemProvider.ShouldProvideCompletions(context, location);

            // Assert
            Assert.False(result);
        }
        public void ShouldProvideCompletions_ReturnsTrueForSimpleImplicitExpressions_WhenInvoked()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@mod");
            var location   = new SourceSpan(2, 0);
            var context    = CreateRazorCompletionContext(syntaxTree);

            // Act
            var result = DirectiveCompletionItemProvider.ShouldProvideCompletions(context, location);

            // Assert
            Assert.True(result);
        }
        public void GetDirectiveCompletionItems_ReturnsDefaultDirectivesAsCompletionItems()
        {
            // Arrange
            var syntaxTree = CreateSyntaxTree("@addTag");

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

            // Assert
            Assert.Collection(
                completionItems,
                item => AssertRazorCompletionItem(DefaultDirectives[0], item),
                item => AssertRazorCompletionItem(DefaultDirectives[1], item),
                item => AssertRazorCompletionItem(DefaultDirectives[2], item));
        }
        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 GetDirectiveCompletionItems_CodeBlockCommitCharacters()
        {
            // Arrange
            var customDirective = DirectiveDescriptor.CreateCodeBlockDirective("custom", builder =>
            {
                builder.DisplayName = "code";
                builder.Description = "My Custom Code Block Directive.";
            });
            var syntaxTree = CreateSyntaxTree("@cod", customDirective);

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

            // Assert
            Assert.Collection(
                completionItems,
                item => AssertRazorCompletionItem("code", customDirective, item, DirectiveCompletionItemProvider.BlockDirectiveCommitCharacters),
                item => AssertRazorCompletionItem(DefaultDirectives[0], item),
                item => AssertRazorCompletionItem(DefaultDirectives[1], item),
                item => AssertRazorCompletionItem(DefaultDirectives[2], item));
        }
        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));
        }