Skip to content

Commit 1c990cc

Browse files
authored
Merge pull request #4065 from sharwell/extension-foreach
Add tests for extension foreach in C# 9
2 parents f7f55c7 + f9a4888 commit 1c990cc

File tree

7 files changed

+460
-2
lines changed

7 files changed

+460
-2
lines changed

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/LayoutRules/SA1501CSharp9UnitTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ namespace StyleCop.Analyzers.Test.CSharp9.LayoutRules
55
{
66
using System.Threading;
77
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
89
using StyleCop.Analyzers.Test.CSharp8.LayoutRules;
910
using Xunit;
1011
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
@@ -46,5 +47,71 @@ void Local()
4647

4748
await VerifyCSharpFixAsync(testCode, Diagnostic().WithLocation(0), fixedCode, CancellationToken.None).ConfigureAwait(false);
4849
}
50+
51+
[Fact]
52+
[WorkItem(3976, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3976")]
53+
public async Task TestSingleLineForeachWithExtensionEnumeratorAsync()
54+
{
55+
var testCode = @"
56+
using System;
57+
58+
public class TestClass
59+
{
60+
public void TestMethod()
61+
{
62+
foreach (var value in new ExtensionEnumerable()) [|{|] Console.WriteLine(value); }
63+
}
64+
}
65+
66+
public class ExtensionEnumerable
67+
{
68+
}
69+
70+
public struct ExtensionEnumerator
71+
{
72+
public int Current => 0;
73+
74+
public bool MoveNext() => false;
75+
}
76+
77+
public static class ExtensionEnumerableExtensions
78+
{
79+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
80+
}
81+
";
82+
83+
var fixedCode = @"
84+
using System;
85+
86+
public class TestClass
87+
{
88+
public void TestMethod()
89+
{
90+
foreach (var value in new ExtensionEnumerable())
91+
{
92+
Console.WriteLine(value);
93+
}
94+
}
95+
}
96+
97+
public class ExtensionEnumerable
98+
{
99+
}
100+
101+
public struct ExtensionEnumerator
102+
{
103+
public int Current => 0;
104+
105+
public bool MoveNext() => false;
106+
}
107+
108+
public static class ExtensionEnumerableExtensions
109+
{
110+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
111+
}
112+
";
113+
114+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
115+
}
49116
}
50117
}

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/LayoutRules/SA1503CSharp9UnitTests.cs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,82 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp9.LayoutRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.CSharp8.LayoutRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
12+
StyleCop.Analyzers.LayoutRules.SA1503BracesMustNotBeOmitted,
13+
StyleCop.Analyzers.LayoutRules.SA1503CodeFixProvider>;
714

815
public partial class SA1503CSharp9UnitTests : SA1503CSharp8UnitTests
916
{
17+
[Fact]
18+
[WorkItem(3976, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3976")]
19+
public async Task TestForeachWithExtensionEnumeratorAsync()
20+
{
21+
var testCode = @"
22+
using System;
23+
24+
public class TestClass
25+
{
26+
public void TestMethod()
27+
{
28+
foreach (var value in new ExtensionEnumerable())
29+
[|Console.WriteLine(value);|]
30+
}
31+
}
32+
33+
public class ExtensionEnumerable
34+
{
35+
}
36+
37+
public struct ExtensionEnumerator
38+
{
39+
public int Current => 0;
40+
41+
public bool MoveNext() => false;
42+
}
43+
44+
public static class ExtensionEnumerableExtensions
45+
{
46+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
47+
}
48+
";
49+
50+
var fixedCode = @"
51+
using System;
52+
53+
public class TestClass
54+
{
55+
public void TestMethod()
56+
{
57+
foreach (var value in new ExtensionEnumerable())
58+
{
59+
Console.WriteLine(value);
60+
}
61+
}
62+
}
63+
64+
public class ExtensionEnumerable
65+
{
66+
}
67+
68+
public struct ExtensionEnumerator
69+
{
70+
public int Current => 0;
71+
72+
public bool MoveNext() => false;
73+
}
74+
75+
public static class ExtensionEnumerableExtensions
76+
{
77+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
78+
}
79+
";
80+
81+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
82+
}
1083
}
1184
}

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/LayoutRules/SA1519CSharp9UnitTests.cs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,84 @@
33

44
namespace StyleCop.Analyzers.Test.CSharp9.LayoutRules
55
{
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Microsoft.CodeAnalysis.Testing;
69
using StyleCop.Analyzers.Test.CSharp8.LayoutRules;
10+
using Xunit;
11+
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
12+
StyleCop.Analyzers.LayoutRules.SA1519BracesMustNotBeOmittedFromMultiLineChildStatement,
13+
StyleCop.Analyzers.LayoutRules.SA1503CodeFixProvider>;
714

815
public partial class SA1519CSharp9UnitTests : SA1519CSharp8UnitTests
916
{
17+
[Fact]
18+
[WorkItem(3976, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3976")]
19+
public async Task TestForeachWithExtensionEnumeratorAsync()
20+
{
21+
var testCode = @"
22+
using System;
23+
24+
public class TestClass
25+
{
26+
public void TestMethod()
27+
{
28+
foreach (var value in new ExtensionEnumerable())
29+
[|Console.WriteLine(
30+
value);|]
31+
}
32+
}
33+
34+
public class ExtensionEnumerable
35+
{
36+
}
37+
38+
public struct ExtensionEnumerator
39+
{
40+
public int Current => 0;
41+
42+
public bool MoveNext() => false;
43+
}
44+
45+
public static class ExtensionEnumerableExtensions
46+
{
47+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
48+
}
49+
";
50+
51+
var fixedCode = @"
52+
using System;
53+
54+
public class TestClass
55+
{
56+
public void TestMethod()
57+
{
58+
foreach (var value in new ExtensionEnumerable())
59+
{
60+
Console.WriteLine(
61+
value);
62+
}
63+
}
64+
}
65+
66+
public class ExtensionEnumerable
67+
{
68+
}
69+
70+
public struct ExtensionEnumerator
71+
{
72+
public int Current => 0;
73+
74+
public bool MoveNext() => false;
75+
}
76+
77+
public static class ExtensionEnumerableExtensions
78+
{
79+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
80+
}
81+
";
82+
83+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
84+
}
1085
}
1186
}

StyleCop.Analyzers/StyleCop.Analyzers.Test.CSharp9/NamingRules/SA1312CSharp9UnitTests.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ namespace StyleCop.Analyzers.Test.CSharp9.NamingRules
77
using System.Threading.Tasks;
88
using Microsoft.CodeAnalysis.Testing;
99
using StyleCop.Analyzers.Test.CSharp8.NamingRules;
10+
using StyleCop.Analyzers.Test.Helpers;
1011
using Xunit;
1112
using static StyleCop.Analyzers.Test.Verifiers.StyleCopCodeFixVerifier<
1213
StyleCop.Analyzers.NamingRules.SA1312VariableNamesMustBeginWithLowerCaseLetter,
@@ -32,5 +33,74 @@ public void Test()
3233

3334
await VerifyCSharpDiagnosticAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, CancellationToken.None).ConfigureAwait(false);
3435
}
36+
37+
[Fact]
38+
[WorkItem(3976, "https://github.com/DotNetAnalyzers/StyleCopAnalyzers/issues/3976")]
39+
public async Task TestForeachVariableWithExtensionEnumeratorAsync()
40+
{
41+
var testCode = @"
42+
using System;
43+
44+
public class TestClass
45+
{
46+
public void TestMethod()
47+
{
48+
foreach (var [|Item|] in new ExtensionEnumerable())
49+
{
50+
Console.WriteLine(Item);
51+
}
52+
}
53+
}
54+
55+
public class ExtensionEnumerable
56+
{
57+
}
58+
59+
public struct ExtensionEnumerator
60+
{
61+
public int Current => 0;
62+
63+
public bool MoveNext() => false;
64+
}
65+
66+
public static class ExtensionEnumerableExtensions
67+
{
68+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
69+
}
70+
";
71+
72+
var fixedCode = @"
73+
using System;
74+
75+
public class TestClass
76+
{
77+
public void TestMethod()
78+
{
79+
foreach (var item in new ExtensionEnumerable())
80+
{
81+
Console.WriteLine(item);
82+
}
83+
}
84+
}
85+
86+
public class ExtensionEnumerable
87+
{
88+
}
89+
90+
public struct ExtensionEnumerator
91+
{
92+
public int Current => 0;
93+
94+
public bool MoveNext() => false;
95+
}
96+
97+
public static class ExtensionEnumerableExtensions
98+
{
99+
public static ExtensionEnumerator GetEnumerator(this ExtensionEnumerable enumerable) => new();
100+
}
101+
";
102+
103+
await VerifyCSharpFixAsync(testCode, DiagnosticResult.EmptyDiagnosticResults, fixedCode, CancellationToken.None).ConfigureAwait(false);
104+
}
35105
}
36106
}

0 commit comments

Comments
 (0)