File: BlockCommentEditing\CloseBlockCommentTests.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.
 
#nullable disable
 
using Microsoft.CodeAnalysis.Editor.CSharp.BlockCommentEditing;
using Microsoft.CodeAnalysis.Editor.UnitTests;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.Commanding;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Editor.Commanding.Commands;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.BlockCommentEditing;
 
[Trait(Traits.Feature, Traits.Features.BlockCommentEditing)]
public sealed class CloseBlockCommentTests : AbstractTypingCommandHandlerTest<TypeCharCommandArgs>
{
    [WpfFact]
    public void ClosedRegularlyAfterAsterisk()
    {
        var code = """
            /*
             *
             *$$
            """;
        var expected = """
            /*
             *
             */$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void ClosedAfterAsteriskSpace1()
    {
        var code = """
            /*
             *
             * $$
            """;
        var expected = """
            /*
             *
             */$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void ClosedAfterAsteriskSpace2()
    {
        var code = """
            /*
             * $$
            """;
        var expected = """
            /*
             */$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterSlashAsteriskSpace()
    {
        var code = """
            /* $$
            """;
        var expected = """
            /* /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterSlashDoubleAsteriskSpace()
    {
        var code = """
            /** $$
            """;
        var expected = """
            /** /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterSpaceWithoutAsterisk()
    {
        var code = """
            /*
             *
               $$
            """;
        var expected = """
            /*
             *
               /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithNonWhitespaceBeforeAsterisk1()
    {
        var code = """
            /*
             *
            ** $$
            """;
        var expected = """
            /*
             *
            ** /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithNonWhitespaceBeforeAsterisk2()
    {
        var code = """
            /*
             *
            /* $$
            """;
        var expected = """
            /*
             *
            /* /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithNonWhitespaceBeforeAsterisk3()
    {
        var code = """
                /*
                 *
            a    * $$
            """;
        var expected = """
                /*
                 *
            a    * /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithNonWhitespaceAfterCursor1()
    {
        var code = """
            /*
             *
             * $$/
            """;
        var expected = """
            /*
             *
             * /$$/
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithNonWhitespaceAfterCursor2()
    {
        var code = """
            /*
             *
             * $$*
            """;
        var expected = """
            /*
             *
             * /$$*
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithNonWhitespaceAfterCursor3()
    {
        var code = """
            /*
             *
             * $$ a
            """;
        var expected = """
            /*
             *
             * /$$ a
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithWhitespaceAfterCursor()
    {
        // Note: There is a single trailing space after the cursor.
        var code = """
            /*
             *
             * $$ 
            """;
        var expected = """
            /*
             *
             * /$$ 
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskDoubleSpace()
    {
        var code = """
            /*
             *
             *  $$
            """;
        var expected = """
            /*
             *
             *  /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void ClosedAfterAsteriskSpaceWithNothingBeforeAsterisk()
    {
        var code = """
                /*
                 *
            * $$
            """;
        var expected = """
                /*
                 *
            */$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void ClosedAfterAsteriskSpaceWithTabsBeforeAsterisk()
    {
        var code = """
                /*
                 *
            <tab><tab>* $$
            """;
        var expected = """
                /*
                 *
            <tab><tab>*/$$
            """;
        VerifyTabs(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceWithOptionOff()
    {
        var code = """
            /*
             *
             * $$
            """;
        var expected = """
            /*
             *
             * /$$
            """;
        Verify(code, expected, workspace =>
        {
            var globalOptions = workspace.GetService<IGlobalOptionService>();
            globalOptions.SetGlobalOption(BlockCommentEditingOptionsStorage.AutoInsertBlockCommentStartString, LanguageNames.CSharp, false);
        });
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceOutsideComment()
    {
        var code = """
            / *
              *
              * $$
            """;
        var expected = """
            / *
              *
              * /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceInsideString()
    {
        var code = """
            class C
            {
                string s = @"
                /*
                 *
                 * $$
            """;
        var expected = """
            class C
            {
                string s = @"
                /*
                 *
                 * /$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void ClosedAfterAsteriskSpaceEndOfFile()
    {
        var code = """
            /*
             * $$
            """;
        var expected = """
            /*
             */$$
            """;
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterAsteriskSpaceStartOfFile()
    {
        var code = @"* $$";
        var expected = @"* /$$";
 
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAfterSpaceStartOfFile()
    {
        var code = @" $$";
        var expected = @" /$$";
 
        Verify(code, expected);
    }
 
    [WpfFact]
    public void NotClosedAtStartOfFile()
    {
        var code = @"$$";
        var expected = @"/$$";
 
        Verify(code, expected);
    }
 
    protected override EditorTestWorkspace CreateTestWorkspace(string initialMarkup)
        => EditorTestWorkspace.CreateCSharp(initialMarkup);
 
    protected override (TypeCharCommandArgs, string insertionText) CreateCommandArgs(ITextView textView, ITextBuffer textBuffer)
        => (new TypeCharCommandArgs(textView, textBuffer, '/'), "/");
 
    internal override ICommandHandler<TypeCharCommandArgs> GetCommandHandler(EditorTestWorkspace workspace)
        => Assert.IsType<CloseBlockCommentCommandHandler>(workspace.GetService<ICommandHandler>(ContentTypeNames.CSharpContentType, nameof(CloseBlockCommentCommandHandler)));
}