File: CommentSelection\CSharpCommentSelectionTests.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.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CommentSelection;
using Microsoft.CodeAnalysis.Editor.UnitTests.Utilities;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Operations;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CommentSelection;
 
[UseExportProvider]
[Trait(Traits.Feature, Traits.Features.CommentSelection)]
public class CSharpCommentSelectionTests
{
    [WpfFact]
    public void UncommentAndFormat1()
    {
        var code = """
            class A
            {
                [|          //            void  Method  (   )
                            // {
                            //
                            //                      }|]
            }
            """;
        var expected = """
            class A
            {
                void Method()
                {
 
                }
            }
            """;
        UncommentSelection(code, expected);
    }
 
    [WpfFact]
    public void UncommentAndFormat2()
    {
        var code = """
            class A
            {
                [|          /*            void  Method  (   )
                             {
 
                                                  } */|]
            }
            """;
        var expected = """
            class A
            {
                void Method()
                {
 
                }
            }
            """;
        UncommentSelection(code, expected);
    }
 
    [WpfFact]
    public void UncommentSingleLineCommentInPseudoBlockComment()
    {
        var code = """
            class C
            {
                /// <include file='doc\Control.uex' path='docs/doc[@for="Control.RtlTranslateAlignment1"]/*' />
                protected void RtlTranslateAlignment2()
                {
                    //[|int x = 0;|]
                }
                /* Hello world */
            }
            """;
 
        var expected = """
            class C
            {
                /// <include file='doc\Control.uex' path='docs/doc[@for="Control.RtlTranslateAlignment1"]/*' />
                protected void RtlTranslateAlignment2()
                {
                    int x = 0;
                }
                /* Hello world */
            }
            """;
 
        UncommentSelection(code, expected);
    }
 
    [WpfFact]
    public void UncommentAndFormat3()
    {
        var code = """
            class A
            {
                [|          //            void  Method  (   )       |]
                [|            // {                                  |]
                [|            //                                    |]
                [|            //                      }             |]
            }
            """;
        var expected = """
            class A
            {
                void Method()
                {
 
                }
            }
            """;
        UncommentSelection(code, expected);
    }
 
    private static void UncommentSelection(string markup, string expected)
    {
        using var workspace = EditorTestWorkspace.CreateCSharp(markup);
        var doc = workspace.Documents.First();
        SetupSelection(doc.GetTextView(), doc.SelectedSpans.Select(s => Span.FromBounds(s.Start, s.End)));
 
        var commandHandler = new CommentUncommentSelectionCommandHandler(
            workspace.GetService<ITextUndoHistoryRegistry>(),
            workspace.GetService<IEditorOperationsFactoryService>(),
            workspace.GetService<EditorOptionsService>());
 
        var textView = doc.GetTextView();
        var textBuffer = doc.GetTextBuffer();
        commandHandler.ExecuteCommand(textView, textBuffer, Operation.Uncomment, TestCommandExecutionContext.Create());
 
        Assert.Equal(expected, doc.GetTextBuffer().CurrentSnapshot.GetText());
    }
 
    private static void SetupSelection(IWpfTextView textView, IEnumerable<Span> spans)
    {
        var snapshot = textView.TextSnapshot;
        if (spans.Count() == 1)
        {
            textView.Selection.Select(new SnapshotSpan(snapshot, spans.Single()), isReversed: false);
            textView.Caret.MoveTo(new SnapshotPoint(snapshot, spans.Single().End));
        }
        else
        {
            textView.Selection.Mode = TextSelectionMode.Box;
            textView.Selection.Select(new VirtualSnapshotPoint(snapshot, spans.First().Start),
                                      new VirtualSnapshotPoint(snapshot, spans.Last().End));
            textView.Caret.MoveTo(new SnapshotPoint(snapshot, spans.Last().End));
        }
    }
}