From 83ac575432bef08a6fa771b6ebcefff0a529abdf Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Tue, 22 Jun 2021 14:09:08 -0700 Subject: [PATCH 1/4] Update to Microsoft.CodeAnalysis.Testing 1.1.0-beta1.21322.2 --- eng/Versions.props | 2 +- ...ateEqualsAndGetHashCodeFromMembersTests.cs | 2 +- .../CSharpCodeFixVerifier`2+Test.cs | 41 +++++++---- .../CSharpCodeRefactoringVerifier`1+Test.cs | 72 +++++++++---------- .../VisualBasicCodeFixVerifier`2+Test.cs | 41 +++++++---- ...sualBasicCodeRefactoringVerifier`1+Test.cs | 48 +++++++++---- 6 files changed, 130 insertions(+), 76 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index 13a2456f4d6b6..ae5276da9efda 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -29,7 +29,7 @@ 3.3.3-beta1.21105.3 6.0.0-preview1.21054.10 - 1.0.1-beta1.20623.3 + 1.1.0-beta1.21322.2 3.10.0 16.10.230 5.0.0-alpha1.19409.1 diff --git a/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs index 792917787cdca..5e8e73e88411f 100644 --- a/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs +++ b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs @@ -35,7 +35,7 @@ private class TestWithDialog : VerifyCS.Test public ImmutableArray MemberNames; public Action> OptionsCallback; - public override AdhocWorkspace CreateWorkspace() + protected override Workspace CreateWorkspaceImpl() { // If we're a dialog test, then mixin our mock and initialize its values to the ones the test asked for. var workspace = new AdhocWorkspace(s_composition.GetHostServices()); diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs index 6ac0276e90786..e74b55a591ad4 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs @@ -26,6 +26,13 @@ public static partial class CSharpCodeFixVerifier { public class Test : CSharpCodeFixTest { + /// + /// The index in of the generated + /// .editorconfig file for , or if no such + /// file has been generated yet. + /// + private int? _analyzerConfigIndex; + static Test() { // If we have outdated defaults from the host unit test application targeting an older .NET Framework, use more @@ -53,18 +60,9 @@ public Test() compilationOptions = compilationOptions.WithSpecificDiagnosticOptions(compilationOptions.SpecificDiagnosticOptions.SetItems(CSharpVerifierHelper.NullableWarnings)); solution = solution.WithProjectCompilationOptions(projectId, compilationOptions); - var (analyzerConfigSource, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - foreach (var id in solution.ProjectIds) - { - var documentId = DocumentId.CreateNewId(id, ".editorconfig"); - solution = solution.AddAnalyzerConfigDocument(documentId, ".editorconfig", analyzerConfigSource, filePath: "/.editorconfig"); - } - } - #if !CODE_STYLE var options = solution.Options; + var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); foreach (var (key, value) in remainingOptions) { options = options.WithChangedOption(key, value); @@ -93,14 +91,33 @@ public Test() public Func, Diagnostic?>? DiagnosticSelector { get; set; } - public override async Task RunAsync(CancellationToken cancellationToken = default) + protected override async Task RunImplAsync(CancellationToken cancellationToken = default) { if (DiagnosticSelector is object) { Assert.True(CodeFixTestBehaviors.HasFlag(Testing.CodeFixTestBehaviors.FixOne), $"'{nameof(DiagnosticSelector)}' can only be used with '{nameof(Testing.CodeFixTestBehaviors)}.{nameof(Testing.CodeFixTestBehaviors.FixOne)}'"); } - await base.RunAsync(cancellationToken); + var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); + if (analyzerConfigSource is object) + { + if (_analyzerConfigIndex is null) + { + _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; + TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); + } + else + { + TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); + } + } + else if (_analyzerConfigIndex is { } index) + { + _analyzerConfigIndex = null; + TestState.AnalyzerConfigFiles.RemoveAt(index); + } + + await base.RunImplAsync(cancellationToken); } #if !CODE_STYLE diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs index ac1137fc4802f..dcd2aa50ff256 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs @@ -2,7 +2,6 @@ // 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.Collections.Generic; using System.Collections.Immutable; using System.Net; using System.Threading; @@ -28,6 +27,13 @@ public static partial class CSharpCodeRefactoringVerifier { public class Test : CSharpCodeRefactoringTest { + /// + /// The index in of the generated + /// .editorconfig file for , or if no such + /// file has been generated yet. + /// + private int? _analyzerConfigIndex; + static Test() { // If we have outdated defaults from the host unit test application targeting an older .NET Framework, use more @@ -53,18 +59,9 @@ public Test() compilationOptions = compilationOptions.WithSpecificDiagnosticOptions(compilationOptions.SpecificDiagnosticOptions.SetItems(CSharpVerifierHelper.NullableWarnings)); solution = solution.WithProjectCompilationOptions(projectId, compilationOptions); - var (analyzerConfigSource, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - foreach (var id in solution.ProjectIds) - { - var documentId = DocumentId.CreateNewId(id, ".editorconfig"); - solution = solution.AddAnalyzerConfigDocument(documentId, ".editorconfig", analyzerConfigSource, filePath: "/.editorconfig"); - } - } - #if !CODE_STYLE var options = solution.Options; + var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); foreach (var (key, value) in remainingOptions) { options = options.WithChangedOption(key, value); @@ -97,6 +94,30 @@ public Test() /// public string[]? ExactActionSetOffered { get; set; } + protected override async Task RunImplAsync(CancellationToken cancellationToken) + { + var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); + if (analyzerConfigSource is object) + { + if (_analyzerConfigIndex is null) + { + _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; + TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); + } + else + { + TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); + } + } + else if (_analyzerConfigIndex is { } index) + { + _analyzerConfigIndex = null; + TestState.AnalyzerConfigFiles.RemoveAt(index); + } + + await base.RunImplAsync(cancellationToken); + } + protected override ImmutableArray FilterCodeActions(ImmutableArray actions) { var result = base.FilterCodeActions(actions); @@ -110,8 +131,6 @@ protected override ImmutableArray FilterCodeActions(ImmutableArray _workspaces = new(); - protected override AnalyzerOptions GetAnalyzerOptions(Project project) => new WorkspaceAnalyzerOptions(base.GetAnalyzerOptions(project), project.Solution); @@ -122,38 +141,15 @@ protected override AnalyzerOptions GetAnalyzerOptions(Project project) private static readonly TestComposition s_editorFeaturesOOPComposition = EditorTestCompositions.EditorFeatures.WithTestHostParts(TestHost.OutOfProcess); - public override AdhocWorkspace CreateWorkspace() + protected override Workspace CreateWorkspaceImpl() { if (TestHost == TestHost.InProcess) - return base.CreateWorkspace(); + return base.CreateWorkspaceImpl(); var hostServices = s_editorFeaturesOOPComposition.GetHostServices(); var workspace = new AdhocWorkspace(hostServices); - lock (_workspaces) - _workspaces.Add(workspace); - return workspace; } - - public override async Task RunAsync(CancellationToken cancellationToken = default) - { - try - { - await base.RunAsync(cancellationToken).ConfigureAwait(false); - } - finally - { - var workspaces = new List(); - lock (_workspaces) - { - workspaces.AddRange(_workspaces); - _workspaces.Clear(); - } - - foreach (var workspace in workspaces) - workspace.Dispose(); - } - } #endif } } diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs index d63b2636931c9..fa56b3ca6b4e9 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs @@ -26,6 +26,13 @@ public static partial class VisualBasicCodeFixVerifier { public class Test : VisualBasicCodeFixTest { + /// + /// The index in of the generated + /// .editorconfig file for , or if no such + /// file has been generated yet. + /// + private int? _analyzerConfigIndex; + static Test() { // If we have outdated defaults from the host unit test application targeting an older .NET Framework, use more @@ -49,18 +56,9 @@ public Test() var parseOptions = (VisualBasicParseOptions)solution.GetProject(projectId)!.ParseOptions!; solution = solution.WithProjectParseOptions(projectId, parseOptions.WithLanguageVersion(LanguageVersion)); - var (analyzerConfigSource, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - foreach (var id in solution.ProjectIds) - { - var documentId = DocumentId.CreateNewId(id, ".editorconfig"); - solution = solution.AddAnalyzerConfigDocument(documentId, ".editorconfig", analyzerConfigSource, filePath: "/.editorconfig"); - } - } - #if !CODE_STYLE var options = solution.Options; + var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); foreach (var (key, value) in remainingOptions) { options = options.WithChangedOption(key, value); @@ -89,14 +87,33 @@ public Test() public Func, Diagnostic?>? DiagnosticSelector { get; set; } - public override async Task RunAsync(CancellationToken cancellationToken = default) + protected override async Task RunImplAsync(CancellationToken cancellationToken = default) { if (DiagnosticSelector is object) { Assert.True(CodeFixTestBehaviors.HasFlag(Testing.CodeFixTestBehaviors.FixOne), $"'{nameof(DiagnosticSelector)}' can only be used with '{nameof(Testing.CodeFixTestBehaviors)}.{nameof(Testing.CodeFixTestBehaviors.FixOne)}'"); } - await base.RunAsync(cancellationToken); + var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); + if (analyzerConfigSource is object) + { + if (_analyzerConfigIndex is null) + { + _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; + TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); + } + else + { + TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); + } + } + else if (_analyzerConfigIndex is { } index) + { + _analyzerConfigIndex = null; + TestState.AnalyzerConfigFiles.RemoveAt(index); + } + + await base.RunImplAsync(cancellationToken); } #if !CODE_STYLE diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs index 0a20d8d15b116..9a2822cfde456 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs @@ -3,10 +3,12 @@ // See the LICENSE file in the project root for more information. using System.Net; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.CodeAnalysis.CodeRefactorings; +using Microsoft.CodeAnalysis.Testing.Verifiers; using Microsoft.CodeAnalysis.VisualBasic; using Microsoft.CodeAnalysis.VisualBasic.Testing; -using Microsoft.CodeAnalysis.Testing.Verifiers; -using Microsoft.CodeAnalysis.CodeRefactorings; #if !CODE_STYLE using System; @@ -21,6 +23,13 @@ public static partial class VisualBasicCodeRefactoringVerifier { public class Test : VisualBasicCodeRefactoringTest { + /// + /// The index in of the generated + /// .editorconfig file for , or if no such + /// file has been generated yet. + /// + private int? _analyzerConfigIndex; + static Test() { // If we have outdated defaults from the host unit test application targeting an older .NET Framework, use more @@ -42,18 +51,9 @@ public Test() var parseOptions = (VisualBasicParseOptions)solution.GetProject(projectId)!.ParseOptions!; solution = solution.WithProjectParseOptions(projectId, parseOptions.WithLanguageVersion(LanguageVersion)); - var (analyzerConfigSource, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - foreach (var id in solution.ProjectIds) - { - var documentId = DocumentId.CreateNewId(id, ".editorconfig"); - solution = solution.AddAnalyzerConfigDocument(documentId, ".editorconfig", analyzerConfigSource, filePath: "/.editorconfig"); - } - } - #if !CODE_STYLE var options = solution.Options; + var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); foreach (var (key, value) in remainingOptions) { options = options.WithChangedOption(key, value); @@ -80,6 +80,30 @@ public Test() public string? EditorConfig { get; set; } + protected override async Task RunImplAsync(CancellationToken cancellationToken) + { + var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); + if (analyzerConfigSource is object) + { + if (_analyzerConfigIndex is null) + { + _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; + TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); + } + else + { + TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); + } + } + else if (_analyzerConfigIndex is { } index) + { + _analyzerConfigIndex = null; + TestState.AnalyzerConfigFiles.RemoveAt(index); + } + + await base.RunImplAsync(cancellationToken); + } + #if !CODE_STYLE protected override AnalyzerOptions GetAnalyzerOptions(Project project) => new WorkspaceAnalyzerOptions(base.GetAnalyzerOptions(project), project.Solution); From 0509d39a5aee59e4d45a0114926484fd888ef285 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Tue, 22 Jun 2021 14:18:50 -0700 Subject: [PATCH 2/4] Add OptionsCollection.Add(OptionsCollection) This is a convenience method for the equivalent of AddRange inside a collection initializer. --- .../ConvertTupleToStructTests.cs | 54 +-- ...ateEqualsAndGetHashCodeFromMembersTests.cs | 416 +++++++----------- .../CoreTestUtilities/OptionsCollection.cs | 4 + 3 files changed, 182 insertions(+), 292 deletions(-) diff --git a/src/EditorFeatures/CSharpTest/ConvertTupleToStruct/ConvertTupleToStructTests.cs b/src/EditorFeatures/CSharpTest/ConvertTupleToStruct/ConvertTupleToStructTests.cs index 2116a5ac38b23..16f228209a291 100644 --- a/src/EditorFeatures/CSharpTest/ConvertTupleToStruct/ConvertTupleToStructTests.cs +++ b/src/EditorFeatures/CSharpTest/ConvertTupleToStruct/ConvertTupleToStructTests.cs @@ -48,7 +48,9 @@ private static async Task TestAsync( if (index != 0) Assert.NotNull(equivalenceKey); - var test = new VerifyCS.Test + options ??= new OptionsCollection(LanguageNames.CSharp); + + await new VerifyCS.Test { TestCode = text, FixedCode = expected, @@ -57,11 +59,8 @@ private static async Task TestAsync( CodeActionIndex = index, CodeActionEquivalenceKey = equivalenceKey, ExactActionSetOffered = actions, - }; - - if (options != null) - test.Options.AddRange(options); - await test.RunAsync(); + Options = { options }, + }.RunAsync(); } #region update containing member tests @@ -2278,7 +2277,8 @@ public static implicit operator NewStruct((int a, int a) value) return new NewStruct(value.a, value.a); } }"; - var test = new VerifyCS.Test + + await new VerifyCS.Test { TestCode = text, FixedCode = expected, @@ -2349,11 +2349,9 @@ public static implicit operator NewStruct((int a, int a) value) // /0/Test0.cs(49,45): error CS0229: Ambiguity between '(int a, int a).a' and '(int a, int a).a' DiagnosticResult.CompilerError("CS0229").WithSpan(49, 45, 49, 46).WithArguments("(int a, int a).a", "(int a, int a).a"), } - } - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + }, + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Theory, CombinatorialData, Trait(Traits.Feature, Traits.Features.CodeActionsConvertTupleToStruct)] @@ -3352,7 +3350,7 @@ void Goo() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestState = { @@ -3373,10 +3371,8 @@ void Goo() CodeActionIndex = 1, CodeActionEquivalenceKey = Scope.ContainingType.ToString(), TestHost = host, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } #endregion update containing project tests @@ -3511,7 +3507,7 @@ void Goo() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { CodeActionIndex = 2, CodeActionEquivalenceKey = Scope.ContainingProject.ToString(), @@ -3524,10 +3520,8 @@ void Goo() { Sources = { expected1, expected2 }, }, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } #endregion @@ -3638,7 +3632,7 @@ void Goo() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { CodeActionIndex = 3, CodeActionEquivalenceKey = Scope.DependentProjects.ToString(), @@ -3667,10 +3661,8 @@ void Goo() } }, }, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Theory, CombinatorialData, Trait(Traits.Feature, Traits.Features.CodeActionsConvertTupleToStruct)] @@ -3777,7 +3769,7 @@ void Goo() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { CodeActionIndex = 3, CodeActionEquivalenceKey = Scope.DependentProjects.ToString(), @@ -3798,10 +3790,8 @@ void Goo() ["DependencyProject"] = { Sources = { expected2 } } }, }, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } #endregion diff --git a/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs index 5e8e73e88411f..bcb254453e86a 100644 --- a/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs +++ b/src/EditorFeatures/CSharpTest/GenerateFromMembers/GenerateEqualsAndGetHashCodeFromMembers/GenerateEqualsAndGetHashCodeFromMembersTests.cs @@ -98,15 +98,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(39916, "https://github.com/dotnet/roslyn/issues/39916")] @@ -135,15 +133,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferExplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferExplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -179,15 +175,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -229,15 +223,13 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -273,15 +265,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -309,15 +299,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -345,15 +333,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -386,15 +372,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -426,15 +410,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -484,16 +466,14 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 0, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -551,15 +531,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -795,15 +773,13 @@ public override bool Equals(object obj) } "; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = expected, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -860,16 +836,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -902,16 +876,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -955,16 +927,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1005,17 +975,15 @@ public override int GetHashCode() } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, MemberNames = ImmutableArray.Empty, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1088,16 +1056,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1130,16 +1096,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1180,16 +1144,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1374,16 +1336,14 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 0, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1411,15 +1371,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1447,15 +1405,13 @@ public override bool Equals(object obj) } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1488,16 +1444,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1530,16 +1484,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1580,16 +1532,14 @@ struct Bar { }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1632,16 +1582,14 @@ struct Bar public override int GetHashCode() => 0; }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1682,16 +1630,14 @@ struct Bar { }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1724,16 +1670,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1766,16 +1710,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1816,16 +1758,14 @@ enum Bar { }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1858,16 +1798,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1899,16 +1837,14 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = ImmutableArray.Create("a", "b"), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1942,16 +1878,14 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = ImmutableArray.Create("c", "b"), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -1983,16 +1917,14 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = ImmutableArray.Empty, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(17643, "https://github.com/dotnet/roslyn/issues/17643")] @@ -2020,15 +1952,13 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(25690, "https://github.com/dotnet/roslyn/issues/25690")] @@ -2188,17 +2118,15 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => EnableOption(options, GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.GenerateOperatorsId), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2278,17 +2206,15 @@ public override bool Equals(object obj) public static bool operator {|CS0216:==|}(Program left, Program right) => true; }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => Assert.Null(options.FirstOrDefault(i => i.Id == GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.GenerateOperatorsId)), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2333,17 +2259,15 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => EnableOption(options, GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.GenerateOperatorsId), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2392,16 +2316,14 @@ enum Bar { }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 0, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2466,16 +2388,14 @@ struct Bar : IEquatable public static bool operator !=(Bar left, Bar right) => !(left == right); }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 0, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2510,17 +2430,15 @@ public bool Equals(Program other) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => EnableOption(options, GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.ImplementIEquatableId), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2711,17 +2629,15 @@ public bool Equals(Program other) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => EnableOption(options, GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.ImplementIEquatableId), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -2844,17 +2760,15 @@ public override bool Equals(object obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => Assert.Null(options.FirstOrDefault(i => i.Id == GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.ImplementIEquatableId)), LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -3063,16 +2977,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -3121,7 +3033,7 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedState = @@ -3135,10 +3047,8 @@ public override int GetHashCode() }, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(37297, "https://github.com/dotnet/roslyn/issues/37297")] @@ -3186,7 +3096,7 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestState = { @@ -3211,10 +3121,8 @@ public override int GetHashCode() }, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(37297, "https://github.com/dotnet/roslyn/issues/37297")] @@ -3262,7 +3170,7 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestState = { @@ -3279,10 +3187,8 @@ public override int GetHashCode() FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -3338,7 +3244,7 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedState = @@ -3352,10 +3258,8 @@ public override int GetHashCode() }, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -3422,16 +3326,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(39916, "https://github.com/dotnet/roslyn/issues/39916")] @@ -3499,16 +3401,14 @@ public override int GetHashCode() } }"; - var test = new VerifyCS.Test + await new VerifyCS.Test { TestCode = code, FixedCode = fixedCode, CodeActionIndex = 1, LanguageVersion = LanguageVersion.CSharp6, - }; - - test.Options.AddRange(PreferExplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferExplicitTypeWithInfo() }, + }.RunAsync(); } [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsGenerateEqualsAndGetHashCode)] @@ -3693,7 +3593,7 @@ public override bool Equals(object? obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedState = @@ -3710,10 +3610,8 @@ public override bool Equals(object? obj) MemberNames = default, OptionsCallback = options => EnableOption(options, GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.GenerateOperatorsId), LanguageVersion = LanguageVersion.Default, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(40053, "https://github.com/dotnet/roslyn/issues/40053")] @@ -3761,17 +3659,15 @@ public override bool Equals(object? obj) } }"; - var test = new TestWithDialog + await new TestWithDialog { TestCode = code, FixedCode = fixedCode, MemberNames = default, OptionsCallback = options => EnableOption(options, GenerateEqualsAndGetHashCodeFromMembersCodeRefactoringProvider.GenerateOperatorsId), LanguageVersion = LanguageVersion.Default, - }; - - test.Options.AddRange(PreferImplicitTypeWithInfo()); - await test.RunAsync(); + Options = { PreferImplicitTypeWithInfo() }, + }.RunAsync(); } [WorkItem(42574, "https://github.com/dotnet/roslyn/issues/42574")] diff --git a/src/Workspaces/CoreTestUtilities/OptionsCollection.cs b/src/Workspaces/CoreTestUtilities/OptionsCollection.cs index deafef00f9a6b..7ba5994514480 100644 --- a/src/Workspaces/CoreTestUtilities/OptionsCollection.cs +++ b/src/Workspaces/CoreTestUtilities/OptionsCollection.cs @@ -49,6 +49,10 @@ public void Add(PerLanguageOption2> option, T value) public void Add(PerLanguageOption2> option, T value, NotificationOption2 notification) => _options.Add(new OptionKey2(option, _languageName), new CodeStyleOption2(value, notification)); + // 📝 This can be removed if/when collection initializers support AddRange. + public void Add(OptionsCollection options) + => AddRange(options); + public void AddRange(OptionsCollection options) { foreach (var (key, value) in options) From 14942491f8c271f10b58b01cafbfc09402249540 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Tue, 22 Jun 2021 16:28:11 -0700 Subject: [PATCH 3/4] Update FormattingAnalyzerTests to use the new editorconfig features --- src/CodeStyle/CSharp/Tests/FormattingAnalyzerTests.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/CodeStyle/CSharp/Tests/FormattingAnalyzerTests.cs b/src/CodeStyle/CSharp/Tests/FormattingAnalyzerTests.cs index 96f2902a56a38..d078794b7f5e8 100644 --- a/src/CodeStyle/CSharp/Tests/FormattingAnalyzerTests.cs +++ b/src/CodeStyle/CSharp/Tests/FormattingAnalyzerTests.cs @@ -270,16 +270,15 @@ void MyMethod() await new CSharpCodeFixTest { - TestState = { Sources = { (Path.GetFullPath("Test0.cs"), testCode) } }, - FixedState = { Sources = { (Path.GetFullPath("Test0.cs"), fixedCode) } }, - SolutionTransforms = + TestState = { - (solution, projectId) => + Sources = { testCode }, + AnalyzerConfigFiles = { - var documentId = DocumentId.CreateNewId(projectId, ".editorconfig"); - return solution.AddAnalyzerConfigDocument(documentId, ".editorconfig", SourceText.From(editorConfig, Encoding.UTF8), filePath: Path.GetFullPath(".editorconfig")); + ("/.editorconfig", editorConfig), }, }, + FixedState = { Sources = { fixedCode } }, }.RunAsync(); } } From ac79a1600ee583cfd0c9661c833c88ae068d1e80 Mon Sep 17 00:00:00 2001 From: Sam Harwell Date: Tue, 22 Jun 2021 16:57:49 -0700 Subject: [PATCH 4/4] Consolidate shared verifier state --- ...nalysis.CodeStyle.UnitTestUtilities.csproj | 1 + .../CSharpCodeFixVerifier`2+Test.cs | 54 ++------- .../CSharpCodeRefactoringVerifier`1+Test.cs | 54 ++------- .../CodeActions/SharedVerifierState.cs | 104 ++++++++++++++++++ .../VisualBasicCodeFixVerifier`2+Test.cs | 54 ++------- ...sualBasicCodeRefactoringVerifier`1+Test.cs | 54 ++------- 6 files changed, 153 insertions(+), 168 deletions(-) create mode 100644 src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/SharedVerifierState.cs diff --git a/src/CodeStyle/Core/Tests/Microsoft.CodeAnalysis.CodeStyle.UnitTestUtilities.csproj b/src/CodeStyle/Core/Tests/Microsoft.CodeAnalysis.CodeStyle.UnitTestUtilities.csproj index 9cb5c77e650de..dae2461a112e8 100644 --- a/src/CodeStyle/Core/Tests/Microsoft.CodeAnalysis.CodeStyle.UnitTestUtilities.csproj +++ b/src/CodeStyle/Core/Tests/Microsoft.CodeAnalysis.CodeStyle.UnitTestUtilities.csproj @@ -16,6 +16,7 @@ + diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs index e74b55a591ad4..334ed11df8092 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeFixVerifier`2+Test.cs @@ -26,12 +26,7 @@ public static partial class CSharpCodeFixVerifier { public class Test : CSharpCodeFixTest { - /// - /// The index in of the generated - /// .editorconfig file for , or if no such - /// file has been generated yet. - /// - private int? _analyzerConfigIndex; + private readonly SharedVerifierState _sharedState; static Test() { @@ -49,6 +44,8 @@ static Test() public Test() { + _sharedState = new SharedVerifierState(this, DefaultFileExt); + MarkupOptions = Testing.MarkupOptions.UseFirstDescriptor; SolutionTransforms.Add((solution, projectId) => @@ -60,17 +57,6 @@ public Test() compilationOptions = compilationOptions.WithSpecificDiagnosticOptions(compilationOptions.SpecificDiagnosticOptions.SetItems(CSharpVerifierHelper.NullableWarnings)); solution = solution.WithProjectCompilationOptions(projectId, compilationOptions); -#if !CODE_STYLE - var options = solution.Options; - var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - foreach (var (key, value) in remainingOptions) - { - options = options.WithChangedOption(key, value); - } - - solution = solution.WithOptions(options); -#endif - return solution; }); } @@ -81,13 +67,15 @@ public Test() /// public LanguageVersion LanguageVersion { get; set; } = LanguageVersion.CSharp8; - /// - /// Gets a collection of options to apply to for testing. Values may be added - /// using a collection initializer. - /// - internal OptionsCollection Options { get; } = new OptionsCollection(LanguageNames.CSharp); + /// + internal OptionsCollection Options => _sharedState.Options; - public string? EditorConfig { get; set; } + /// + public string? EditorConfig + { + get => _sharedState.EditorConfig; + set => _sharedState.EditorConfig = value; + } public Func, Diagnostic?>? DiagnosticSelector { get; set; } @@ -98,25 +86,7 @@ protected override async Task RunImplAsync(CancellationToken cancellationToken = Assert.True(CodeFixTestBehaviors.HasFlag(Testing.CodeFixTestBehaviors.FixOne), $"'{nameof(DiagnosticSelector)}' can only be used with '{nameof(Testing.CodeFixTestBehaviors)}.{nameof(Testing.CodeFixTestBehaviors.FixOne)}'"); } - var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - if (_analyzerConfigIndex is null) - { - _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; - TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); - } - else - { - TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); - } - } - else if (_analyzerConfigIndex is { } index) - { - _analyzerConfigIndex = null; - TestState.AnalyzerConfigFiles.RemoveAt(index); - } - + _sharedState.Apply(); await base.RunImplAsync(cancellationToken); } diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs index dcd2aa50ff256..8012ac3db1bef 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/CSharpCodeRefactoringVerifier`1+Test.cs @@ -27,12 +27,7 @@ public static partial class CSharpCodeRefactoringVerifier { public class Test : CSharpCodeRefactoringTest { - /// - /// The index in of the generated - /// .editorconfig file for , or if no such - /// file has been generated yet. - /// - private int? _analyzerConfigIndex; + private readonly SharedVerifierState _sharedState; static Test() { @@ -50,6 +45,8 @@ static Test() public Test() { + _sharedState = new SharedVerifierState(this, DefaultFileExt); + SolutionTransforms.Add((solution, projectId) => { var parseOptions = (CSharpParseOptions)solution.GetProject(projectId)!.ParseOptions!; @@ -59,17 +56,6 @@ public Test() compilationOptions = compilationOptions.WithSpecificDiagnosticOptions(compilationOptions.SpecificDiagnosticOptions.SetItems(CSharpVerifierHelper.NullableWarnings)); solution = solution.WithProjectCompilationOptions(projectId, compilationOptions); -#if !CODE_STYLE - var options = solution.Options; - var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - foreach (var (key, value) in remainingOptions) - { - options = options.WithChangedOption(key, value); - } - - solution = solution.WithOptions(options); -#endif - return solution; }); } @@ -80,13 +66,15 @@ public Test() /// public LanguageVersion LanguageVersion { get; set; } = LanguageVersion.CSharp8; - /// - /// Gets a collection of options to apply to for testing. Values may be added - /// using a collection initializer. - /// - internal OptionsCollection Options { get; } = new OptionsCollection(LanguageNames.CSharp); + /// + internal OptionsCollection Options => _sharedState.Options; - public string? EditorConfig { get; set; } + /// + public string? EditorConfig + { + get => _sharedState.EditorConfig; + set => _sharedState.EditorConfig = value; + } /// /// The set of code action s offered the user in this exact order. @@ -96,25 +84,7 @@ public Test() protected override async Task RunImplAsync(CancellationToken cancellationToken) { - var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - if (_analyzerConfigIndex is null) - { - _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; - TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); - } - else - { - TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); - } - } - else if (_analyzerConfigIndex is { } index) - { - _analyzerConfigIndex = null; - TestState.AnalyzerConfigFiles.RemoveAt(index); - } - + _sharedState.Apply(); await base.RunImplAsync(cancellationToken); } diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/SharedVerifierState.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/SharedVerifierState.cs new file mode 100644 index 0000000000000..c8679afa8e11c --- /dev/null +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/SharedVerifierState.cs @@ -0,0 +1,104 @@ +// 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; +using Microsoft.CodeAnalysis.Testing; +using Microsoft.CodeAnalysis.Testing.Verifiers; + +#if !CODE_STYLE +using Roslyn.Utilities; +#endif + +namespace Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions +{ + internal sealed class SharedVerifierState + { + private readonly AnalyzerTest _test; + private readonly string _defaultFileExt; + + /// + /// The index in of the generated + /// .editorconfig file for , or if no such + /// file has been generated yet. + /// + private int? _analyzerConfigIndex; + + /// + /// The index in of the options transformation for + /// remaining , or if no such transfor has been generated yet. + /// + private Func? _remainingOptionsSolutionTransform; + + public SharedVerifierState(AnalyzerTest test, string defaultFileExt) + { + _test = test; + _defaultFileExt = defaultFileExt; + Options = new OptionsCollection(test.Language); + } + + public string? EditorConfig { get; set; } + + /// + /// Gets a collection of options to apply to for testing. Values may be added + /// using a collection initializer. + /// + internal OptionsCollection Options { get; } + + internal void Apply() + { + var (analyzerConfigSource, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(_defaultFileExt, EditorConfig, Options); + if (analyzerConfigSource is not null) + { + if (_analyzerConfigIndex is null) + { + _analyzerConfigIndex = _test.TestState.AnalyzerConfigFiles.Count; + _test.TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); + } + else + { + _test.TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); + } + } + else if (_analyzerConfigIndex is { } index) + { + _analyzerConfigIndex = null; + _test.TestState.AnalyzerConfigFiles.RemoveAt(index); + } + + var solutionTransformIndex = _remainingOptionsSolutionTransform is not null ? _test.SolutionTransforms.IndexOf(_remainingOptionsSolutionTransform) : -1; + if (remainingOptions is not null) + { + // Generate a new solution transform + _remainingOptionsSolutionTransform = (solution, projectId) => + { +#if !CODE_STYLE + var options = solution.Options; + foreach (var (key, value) in remainingOptions) + { + options = options.WithChangedOption(key, value); + } + + solution = solution.WithOptions(options); +#endif + + return solution; + }; + + if (solutionTransformIndex < 0) + { + _test.SolutionTransforms.Add(_remainingOptionsSolutionTransform); + } + else + { + _test.SolutionTransforms[solutionTransformIndex] = _remainingOptionsSolutionTransform; + } + } + else if (_remainingOptionsSolutionTransform is not null) + { + _test.SolutionTransforms.Remove(_remainingOptionsSolutionTransform); + _remainingOptionsSolutionTransform = null; + } + } + } +} diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs index fa56b3ca6b4e9..1ec477ed7b4a6 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeFixVerifier`2+Test.cs @@ -26,12 +26,7 @@ public static partial class VisualBasicCodeFixVerifier { public class Test : VisualBasicCodeFixTest { - /// - /// The index in of the generated - /// .editorconfig file for , or if no such - /// file has been generated yet. - /// - private int? _analyzerConfigIndex; + private readonly SharedVerifierState _sharedState; static Test() { @@ -49,6 +44,8 @@ static Test() public Test() { + _sharedState = new SharedVerifierState(this, DefaultFileExt); + MarkupOptions = Testing.MarkupOptions.UseFirstDescriptor; SolutionTransforms.Add((solution, projectId) => @@ -56,17 +53,6 @@ public Test() var parseOptions = (VisualBasicParseOptions)solution.GetProject(projectId)!.ParseOptions!; solution = solution.WithProjectParseOptions(projectId, parseOptions.WithLanguageVersion(LanguageVersion)); -#if !CODE_STYLE - var options = solution.Options; - var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - foreach (var (key, value) in remainingOptions) - { - options = options.WithChangedOption(key, value); - } - - solution = solution.WithOptions(options); -#endif - return solution; }); } @@ -77,13 +63,15 @@ public Test() /// public LanguageVersion LanguageVersion { get; set; } = LanguageVersion.VisualBasic16; - /// - /// Gets a collection of options to apply to for testing. Values may be added - /// using a collection initializer. - /// - internal OptionsCollection Options { get; } = new OptionsCollection(LanguageNames.VisualBasic); + /// + internal OptionsCollection Options => _sharedState.Options; - public string? EditorConfig { get; set; } + /// + public string? EditorConfig + { + get => _sharedState.EditorConfig; + set => _sharedState.EditorConfig = value; + } public Func, Diagnostic?>? DiagnosticSelector { get; set; } @@ -94,25 +82,7 @@ protected override async Task RunImplAsync(CancellationToken cancellationToken = Assert.True(CodeFixTestBehaviors.HasFlag(Testing.CodeFixTestBehaviors.FixOne), $"'{nameof(DiagnosticSelector)}' can only be used with '{nameof(Testing.CodeFixTestBehaviors)}.{nameof(Testing.CodeFixTestBehaviors.FixOne)}'"); } - var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - if (_analyzerConfigIndex is null) - { - _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; - TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); - } - else - { - TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); - } - } - else if (_analyzerConfigIndex is { } index) - { - _analyzerConfigIndex = null; - TestState.AnalyzerConfigFiles.RemoveAt(index); - } - + _sharedState.Apply(); await base.RunImplAsync(cancellationToken); } diff --git a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs index 9a2822cfde456..727be29d9a845 100644 --- a/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs +++ b/src/EditorFeatures/DiagnosticsTestUtilities/CodeActions/VisualBasicCodeRefactoringVerifier`1+Test.cs @@ -23,12 +23,7 @@ public static partial class VisualBasicCodeRefactoringVerifier { public class Test : VisualBasicCodeRefactoringTest { - /// - /// The index in of the generated - /// .editorconfig file for , or if no such - /// file has been generated yet. - /// - private int? _analyzerConfigIndex; + private readonly SharedVerifierState _sharedState; static Test() { @@ -46,22 +41,13 @@ static Test() public Test() { + _sharedState = new SharedVerifierState(this, DefaultFileExt); + SolutionTransforms.Add((solution, projectId) => { var parseOptions = (VisualBasicParseOptions)solution.GetProject(projectId)!.ParseOptions!; solution = solution.WithProjectParseOptions(projectId, parseOptions.WithLanguageVersion(LanguageVersion)); -#if !CODE_STYLE - var options = solution.Options; - var (_, remainingOptions) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - foreach (var (key, value) in remainingOptions) - { - options = options.WithChangedOption(key, value); - } - - solution = solution.WithOptions(options); -#endif - return solution; }); } @@ -72,35 +58,19 @@ public Test() /// public LanguageVersion LanguageVersion { get; set; } = LanguageVersion.VisualBasic16; - /// - /// Gets a collection of options to apply to for testing. Values may be added - /// using a collection initializer. - /// - internal OptionsCollection Options { get; } = new OptionsCollection(LanguageNames.VisualBasic); + /// + internal OptionsCollection Options => _sharedState.Options; - public string? EditorConfig { get; set; } + /// + public string? EditorConfig + { + get => _sharedState.EditorConfig; + set => _sharedState.EditorConfig = value; + } protected override async Task RunImplAsync(CancellationToken cancellationToken) { - var (analyzerConfigSource, _) = CodeFixVerifierHelper.ConvertOptionsToAnalyzerConfig(DefaultFileExt, EditorConfig, Options); - if (analyzerConfigSource is object) - { - if (_analyzerConfigIndex is null) - { - _analyzerConfigIndex = TestState.AnalyzerConfigFiles.Count; - TestState.AnalyzerConfigFiles.Add(("/.editorconfig", analyzerConfigSource)); - } - else - { - TestState.AnalyzerConfigFiles[_analyzerConfigIndex.Value] = ("/.editorconfig", analyzerConfigSource); - } - } - else if (_analyzerConfigIndex is { } index) - { - _analyzerConfigIndex = null; - TestState.AnalyzerConfigFiles.RemoveAt(index); - } - + _sharedState.Apply(); await base.RunImplAsync(cancellationToken); }