File: DocumentationComments\XmlTagCompletionTests.cs
Web Access
Project: src\src\EditorFeatures\CSharpTest\Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using Microsoft.CodeAnalysis.Editor.CSharp.DocumentationComments;
using Microsoft.CodeAnalysis.Editor.UnitTests.DocumentationComments;
using Microsoft.CodeAnalysis.Editor.UnitTests.Extensions;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.Commanding;
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.DocumentationComments;
 
[Trait(Traits.Feature, Traits.Features.XmlTagCompletion)]
public class XmlTagCompletionTests : AbstractXmlTagCompletionTests
{
    private protected override IChainedCommandHandler<TypeCharCommandArgs> CreateCommandHandler(EditorTestWorkspace workspace)
        => workspace.ExportProvider.GetCommandHandler<XmlTagCompletionCommandHandler>(nameof(XmlTagCompletionCommandHandler), ContentTypeNames.CSharpContentType);
 
    private protected override EditorTestWorkspace CreateTestWorkspace(string initialMarkup)
        => EditorTestWorkspace.CreateCSharp(initialMarkup);
 
    [WpfFact]
    public void SimpleTagCompletion()
    {
        var text = """
            /// <goo$$
            class c { }
            """;
 
        var expected = """
            /// <goo>$$</goo>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void NestedTagCompletion()
    {
        var text = """
            /// <summary>
            /// <goo$$
            /// </summary>
            class c { }
            """;
 
        var expected = """
            /// <summary>
            /// <goo>$$</goo>
            /// </summary>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void CompleteBeforeIncompleteTag()
    {
        var text = """
            /// <goo$$
            /// </summary>
            class c { }
            """;
 
        var expected = """
            /// <goo>$$</goo>
            /// </summary>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void NotEmptyElement()
    {
        var text = """
            /// <$$
            class c { }
            """;
 
        var expected = """
            /// <>$$
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void NotAlreadyCompleteTag()
    {
        var text = """
            /// <goo$$</goo>
            class c { }
            """;
 
        var expected = """
            /// <goo>$$</goo>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void NotAlreadyCompleteTag2()
    {
        var text = """
            /// <goo$$
            ///
            /// </goo>
            class c { }
            """;
 
        var expected = """
            /// <goo>$$
            ///
            /// </goo>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void SimpleSlashCompletion()
    {
        var text = """
            /// <goo><$$
            class c { }
            """;
 
        var expected = """
            /// <goo></goo>$$
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact]
    public void NestedSlashTagCompletion()
    {
        var text = """
            /// <summary>
            /// <goo><$$
            /// </summary>
            class c { }
            """;
 
        var expected = """
            /// <summary>
            /// <goo></goo>$$
            /// </summary>
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact]
    public void SlashCompleteBeforeIncompleteTag()
    {
        var text = """
            /// <goo><$$
            /// </summary>
            class c { }
            """;
 
        var expected = """
            /// <goo></goo>$$
            /// </summary>
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact]
    public void SlashNotEmptyElement()
    {
        var text = """
            /// <><$$
            class c { }
            """;
 
        var expected = """
            /// <></$$
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact]
    public void SlashNotAlreadyCompleteTag()
    {
        var text = """
            /// <goo><$$goo>
            class c { }
            """;
 
        var expected = """
            /// <goo></$$goo>
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact]
    public void SlashNotAlreadyCompleteTag2()
    {
        var text = """
            /// <goo>
            ///
            /// <$$goo>
            class c { }
            """;
 
        var expected = """
            /// <goo>
            ///
            /// </$$goo>
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/638800")]
    public void NestedIdenticalTags()
    {
        var text = """
            /// <goo><goo$$</goo>
            class c { }
            """;
 
        var expected = """
            /// <goo><goo>$$</goo></goo>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/638800")]
    public void MultipleNestedIdenticalTags()
    {
        var text = """
            /// <goo><goo><goo$$</goo></goo>
            class c { }
            """;
 
        var expected = """
            /// <goo><goo><goo>$$</goo></goo></goo>
            class c { }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/638235")]
    public void SlashNotIfCloseTagFollows()
    {
        var text = """
            /// <summary>
            /// <$$
            /// </summary>
            class c { }
            """;
 
        var expected = """
            /// <summary>
            /// </$$
            /// </summary>
            class c { }
            """;
 
        Verify(text, expected, '/');
    }
 
    [WpfFact]
    public void TestSimpleTagCompletion()
    {
        var text = """
            /// <goo$$
            class C {}
            """;
 
        var expected = """
            /// <goo>$$</goo>
            class C {}
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void TestNestedTagCompletion()
    {
        var text = """
            /// <summary>
            /// <goo$$
            /// </summary>
            class C {}
            """;
 
        var expected = """
            /// <summary>
            /// <goo>$$</goo>
            /// </summary>
            class C {}
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void TestCompleteBeforeIncompleteTag()
    {
        var text = """
            /// <goo$$
            /// </summary>
            class C {}
            """;
 
        var expected = """
            /// <goo>$$</goo>
            /// </summary>
            class C {}
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void TestNotEmptyElement()
    {
        var text = """
            /// <$$
            class C {}
            """;
 
        var expected = """
            /// <>$$
            class C {}
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void TestNotAlreadyCompleteTag()
    {
        var text = """
            /// <goo$$</goo>
            class C {}
            """;
 
        var expected = """
            /// <goo>$$</goo>
            class C {}
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void TestNotAlreadyCompleteTag2()
    {
        var text = """
            /// <goo$$
            ///
            /// </goo>
            class C {}
            """;
 
        var expected = """
            /// <goo>$$
            ///
            /// </goo>
            class C {}
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact]
    public void TestNotOutsideDocComment()
    {
        var text = """
            class C
            {
                private int z = <goo$$
            }
            """;
 
        var expected = """
            class C
            {
                private int z = <goo>$$
            }
            """;
 
        Verify(text, expected, '>');
    }
 
    [WpfFact, WorkItem("http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/638235")]
    public void TestNotCloseClosedTag()
    {
        var text = """
            /// <summary>
            /// <$$
            /// </summary>
            class C {}
            """;
 
        var expected = """
            /// <summary>
            /// </$$
            /// </summary>
            class C {}
            """;
 
        Verify(text, expected, '/');
    }
}