Skip to content

Commit a20bba5

Browse files
committed
Cleanup Enumerable and ImmutableArray extensions
1 parent 3effda2 commit a20bba5

File tree

11 files changed

+762
-737
lines changed

11 files changed

+762
-737
lines changed

src/Compilers/Core/CodeAnalysisTest/Collections/EnumerableExtensionsTests.cs

Lines changed: 0 additions & 81 deletions
This file was deleted.

src/Compilers/Core/CodeAnalysisTest/InternalUtilities/EnumerableExtensionsTests.cs

Lines changed: 141 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,155 @@
44

55
#nullable disable
66

7+
using System;
8+
using System.Collections;
79
using System.Collections.Generic;
10+
using System.Linq;
11+
using Microsoft.CodeAnalysis.Collections;
12+
using Roslyn.Utilities;
813
using Xunit;
914

10-
namespace Roslyn.Utilities.UnitTests.InternalUtilities
15+
namespace Microsoft.CodeAnalysis.UnitTests;
16+
17+
public class EnumerableExtensionsTests
1118
{
12-
using System.Linq;
19+
private static IEnumerable<T> MakeEnumerable<T>(params T[] values)
20+
=> values;
1321

14-
public class EnumerableExtensionsTests
22+
[Fact]
23+
public void SequenceEqual()
1524
{
16-
[Fact]
17-
public void SequenceEqual()
25+
bool comparer(int x, int y) => x == y;
26+
Assert.True(RoslynEnumerableExtensions.SequenceEqual((IEnumerable<int>)null, null, comparer));
27+
Assert.False(RoslynEnumerableExtensions.SequenceEqual(new[] { 1 }, null, comparer));
28+
Assert.False(RoslynEnumerableExtensions.SequenceEqual(null, new[] { 1 }, comparer));
29+
30+
Assert.True(RoslynEnumerableExtensions.SequenceEqual(new[] { 1 }, new[] { 1 }, comparer));
31+
Assert.False(RoslynEnumerableExtensions.SequenceEqual(new int[0], new[] { 1 }, comparer));
32+
Assert.False(RoslynEnumerableExtensions.SequenceEqual(new[] { 1 }, new int[0], comparer));
33+
Assert.False(RoslynEnumerableExtensions.SequenceEqual(new[] { 1, 2, 3 }, new[] { 1, 3, 2 }, comparer));
34+
Assert.True(RoslynEnumerableExtensions.SequenceEqual(new[] { 1, 2, 3 }, new[] { 1, 2, 3 }, comparer));
35+
}
36+
37+
[Fact]
38+
public void AsSingleton()
39+
{
40+
Assert.Equal(0, new int[] { }.AsSingleton());
41+
Assert.Equal(1, new int[] { 1 }.AsSingleton());
42+
Assert.Equal(0, new int[] { 1, 2 }.AsSingleton());
43+
44+
Assert.Equal(0, Enumerable.Range(1, 0).AsSingleton());
45+
Assert.Equal(1, Enumerable.Range(1, 1).AsSingleton());
46+
Assert.Equal(0, Enumerable.Range(1, 2).AsSingleton());
47+
}
48+
49+
private class ReadOnlyList<T> : IReadOnlyList<T>
50+
{
51+
private readonly T[] _items;
52+
53+
public ReadOnlyList(params T[] items)
1854
{
19-
bool comparer(int x, int y) => x == y;
20-
Assert.True(EnumerableExtensions.SequenceEqual((IEnumerable<int>)null, null, comparer));
21-
Assert.False(EnumerableExtensions.SequenceEqual(new[] { 1 }, null, comparer));
22-
Assert.False(EnumerableExtensions.SequenceEqual(null, new[] { 1 }, comparer));
23-
24-
Assert.True(EnumerableExtensions.SequenceEqual(new[] { 1 }, new[] { 1 }, comparer));
25-
Assert.False(EnumerableExtensions.SequenceEqual(new int[0], new[] { 1 }, comparer));
26-
Assert.False(EnumerableExtensions.SequenceEqual(new[] { 1 }, new int[0], comparer));
27-
Assert.False(EnumerableExtensions.SequenceEqual(new[] { 1, 2, 3 }, new[] { 1, 3, 2 }, comparer));
28-
Assert.True(EnumerableExtensions.SequenceEqual(new[] { 1, 2, 3 }, new[] { 1, 2, 3 }, comparer));
55+
_items = items;
2956
}
57+
58+
public T this[int index] => _items[index];
59+
public int Count => _items.Length;
60+
public IEnumerator<T> GetEnumerator() => throw new NotImplementedException();
61+
IEnumerator IEnumerable.GetEnumerator() => throw new NotImplementedException();
3062
}
63+
64+
private class SignlessEqualityComparer : IEqualityComparer<int>
65+
{
66+
public bool Equals(int x, int y) => Math.Abs(x) == Math.Abs(y);
67+
public int GetHashCode(int obj) => throw new NotImplementedException();
68+
}
69+
70+
[Fact]
71+
public void IndexOf()
72+
{
73+
Assert.Equal(-1, SpecializedCollections.SingletonList(5).IndexOf(6));
74+
Assert.Equal(0, SpecializedCollections.SingletonList(5).IndexOf(5));
75+
76+
Assert.Equal(-1, new ReadOnlyList<int>(5).IndexOf(6));
77+
Assert.Equal(0, new ReadOnlyList<int>(5).IndexOf(5));
78+
}
79+
80+
[Fact]
81+
public void IndexOf_EqualityComparer()
82+
{
83+
var comparer = new SignlessEqualityComparer();
84+
85+
Assert.Equal(-1, SpecializedCollections.SingletonList(5).IndexOf(-6, comparer));
86+
Assert.Equal(0, SpecializedCollections.SingletonList(5).IndexOf(-5, comparer));
87+
88+
Assert.Equal(-1, new ReadOnlyList<int>(5).IndexOf(-6, comparer));
89+
Assert.Equal(0, new ReadOnlyList<int>(5).IndexOf(-5, comparer));
90+
}
91+
92+
[Fact]
93+
public void TestDo()
94+
{
95+
var elements = MakeEnumerable(1, 2, 3);
96+
var result = new List<int>();
97+
98+
elements.Do(a => result.Add(a));
99+
100+
Assert.True(elements.SequenceEqual(result));
101+
}
102+
103+
[Fact]
104+
public void TestConcat()
105+
{
106+
var elements = MakeEnumerable(1, 2, 3);
107+
Assert.True(MakeEnumerable(1, 2, 3, 4).SequenceEqual(elements.Concat(4)));
108+
}
109+
110+
[Fact]
111+
public void TestSetEquals()
112+
=> Assert.True(MakeEnumerable(1, 2, 3, 4).SetEquals(MakeEnumerable(4, 2, 3, 1)));
113+
114+
[Fact]
115+
public void TestIsEmpty()
116+
{
117+
Assert.True(MakeEnumerable<int>().IsEmpty());
118+
Assert.False(MakeEnumerable(0).IsEmpty());
119+
}
120+
121+
[Fact]
122+
public void TestJoin()
123+
{
124+
Assert.Equal(string.Empty, MakeEnumerable<string>().Join(", "));
125+
Assert.Equal("a", MakeEnumerable("a").Join(", "));
126+
Assert.Equal("a, b", MakeEnumerable("a", "b").Join(", "));
127+
Assert.Equal("a, b, c", MakeEnumerable("a", "b", "c").Join(", "));
128+
}
129+
130+
[Fact]
131+
public void TestFlatten()
132+
{
133+
var sequence = MakeEnumerable(MakeEnumerable("a", "b"), MakeEnumerable("c", "d"), MakeEnumerable("e", "f"));
134+
Assert.True(sequence.Flatten().SequenceEqual(MakeEnumerable("a", "b", "c", "d", "e", "f")));
135+
}
136+
137+
[Fact]
138+
public void TestSequenceEqualWithFunction()
139+
{
140+
static bool equality(int a, int b) => a == b;
141+
var seq = new List<int>() { 1, 2, 3 };
142+
143+
// same object reference
144+
Assert.True(seq.SequenceEqual(seq, equality));
145+
146+
// matching values, matching lengths
147+
Assert.True(seq.SequenceEqual(new int[] { 1, 2, 3 }, equality));
148+
149+
// matching values, different lengths
150+
Assert.False(seq.SequenceEqual(new int[] { 1, 2, 3, 4 }, equality));
151+
Assert.False(seq.SequenceEqual(new int[] { 1, 2 }, equality));
152+
153+
// different values, matching lengths
154+
Assert.False(seq.SequenceEqual(new int[] { 1, 2, 6 }, equality));
155+
}
156+
31157
}
32158

src/Compilers/Test/Core/Diagnostics/DescriptorFactory.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,9 @@ public static class DescriptorFactory
2929
/// <returns>A <see cref="DiagnosticDescriptor"/> with specified <see cref="DiagnosticDescriptor.Id"/>.</returns>
3030
public static DiagnosticDescriptor CreateSimpleDescriptor(string id, params string[] additionalCustomTags)
3131
{
32-
var customTags = additionalCustomTags.Concat(WellKnownDiagnosticTags.NotConfigurable).AsArray();
3332
return new DiagnosticDescriptor(id, title: "", messageFormat: id, category: "",
3433
defaultSeverity: DiagnosticSeverity.Hidden, isEnabledByDefault: true,
35-
customTags: customTags);
34+
customTags: [.. additionalCustomTags, WellKnownDiagnosticTags.NotConfigurable]);
3635
}
3736
}
3837
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
' Licensed to the .NET Foundation under one or more agreements.
2+
' The .NET Foundation licenses this file to you under the MIT license.
3+
' See the LICENSE file in the project root for more information.
4+
5+
Imports System.Runtime.CompilerServices
6+
7+
Namespace Microsoft.CodeAnalysis.VisualBasic
8+
Module EnumerableExtensions
9+
<Extension>
10+
Public Iterator Function Concat(Of T)(source As IEnumerable(Of T), value As T) As IEnumerable(Of T)
11+
For Each v In source
12+
Yield v
13+
Next
14+
15+
Yield value
16+
End Function
17+
End Module
18+
End Namespace

0 commit comments

Comments
 (0)