InvertIfTests.cs 16.0 KB
Newer Older
1
// Copyright (c) Microsoft.  All Rights Reserved.  Licensed under the Apache License, Version 2.0.  See License.txt in the project root for license information.
2

3
using System.Threading.Tasks;
C
CyrusNajmabadi 已提交
4
using Microsoft.CodeAnalysis.CodeRefactorings;
5 6 7 8 9 10 11 12
using Microsoft.CodeAnalysis.CSharp.CodeRefactorings.InvertIf;
using Roslyn.Test.Utilities;
using Xunit;

namespace Microsoft.CodeAnalysis.Editor.CSharp.UnitTests.CodeRefactorings.InvertIf
{
    public class InvertIfTests : AbstractCSharpCodeActionTest
    {
13
        private async Task TestFixOneAsync(
14 15 16
            string initial,
            string expected)
        {
17
            await TestAsync(CreateTreeText(initial), CreateTreeText(expected), index: 0);
18 19
        }

C
CyrusNajmabadi 已提交
20
        protected override CodeRefactoringProvider CreateCodeRefactoringProvider(Workspace workspace)
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
        {
            return new InvertIfCodeRefactoringProvider();
        }

        private string CreateTreeText(string initial)
        {
            return
@"class A
{
  void Foo()
  {
" + initial + @"
  }
}";
        }

37
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
38
        public async Task TestIdentifier()
39
        {
40
            await TestFixOneAsync(
41 42 43 44
@"[||]if (a) { a(); } else { b(); }",
@"if (!a) { b(); } else { a(); }");
        }

45
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
46
        public async Task TestNotIdentifier()
47
        {
48
            await TestFixOneAsync(
49 50 51 52
@"[||]if (!a) { a(); } else { b(); }",
@"if (a) { b(); } else { a(); }");
        }

53
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
54
        public async Task TestEqualsEquals()
55
        {
56
            await TestFixOneAsync(
57 58 59 60
@"[||]if (a == b) { a(); } else { b(); }",
@"if (a != b) { b(); } else { a(); }");
        }

61
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
62
        public async Task TestNotEquals()
63
        {
64
            await TestFixOneAsync(
65 66 67 68
@"[||]if (a != b) { a(); } else { b(); }",
@"if (a == b) { b(); } else { a(); }");
        }

69
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
70
        public async Task TestGreaterThan()
71
        {
72
            await TestFixOneAsync(
73 74 75 76
@"[||]if (a > b) { a(); } else { b(); }",
@"if (a <= b) { b(); } else { a(); }");
        }

77
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
78
        public async Task TestGreaterThanEquals()
79
        {
80
            await TestFixOneAsync(
81 82 83 84
@"[||]if (a >= b) { a(); } else { b(); }",
@"if (a < b) { b(); } else { a(); }");
        }

85
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
86
        public async Task TestLessThan()
87
        {
88
            await TestFixOneAsync(
89 90 91 92
@"[||]if (a < b) { a(); } else { b(); }",
@"if (a >= b) { b(); } else { a(); }");
        }

93
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
94
        public async Task TestLessThanEquals()
95
        {
96
            await TestFixOneAsync(
97 98 99 100
@"[||]if (a <= b) { a(); } else { b(); }",
@"if (a > b) { b(); } else { a(); }");
        }

101
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
102
        public async Task TestParens()
103
        {
104
            await TestFixOneAsync(
105 106 107 108
@"[||]if ((a)) { a(); } else { b(); }",
@"if (!a) { b(); } else { a(); }");
        }

109
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
110
        public async Task TestIs()
111
        {
112
            await TestFixOneAsync(
113 114 115 116
@"[||]if (a is Foo) { a(); } else { b(); }",
@"if (!(a is Foo)) { b(); } else { a(); }");
        }

117
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
118
        public async Task TestCall()
119
        {
120
            await TestFixOneAsync(
121 122 123 124
@"[||]if (a.Foo()) { a(); } else { b(); }",
@"if (!a.Foo()) { b(); } else { a(); }");
        }

125
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
126
        public async Task TestOr()
127
        {
128
            await TestFixOneAsync(
129 130 131 132
@"[||]if (a || b) { a(); } else { b(); }",
@"if (!a && !b) { b(); } else { a(); }");
        }

133
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
134
        public async Task TestOr2()
135
        {
136
            await TestFixOneAsync(
137 138 139 140
@"[||]if (!a || !b) { a(); } else { b(); }",
@"if (a && b) { b(); } else { a(); }");
        }

141
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
142
        public async Task TestAnd()
143
        {
144
            await TestFixOneAsync(
145 146 147 148
@"[||]if (a && b) { a(); } else { b(); }",
@"if (!a || !b) { b(); } else { a(); }");
        }

149
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
150
        public async Task TestAnd2()
151
        {
152
            await TestFixOneAsync(
153 154 155 156
@"[||]if (!a && !b) { a(); } else { b(); }",
@"if (a || b) { b(); } else { a(); }");
        }

157
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
158
        public async Task TestParenthesizeAndForPrecedence()
159
        {
160
            await TestFixOneAsync(
161 162 163 164
@"[||]if (a && b || c) { a(); } else { b(); }",
@"if ((!a || !b) && !c) { b(); } else { a(); }");
        }

165
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
166
        public async Task TestPlus()
167
        {
168
            await TestFixOneAsync(
169 170 171 172
@"[||]if (a + b) { a(); } else { b(); }",
@"if (!(a + b)) { b(); } else { a(); }");
        }

173
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
174
        public async Task TestTrue()
175
        {
176
            await TestFixOneAsync(
177 178 179 180
@"[||]if (true) { a(); } else { b(); }",
@"if (false) { b(); } else { a(); }");
        }

181
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
182
        public async Task TestFalse()
183
        {
184
            await TestFixOneAsync(
185 186 187 188
@"[||]if (false) { a(); } else { b(); }",
@"if (true) { b(); } else { a(); }");
        }

189
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
190
        public async Task TestTrueAndFalse()
191
        {
192
            await TestFixOneAsync(
193 194 195 196
@"[||]if (true && false) { a(); } else { b(); }",
@"if (false || true) { b(); } else { a(); }");
        }

197
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
198
        public async Task TestCurlies1()
199
        {
200
            await TestFixOneAsync(
201 202 203 204
@"[||]if (a) a(); else b();",
@"if (!a) b(); else a();");
        }

205
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
206
        public async Task TestCurlies2()
207
        {
208
            await TestFixOneAsync(
209 210 211 212
@"[||]if (a) { a(); } else b();",
@"if (!a) b(); else { a(); }");
        }

213
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
214
        public async Task TestCurlies3()
215
        {
216
            await TestFixOneAsync(
217 218 219 220
@"[||]if (a) a(); else { b(); }",
@"if (!a) { b(); } else a();");
        }

221
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
222
        public async Task TestIfElseIf()
223
        {
224
            await TestFixOneAsync(
225 226 227 228
@"[||]if (a) { a(); } else if (b) { b(); }",
@"if (!a) { if (b) { b(); } } else { a(); }");
        }

229
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
230
        public async Task TestIfElseIf2()
231
        {
232
            await TestFixOneAsync(
233 234 235 236
@"[||]if (a) { a(); } else if (b) { b(); } else { c(); }",
@"if (!a) { if (b) { b(); } else { c(); } } else { a(); }");
        }

237
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
238
        public async Task TestNested()
239
        {
240
            await TestFixOneAsync(
241 242 243 244
@"[||]if (((a == b) && (c != d)) || ((e < f) && (!g))) { a(); } else { b(); }",
@"if ((a != b || c == d) && (e >= f || g)) { b(); } else { a(); }");
        }

245
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
246
        public async Task TestKeepTriviaWithinExpression()
247
        {
248
            await TestFixOneAsync(
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
@"[||]if (a ||
    b &&
    c < // comment
    d)
{
    a();
}
else
{
    b();
}",
@"if (!a &&
    (!b ||
    c >= // comment
    d))
{
    b();
}
else
{
    a();
}");
        }

273
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
274
        public async Task TestMissingOnNonEmptySpan()
275
        {
276
            await TestMissingAsync(
C
CyrusNajmabadi 已提交
277 278 279 280 281 282 283 284 285 286 287 288 289 290
@"class C
{
    void F()
    {
        [|if (a)
        {
            a();
        }
        else
        {
            b();
        }|]
    }
}");
291 292
        }

293
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
294
        public async Task TestOverlapsHiddenPosition1()
295
        {
296
            await TestMissingAsync(
C
CyrusNajmabadi 已提交
297
@"class C
298 299 300 301
{
    void F()
    {
#line hidden
C
CyrusNajmabadi 已提交
302 303 304 305 306 307 308 309
        [||]if (a)
        {
            a();
        }
        else
        {
            b();
        }
310 311 312 313 314
#line default
    }
}");
        }

315
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
316
        public async Task TestOverlapsHiddenPosition2()
317
        {
318
            await TestMissingAsync(
C
CyrusNajmabadi 已提交
319
@"class C
320 321 322 323 324 325 326 327 328 329
{
    void F()
    {
        [||]if (a)
        {
#line hidden
            a();
#line default
        }
        else
C
CyrusNajmabadi 已提交
330
        {
331 332 333 334 335 336
            b();
        }
    }
}");
        }

337
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
338
        public async Task TestOverlapsHiddenPosition3()
339
        {
340
            await TestMissingAsync(
C
CyrusNajmabadi 已提交
341
@"class C
342 343 344 345 346 347 348 349
{
    void F()
    {
        [||]if (a)
        {
            a();
        }
        else
C
CyrusNajmabadi 已提交
350
        {
351 352 353 354 355 356 357 358
#line hidden
            b();
#line default
        }
    }
}");
        }

359
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
360
        public async Task TestOverlapsHiddenPosition4()
361
        {
362
            await TestMissingAsync(
C
CyrusNajmabadi 已提交
363
@"class C
364 365 366 367 368 369 370 371 372
{
    void F()
    {
        [||]if (a)
        {
#line hidden
            a();
        }
        else
C
CyrusNajmabadi 已提交
373
        {
374 375 376 377 378 379 380
            b();
#line default
        }
    }
}");
        }

381
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
382
        public async Task TestOverlapsHiddenPosition5()
383
        {
384
            await TestMissingAsync(
C
CyrusNajmabadi 已提交
385
@"class C
386 387 388 389 390 391 392 393 394
{
    void F()
    {
        [||]if (a)
        {
            a();
#line hidden
        }
        else
C
CyrusNajmabadi 已提交
395
        {
396 397 398 399 400 401 402
#line default
            b();
        }
    }
}");
        }

403
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
404
        public async Task TestOverlapsHiddenPosition6()
405
        {
406
            await TestAsync(
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
@"
#line hidden
class C 
{
    void F()
    {
#line default
        [||]if (a)
        {
            a();
        }
        else
        { 
            b();
        }
    }
}",

@"
#line hidden
class C 
{
    void F()
    {
#line default
        if (!a)
        {
            b();
        }
        else
        {
            a();
        }
    }
}", compareTokens: false);
        }

444
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
445
        public async Task TestOverlapsHiddenPosition7()
446
        {
447
            await TestAsync(
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
@"
#line hidden
class C 
{
    void F()
    {
#line default
        [||]if (a)
        {
            a();
        }
        else
        { 
            b();
        }
#line hidden
    }
}
#line default",

@"
#line hidden
class C 
{
    void F()
    {
#line default
        if (!a)
        {
            b();
        }
        else
        {
            a();
        }
#line hidden
    }
}
#line default", compareTokens: false);
        }

489
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
490
        public async Task TestSimplifyToLengthEqualsZero()
491
        {
492
            await TestFixOneAsync(
493 494 495 496
@"string x; [||]if (x.Length > 0) { GreaterThanZero(); } else { EqualsZero(); } } } ",
@"string x; if (x.Length == 0) { EqualsZero(); } else { GreaterThanZero(); } } } ");
        }

497
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
498
        public async Task TestSimplifyToLengthEqualsZero2()
499
        {
500
            await TestFixOneAsync(
501 502 503 504
@"string[] x; [||]if (x.Length > 0) { GreaterThanZero(); } else { EqualsZero(); } } } ",
@"string[] x; if (x.Length == 0) { EqualsZero(); } else { GreaterThanZero(); } } } ");
        }

505
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
506
        public async Task TestSimplifyToLengthEqualsZero3()
507
        {
508
            await TestFixOneAsync(
509 510 511 512
@"string x; [||]if (x.Length > 0x0) { a(); } else { b(); } } } ",
@"string x; if (x.Length == 0x0) { b(); } else { a(); } } } ");
        }

513
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
514
        public async Task TestSimplifyToLengthEqualsZero4()
515
        {
516
            await TestFixOneAsync(
517 518 519 520
@"string x; [||]if (0 < x.Length) { a(); } else { b(); } } } ",
@"string x; if (0 == x.Length) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
521
        [WorkItem(545986, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545986")]
522
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
523
        public async Task TestSimplifyToLengthEqualsZero5()
524
        {
525
            await TestFixOneAsync(
526 527 528 529
@"byte x = 1; [||]if (0 < x) { a(); } else { b(); } } } ",
@"byte x = 1; if (0 == x) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
530
        [WorkItem(545986, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545986")]
531
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
532
        public async Task TestSimplifyToLengthEqualsZero6()
533
        {
534
            await TestFixOneAsync(
535 536 537 538
@"ushort x = 1; [||]if (0 < x) { a(); } else { b(); } } } ",
@"ushort x = 1; if (0 == x) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
539
        [WorkItem(545986, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545986")]
540
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
541
        public async Task TestSimplifyToLengthEqualsZero7()
542
        {
543
            await TestFixOneAsync(
544 545 546 547
@"uint x = 1; [||]if (0 < x) { a(); } else { b(); } } } ",
@"uint x = 1; if (0 == x) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
548
        [WorkItem(545986, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545986")]
549
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
550
        public async Task TestSimplifyToLengthEqualsZero8()
551
        {
552
            await TestFixOneAsync(
553 554 555 556
@"ulong x = 1; [||]if (0 < x) { a(); } else { b(); } } } ",
@"ulong x = 1; if (0 == x) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
557
        [WorkItem(545986, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545986")]
558
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
559
        public async Task TestSimplifyToLengthEqualsZero9()
560
        {
561
            await TestFixOneAsync(
562 563 564 565
@"ulong x = 1; [||]if (0 == x) { a(); } else { b(); } } } ",
@"ulong x = 1; if (0 < x) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
566
        [WorkItem(545986, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/545986")]
567
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
568
        public async Task TestSimplifyToLengthEqualsZero10()
569
        {
570
            await TestFixOneAsync(
571 572 573 574
@"ulong x = 1; [||]if (x == 0) { a(); } else { b(); } } } ",
@"ulong x = 1; if (x > 0) { b(); } else { a(); } } } ");
        }

J
Jared Parsons 已提交
575
        [WorkItem(530505, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/530505")]
576
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
577
        public async Task TestSimplifyToLengthEqualsZero11()
578
        {
579
            await TestFixOneAsync(
580 581 582 583
@"string[] x; [||]if (x.LongLength > 0) { GreaterThanZero(); } else { EqualsZero(); } } } ",
@"string[] x; if (x.LongLength == 0) { EqualsZero(); } else { GreaterThanZero(); } } } ");
        }

584
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
585
        public async Task TestDoesNotSimplifyToLengthEqualsZero()
586
        {
587
            await TestFixOneAsync(
588 589 590 591
@"string x; [||]if (x.Length >= 0) { a(); } else { b(); } } } ",
@"string x; if (x.Length < 0) { b(); } else { a(); } } } ");
        }

592
        [Fact, Trait(Traits.Feature, Traits.Features.CodeActionsInvertIf)]
593
        public async Task TestDoesNotSimplifyToLengthEqualsZero2()
594
        {
595
            await TestFixOneAsync(
596 597 598 599 600
@"string x; [||]if (x.Length > 0.0f) { GreaterThanZero(); } else { EqualsZero(); } } } ",
@"string x; if (x.Length <= 0.0f) { EqualsZero(); } else { GreaterThanZero(); } } } ");
        }
    }
}