File: ReverseForStatement\ReverseForStatementTests.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.
 
#nullable disable
 
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeRefactorings;
using Microsoft.CodeAnalysis.CSharp.ReverseForStatement;
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings;
using Microsoft.CodeAnalysis.Test.Utilities;
using Xunit;
 
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.ReverseForStatement;
 
[Trait(Traits.Feature, Traits.Features.CodeActionsMoveDeclarationNearReference)]
public class ReverseForStatementTests : AbstractCSharpCodeActionTest_NoEditor
{
    protected override CodeRefactoringProvider CreateCodeRefactoringProvider(TestWorkspace workspace, TestParameters parameters)
        => new CSharpReverseForStatementCodeRefactoringProvider();
 
    [Fact]
    public async Task TestMissingWithoutInitializer()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (; i < args.Length; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithoutCondition()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; ; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithoutIncrementor()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; )
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithoutVariableReferencedInCondition()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; j < args.Length; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithoutVariableReferencedInIncrementor()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; j++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithoutVariableInitializer()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i; i < args.Length; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithMismatchedConditionAndIncrementor1()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithMismatchedConditionAndIncrementor2()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i >= args.Length; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostIncrement1()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = args.Length - 1; i >= 0; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostIncrementConstants1()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < 10; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = 10 - 1; i >= 0; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostDecrementConstants1()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 10 - 1; i >= 0; i--)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = 0; i < 10; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestIncrementPreIncrement()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; ++i)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = args.Length - 1; i >= 0; --i)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestIncrementAddAssignment()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; i += 1)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = args.Length - 1; i >= 0; i -= 1)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestMissingWithNonOneIncrementValue()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i < args.Length; i += 2)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostDecrement()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = args.Length - 1; i >= 0; i--)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = 0; i < args.Length; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostIncrementEquals1()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; i <= args.Length; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = args.Length; i >= 0; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostDecrementEquals()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = args.Length; i >= 0; i--)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = 0; i <= args.Length; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestTrivia1()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (/*t1*/int/*t2*/i/*t3*/=/*t4*/0/*t5*/;/*t6*/i/*t7*/</*t8*/args.Length/*t9*/;/*t10*/i/*t11*/++/*t12*/)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (/*t1*/int/*t2*/i/*t3*/=/*t4*/args.Length/*t9*/- 1;/*t6*/i/*t7*/>=/*t8*/0/*t5*/;/*t10*/i/*t11*/--/*t12*/)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostIncrementSwappedConditions()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; args.Length > i; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = args.Length - 1; 0 <= i; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestPostIncrementEqualsSwappedConditions()
    {
        await TestInRegularAndScriptAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (int i = 0; args.Length >= i; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (int i = args.Length; 0 <= i; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestByteOneMin()
    {
        await TestInRegularAndScript1Async(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (byte i = 1; i <= 10; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (byte i = 10; i >= 1; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt16OneMin()
    {
        await TestInRegularAndScript1Async(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (ushort i = 1; i <= 10; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (ushort i = 10; i >= 1; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt32OneMin()
    {
        await TestInRegularAndScript1Async(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (uint i = 1; i <= 10; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (uint i = 10; i >= 1; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt64OneMin()
    {
        await TestInRegularAndScript1Async(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (ulong i = 1; i <= 10; i++)
                    {
                    }
                }
            }
            """,
            """
            class C
            {
                void M(string[] args)
                {
                    for (ulong i = 10; i >= 1; i--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestByteZeroMin()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (byte i = 0; i <= 10; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt16ZeroMin()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (ushort i = 0; i <= 10; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt32ZeroMin()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (uint i = 0; i <= 10; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt64ZeroMin()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (ulong i = 0; i <= 10; i++)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestByteMax()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (byte x = byte.MaxValue; x >= 10; x--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt16Max()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (ushort x = ushort.MaxValue; x >= 10; x--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt32Max()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (uint x = uint.MaxValue; x >= 10; x--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestUInt64Max()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (ulong x = ulong.MaxValue; x >= 10; x--)
                    {
                    }
                }
            }
            """);
    }
 
    [Fact]
    public async Task TestByteZeroMinReverse()
    {
        await TestMissingAsync(
            """
            class C
            {
                void M(string[] args)
                {
                    [||]for (byte i = 10; i >= 0; i--)
                    {
                    }
                }
            }
            """);
    }
}