123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- // Licensed to the .NET Foundation under one or more agreements.
- // The .NET Foundation licenses this file to you under the Apache 2.0 License.
- // See the LICENSE file in the project root for more information.
- <#@ template debug="false" hostspecific="false" language="C#" #>
- <#@ assembly name="System.Core" #>
- <#@ import namespace="System.Linq" #>
- <#@ import namespace="System.Text" #>
- <#@ import namespace="System.Collections.Generic" #>
- <#@ output extension=".cs" #>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Threading;
- using System.Threading.Tasks;
- using Xunit;
- namespace Tests
- {
- partial class GroupBy
- {
- <#
- foreach (var kind in new[] { "Sync", "Async", "Async_Cancel" })
- {
- string keySelectorType, elementSelectorType, resultSelectorType;
- string keySelectorFunc, elementSelectorFunc, resultSelectorFunc;
- string suffix;
- bool isCancel = false;
- switch (kind)
- {
- case "Sync":
- keySelectorType = elementSelectorType = "Func<int, int>";
- keySelectorFunc = elementSelectorFunc = "(int x) => x";
- resultSelectorType = "Func<int, IAsyncEnumerable<int>, int>";
- resultSelectorFunc = "(k, g) => 0";
- suffix = "";
- break;
- case "Async":
- keySelectorType = elementSelectorType = "Func<int, ValueTask<int>>";
- keySelectorFunc = elementSelectorFunc = "(int x) => new ValueTask<int>(x)";
- resultSelectorType = "Func<int, IAsyncEnumerable<int>, ValueTask<int>>";
- resultSelectorFunc = "(k, g) => new ValueTask<int>(0)";
- suffix = "Await";
- break;
- case "Async_Cancel":
- keySelectorType = elementSelectorType = "Func<int, CancellationToken, ValueTask<int>>";
- keySelectorFunc = elementSelectorFunc = "(int x, CancellationToken ct) => new ValueTask<int>(x)";
- resultSelectorType = "Func<int, IAsyncEnumerable<int>, CancellationToken, ValueTask<int>>";
- resultSelectorFunc = "(k, g, ct) => new ValueTask<int>(0)";
- suffix = "AwaitWithCancellation";
- isCancel = true;
- break;
- default:
- throw new Exception();
- }
- if (isCancel)
- {
- #>
- #if !NO_DEEP_CANCELLATION
- <#
- }
- string keySelector, elementSelector, resultSelector;
- switch (kind)
- {
- case "Sync":
- keySelector = "m => m.Name";
- elementSelector = "m => m.Name.ToUpper()";
- resultSelector = "(k, g) => k + \" - \" + g.CountAsync().Result";
- break;
- case "Async":
- keySelector = "m => new ValueTask<string>(m.Name)";
- elementSelector = "m => new ValueTask<string>(m.Name.ToUpper())";
- resultSelector = "async (k, g) => k + \" - \" + await g.CountAsync()";
- break;
- case "Async_Cancel":
- keySelector = "(m, ct) => new ValueTask<string>(m.Name)";
- elementSelector = "(m, ct) => new ValueTask<string>(m.Name.ToUpper())";
- resultSelector = "async (k, g, ct) => k + \" - \" + await g.CountAsync(ct)";
- break;
- default:
- throw new Exception();
- }
- #>
- [Fact]
- public void KeySelector_<#=kind#>_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int>(Return42, default(<#=keySelectorType#>)));
- }
- [Fact]
- public async Task KeySelector_<#=kind#>_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var resS = methodsS.GroupBy(m => m.Name);
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>);
- await Groups_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_<#=kind#>_Comparer_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int>(Return42, default(<#=keySelectorType#>), EqualityComparer<int>.Default));
- }
- [Fact]
- public async Task KeySelector_<#=kind#>_Comparer_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var eq = new StringPrefixEqualityComparer(1);
- var resS = methodsS.GroupBy(m => m.Name, eq);
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, eq);
- await Groups_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_ElementSelector_<#=kind#>_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=elementSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(Return42, default(<#=keySelectorType#>), <#=elementSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(Return42, <#=keySelectorFunc#>, default(<#=elementSelectorType#>)));
- }
- [Fact]
- public async Task KeySelector_ElementSelector_<#=kind#>_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper());
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, <#=elementSelector#>);
- await Groups_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_ElementSelector_<#=kind#>_Comparer_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=elementSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(Return42, default(<#=keySelectorType#>), <#=elementSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, default(<#=elementSelectorType#>), EqualityComparer<int>.Default));
- }
- [Fact]
- public async Task KeySelector_ElementSelector_<#=kind#>_Comparer_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var eq = new StringPrefixEqualityComparer(1);
- var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), eq);
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, <#=elementSelector#>, eq);
- await Groups_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_ResultSelector_<#=kind#>_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=resultSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(Return42, default(<#=keySelectorType#>), <#=resultSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(Return42, <#=keySelectorFunc#>, default(<#=resultSelectorType#>)));
- }
- [Fact]
- public async Task KeySelector_ResultSelector_<#=kind#>_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count());
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, <#=resultSelector#>);
- await Group_Result_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_ResultSelector_<#=kind#>_Comparer_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=resultSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(Return42, default(<#=keySelectorType#>), <#=resultSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, default(<#=resultSelectorType#>), EqualityComparer<int>.Default));
- }
- [Fact]
- public async Task KeySelector_ResultSelector_<#=kind#>_Comparer_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var eq = new StringPrefixEqualityComparer(1);
- var resS = methodsS.GroupBy(m => m.Name, (k, g) => k + " - " + g.Count(), eq);
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, <#=resultSelector#>, eq);
- await Group_Result_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_ElementSelector_ResultSelector_<#=kind#>_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=elementSelectorFunc#>, <#=resultSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(Return42, default(<#=keySelectorType#>), <#=elementSelectorFunc#>, <#=resultSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(Return42, <#=keySelectorFunc#>, default(<#=elementSelectorType#>), <#=resultSelectorFunc#>));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(Return42, <#=keySelectorFunc#>, <#=elementSelectorFunc#>, default(<#=resultSelectorType#>)));
- }
- [Fact]
- public async Task KeySelector_ElementSelector_ResultSelector_<#=kind#>_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count());
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, <#=elementSelector#>, <#=resultSelector#>);
- await Group_Result_AssertCore(resS, resA);
- }
- [Fact]
- public void KeySelector_ElementSelector_ResultSelector_<#=kind#>_Comparer_Null()
- {
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=elementSelectorFunc#>, <#=resultSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(Return42, default(<#=keySelectorType#>), <#=elementSelectorFunc#>, <#=resultSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, default(<#=elementSelectorType#>), <#=resultSelectorFunc#>, EqualityComparer<int>.Default));
- Assert.Throws<ArgumentNullException>(() => AsyncEnumerable.GroupBy<#=suffix#><int, int, int, int>(default(IAsyncEnumerable<int>), <#=keySelectorFunc#>, <#=elementSelectorFunc#>, default(<#=resultSelectorType#>), EqualityComparer<int>.Default));
- }
- [Fact]
- public async Task KeySelector_ElementSelector_ResultSelector_<#=kind#>_Comparer_All()
- {
- var methodsS = typeof(Enumerable).GetMethods().AsEnumerable();
- var methodsA = methodsS.ToAsyncEnumerable();
- var eq = new StringPrefixEqualityComparer(1);
- var resS = methodsS.GroupBy(m => m.Name, m => m.Name.ToUpper(), (k, g) => k + " - " + g.Count(), eq);
- var resA = methodsA.GroupBy<#=suffix#>(<#=keySelector#>, <#=elementSelector#>, <#=resultSelector#>, eq);
- await Group_Result_AssertCore(resS, resA);
- }
- <#
- if (isCancel)
- {
- #>
- #endif
- <#
- }
- #>
- <#
- }
- #>
- private async Task Groups_AssertCore<T, K>(IEnumerable<IGrouping<K, T>> resS, IAsyncEnumerable<IAsyncGrouping<K, T>> resA)
- {
- Assert.True(await AsyncEnumerable.SequenceEqualAsync(
- resS.Select(g => g.Key).ToAsyncEnumerable(),
- resA.Select(g => g.Key)
- ));
- // CountAsync
- Assert.Equal(resS.Count(), await resA.CountAsync());
- // ToArrayAsync
- var resArrS = resS.ToArray();
- var resArrA = await resA.ToArrayAsync();
- Assert.Equal(
- resArrS.Select(g => g.Key),
- resArrA.Select(g => g.Key)
- );
- // ToListAsync
- var resLstS = resS.ToList();
- var resLstA = await resA.ToListAsync();
- Assert.Equal(
- resLstS.Select(g => g.Key),
- resLstA.Select(g => g.Key)
- );
- }
- private async Task Group_Result_AssertCore<T>(IEnumerable<T> resS, IAsyncEnumerable<T> resA)
- {
- Assert.True(await AsyncEnumerable.SequenceEqualAsync(
- resS.ToAsyncEnumerable(),
- resA
- ));
- // CountAsync
- Assert.Equal(resS.Count(), await resA.CountAsync());
- // ToArrayAsync
- var resArrS = resS.ToArray();
- var resArrA = await resA.ToArrayAsync();
- Assert.Equal(resArrS, resArrA);
- // ToListAsync
- var resLstS = resS.ToList();
- var resLstA = await resA.ToListAsync();
- Assert.Equal(resLstS, resLstA);
- }
- private sealed class StringPrefixEqualityComparer : IEqualityComparer<string>
- {
- private readonly int _n;
- public StringPrefixEqualityComparer(int n) => _n = n;
- public bool Equals(string s1, string s2) => s1.Substring(0, _n) == s2.Substring(0, _n);
- public int GetHashCode(string s) => s.Substring(0, _n).GetHashCode();
- }
- }
- }
|