File: Intents\RenameIntentTests.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 System.Threading.Tasks;
using Microsoft.CodeAnalysis.Features.Intents;
using Microsoft.CodeAnalysis.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Intents;
 
[UseExportProvider]
public class RenameIntentTests : IntentTestsBase
{
    [Fact]
    public async Task TestRenameIntentAsync()
    {
        var initialText =
            """
            class C
            {
                void M()
                {
                    var thing = 1;
                    {|priorSelection:thing|}.ToString();
                }
            }
            """;
        var currentText =
            """
            class C
            {
                void M()
                {
                    var thing = 1;
                    something.ToString();
                }
            }
            """;
        var expectedText =
            """
            class C
            {
                void M()
                {
                    var something = 1;
                    something.ToString();
                }
            }
            """;
 
        await VerifyExpectedRenameAsync(initialText, currentText, expectedText, "something").ConfigureAwait(false);
    }
 
    [Fact]
    public async Task TestRenameIntentAsync_Insert()
    {
        var initialText =
            """
            class C
            {
                void M()
                {
                    var thing = 1;
                    {|priorSelection:|}thing.ToString();
                }
            }
            """;
        var currentText =
            """
            class C
            {
                void M()
                {
                    var thing = 1;
                    something.ToString();
                }
            }
            """;
        var expectedText =
            """
            class C
            {
                void M()
                {
                    var something = 1;
                    something.ToString();
                }
            }
            """;
 
        await VerifyExpectedRenameAsync(initialText, currentText, expectedText, "something").ConfigureAwait(false);
    }
 
    [Fact]
    public async Task TestRenameIntentAsync_Delete()
    {
        var initialText =
            """
            class C
            {
                void M()
                {
                    var something = 1;
                    {|priorSelection:some|}thing.ToString();
                }
            }
            """;
        var currentText =
            """
            class C
            {
                void M()
                {
                    var something = 1;
                    thing.ToString();
                }
            }
            """;
        var expectedText =
            """
            class C
            {
                void M()
                {
                    var thing = 1;
                    thing.ToString();
                }
            }
            """;
 
        await VerifyExpectedRenameAsync(initialText, currentText, expectedText, "thing").ConfigureAwait(false);
    }
 
    [Fact]
    public async Task TestRenameIntentAsync_MultipleFiles()
    {
        var initialText =
            """
            namespace M
            {
                public class C
                {
                    public static string {|priorSelection:SomeString|} = string.Empty;
 
                    void M()
                    {
                        var m = SomeString;
                    }
                }
            }
            """;
        var currentText =
            """
            namespace M
            {
                public class C
                {
                    public static string BetterString = string.Empty;
 
                    void M()
                    {
                        var m = SomeString;
                    }
                }
            }
            """;
        var additionalDocuments = new string[]
        {
            """
            namespace M
            {
                public class D
                {
                    void M()
                    {
                        var m = C.SomeString;
                    }
                }
            }
            """
        };
 
        var expectedTexts = new string[]
        {
            """
            namespace M
            {
                public class C
                {
                    public static string BetterString = string.Empty;
 
                    void M()
                    {
                        var m = BetterString;
                    }
                }
            }
            """,
            """
            namespace M
            {
                public class D
                {
                    void M()
                    {
                        var m = C.BetterString;
                    }
                }
            }
            """
        };
 
        await VerifyExpectedRenameAsync(initialText, currentText, additionalDocuments, expectedTexts, "BetterString").ConfigureAwait(false);
    }
 
    private static Task VerifyExpectedRenameAsync(string initialText, string currentText, string expectedText, string newName)
    {
        return VerifyExpectedTextAsync(WellKnownIntents.Rename, initialText, currentText, expectedText, intentData: $"{{ \"newName\": \"{newName}\" }}");
    }
 
    private static Task VerifyExpectedRenameAsync(string initialText, string currentText, string[] additionalText, string[] expectedTexts, string newName)
    {
        return VerifyExpectedTextAsync(WellKnownIntents.Rename, initialText, currentText, additionalText, expectedTexts, intentData: $"{{ \"newName\": \"{newName}\" }}");
    }
}