File: Intents\GenerateConstructorIntentTests.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.CSharp.CodeStyle;
using Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions;
using Microsoft.CodeAnalysis.Features.Intents;
using Microsoft.CodeAnalysis.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Intents;
 
[UseExportProvider]
public class GenerateConstructorIntentTests : IntentTestsBase
{
    [Fact]
    public async Task GenerateConstructorSimpleResult()
    {
        var initialText =
            """
            class C
            {
                private readonly int _someInt;
 
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            class C
            {
                private readonly int _someInt;
 
                public C
            }
            """;
        var expectedText =
            """
            class C
            {
                private readonly int _someInt;
 
                public C(int someInt)
                {
                    _someInt = someInt;
                }
            }
            """;
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, expectedText).ConfigureAwait(false);
    }
 
    [Fact]
    public async Task GenerateConstructorTypedPrivateWithoutIntentData()
    {
        var initialText =
            """
            class C
            {
                private readonly int _someInt;
 
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            class C
            {
                private readonly int _someInt;
 
                private C
            }
            """;
        var expectedText =
            """
            class C
            {
                private readonly int _someInt;
 
                public C(int someInt)
                {
                    _someInt = someInt;
                }
            }
            """;
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, expectedText).ConfigureAwait(false);
    }
 
    [Fact]
    public async Task GenerateConstructorTypedPrivateWithIntentData()
    {
        var initialText =
            """
            class C
            {
                private readonly int _someInt;
 
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            class C
            {
                private readonly int _someInt;
 
                private C
            }
            """;
        var expectedText =
            """
            class C
            {
                private readonly int _someInt;
 
                private C(int someInt)
                {
                    _someInt = someInt;
                }
            }
            """;
 
        // lang=json
        var intentData = @"{ ""accessibility"": ""Private""}"{ ""accessibility"": ""Private""}";
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, expectedText, intentData: intentData).ConfigureAwait(false);
    }
 
    [Fact]
    public async Task GenerateConstructorTypedPrivateProtectedWithIntentData()
    {
        var initialText =
            """
            class C
            {
                private readonly int _someInt;
 
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            class C
            {
                private readonly int _someInt;
 
                private protected C
            }
            """;
        var expectedText =
            """
            class C
            {
                private readonly int _someInt;
 
                private protected C(int someInt)
                {
                    _someInt = someInt;
                }
            }
            """;
 
        // lang=json
        var intentData = @"{ ""accessibility"": ""ProtectedAndInternal""}"{ ""accessibility"": ""ProtectedAndInternal""}";
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, expectedText, intentData: intentData).ConfigureAwait(false);
    }
 
    [Fact]
    public async Task GenerateConstructorWithFieldsInPartial()
    {
        var initialText =
            """
            partial class C
            {
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            partial class C
            {
                public C
            }
            """;
        var additionalDocuments = new string[]
        {
            """
            partial class C
            {
                private readonly int _someInt;
            }
            """
        };
        var expectedText =
            """
            partial class C
            {
                public C(int someInt)
                {
                    _someInt = someInt;
                }
            }
            """;
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, additionalDocuments, [expectedText]).ConfigureAwait(false);
    }
 
    [Fact]
    public async Task GenerateConstructorWithReferenceType()
    {
        var initialText =
            """
            class C
            {
                private readonly object _someObject;
 
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            class C
            {
                private readonly object _someObject;
 
                public C
            }
            """;
        var expectedText =
            """
            class C
            {
                private readonly object _someObject;
 
                public C(object someObject)
                {
                    _someObject = someObject;
                }
            }
            """;
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, expectedText).ConfigureAwait(false);
    }
 
    [Fact]
    public async Task GenerateConstructorWithExpressionBodyOption()
    {
        var initialText =
            """
            class C
            {
                private readonly int _someInt;
 
                {|priorSelection:|}
            }
            """;
        var currentText =
            """
            class C
            {
                private readonly int _someInt;
 
                public C
            }
            """;
        var expectedText =
            """
            class C
            {
                private readonly int _someInt;
 
                public C(int someInt) => _someInt = someInt;
            }
            """;
 
        await VerifyExpectedTextAsync(WellKnownIntents.GenerateConstructor, initialText, currentText, expectedText,
            options: new OptionsCollection(LanguageNames.CSharp)
            {
                { CSharpCodeStyleOptions.PreferExpressionBodiedConstructors, CSharpCodeStyleOptions.WhenPossibleWithSilentEnforcement }
            }).ConfigureAwait(false);
    }
}