| 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();
 
-         }
 
-     }
 
- }
 
 
  |