diff --git a/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj b/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj index e86ab125b8c027b84c4e96eb988f211895d8d773..b0d009a72562a1ca05fa67c3088214bac2fa19da 100644 --- a/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj +++ b/src/EditorFeatures/CSharpTest/CSharpEditorServicesTest.csproj @@ -93,8 +93,10 @@ Roslyn.Services.Editor.CSharp.UnitTests UnitTest - - + + + + @@ -278,6 +280,7 @@ + diff --git a/src/EditorFeatures/CSharpTest/UseCollectionInitializer/UseCollectionInitializerTests.cs b/src/EditorFeatures/CSharpTest/UseCollectionInitializer/UseCollectionInitializerTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..4edda119ceb704133bf59c6b3361e0693076fac2 --- /dev/null +++ b/src/EditorFeatures/CSharpTest/UseCollectionInitializer/UseCollectionInitializerTests.cs @@ -0,0 +1,267 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CodeFixes; +using Microsoft.CodeAnalysis.CSharp.UseCollectionInitializer; +using Microsoft.CodeAnalysis.Diagnostics; +using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics; +using Roslyn.Test.Utilities; +using Xunit; + +namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.UseCollectionInitializer +{ + public partial class UseCollectionInitializerTests : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest + { + internal override Tuple CreateDiagnosticProviderAndFixer(Workspace workspace) + { + return new Tuple( + new CSharpUseCollectionInitializerDiagnosticAnalyzer(), + new CSharpUseCollectionInitializerCodeFixProvider()); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestOnVariableDeclarator() + { + await TestAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = [||]new List(); + c.Add(1); + } +}", +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = new List() + { + 1 + }; + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestOnAssignmentExpression() + { + await TestAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + List c = null; + c = [||]new List(); + c.Add(1); + } +}", +@" +using System.Collections.Generic; +class C +{ + void M() + { + List c = null; + c = new List() + { + 1 + }; + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestMissingOnRefAdd() + { + await TestMissingAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = [||]new List(); + c.Add(ref i); + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestComplexInitializer() + { + await TestAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + List[] array; + + array[0] = [||]new List(); + array[0].Add(1); + array[0].Add(2); + } +}", +@" +using System.Collections.Generic; +class C +{ + void M() + { + List[] array; + + array[0] = new List() + { + 1, + 2 + }; + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestNotOnNamedArg() + { + await TestMissingAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = [||]new List(); + c.Add(arg: 1); + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestMissingWithExistingInitializer() + { + await TestMissingAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = [||]new List() { 1 }; + c.Add(1); + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestFixAllInDocument() + { + await TestAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + List[] array; + + array[0] = {|FixAllInDocument:new|} List(); + array[0].Add(1); + array[0].Add(2); + + array[1] = new List(); + array[1].Add(3); + array[1].Add(4); + } +}", +@" +using System.Collections.Generic; +class C +{ + void M() + { + List[] array; + + array[0] = new List() + { + 1, + 2 + }; + array[1] = new List() + { + 3, + 4 + }; + } +}"); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestTrivia1() + { + await TestAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = [||]new List(); + c.Add(1); // Foo + c.Add(2); // Bar + } +}", +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = new List() + { + 1, // Foo + 2 // Bar + }; + } +}", +compareTokens: false); + } + + [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseCollectionInitializer)] + public async Task TestComplexInitializer2() + { + await TestAsync( +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = new [||]Dictionary(); + c.Add(1, ""x""); + c.Add(2, ""y""); + } +}", +@" +using System.Collections.Generic; +class C +{ + void M() + { + var c = new Dictionary() + { + { 1, ""x"" }, + { 2, ""y"" } + }; + } +}"); + } + } +} \ No newline at end of file diff --git a/src/EditorFeatures/TestUtilities/Traits.cs b/src/EditorFeatures/TestUtilities/Traits.cs index eb782d4f9855f5991bef685fad0040acdecf967b..142bf142b4686d9976615ac5ccfe57219aa2239d 100644 --- a/src/EditorFeatures/TestUtilities/Traits.cs +++ b/src/EditorFeatures/TestUtilities/Traits.cs @@ -84,6 +84,7 @@ public static class Features public const string CodeActionsSpellcheck = "CodeActions.Spellcheck"; public const string CodeActionsSuppression = "CodeActions.Suppression"; public const string CodeActionsUseAutoProperty = "CodeActions.UseAutoProperty"; + public const string CodeActionsUseCollectionInitializer = "CodeActions.UseCollectionInitializer"; public const string CodeActionsUseExpressionBody = "CodeActions.UseExpressionBody"; public const string CodeActionsUseImplicitType = "CodeActions.UseImplicitType"; public const string CodeActionsUseExplicitType = "CodeActions.UseExplicitType";