File: CommentSelection\CSharpToggleLineCommentCommandHandlerTests.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 System;
using System.Linq;
using Microsoft.CodeAnalysis.CommentSelection;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Test.Utilities.CommentSelection;
using Microsoft.VisualStudio.Commanding;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CommentSelection;
 
[UseExportProvider]
[Trait(Traits.Feature, Traits.Features.ToggleLineComment)]
public class CSharpToggleLineCommentCommandHandlerTests : AbstractToggleCommentTestBase
{
    [WpfFact]
    public void AddComment_EmptyCaret()
    {
        var markup = @"$$";
        var expected = @"[||]";
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_EmptySelection()
    {
        var markup = @"[| |]";
        var expected = @"[||]";
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_CaretInUncommentedLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var$$ i = 1;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var[||] i = 1;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_CaretBeforeUncommentedLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
            $$        var i = 1;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
            [||]        //var i = 1;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_SingleLineSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|var i = 1;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_PartialSingleLineSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var [|i = 1;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var [|i = 1;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_SingleLineWithWhitespaceSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
            [|
                    var i = 1;
               |]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
            [|
                    //var i = 1;
               |]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_SelectionInsideCommentAtEndOfLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var i = 1; // A [|comment|].
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var i = 1; // A [|comment|].
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_SelectionAroundCommentAtEndOfLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var i = 1; [|// A comment.|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var i = 1; [|// A comment.|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_SelectionOutsideCommentAtEndOfLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|var i = 1; // A comment.|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1; // A comment.|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_CaretOutsideCommentAtEndOfLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var $$i = 1; // A comment.
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var [||]i = 1; // A comment.
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_CaretInsideCommentAtEndOfLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var i = 1; // A $$comment.
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var i = 1; // A [||]comment.
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_CommentMarkerInString()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|string s = '\\';|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|//string s = '\\';|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultipleLinesSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|var i = 1;
                    var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;
                    //var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultipleLinesWithWhitespaceSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
            [|
                    var i = 1;
 
                    var j = 2;
               |]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
            [|
                    //var i = 1;
 
                    //var j = 2;
               |]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultipleLinesPartiallyCommentedSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;
                    var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|////var i = 1;
                    //var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultipleLinesWithCommentsInLineSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|var i = 1; // A comment.
                    var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1; // A comment.
                    //var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultipleLinesWithDifferentIndentationsSelected()
    {
        var markup =
            """
            class C
            {
            [|    void M()
                {
                    var i = 1;
 
                    var j = 2;
                }|]
            }
            """;
        var expected =
            """
            class C
            {
            [|    //void M()
                //{
                //    var i = 1;
 
                //    var j = 2;
                //}|]
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultiCaret()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    var [||]i = 1;
                    var [||]j = 2;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var [||]i = 1;
                    //var [||]j = 2;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultiSeletion()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|var i = 1;|]
                    [|var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;|]
                    [|//var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_MultiSeletionPartiallyCommented()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = |]1;
                    [|var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|////var i = |]1;
                    [|//var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void AddComment_WithProjectionBuffer()
    {
        var surfaceMarkup = @"< html >@{|S1:|}";
        var csharpMarkup =
            """
            {|S1:class C
            {
                void M()
                {
                    [|var i = 1;|]
                }
            }|}
            """;
        var expected =
            """
            < html >@class C
            {
                void M()
                {
                    [|//var i = 1;|]
                }
            }
            """;
 
        ToggleCommentWithProjectionBuffer(surfaceMarkup, csharpMarkup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CaretInCommentedLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    //var$$ i = 1;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    var[||] i = 1;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CaretBeforeCommentedLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                $$    //var i = 1;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                [||]    var i = 1;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CaretInCommentedLineWithEndComment()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    //var i = 1; // A $$comment.
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    var i = 1; // A [||]comment.
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CaretInDoubleCommentedLine()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    ////var$$ i = 1;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    //var[||] i = 1;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CommentedLineSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|var i = 1;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_InsideCommentSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    //var [|i = 1;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    var [|i = 1;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CommentedLineWithWhitespaceSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
            [|
                    //var i = 1;
              |]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
            [|
                    var i = 1;
            |]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_CommentMarkerInString()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//string s = '\\';|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|string s = '\\';|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_MultipleCommentedLinesSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;
                    //var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|var i = 1;
                    var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_MultipleCommentedLinesAndWhitespaceSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
            [|
                    //var i = 1;
 
                    //var j = 2;
                |]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
            [|
                    var i = 1;
 
                    var j = 2;
            |]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_MultipleCommentedLinesWithEndCommentSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1; // A comment.
                    //var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|var i = 1; // A comment.
                    var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_MultipleLinesWithDifferentIndentationsSelected()
    {
        var markup =
            """
            class C
            {
            [|    //void M()
                //{
                //    var i = 1;
 
                //    var j = 2;
                //}|]
            }
            """;
        var expected =
            """
            class C
            {
            [|    void M()
                {
                    var i = 1;
 
                    var j = 2;
                }|]
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_MultiCaret()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    //var [||]i = 1;
                          [||]
                    //var [||]j = 2;
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    var [||]i = 1;
            [||]
                    var [||]j = 2;
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_MultiSeletion()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;|]
                    [|            |]
                    [|//var j = 2;|]
                }
            }
            """;
        var expected =
            """
            class C
            {
                void M()
                {
                    [|var i = 1;|]
            [||]
                    [|var j = 2;|]
                }
            }
            """;
 
        ToggleComment(markup, expected);
    }
 
    [WpfFact]
    public void RemoveComment_WithProjectionBuffer()
    {
        var surfaceMarkup = @"< html >@{|S1:|}";
        var csharpMarkup =
            """
            {|S1:class C
            {
                void M()
                {
                    [|//var i = 1;|]
                }
            }|}
            """;
        var expected =
            """
            < html >@class C
            {
                void M()
                {
                    [|var i = 1;|]
                }
            }
            """;
 
        ToggleCommentWithProjectionBuffer(surfaceMarkup, csharpMarkup, expected);
    }
 
    [WpfFact]
    public void ToggleComment_MultipleLinesSelected()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;
 
                    var j = 2;|]
                }
            }
            """;
        var expected = new string[]
        {
            """
            class C
            {
                void M()
                {
                    [|////var i = 1;
 
                    //var j = 2;|]
                }
            }
            """,
            """
            class C
            {
                void M()
                {
                    [|//var i = 1;
 
                    var j = 2;|]
                }
            }
            """
    };
 
        ToggleCommentMultiple(markup, expected);
    }
 
    [WpfFact]
    public void ToggleComment_MultipleSelection()
    {
        var markup =
            """
            class C
            {
                void M()
                {
                    [|//var i = |]1;
            [||]
                    [|var j = 2;|]
                }
            }
            """;
        var expected = new string[]
        {
            """
            class C
            {
                void M()
                {
                    [|////var i = |]1;
            [||]
                    [|//var j = 2;|]
                }
            }
            """,
            """
            class C
            {
                void M()
                {
                    [|//var i = |]1;
            [||]
                    [|var j = 2;|]
                }
            }
            """
    };
 
        ToggleCommentMultiple(markup, expected);
    }
 
    internal override AbstractCommentSelectionBase<ValueTuple> GetToggleCommentCommandHandler(EditorTestWorkspace workspace)
    {
        return (AbstractCommentSelectionBase<ValueTuple>)workspace.ExportProvider.GetExportedValues<ICommandHandler>()
            .First(export => typeof(ToggleLineCommentCommandHandler).Equals(export.GetType()));
    }
 
    internal override EditorTestWorkspace GetWorkspace(string markup, TestComposition composition)
        => EditorTestWorkspace.CreateCSharp(markup, composition: composition);
}