File: src\Analyzers\CSharp\Tests\MakeTypePartial\MakeTypePartialTests.cs
Web Access
Project: src\src\Features\CSharpTest\Microsoft.CodeAnalysis.CSharp.Features.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.Features.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CSharp.MakeTypePartial;
using Microsoft.CodeAnalysis.Editor.UnitTests.CodeActions;
using Microsoft.CodeAnalysis.Test.Utilities;
using Microsoft.CodeAnalysis.Testing;
using Xunit;
 
namespace Microsoft.CodeAnalysis.CSharp.CSharp.UnitTests.MakeTypePartial;
 
using VerifyCS = CSharpCodeFixVerifier<
    EmptyDiagnosticAnalyzer,
    CSharpMakeTypePartialCodeFixProvider>;
 
[Trait(Traits.Feature, Traits.Features.CodeActionsMakeTypePartial)]
public sealed class MakeTypePartialTests
{
    public static IEnumerable<object[]> AllValidDeclarationTypes()
    {
        yield return new[] { "class" };
        yield return new[] { "struct" };
        yield return new[] { "interface" };
        yield return new[] { "record" };
        yield return new[] { "record class" };
        yield return new[] { "record struct" };
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task OutsideNamespace(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                partial {{declarationType}} Declaration
                {
                }
            
                {{declarationType}} {|CS0260:Declaration|}
                {
                }
                """,
            FixedCode = $$"""
                partial {{declarationType}} Declaration
                {
                }
            
                partial {{declarationType}} Declaration
                {
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task InsideOneFileScopedNamespace(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                namespace TestNamespace;
            
                partial {{declarationType}} Declaration
                {
                }
            
                {{declarationType}} {|CS0260:Declaration|}
                {
                }
                """,
            FixedCode = $$"""
                namespace TestNamespace;
            
                partial {{declarationType}} Declaration
                {
                }
            
                partial {{declarationType}} Declaration
                {
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task InsideOneBlockScopedNamespace(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                namespace TestNamespace
                {
                    partial {{declarationType}} Declaration
                    {
                    }
            
                    {{declarationType}} {|CS0260:Declaration|}
                    {
                    }
                }
                """,
            FixedCode = $$"""
                namespace TestNamespace
                {
                    partial {{declarationType}} Declaration
                    {
                    }
            
                    partial {{declarationType}} Declaration
                    {
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task InsideTwoEqualBlockScopedNamespaces(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                namespace TestNamespace
                {
                    partial {{declarationType}} Declaration
                    {
                    }
                }
            
                namespace TestNamespace
                {
                    {{declarationType}} {|CS0260:Declaration|}
                    {
                    }
                }
                """,
            FixedCode = $$"""
                namespace TestNamespace
                {
                    partial {{declarationType}} Declaration
                    {
                    }
                }
            
                namespace TestNamespace
                {
                    partial {{declarationType}} Declaration
                    {
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task InDifferentDocuments(string declarationType)
    {
        var document1 = $$"""
            partial {{declarationType}} Declaration
            {
            }
            """;
 
        var document2 = $$"""
            {{declarationType}} {|CS0260:Declaration|}
            {
            }
            """;
 
        var fixedDocument2 = $$"""
            partial {{declarationType}} Declaration
            {
            }
            """;
 
        await new VerifyCS.Test
        {
            TestState =
            {
                Sources = { document1, document2 }
            },
            FixedState =
            {
                Sources = { document1, fixedDocument2 }
            },
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task WithOtherModifiers(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                public partial {{declarationType}} Declaration
                {
                }
            
                public {{declarationType}} {|CS0260:Declaration|}
                {
                }
                """,
            FixedCode = $$"""
                public partial {{declarationType}} Declaration
                {
                }
            
                public partial {{declarationType}} Declaration
                {
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task NestedType1(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                class Test
                {
                    public partial {{declarationType}} Declaration
                    {
                    }
            
                    public {{declarationType}} {|CS0260:Declaration|}
                    {
                    }
                }
                """,
            FixedCode = $$"""
                class Test
                {
                    public partial {{declarationType}} Declaration
                    {
                    }
            
                    public partial {{declarationType}} Declaration
                    {
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task NestedType2(string declarationType)
    {
        await new VerifyCS.Test
        {
            TestCode = $$"""
                partial {{declarationType}} Test
                {
                }
 
                {{declarationType}} {|CS0260:Test|}
                {
                    public partial {{declarationType}} Declaration
                    {
                    }
            
                    public {{declarationType}} {|CS0260:Declaration|}
                    {
                    }
                }
                """,
            FixedCode = $$"""
                partial {{declarationType}} Test
                {
                }
 
                partial {{declarationType}} Test
                {
                    public partial {{declarationType}} Declaration
                    {
                    }
            
                    public partial {{declarationType}} Declaration
                    {
                    }
                }
                """,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task FixOne(string declarationType)
    {
        var testCode = $$"""
            partial {{declarationType}} Test
            {
            }
            
            {{declarationType}} {|CS0260:Test|}
            {
            }
            
            {{declarationType}} {|CS0260:Test|}
            {
            }
            """;
        var fixedCode = $$"""
            partial {{declarationType}} Test
            {
            }
            
            partial {{declarationType}} Test
            {
            }
            
            partial {{declarationType}} Test
            {
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp10,
            CodeFixTestBehaviors = CodeFixTestBehaviors.FixOne,
            DiagnosticSelector = d => d[0]
        }.RunAsync();
 
        await new VerifyCS.Test
        {
            TestCode = testCode,
            FixedCode = fixedCode,
            LanguageVersion = LanguageVersion.CSharp10,
            CodeFixTestBehaviors = CodeFixTestBehaviors.FixOne,
            DiagnosticSelector = d => d[1]
        }.RunAsync();
    }
 
    [Theory]
    [MemberData(nameof(AllValidDeclarationTypes))]
    public async Task NotInDifferentNamespaces(string declarationType)
    {
        var markup = $$"""
            namespace TestNamespace1
            {
                partial {{declarationType}} Declaration
                {
                }
            }
            
            namespace TestNamespace2
            {
                {{declarationType}} Declaration
                {
                }
            }
            """;
 
        await new VerifyCS.Test
        {
            TestCode = markup,
            LanguageVersion = LanguageVersion.CSharp10
        }.RunAsync();
    }
}