UseRangeOperatorTests.cs 6.2 KB
Newer Older
C
Cyrus Najmabadi 已提交
1 2 3 4 5
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.

using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CSharp;
C
Cyrus Najmabadi 已提交
6
using Microsoft.CodeAnalysis.CSharp.UseIndexOrRangeOperator;
C
Cyrus Najmabadi 已提交
7 8 9
using Microsoft.CodeAnalysis.Diagnostics;
using Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.Diagnostics;
using Microsoft.CodeAnalysis.Test.Utilities;
C
Cyrus Najmabadi 已提交
10
using Roslyn.Test.Utilities;
C
Cyrus Najmabadi 已提交
11 12
using Xunit;

C
Cyrus Najmabadi 已提交
13
namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.UseIndexOrRangeOperator
C
Cyrus Najmabadi 已提交
14 15 16 17 18 19
{
    public class UseRangeOperatorTests : AbstractCSharpDiagnosticProviderBasedUserDiagnosticTest
    {
        internal override (DiagnosticAnalyzer, CodeFixProvider) CreateDiagnosticProviderAndFixer(Workspace workspace)
            => (new CSharpUseRangeOperatorDiagnosticAnalyzer(), new CSharpUseRangeOperatorCodeFixProvider());

D
dotnet-bot 已提交
20
        private static readonly CSharpParseOptions s_parseOptions =
C
Cyrus Najmabadi 已提交
21 22 23 24 25
            CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp8);

        private static readonly TestParameters s_testParameters =
            new TestParameters(parseOptions: s_parseOptions);

C
Cyrus Najmabadi 已提交
26
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
C
Cyrus Najmabadi 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40
        public async Task TestNotInCSharp7()
        {
            await TestMissingAsync(
@"
class C
{
    void Goo(string s)
    {
        var v = s.Substring([||]1, s.Length - 1);
    }
}", parameters: new TestParameters(
    parseOptions: CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp7)));
        }

C
Cyrus Najmabadi 已提交
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
        public async Task TestWithMissingReference()
        {
            // We are explicitly *not* passing: CommonReferences="true" here.  We want to 
            // validate we don't crash with missing references.
            await TestMissingAsync(
@"<Workspace>
    <Project Language=""C#"" AssemblyName=""Assembly1"">
        <Document>
class C
{
    void Goo(string s)
    {
        var v = s.Substring([||]1, s.Length - 1);
    }
}
        </Document>
    </Project>
</Workspace>");
        }

C
Cyrus Najmabadi 已提交
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
        [WorkItem(36909, "https://github.com/dotnet/roslyn/issues/36909")]
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
        public async Task TestNotWithoutSystemRange()
        {
            await TestMissingInRegularAndScriptAsync(
@"
class C
{
    void Goo(string s)
    {
        var v = s.Substring([||]1, s.Length - 1);
    }
}", new TestParameters(parseOptions: s_parseOptions));
        }

C
Cyrus Najmabadi 已提交
77
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
C
Cyrus Najmabadi 已提交
78 79 80 81
        public async Task TestSimple()
        {
            await TestAsync(
@"
C
Cyrus Najmabadi 已提交
82
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
83 84 85 86 87 88 89 90
class C
{
    void Goo(string s)
    {
        var v = s.Substring([||]1, s.Length - 1);
    }
}",
@"
C
Cyrus Najmabadi 已提交
91
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
92 93 94 95 96 97 98 99 100
class C
{
    void Goo(string s)
    {
        var v = s[1..];
    }
}", parseOptions: s_parseOptions);
        }

C
Cyrus Najmabadi 已提交
101
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
C
Cyrus Najmabadi 已提交
102 103 104 105
        public async Task TestComplexSubstraction()
        {
            await TestAsync(
@"
C
Cyrus Najmabadi 已提交
106
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
107 108
class C
{
C
Cyrus Najmabadi 已提交
109
    void Goo(string s, int bar, int baz)
C
Cyrus Najmabadi 已提交
110 111 112 113 114
    {
        var v = s.Substring([||]bar, s.Length - baz - bar);
    }
}",
@"
C
Cyrus Najmabadi 已提交
115
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
116 117
class C
{
C
Cyrus Najmabadi 已提交
118
    void Goo(string s, int bar, int baz)
C
Cyrus Najmabadi 已提交
119 120 121 122 123 124
    {
        var v = s[bar..^baz];
    }
}", parseOptions: s_parseOptions);
        }

C
Cyrus Najmabadi 已提交
125
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
C
Cyrus Najmabadi 已提交
126 127 128 129
        public async Task TestConstantSubtraction1()
        {
            await TestAsync(
@"
C
Cyrus Najmabadi 已提交
130
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
131 132 133 134 135 136 137 138
class C
{
    void Goo(string s)
    {
        var v = s.Substring([||]1, s.Length - 2);
    }
}",
@"
C
Cyrus Najmabadi 已提交
139
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
140 141 142 143 144 145
class C
{
    void Goo(string s)
    {
        var v = s[1..^1];
    }
C
Cyrus Najmabadi 已提交
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
}", parseOptions: s_parseOptions);
        }

        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
        public async Task TestNonStringType()
        {
            await TestAsync(
@"
namespace System { public struct Range { } }
struct S { public S Slice(int start, int length); public int Length { get; } public S this[System.Range] { get; } }
class C
{
    void Goo(S s)
    {
        var v = s.Slice([||]1, s.Length - 2);
    }
}",
@"
namespace System { public struct Range { } }
struct S { public S Slice(int start, int length); public int Length { get; } public S this[System.Range] { get; } }
class C
{
    void Goo(S s)
    {
        var v = s[1..^1];
    }
172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
}", parseOptions: s_parseOptions);
        }

        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
        public async Task TestMethodToMethod()
        {
            await TestAsync(
@"
namespace System { public struct Range { } }
struct S { public int Slice(int start, int length); public int Length { get; } public int Slice(System.Range r); }
class C
{
    void Goo(S s)
    {
        var v = s.Slice([||]1, s.Length - 2);
    }
}",
@"
namespace System { public struct Range { } }
struct S { public int Slice(int start, int length); public int Length { get; } public int Slice(System.Range r); }
class C
{
    void Goo(S s)
    {
        var v = s.Slice(1..^1);
    }
C
Cyrus Najmabadi 已提交
198 199 200 201 202 203 204 205 206 207
}", parseOptions: s_parseOptions);
        }

        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsUseRangeOperator)]
        public async Task TestFixAllInvocationToElementAccess1()
        {
            // Note: once the IOp tree has support for range operators, this should 
            // simplify even further.
            await TestAsync(
@"
C
Cyrus Najmabadi 已提交
208
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
209 210 211 212 213 214 215 216
class C
{
    void Goo(string s, string t)
    {
        var v = t.Substring(s.Substring({|FixAllInDocument:|}1, s.Length - 2)[0], t.Length - s.Substring(1, s.Length - 2)[0]);
    }
}",
@"
C
Cyrus Najmabadi 已提交
217
namespace System { public struct Range { } }
C
Cyrus Najmabadi 已提交
218 219 220 221 222 223
class C
{
    void Goo(string s, string t)
    {
        var v = t.Substring(s[1..^1][0], t.Length - s[1..^1][0]);
    }
C
Cyrus Najmabadi 已提交
224 225 226 227
}", parseOptions: s_parseOptions);
        }
    }
}