File: Wrapping\ParameterWrappingTests.cs
Web Access
Project: src\src\Features\CSharpTest\Microsoft.CodeAnalysis.CSharp.Features.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.Features.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.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.Test.Utilities;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Wrapping;
 
[Trait(Traits.Feature, Traits.Features.CodeActionsWrapping)]
public class ParameterWrappingTests : AbstractWrappingTests
{
    [Fact]
    public async Task TestMissingWithSyntaxError()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]int i, int j {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithSelection()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([|int|] i, int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingInBody()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo(int i, int j) {[||]
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingInAttributes()
    {
        await TestMissingAsync(
            """
            class C {
                [||][Attr]
                void Goo(int i, int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithOpenTokenTrailingComment()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]/**/int i, int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithItemLeadingComment()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]
                    /**/int i, int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithItemTrailingComment()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]
                    int i/**/, int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithCommaTrailingComment()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]
                    int i,/**/int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithLastItemTrailingComment()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]
                    int i, int j/**/
                    ) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithCloseTokenLeadingComment()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]
                    int i, int j
                    /**/) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestWithOpenTokenLeadingComment()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                void Goo/**/([||]int i, int j) {
                }
            }
            """,
 
            """
            class C {
                void Goo/**/(int i,
                             int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestWithCloseTokenTrailingComment()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                void Goo([||]int i, int j)/**/ {
                }
            }
            """,
 
            """
            class C {
                void Goo(int i,
                         int j)/**/ {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithSingleParameter()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]int i) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithMultiLineParameter()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo([||]int i, int j =
                    initializer) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestInHeader1()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                [||]void Goo(int i, int j) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                         int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestInHeader2()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                void [||]Goo(int i, int j) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                         int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestInHeader3()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                [||]public void Goo(int i, int j) {
                }
            }
            """,
            """
            class C {
                public void Goo(int i,
                                int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestInHeader4()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                public void Goo(int i, int j)[||] {
                }
            }
            """,
            """
            class C {
                public void Goo(int i,
                                int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestTwoParamWrappingCases()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]int i, int j) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                         int j) {
                }
            }
            """,
            """
            class C {
                void Goo(
                    int i,
                    int j) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                    int j) {
                }
            }
            """,
            """
            class C {
                void Goo(
                    int i, int j) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestThreeParamWrappingCases()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]int i, int j, int k) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                         int j,
                         int k) {
                }
            }
            """,
            """
            class C {
                void Goo(
                    int i,
                    int j,
                    int k) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                    int j,
                    int k) {
                }
            }
            """,
            """
            class C {
                void Goo(
                    int i, int j, int k) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task Test_AllOptions_NoInitialMatches()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int i,
                        int j,
                            int k) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                         int j,
                         int k) {
                }
            }
            """,
            """
            class C {
                void Goo(
                    int i,
                    int j,
                    int k) {
                }
            }
            """,
            """
            class C {
                void Goo(int i,
                    int j,
                    int k) {
                }
            }
            """,
            """
            class C {
                void Goo(int i, int j, int k) {
                }
            }
            """,
            """
            class C {
                void Goo(
                    int i, int j, int k) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task Test_LongWrapping_ShortIds()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int i, int j, int k, int l, int m,
                    int n) {
                }
            }
            """,
GetIndentionColumn(30),
"""
class C {
    void Goo(int i,
             int j,
             int k,
             int l,
             int m,
             int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i,
        int j,
        int k,
        int l,
        int m,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i,
        int j,
        int k,
        int l,
        int m,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int j, int k, int l, int m, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int j, int k, int l, int m, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int j,
             int k, int l,
             int m, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int j, int k,
        int l, int m, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int j,
        int k, int l, int m,
        int n) {
    }
}
""");
    }
 
    [Fact]
    public async Task Test_LongWrapping_VariadicLengthIds()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int i, int jj, int kkkk, int llllllll, int mmmmmmmmmmmmmmmm,
                    int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
                }
            }
            """,
GetIndentionColumn(30),
"""
class C {
    void Goo(int i,
             int jj,
             int kkkk,
             int llllllll,
             int mmmmmmmmmmmmmmmm,
             int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int i,
        int jj,
        int kkkk,
        int llllllll,
        int mmmmmmmmmmmmmmmm,
        int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(int i,
        int jj,
        int kkkk,
        int llllllll,
        int mmmmmmmmmmmmmmmm,
        int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj, int kkkk, int llllllll, int mmmmmmmmmmmmmmmm, int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj, int kkkk, int llllllll, int mmmmmmmmmmmmmmmm, int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
             int kkkk,
             int llllllll,
             int mmmmmmmmmmmmmmmm,
             int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj,
        int kkkk, int llllllll,
        int mmmmmmmmmmmmmmmm,
        int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
        int kkkk, int llllllll,
        int mmmmmmmmmmmmmmmm,
        int nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn) {
    }
}
""");
    }
 
    [Fact]
    public async Task Test_DoNotOfferLongWrappingOptionThatAlreadyAppeared()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int iiiii, int jjjjj, int kkkkk, int lllll, int mmmmm,
                    int nnnnn) {
                }
            }
            """,
GetIndentionColumn(30),
"""
class C {
    void Goo(int iiiii,
             int jjjjj,
             int kkkkk,
             int lllll,
             int mmmmm,
             int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int iiiii,
        int jjjjj,
        int kkkkk,
        int lllll,
        int mmmmm,
        int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(int iiiii,
        int jjjjj,
        int kkkkk,
        int lllll,
        int mmmmm,
        int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(int iiiii, int jjjjj, int kkkkk, int lllll, int mmmmm, int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int iiiii, int jjjjj, int kkkkk, int lllll, int mmmmm, int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int iiiii, int jjjjj,
        int kkkkk, int lllll,
        int mmmmm, int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(int iiiii,
        int jjjjj, int kkkkk,
        int lllll, int mmmmm,
        int nnnnn) {
    }
}
""");
    }
 
    [Fact]
    public async Task Test_DoNotOfferAllLongWrappingOptionThatAlreadyAppeared()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int iiiii, int jjjjj, int kkkkk, int lllll, int mmmmm,
                    int nnnnn) {
                }
            }
            """,
GetIndentionColumn(20),
"""
class C {
    void Goo(int iiiii,
             int jjjjj,
             int kkkkk,
             int lllll,
             int mmmmm,
             int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int iiiii,
        int jjjjj,
        int kkkkk,
        int lllll,
        int mmmmm,
        int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(int iiiii,
        int jjjjj,
        int kkkkk,
        int lllll,
        int mmmmm,
        int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(int iiiii, int jjjjj, int kkkkk, int lllll, int mmmmm, int nnnnn) {
    }
}
""",
"""
class C {
    void Goo(
        int iiiii, int jjjjj, int kkkkk, int lllll, int mmmmm, int nnnnn) {
    }
}
""");
    }
 
    [Fact]
    public async Task Test_LongWrapping_VariadicLengthIds2()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int i, int jj, int kkkk, int lll, int mm,
                    int n) {
                }
            }
            """,
GetIndentionColumn(30),
"""
class C {
    void Goo(int i,
             int jj,
             int kkkk,
             int lll,
             int mm,
             int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i,
        int jj,
        int kkkk,
        int lll,
        int mm,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i,
        int jj,
        int kkkk,
        int lll,
        int mm,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj, int kkkk, int lll, int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj, int kkkk, int lll, int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
             int kkkk, int lll,
             int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj,
        int kkkk, int lll,
        int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
        int kkkk, int lll,
        int mm, int n) {
    }
}
""");
    }
 
    [Fact]
    public async Task Test_DoNotOfferExistingOption1()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]int i,
                         int jj,
                         int kkkk,
                         int lll,
                         int mm,
                         int n) {
                }
            }
            """,
GetIndentionColumn(30),
"""
class C {
    void Goo(
        int i,
        int jj,
        int kkkk,
        int lll,
        int mm,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i,
        int jj,
        int kkkk,
        int lll,
        int mm,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj, int kkkk, int lll, int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj, int kkkk, int lll, int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
             int kkkk, int lll,
             int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj,
        int kkkk, int lll,
        int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
        int kkkk, int lll,
        int mm, int n) {
    }
}
""");
    }
 
    [Fact]
    public async Task Test_DoNotOfferExistingOption2()
    {
        await TestAllWrappingCasesAsync(
            """
            class C {
                void Goo([||]
                    int i,
                    int jj,
                    int kkkk,
                    int lll,
                    int mm,
                    int n) {
                }
            }
            """,
GetIndentionColumn(30),
"""
class C {
    void Goo(int i,
             int jj,
             int kkkk,
             int lll,
             int mm,
             int n) {
    }
}
""",
"""
class C {
    void Goo(int i,
        int jj,
        int kkkk,
        int lll,
        int mm,
        int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj, int kkkk, int lll, int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj, int kkkk, int lll, int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
             int kkkk, int lll,
             int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(
        int i, int jj,
        int kkkk, int lll,
        int mm, int n) {
    }
}
""",
"""
class C {
    void Goo(int i, int jj,
        int kkkk, int lll,
        int mm, int n) {
    }
}
""");
    }
 
    [Fact]
    public async Task TestInConstructor()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                public [||]C(int i, int j) {
                }
            }
            """,
            """
            class C {
                public C(int i,
                         int j) {
                }
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/38986")]
    public async Task TestInConstructorWithSyntaxErrorAfter()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                public [||]C(int i, int j) : base(,) {
                }
            }
            """,
            """
            class C {
                public C(int i,
                         int j) : base(,) {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestInIndexer()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                public int [||]this[int i, int j] => 0;
            }
            """,
            """
            class C {
                public int this[int i,
                                int j] => 0;
            }
            """);
    }
 
    [Fact]
    public async Task TestInOperator()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                public shared int operator [||]+(C c1, C c2) => 0;
            }
            """,
            """
            class C {
                public shared int operator +(C c1,
                                             C c2) => 0;
            }
            """);
    }
 
    [Fact]
    public async Task TestInDelegate()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                public delegate int [||]D(C c1, C c2);
            }
            """,
            """
            class C {
                public delegate int D(C c1,
                                      C c2);
            }
            """);
    }
 
    [Fact]
    public async Task TestInParenthesizedLambda()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                void Goo()
                {
                    var v = ([||]C c, C d) => {
                    };
                }
            }
            """,
            """
            class C {
                void Goo()
                {
                    var v = (C c,
                             C d) => {
                    };
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestInParenthesizedLambda2()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                void Goo()
                {
                    var v = ([||]c, d) => {
                    };
                }
            }
            """,
            """
            class C {
                void Goo()
                {
                    var v = (c,
                             d) => {
                    };
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestNotOnSimpleLambda()
    {
        await TestMissingAsync(
            """
            class C {
                void Goo()
                {
                    var v = [||]c => {
                    };
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestLocalFunction()
    {
        await TestInRegularAndScript1Async(
            """
            class C {
                void Goo()
                {
                    void Local([||]C c, C d) {
                    }
                }
            }
            """,
            """
            class C {
                void Goo()
                {
                    void Local(C c,
                               C d) {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestRecord_Semicolon()
    {
        await TestInRegularAndScript1Async(
"record R([||]int I, string S);",
"""
record R(int I,
         string S);
""");
    }
 
    [Fact]
    public async Task TestClass_Semicolon()
    {
        await TestInRegularAndScript1Async(
"class R([||]int I, string S);",
"""
class R(int I,
        string S);
""");
    }
 
    [Fact]
    public async Task TestInterface_Semicolon()
    {
        await TestInRegularAndScript1Async(
"interface R([||]int I, string S);",
"""
interface R(int I,
            string S);
""");
    }
 
    [Fact]
    public async Task TestRecord_Braces()
    {
        await TestInRegularAndScript1Async(
"record R([||]int I, string S) { }",
"""
record R(int I,
         string S) { }
""");
    }
 
    [Fact]
    public async Task TestClass_Braces()
    {
        await TestInRegularAndScript1Async(
"class R([||]int I, string S) { }",
"""
class R(int I,
        string S) { }
""");
    }
 
    [Fact]
    public async Task TestInterface_Braces()
    {
        await TestInRegularAndScript1Async(
"interface R([||]int I, string S) { }",
"""
interface R(int I,
            string S) { }
""");
    }
 
    [Fact]
    public async Task TestRecordStruct_Semicolon()
    {
        await TestInRegularAndScript1Async(
"record struct R([||]int I, string S);",
"""
record struct R(int I,
                string S);
""", new TestParameters(TestOptions.RegularPreview));
    }
 
    [Fact]
    public async Task TestStruct_Semicolon()
    {
        await TestInRegularAndScript1Async(
"struct R([||]int I, string S);",
"""
struct R(int I,
         string S);
""", new TestParameters(TestOptions.RegularPreview));
    }
 
    [Fact]
    public async Task TestRecordStruct_Braces()
    {
        await TestInRegularAndScript1Async(
"record struct R([||]int I, string S) { }",
"""
record struct R(int I,
                string S) { }
""", new TestParameters(TestOptions.RegularPreview));
    }
 
    [Fact]
    public async Task TestStruct_Braces()
    {
        await TestInRegularAndScript1Async(
"struct R([||]int I, string S) { }",
"""
struct R(int I,
         string S) { }
""", new TestParameters(TestOptions.RegularPreview));
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/61362")]
    public async Task TestWithMissingParameterList()
    {
        await TestMissingAsync(
            """
            class C {
                public void UpsertRecord<T>[||]
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/63732")]
    public async Task TestWithMissingStartToken1()
    {
        await TestMissingAsync(
            """
            class C {
                public void UpsertRecord<T>[||])
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/63732")]
    public async Task TestWithMissingStartToken2()
    {
        await TestMissingAsync(
            """
            class C {
                public void UpsertRecord<T>[||] int i, int j)
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/63732")]
    public async Task TestWithMissingEndToken1()
    {
        await TestMissingAsync(
            """
            class C {
                public void UpsertRecord<T>([||]
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/63732")]
    public async Task TestWithMissingEndToken2()
    {
        await TestMissingAsync(
            """
            class C {
                public void UpsertRecord<T>([||]int i, int j
            }
            """);
    }
}