/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/Compilers/Core/CodeAnalysisTest/InternalUtilities/OneOrManyTests.cs
274 строки
12 KB
Tomáš Matoušek
Refactoring of extension methods in source packages (#78620) - take 2 (#78894)
26 июн 2025, 18:42
Не верифицирован
26 июн 2025, 18:42
05fc006
Код
Авторство
О чём код?
// 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. using System; using System.Collections.Immutable; using Microsoft.CodeAnalysis.Collections; using Roslyn.Test.Utilities; using Roslyn.Utilities; using Xunit; namespace Microsoft.CodeAnalysis.UnitTests.InternalUtilities { public class OneOrManyTests : TestBase { private static void Verify<T>(OneOrMany<T> actual, params T[] expected) where T : notnull { Assert.Equal(actual.Count, expected.Length); int n = actual.Count; int i; for (i = 0; i < n; i++) { Assert.Equal(actual[i], expected[i]); } i = 0; foreach (var value in actual) { Assert.Equal(value, expected[i]); i++; } Assert.Equal(n, i); Assert.True(actual.SequenceEqual(expected)); } [Fact] public void CreateZero() { Verify(OneOrMany.Create(ImmutableArray<int>.Empty)); Verify(new OneOrMany<int>(ImmutableArray<int>.Empty)); } [Fact] public void CreateOne() { Verify(OneOrMany.Create(1), 1); Verify(OneOrMany.Create(ImmutableArray.Create(2)), 2); Verify(OneOrMany.Create(ImmutableArray<int>.Empty).Add(3), 3); Verify(new OneOrMany<int>(1), 1); Verify(new OneOrMany<int>(ImmutableArray.Create(2)), 2); Verify(new OneOrMany<int>(ImmutableArray<int>.Empty).Add(3), 3); } [Fact] public void OneOrNone() { Verify(OneOrMany.OneOrNone(1), 1); Verify(OneOrMany.OneOrNone("x"), "x"); Verify(OneOrMany.OneOrNone<string>(null)); } [Fact] public void CreateArray() { Verify(OneOrMany.Create(ImmutableArray.Create(1, 2, 3)).Add(4), 1, 2, 3, 4); Verify(OneOrMany.Create(ImmutableArray.Create(1, 2, 3, 4)), 1, 2, 3, 4); Verify(OneOrMany.Create(ImmutableArray<int>.Empty).Add(1).Add(2).Add(3).Add(4), 1, 2, 3, 4); Verify(new OneOrMany<int>(ImmutableArray.Create(1, 2, 3)).Add(4), 1, 2, 3, 4); Verify(new OneOrMany<int>(ImmutableArray.Create(1, 2, 3, 4)), 1, 2, 3, 4); Verify(new OneOrMany<int>(ImmutableArray<int>.Empty).Add(1).Add(2).Add(3).Add(4), 1, 2, 3, 4); Verify(OneOrMany.Create(ImmutableArray.Create(1)).Add(4), 1, 4); Verify(OneOrMany.Create(ImmutableArray.Create(1)), 1); Verify(OneOrMany.Create(1, 2), 1, 2); } [Fact] public void Contains() { Assert.True(OneOrMany.Create(1).Contains(1)); Assert.False(OneOrMany.Create(1).Contains(0)); Assert.False(OneOrMany.Create(ImmutableArray<int>.Empty).Contains(0)); Assert.True(OneOrMany.Create(ImmutableArray.Create(1)).Contains(1)); Assert.False(OneOrMany.Create(ImmutableArray.Create(1)).Contains(0)); Assert.True(OneOrMany.Create(ImmutableArray.Create(1, 2)).Contains(1)); Assert.True(OneOrMany.Create(ImmutableArray.Create(1, 2)).Contains(2)); Assert.False(OneOrMany.Create(ImmutableArray.Create(1, 2)).Contains(0)); } [Fact] public void RemoveAll() { Verify(OneOrMany<int>.Empty.RemoveAll(1)); Verify(OneOrMany.Create(1).RemoveAll(1)); Verify(OneOrMany.Create(2).RemoveAll(1), 2); Verify(OneOrMany.Create(1, 2).RemoveAll(1), 2); Verify(OneOrMany.Create(1, 2).RemoveAll(2), 1); Verify(OneOrMany.Create(1, 1).RemoveAll(1)); Verify(OneOrMany.Create(ImmutableArray.Create(1, 1, 1, 2)).RemoveAll(1), 2); } [Fact] public void Select() { Verify(OneOrMany.Create(1).Select(i => i + 1), 2); Verify(OneOrMany.Create(ImmutableArray<int>.Empty).Select(i => i + 1)); Verify(OneOrMany.Create(ImmutableArray.Create(1)).Select(i => i + 1), 2); Verify(OneOrMany.Create(ImmutableArray.Create(1, 2)).Select(i => i + 1), 2, 3); } [Fact] public void Select_WithArg() { Verify(OneOrMany.Create(1).Select((i, a) => i + a, 1), 2); Verify(OneOrMany.Create(ImmutableArray<int>.Empty).Select((i, a) => i + a, 1)); Verify(OneOrMany.Create(ImmutableArray.Create(1)).Select((i, a) => i + a, 1), 2); Verify(OneOrMany.Create(ImmutableArray.Create(1, 2)).Select((i, a) => i + a, 1), 2, 3); } [Fact] public void FirstOrDefault() { Assert.Equal(1, OneOrMany.Create(1).FirstOrDefault(i => i < 2)); Assert.Equal(0, OneOrMany.Create(1).FirstOrDefault(i => i > 2)); Assert.Equal(0, OneOrMany.Create(ImmutableArray<int>.Empty).FirstOrDefault(i => i > 2)); Assert.Equal(1, OneOrMany.Create(ImmutableArray.Create(1)).FirstOrDefault(i => i < 2)); Assert.Equal(0, OneOrMany.Create(ImmutableArray.Create(1)).FirstOrDefault(i => i > 2)); Assert.Equal(1, OneOrMany.Create(ImmutableArray.Create(1, 3)).FirstOrDefault(i => i < 2)); Assert.Equal(3, OneOrMany.Create(ImmutableArray.Create(1, 3)).FirstOrDefault(i => i > 2)); } [Fact] public void FirstOrDefault_WithArg() { Assert.Equal(1, OneOrMany.Create(1).FirstOrDefault((i, a) => i < a, 2)); Assert.Equal(0, OneOrMany.Create(1).FirstOrDefault((i, a) => i > a, 2)); Assert.Equal(0, OneOrMany.Create(ImmutableArray<int>.Empty).FirstOrDefault((i, a) => i > a, 2)); Assert.Equal(1, OneOrMany.Create(ImmutableArray.Create(1)).FirstOrDefault((i, a) => i < a, 2)); Assert.Equal(0, OneOrMany.Create(ImmutableArray.Create(1)).FirstOrDefault((i, a) => i > a, 2)); Assert.Equal(1, OneOrMany.Create(ImmutableArray.Create(1, 3)).FirstOrDefault((i, a) => i < a, 2)); Assert.Equal(3, OneOrMany.Create(ImmutableArray.Create(1, 3)).FirstOrDefault((i, a) => i > a, 2)); } [Fact] public void All() { Assert.True(OneOrMany<int>.Empty.All(_ => false)); Assert.True(OneOrMany<int>.Empty.All(_ => true)); Assert.False(OneOrMany.Create(1).All(i => i > 1)); Assert.True(OneOrMany.Create(1).All(i => i > 0)); Assert.False(OneOrMany.Create(1, 2).All(i => i > 1)); Assert.True(OneOrMany.Create(1, 2).All(i => i > 0)); } [Fact] public void All_WithArg() { Assert.True(OneOrMany<int>.Empty.All((_, _) => false, 0)); Assert.True(OneOrMany<int>.Empty.All((_, _) => true, 0)); Assert.False(OneOrMany.Create(1).All((i, a) => i > a, 1)); Assert.True(OneOrMany.Create(1).All((i, a) => i > a, 0)); Assert.False(OneOrMany.Create(1, 2).All((i, a) => i > a, 1)); Assert.True(OneOrMany.Create(1, 2).All((i, a) => i > a, 0)); } [Fact] public void Any() { Assert.False(OneOrMany<int>.Empty.Any()); Assert.True(OneOrMany.Create(1).Any()); Assert.True(OneOrMany.Create(1, 2).Any()); } [Fact] public void Any_Predicate() { Assert.False(OneOrMany<int>.Empty.Any(_ => false)); Assert.False(OneOrMany<int>.Empty.Any(_ => true)); Assert.False(OneOrMany.Create(1).Any(i => i > 1)); Assert.True(OneOrMany.Create(1).Any(i => i > 0)); Assert.False(OneOrMany.Create(1, 2).Any(i => i < 0)); Assert.True(OneOrMany.Create(1, 2).Any(i => i > 1)); } [Fact] public void Any_Predicate_WithArg() { Assert.False(OneOrMany<int>.Empty.Any((_, _) => false, 0)); Assert.False(OneOrMany<int>.Empty.Any((_, _) => true, 0)); Assert.False(OneOrMany.Create(1).Any((i, a) => i > a, 1)); Assert.True(OneOrMany.Create(1).Any((i, a) => i > a, 0)); Assert.False(OneOrMany.Create(1, 2).Any((i, a) => i < a, 0)); Assert.True(OneOrMany.Create(1, 2).Any((i, a) => i > a, 1)); } [Fact] public void Errors() { var single = OneOrMany.Create(123); var quad = OneOrMany.Create(ImmutableArray.Create<int>(10, 20, 30, 40)); Assert.Throws<IndexOutOfRangeException>(() => single[1]); Assert.Throws<IndexOutOfRangeException>(() => single[-1]); Assert.Throws<IndexOutOfRangeException>(() => quad[5]); Assert.Throws<IndexOutOfRangeException>(() => quad[-1]); Assert.Throws<ArgumentNullException>(() => OneOrMany.Create(default(ImmutableArray<int>))); } [Fact] public void SequenceEqual() { Assert.True(OneOrMany<int>.Empty.SequenceEqual(OneOrMany<int>.Empty)); Assert.False(OneOrMany<int>.Empty.SequenceEqual(OneOrMany.Create(1))); Assert.False(OneOrMany<int>.Empty.SequenceEqual(OneOrMany.Create(1, 2))); Assert.False(OneOrMany.Create(1).SequenceEqual(OneOrMany<int>.Empty)); Assert.False(OneOrMany.Create(1, 2).SequenceEqual(OneOrMany<int>.Empty)); Assert.True(OneOrMany.Create(1).SequenceEqual(OneOrMany.Create(1))); Assert.False(OneOrMany.Create(1).SequenceEqual(OneOrMany.Create(2))); Assert.True(OneOrMany.Create(1, 2).SequenceEqual(OneOrMany.Create(1, 2))); Assert.False(OneOrMany.Create(1, 2).SequenceEqual(OneOrMany.Create(1, 0))); Assert.False(OneOrMany.Create(1, 2).SequenceEqual(OneOrMany.Create(ImmutableArray.Create(1, 2, 3)))); Assert.True(OneOrMany.Create(1).SequenceEqual(OneOrMany.Create(ImmutableArray.Create(1)))); Assert.True(OneOrMany<int>.Empty.SequenceEqual(new int[0])); Assert.False(OneOrMany<int>.Empty.SequenceEqual(new[] { 1 })); Assert.False(OneOrMany<int>.Empty.SequenceEqual(new[] { 1, 2 })); Assert.True(OneOrMany.Create(1).SequenceEqual(new[] { 1 })); Assert.False(OneOrMany.Create(1).SequenceEqual(new[] { 2 })); Assert.True(OneOrMany.Create(1, 2).SequenceEqual(new[] { 1, 2 })); Assert.False(OneOrMany.Create(1, 2).SequenceEqual(new[] { 1, 0 })); Assert.False(OneOrMany.Create(1, 2).SequenceEqual(new[] { 1, 2, 3 })); Assert.True(new int[0].SequenceEqual(OneOrMany<int>.Empty)); Assert.False(new[] { 1 }.SequenceEqual(OneOrMany<int>.Empty)); Assert.False(new[] { 1, 2 }.SequenceEqual(OneOrMany<int>.Empty)); Assert.True(new[] { 1 }.SequenceEqual(OneOrMany.Create(1))); Assert.False(new[] { 1 }.SequenceEqual(OneOrMany.Create(2))); Assert.True(new[] { 1, 2 }.SequenceEqual(OneOrMany.Create(1, 2))); Assert.False(new[] { 1, 2 }.SequenceEqual(OneOrMany.Create(1, 0))); Assert.False(new[] { 1, 2 }.SequenceEqual(OneOrMany.Create(ImmutableArray.Create(1, 2, 3)))); Assert.True(ImmutableArray<int>.Empty.SequenceEqual(OneOrMany<int>.Empty)); Assert.False(ImmutableArray.Create(1).SequenceEqual(OneOrMany<int>.Empty)); Assert.False(ImmutableArray.Create(1, 2).SequenceEqual(OneOrMany<int>.Empty)); Assert.True(ImmutableArray.Create(1).SequenceEqual(OneOrMany.Create(1))); Assert.False(ImmutableArray.Create(1).SequenceEqual(OneOrMany.Create(2))); Assert.True(ImmutableArray.Create(1, 2).SequenceEqual(OneOrMany.Create(1, 2))); Assert.False(ImmutableArray.Create(1, 2).SequenceEqual(OneOrMany.Create(1, 0))); Assert.False(ImmutableArray.Create(1, 2).SequenceEqual(OneOrMany.Create(ImmutableArray.Create(1, 2, 3)))); } [Fact] public void SequenceEqual_WithComparer() { var comparer = new TestEqualityComparer<int>((x, y) => x % 10 == y % 10); Assert.True(OneOrMany.Create(1).SequenceEqual(new[] { 11 }, comparer)); Assert.True(OneOrMany.Create(1, 2).SequenceEqual(new[] { 11, 32 }, comparer)); Assert.False(OneOrMany.Create(1, 2).SequenceEqual(new[] { 0, 1 }, comparer)); } } }