File: CodeActions\MoveType\MoveTypeTests.ActionCountTests.cs
Web Access
Project: src\src\EditorFeatures\CSharpTest\Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests.csproj (Microsoft.CodeAnalysis.CSharp.EditorFeatures.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
#nullable disable
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeActions.MoveType;
 
[Trait(Traits.Feature, Traits.Features.CodeActionsMoveType)]
public partial class MoveTypeTests : CSharpMoveTypeTestsBase
{
    [Fact]
    public async Task MoveType_ActionCounts_RenameOnly()
    {
        var code =
@"namespace N1
{
    class Class1[||]
    {
    }
}";
        // Fixes offered will be rename type to match file, rename file to match type.
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_AvailableBeforeHeader()
    {
        var code =
@"namespace N1
{
    [||]
    class Class1
    {
    }
}";
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_AvailableBeforeAttributeOnHeader()
    {
        var code =
@"namespace N1
{
    [||][X]
    class Class1
    {
    }
}";
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_AvailableOnHeaderIncludingWhitespaceAndAttribute()
    {
        var code =
@"namespace N1
{[|
    [X]
    class Class1
    {|]
    }
}";
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_AvailableAfterHeader()
    {
        var code =
@"namespace N1
{
    class Class1
    [||]{
    }
}";
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_AvailableIncludingDocumentationCommentAndHeader()
    {
        var code =
@"namespace N1
{
    [|/// <summary>
    /// Documentation comment.
    /// </summary>
    class Class1|]
    {
    }
}";
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_AvailableIncludingDocumentationCommentAndAttributeAndHeader()
    {
        var code =
@"using System;
namespace N1
{
    [|/// <summary>
    /// Documentation comment.
    /// </summary>
    [Obsolete]
    class Class1|]
    {
    }
}";
        await TestActionCountAsync(code, count: 2);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableBeforeType()
    {
        var code =
@"[|namespace N1
{|]
    class Class1
    {
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableInsideType()
    {
        var code =
@"namespace N1
{
    class Class1
    {[|
        void M()
        {
        }|]
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableAfterType()
    {
        var code =
@"namespace N1
{
    class Class1
    {
        void M()
        {
        }
    }
 
    [|class test1|]
    {
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableAroundDocumentationCommentAboveHeader()
    {
        var code =
@"namespace N1
{
    [|/// <summary>
    /// Documentation comment.
    /// </summary>|]
    class Class1
    {
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableAroundAttributeAboveHeader()
    {
        var code =
@"using System;
namespace N1
{
    [|[Obsolete]|]
    class Class1
    {
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableAroundDocumentationCommentAndAttributeAboveHeader()
    {
        var code =
@"using System;
namespace N1
{
    [|/// <summary>
    /// Documentation comment.
    /// </summary>
    [Obsolete]|]
    class Class1
    {
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_NotAvailableInsideDocumentationCommentAndAttributeAboveHeader()
    {
        var code =
@"using System;
namespace N1
{
    /// <summary>
    /// [|Documentation comment.
    /// </summary>
    [Obso|]lete]
    class Class1
    {
    }
}";
        await TestMissingInRegularAndScriptAsync(code);
    }
 
    [Fact]
    public async Task MoveType_ActionCounts_MoveOnly()
    {
        var code =
@"namespace N1
{
    class Class1[||]
    {
    }
 
    class test1 /* this matches file name assigned by TestWorkspace*/
    {
    }
}";
        // Fixes offered will be move type to new file.
        await TestActionCountAsync(code, count: 1);
    }
 
    [Fact]
    public async Task MoveType_ActionCounts_RenameAndMove()
    {
        var code =
@"namespace N1
{
    class Class1[||]
    {
    }
 
    class Class2
    {
    }
}";
        // Fixes offered will be move type, rename type to match file, rename file to match type.
        await TestActionCountAsync(code, count: 3);
    }
 
    [Fact]
    public async Task MoveType_ActionCounts_All()
    {
        var code =
@"namespace N1
{
    class OuterType
    {
        class InnerType[||]
        {
        }
    }
 
    class Class1
    {
    }
}";
        // Fixes offered will be
        // 1. move type to InnerType.cs
        // 2. move type to OuterType.InnerType.cs
        // 3. rename file to InnerType.cs
        // 4. rename file to OuterType.InnerType.cs
        // 5. rename type to test1 (which is the default document name given by TestWorkspace).
        await TestActionCountAsync(code, count: 5);
    }
}