File: src\Analyzers\CSharp\Tests\UseObjectInitializer\UseObjectInitializerTests.cs
Web Access
Project: src\src\CodeStyle\CSharp\Tests\Microsoft.CodeAnalysis.CSharp.CodeStyle.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.CodeStyle.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.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.UseObjectInitializer;
using Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions;
using Microsoft.CodeAnalysis.Test.Utilities;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.UseObjectInitializer;
 
using VerifyCS = CSharpCodeFixVerifier<
    CSharpUseObjectInitializerDiagnosticAnalyzer,
    CSharpUseObjectInitializerCodeFixProvider>;
 
[Trait(Traits.Feature, Traits.Features.CodeActionsUseObjectInitializer)]
public partial class UseObjectInitializerTests
{
    private static async Task TestMissingInRegularAndScriptAsync(
        [StringSyntax(PredefinedEmbeddedLanguageNames.CSharpTest)] string testCode,
        LanguageVersion? languageVersion = null)
    {
        var test = new VerifyCS.Test
        {
            TestCode = testCode,
        };
 
        if (languageVersion != null)
            test.LanguageVersion = languageVersion.Value;
 
        await test.RunAsync();
    }
 
    [Fact]
    public async Task TestOnVariableDeclarator()
    {
        var testCode = """
            class C
            {
                int i;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(6,19): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestNotForField1()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                C c = new C();
            }
            """);
    }
 
    [Fact]
    public async Task TestNotForField2()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                C c = new C() { };
            }
            """);
    }
 
    [Fact]
    public async Task TestNotForField3()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                C c = new C { };
            }
            """);
    }
 
    [Fact]
    public async Task TestNotForField4()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                int P;
                C c = new C() { P = 1 };
            }
            """);
    }
 
    [Fact]
    public async Task TestNotForField5()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                int P;
                C c = new C { P = 1 };
            }
            """);
    }
 
    [Fact]
    public async Task TestDoNotUpdateAssignmentThatReferencesInitializedValue1Async()
    {
        var testCode = """
            class C
            {
                int i;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                    c.i = c.i + 1;
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1
                    };
                    c.i = c.i + 1;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(7,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestDoNotUpdateAssignmentThatReferencesInitializedValue2Async()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                int i;
 
                void M()
                {
                    var c = new C();
                    c.i = c.i + 1;
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestDoNotUpdateAssignmentThatReferencesInitializedValue3Async()
    {
        var testCode = """
            class C
            {
                int i;
 
                void M()
                {
                    C c;
                    c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                    c.i = c.i + 1;
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
 
                void M()
                {
                    C c;
                    c = new C
                    {
                        i = 1
                    };
                    c.i = c.i + 1;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(6,19): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestDoNotUpdateAssignmentThatReferencesInitializedValue4Async()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                int i;
 
                void M()
                {
                    C c;
                    c = new C();
                    c.i = c.i + 1;
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestOnAssignmentExpression()
    {
        var testCode = """
            class C
            {
                int i;
 
                void M()
                {
                    C c = null;
                    c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
 
                void M()
                {
                    C c = null;
                    c = new C
                    {
                        i = 1
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,13): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestStopOnDuplicateMember()
    {
        var testCode = """
            class C
            {
                int i;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                    c.i = 2;
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1
                    };
                    c.i = 2;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(7,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestComplexInitializer()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                void M(C[] array)
                {
                    array[0] = {|#1:{|#0:new|} C()|};
                    {|#2:array[0].|}i = 1{|#3:;|}
                    {|#4:array[0].|}j = 2{|#5:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                void M(C[] array)
                {
                    array[0] = new C
                    {
                        i = 1,
                        j = 2
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,20): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3).WithLocation(4).WithLocation(5),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestNotOnCompoundAssignment()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                    c.j += 1;
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1
                    };
                    c.j += 1;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/39146")]
    public async Task TestWithExistingInitializer()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C() { i = 1 }|};
                    {|#2:c.|}j = 1{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1,
                        j = 1
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/39146")]
    public async Task TestWithExistingInitializerComma()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C()
                    {
                        i = 1,
                    }|};
                    {|#2:c.|}j = 1{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1,
                        j = 1
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/39146")]
    public async Task TestWithExistingInitializerNotIfAlreadyInitialized()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = {|#1:{|#0:new|} C()
                    {
                        i = 1,
                    }|};
                    {|#2:c.|}j = 1{|#3:;|}
                    c.i = 2;
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    var c = new C
                    {
                        i = 1,
                        j = 1
                    };
                    c.i = 2;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestMissingBeforeCSharp3()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C
            {
                int i;
                int j;
 
                void M()
                {
                    C c = new C();
                    c.j = 1;
                }
            }
            """, LanguageVersion.CSharp2);
    }
 
    [Fact]
    public async Task TestFixAllInDocument1()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                public C() { }
                public C(System.Action a) { }
 
                void M()
                {
                    var v = {|#1:{|#0:new|} C(() => {
                        var v2 = {|#5:{|#4:new|} C()|};
                        {|#6:v2.|}i = 1{|#7:;|}
                    })|};
                    {|#2:v.|}j = 2{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                public C() { }
                public C(System.Action a) { }
 
                void M()
                {
                    var v = new C(() =>
                    {
                        var v2 = new C
                        {
                            i = 1
                        };
                    })
                    {
                        j = 2
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(11,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
                // /0/Test0.cs(12,22): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(4).WithLocation(5).WithLocation(6).WithLocation(7),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestFixAllInDocument2()
    {
        var testCode = """
            class C
            {
                int i;
                System.Action j;
 
                void M()
                {
                    var v = {|#1:{|#0:new|} C()|};
                    {|#2:v.|}j = () => {
                        var v2 = {|#5:{|#4:new|} C()|};
                        {|#6:v2.|}i = 1{|#7:;|}
                    }{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                System.Action j;
 
                void M()
                {
                    var v = new C
                    {
                        j = () =>
                        {
                            var v2 = new C
                            {
                                i = 1
                            };
                        }
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
                // /0/Test0.cs(10,22): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(4).WithLocation(5).WithLocation(6).WithLocation(7),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestFixAllInDocument3()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
 
                void M(C[] array)
                {
                    array[0] = {|#1:{|#0:new|} C()|};
                    {|#2:array[0].|}i = 1{|#3:;|}
                    {|#4:array[0].|}j = 2{|#5:;|}
                    array[1] = {|#7:{|#6:new|} C()|};
                    {|#8:array[1].|}i = 3{|#9:;|}
                    {|#10:array[1].|}j = 4{|#11:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
 
                void M(C[] array)
                {
                    array[0] = new C
                    {
                        i = 1,
                        j = 2
                    };
                    array[1] = new C
                    {
                        i = 3,
                        j = 4
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(8,20): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3).WithLocation(4).WithLocation(5),
                // /0/Test0.cs(11,20): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(6).WithLocation(7).WithLocation(8).WithLocation(9).WithLocation(10).WithLocation(11),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact]
    public async Task TestTrivia1()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|} // Goo
                    {|#4:c.|}j = 2{|#5:;|} // Bar
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
                void M()
                {
                    var c = new C
                    {
                        i = 1, // Goo
                        j = 2 // Bar
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(7,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3).WithLocation(4).WithLocation(5),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/46670")]
    public async Task TestTriviaRemoveLeadingBlankLinesForFirstProperty()
    {
        var testCode = """
            class C
            {
                int i;
                int j;
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
 
                    //Goo
                    {|#2:c.|}i = 1{|#3:;|}
 
                    //Bar
                    {|#4:c.|}j = 2{|#5:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
                int j;
                void M()
                {
                    var c = new C
                    {
                        //Goo
                        i = 1,
 
                        //Bar
                        j = 2
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(7,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3).WithLocation(4).WithLocation(5),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/15459")]
    public async Task TestMissingInNonTopLevelObjectInitializer()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C {
            	int a;
            	C Add(int x) {
            		var c = Add(new int());
            		c.a = 1;
            		return c;
            	}
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/17853")]
    public async Task TestMissingForDynamic()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            using System.Dynamic;
 
            class C
            {
                void Goo()
                {
                    dynamic body = new ExpandoObject();
                    body.content = new ExpandoObject();
                }
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/17953")]
    public async Task TestMissingAcrossPreprocessorDirective()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            public class Goo
            {
                public void M()
                {
                    var goo = new Goo();
            #if true
                    goo.Value = "";
            #endif
                }
 
                public string Value { get; set; }
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/17953")]
    public async Task TestAvailableInsidePreprocessorDirective()
    {
        var testCode = """
            public class Goo
            {
                public void M()
                {
            #if true
                    var goo = {|#1:{|#0:new|} Goo()|};
                    {|#2:goo.|}Value = ""{|#3:;|}
            #endif
                }
 
                public string Value { get; set; }
            }
            """;
        var fixedCode = """
            public class Goo
            {
                public void M()
                {
            #if true
                    var goo = new Goo
                    {
                        Value = ""
                    };
            #endif
                }
 
                public string Value { get; set; }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(6,19): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/19253")]
    public async Task TestKeepBlankLinesAfter()
    {
        var testCode = """
            class Goo
            {
                public int Bar { get; set; }
            }
 
            class MyClass
            {
                public void Main()
                {
                    var goo = {|#1:{|#0:new|} Goo()|};
                    {|#2:goo.|}Bar = 1{|#3:;|}
 
                    int horse = 1;
                }
            }
            """;
        var fixedCode = """
            class Goo
            {
                public int Bar { get; set; }
            }
 
            class MyClass
            {
                public void Main()
                {
                    var goo = new Goo
                    {
                        Bar = 1
                    };
 
                    int horse = 1;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(6,19): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/23368")]
    public async Task TestWithExplicitImplementedInterfaceMembers1()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            interface IExample {
                string Name { get; set; }
            }
 
            class C : IExample {
                string IExample.Name { get; set; }
            }
 
            class MyClass
            {
                public void Main()
                {
                    IExample e = new C();
                    e.Name = string.Empty;
                }
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/23368")]
    public async Task TestWithExplicitImplementedInterfaceMembers2()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            interface IExample {
                string Name { get; set; }
                string LastName { get; set; }
            }
 
            class C : IExample {
                string IExample.Name { get; set; }
                public string LastName { get; set; }
            }
 
            class MyClass
            {
                public void Main()
                {
                    IExample e = new C();
                    e.Name = string.Empty;
                    e.LastName = string.Empty;
                }
            }
            """);
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/23368")]
    public async Task TestWithExplicitImplementedInterfaceMembers3()
    {
        var testCode = """
            interface IExample {
                string Name { get; set; }
                string LastName { get; set; }
            }
 
            class C : IExample {
                string IExample.Name { get; set; }
                public string LastName { get; set; }
            }
 
            class MyClass
            {
                public void Main()
                {
                    IExample e = {|#1:{|#0:new|} C()|};
                    {|#2:e.|}LastName = string.Empty{|#3:;|}
                    e.Name = string.Empty;
                }
            }
            """;
        var fixedCode = """
            interface IExample {
                string Name { get; set; }
                string LastName { get; set; }
            }
 
            class C : IExample {
                string IExample.Name { get; set; }
                public string LastName { get; set; }
            }
 
            class MyClass
            {
                public void Main()
                {
                    IExample e = new C
                    {
                        LastName = string.Empty
                    };
                    e.Name = string.Empty;
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(15,22): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/37675")]
    public async Task TestDoNotOfferForUsingDeclaration()
    {
        await TestMissingInRegularAndScriptAsync(
            """
            class C : System.IDisposable
            {
                int i;
 
                void M()
                {
                    using var c = new C();
                    c.i = 1;
                }
 
                public void Dispose()
                {
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestImplicitObject()
    {
        var testCode = """
            class C
            {
                int i;
 
                void M()
                {
                    C c = {|#1:{|#0:new|}()|};
                    {|#2:c.|}i = 1{|#3:;|}
                }
            }
            """;
        var fixedCode = """
            class C
            {
                int i;
 
                void M()
                {
                    C c = new()
                    {
                        i = 1
                    };
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(6,19): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/61066")]
    public async Task TestInTopLevelStatements()
    {
        var testCode = """
            MyClass cl = {|#1:{|#0:new|}()|};
            {|#2:cl.|}MyProperty = 5{|#3:;|}
 
            class MyClass
            {
                public int MyProperty { get; set; }
            }
            """;
        var fixedCode = """
            MyClass cl = new()
            {
                MyProperty = 5
            };
 
            class MyClass
            {
                public int MyProperty { get; set; }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            ExpectedDiagnostics =
            {
                // /0/Test0.cs(6,19): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
            },
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp12,
            TestState = { OutputKind = OutputKind.ConsoleApplication },
        }.RunAsync();
    }
 
    [Theory]
    [CombinatorialData]
    [WorkItem("https://github.com/dotnet/roslyn/issues/72094")]
    public async Task TestWithConflictingSeverityConfigurationEntries(bool enabled)
    {
        string testCode, fixedCode;
        if (enabled)
        {
            testCode =
                """
                class C
                {
                    int i;
            
                    void M()
                    {
                        var c = {|#1:{|#0:new|} C()|};
                        {|#2:c.|}i = 1{|#3:;|}
                    }
                }
                """;
 
            fixedCode =
                """
                class C
                {
                    int i;
            
                    void M()
                    {
                        var c = new C
                        {
                            i = 1
                        };
                    }
                }
                """;
        }
        else
        {
            testCode =
                """
                class C
                {
                    int i;
            
                    void M()
                    {
                        var c = new C();
                        c.i = 1;
                    }
                }
                """;
            fixedCode = testCode;
        }
 
        var globalConfig =
            $"""
            is_global = true
 
            dotnet_style_object_initializer = true:suggestion
            dotnet_diagnostic.IDE0017.severity = none
 
            build_property.EnableCodeStyleSeverity = {enabled}
            """;
 
        var test = new VerifyCS.Test
        {
            TestState =
            {
                Sources = { testCode },
                AnalyzerConfigFiles =
                {
                    ("/.globalconfig", globalConfig),
                }
            },
            FixedState = { Sources = { fixedCode } },
            LanguageVersion = LanguageVersion.CSharp12,
        };
 
        if (enabled)
        {
            test.ExpectedDiagnostics.Add(
                // /0/Test0.cs(7,17): info IDE0017: Object initialization can be simplified
                VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Info).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3));
        }
 
        await test.RunAsync();
    }
 
    [Theory]
    [CombinatorialData]
    public async Task TestFallbackSeverityConfiguration(bool enabled)
    {
        var testCode =
            """
            class C
            {
                int i;
            
                void M()
                {
                    var c = {|#1:{|#0:new|} C()|};
                    {|#2:c.|}i = 1{|#3:;|}
                }
            }
            """;
 
        var fixedCode =
            """
            class C
            {
                int i;
            
                void M()
                {
                    var c = new C
                    {
                        i = 1
                    };
                }
            }
            """;
 
        var globalConfig =
            $"""
            is_global = true
 
            dotnet_style_object_initializer = true
            dotnet_diagnostic.IDE0017.severity = warning
 
            build_property.EnableCodeStyleSeverity = {enabled}
            """;
 
        await new VerifyCS.Test
        {
            TestState =
            {
                Sources = { testCode },
                ExpectedDiagnostics =
                {
                    // /0/Test0.cs(7,17): warning IDE0017: Object initialization can be simplified
                    VerifyCS.Diagnostic().WithSeverity(DiagnosticSeverity.Warning).WithLocation(0).WithLocation(1).WithLocation(2).WithLocation(3),
                },
                AnalyzerConfigFiles =
                {
                    ("/.globalconfig", globalConfig),
                }
            },
            FixedState = { Sources = { fixedCode } },
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/46665")]
    public async Task TestIndentationOfMultiLineExpressions1()
    {
        await new VerifyCS.Test
        {
            TestCode = """
                class C
                {
                    string S;
                    string T;
 
                    void M(int i)
                    {
                        var c = [|new|] C();
                        c.S = i
                            .ToString();
                        c.T = i.
                            ToString();
                    }
                }
                """,
            FixedCode = """
                class C
                {
                    string S;
                    string T;
                
                    void M(int i)
                    {
                        var c = [|new|] C
                        {
                            S = i
                                .ToString(),
                            T = i.
                                ToString()
                        };
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/46665")]
    public async Task TestIndentationOfMultiLineExpressions2()
    {
        await new VerifyCS.Test
        {
            TestCode = """
                class C
                {
                    string S;
                    string T;
 
                    void M(int i)
                    {
                        var c = [|new|] C();
                        c.S = i
                            .ToString()
                            .ToString();
                        c.T = i.
                            ToString().
                            ToString();
                    }
                }
                """,
            FixedCode = """
                class C
                {
                    string S;
                    string T;
                
                    void M(int i)
                    {
                        var c = [|new|] C
                        {
                            S = i
                                .ToString()
                                .ToString(),
                            T = i.
                                ToString().
                                ToString()
                        };
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/46665")]
    public async Task TestIndentationOfMultiLineExpressions3()
    {
        await new VerifyCS.Test
        {
            TestCode = """
                class C
                {
                    string S;
                    string T;
 
                    void M(int i)
                    {
                        var c = [|new|] C();
                        c.S =
                            i.ToString();
                        c.T =
                            i.ToString();
                    }
                }
                """,
            FixedCode = """
                class C
                {
                    string S;
                    string T;
                
                    void M(int i)
                    {
                        var c = [|new|] C
                        {
                            S =
                                i.ToString(),
                            T =
                                i.ToString()
                        };
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
 
    [Fact, WorkItem("https://github.com/dotnet/roslyn/issues/46665")]
    public async Task TestIndentationOfMultiLineExpressions4()
    {
        await new VerifyCS.Test
        {
            TestCode = """
                class C
                {
                    string S;
                    string T;
 
                    void M(int i)
                    {
                        var c = [|new|] C();
                        c.S =
                            i.ToString()
                             .ToString();
                        c.T =
                            i.ToString()
                             .ToString();
                    }
                }
                """,
            FixedCode = """
                class C
                {
                    string S;
                    string T;
                
                    void M(int i)
                    {
                        var c = [|new|] C
                        {
                            S =
                                i.ToString()
                                 .ToString(),
                            T =
                                i.ToString()
                                 .ToString()
                        };
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp12,
        }.RunAsync();
    }
}