public void GetCompletionAt_AtAttributeEdge_BoolAttribute_ReturnsCompletionsWithout()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test2 />", isRazorFile: false, DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(36 + Environment.NewLine.Length, 0);
            var context      = new RazorCompletionContext(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext());

            // Act
            var completions = service.GetCompletionItems(context, sourceSpan);

            // Assert
            Assert.Collection(
                completions,
                completion =>
            {
                Assert.Equal("bool-val", completion.InsertText);
                Assert.Equal(TagHelperCompletionProvider.MinimizedAttributeCommitCharacters, completion.CommitCharacters);
                Assert.Equal(CompletionSortTextHelper.HighSortPriority, completion.SortText);
            },
                completion =>
            {
                Assert.Equal("int-val", completion.InsertText);
                Assert.Equal(TagHelperCompletionProvider.AttributeCommitCharacters, completion.CommitCharacters);
                Assert.Equal(CompletionSortTextHelper.HighSortPriority, completion.SortText);
            });
        }
        public void GetCompletionAt_AtAttributeEdge_IndexerAttribute_ReturnsCompletions()
        {
            // Arrange
            var tagHelper = TagHelperDescriptorBuilder.Create("TestTagHelper", "TestAssembly");

            tagHelper.TagMatchingRule(rule => rule.TagName = "test");
            tagHelper.SetTypeName("TestTagHelper");
            tagHelper.BindAttribute(attribute =>
            {
                attribute.Name = "int-val";
                attribute.SetPropertyName("IntVal");
                attribute.TypeName = "System.Collections.Generic.IDictionary<System.String, System.Int32>";
                attribute.AsDictionary("int-val-", typeof(int).FullName);
            });
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test />", tagHelper.Build());
            var sourceSpan   = new SourceSpan(35 + Environment.NewLine.Length, 0);

            // Act
            var completions = service.GetCompletionItems(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext(), sourceSpan);

            // Assert
            Assert.Collection(
                completions,
                completion =>
            {
                Assert.Equal("int-val", completion.InsertText);
                Assert.Equal(TagHelperCompletionProvider.AttributeCommitCharacters, completion.CommitCharacters);
            },
                completion =>
            {
                Assert.Equal("int-val-", completion.InsertText);
                Assert.Empty(completion.CommitCharacters);
            });
        }
        public void GetCompletionAt_InBody_ParentRequiring_ReturnsCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test1><</test1>", isRazorFile: false, DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(37 + Environment.NewLine.Length, 0);
            var context      = new RazorCompletionContext(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext());

            // Act
            var completions = service.GetCompletionItems(context, sourceSpan);

            // Assert
            Assert.Collection(
                completions,
                completion =>
            {
                Assert.Equal("test1", completion.InsertText);
            },
                completion =>
            {
                Assert.Equal("SomeChild", completion.InsertText);
            },
                completion =>
            {
                Assert.Equal("test2", completion.InsertText);
            });
        }
        public void GetCompletionAt_HtmlAttributeValue_DoesNotReturnCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test2 class='' />", DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(43 + Environment.NewLine.Length, 0);

            // Act
            var completions = service.GetCompletionItems(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext(), sourceSpan);

            // Assert
            Assert.Empty(completions);
        }
        public void GetCompletionsAt_MalformedAttributeName_ReturnsCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test2 int->", DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(38 + Environment.NewLine.Length, 0);

            // Act
            var completions = service.GetCompletionItems(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext(), sourceSpan);

            // Assert
            AssertBoolIntCompletions(completions);
        }
        public void GetCompletionAt_InTagHelperAttribute_ReturnsCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test2 int-val='123' />", isRazorFile: false, DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(38 + Environment.NewLine.Length, 0);
            var context      = new RazorCompletionContext(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext());

            // Act
            var completions = service.GetCompletionItems(context, sourceSpan);

            // Assert
            Assert.Empty(completions);
        }
        public void GetCompletionAt_AtTagHelperElementNameEdge_ReturnsNoCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<test1 />", DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(35 + Environment.NewLine.Length, 0);
            var context      = new RazorCompletionContext(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext());

            // Act
            var completions = service.GetCompletionItems(context, sourceSpan);

            // Assert
            Assert.Empty(completions);
        }
        public void GetCompletionsAt_AttributePrefix_ReturnsCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var txt          = $"@addTagHelper *, TestAssembly{Environment.NewLine}<test2        class=''>";
            var codeDocument = CreateCodeDocument(txt, isRazorFile: false, DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(38 + Environment.NewLine.Length, 0);
            var context      = new RazorCompletionContext(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext());

            // Act
            var completions = service.GetCompletionItems(context, sourceSpan);

            // Assert
            AssertBoolIntCompletions(completions);
        }
        public void GetCompletionAt_AtEmptyTagName_ReturnsCompletions()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<", DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(30 + Environment.NewLine.Length, 0);

            // Act
            var completions = service.GetCompletionItems(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext(), sourceSpan);

            // Assert
            Assert.Collection(
                completions,
                completion => Assert.Equal("test1", completion.InsertText),
                completion => Assert.Equal("test2", completion.InsertText));
        }
        public void GetCompletionAt_KnownHtmlElement_ReturnsCompletions_DefaultPriority()
        {
            // Arrange
            var service      = new TagHelperCompletionProvider(RazorTagHelperCompletionService, HtmlFactsService, TagHelperFactsService);
            var codeDocument = CreateCodeDocument($"@addTagHelper *, TestAssembly{Environment.NewLine}<title  mutator />", isRazorFile: false, DefaultTagHelpers);
            var sourceSpan   = new SourceSpan(36 + Environment.NewLine.Length, 0);
            var context      = new RazorCompletionContext(codeDocument.GetSyntaxTree(), codeDocument.GetTagHelperContext());

            // Act
            var completions = service.GetCompletionItems(context, sourceSpan);

            // Assert
            Assert.Collection(
                completions,
                completion =>
            {
                Assert.Equal("Extra", completion.InsertText);
                Assert.Equal(TagHelperCompletionProvider.MinimizedAttributeCommitCharacters, completion.CommitCharacters);
                Assert.Equal("Extra", completion.SortText);
            });
        }