// 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. using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using Xunit; using System.Threading; using System.Threading.Tasks; namespace Tests { public partial class AsyncTests { [Fact] public void MoveNextExtension_Null() { var en = default(IAsyncEnumerator); Assert.ThrowsAsync(() => en.MoveNextAsync()); } [Fact] public void Select_Null() { AssertThrows(() => AsyncEnumerable.Select(null, x => x)); AssertThrows(() => AsyncEnumerable.Select(null, (x, i) => x)); AssertThrows(() => AsyncEnumerable.Select(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.Select(AsyncEnumerable.Return(42), default(Func))); } [Fact] public void Select1() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Select(x => (char)('a' + x)); var e = ys.GetAsyncEnumerator(); HasNext(e, 'a'); HasNext(e, 'b'); HasNext(e, 'c'); NoNext(e); } [Fact] public void Select2() { var xs = new[] { 8, 5, 7 }.ToAsyncEnumerable(); var ys = xs.Select((x, i) => (char)('a' + i)); var e = ys.GetAsyncEnumerator(); HasNext(e, 'a'); HasNext(e, 'b'); HasNext(e, 'c'); NoNext(e); } [Fact] public void Select3() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Select(x => 1 / x); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is DivideByZeroException); } [Fact] public void Select4() { var xs = new[] { 8, 5, 7 }.ToAsyncEnumerable(); var ys = xs.Select((x, i) => 1 / i); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is DivideByZeroException); } [Fact] public void Select5() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Select(i => i + 3).Select(x => (char)('a' + x)); var e = ys.GetAsyncEnumerator(); HasNext(e, 'd'); HasNext(e, 'e'); HasNext(e, 'f'); NoNext(e); } [Fact] public async Task Select7() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Select(x => (char)('a' + x)); await SequenceIdentity(ys); } [Fact] public async Task Select8() { var xs = new[] { 8, 5, 7 }.ToAsyncEnumerable(); var ys = xs.Select((x, i) => (char)('a' + i)); await SequenceIdentity(ys); } [Fact] public void SelectWhere2() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Select(i => i + 2).Where(i => i % 2 == 0); var e = ys.GetAsyncEnumerator(); HasNext(e, 2); HasNext(e, 4); NoNext(e); } [Fact] public void WhereSelect2() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Where(i => i % 2 == 0).Select(i => i + 2); var e = ys.GetAsyncEnumerator(); HasNext(e, 2); HasNext(e, 4); NoNext(e); } [Fact] public void WhereSelect3() { var xs = new[] { 0, 1, 2 }.ToAsyncEnumerable(); var ys = xs.Where(i => i % 2 == 0).Select(i => i + 2).Select(i => i + 2); var e = ys.GetAsyncEnumerator(); HasNext(e, 4); HasNext(e, 6); NoNext(e); } [Fact] public void Where_Null() { AssertThrows(() => AsyncEnumerable.Where(null, x => true)); AssertThrows(() => AsyncEnumerable.Where(null, (x, i) => true)); AssertThrows(() => AsyncEnumerable.Where(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.Where(AsyncEnumerable.Return(42), default(Func))); } [Fact] public void Where1() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ys = xs.Where(x => x % 2 == 0); var e = ys.GetAsyncEnumerator(); HasNext(e, 8); HasNext(e, 4); HasNext(e, 6); HasNext(e, 2); HasNext(e, 0); NoNext(e); } [Fact] public void Where2() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ys = xs.Where((x, i) => i % 2 == 0); var e = ys.GetAsyncEnumerator(); HasNext(e, 8); HasNext(e, 7); HasNext(e, 6); HasNext(e, 2); HasNext(e, 0); NoNext(e); } [Fact] public void Where3() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ex = new Exception("Bang"); var ys = xs.Where(x => { if (x == 4) throw ex; return true; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 8); HasNext(e, 5); HasNext(e, 7); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Where4() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ex = new Exception("Bang"); var ys = xs.Where((x, i) => { if (i == 3) throw ex; return true; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 8); HasNext(e, 5); HasNext(e, 7); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Where5() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.Where(x => true); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Where6() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.Where((x, i) => true); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Where7() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ys = xs.Where(x => x % 2 == 0).Where(x => x > 5); var e = ys.GetAsyncEnumerator(); HasNext(e, 8); HasNext(e, 6); NoNext(e); } [Fact] public async Task Where8() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ys = xs.Where(x => x % 2 == 0); await SequenceIdentity(ys); } [Fact] public async Task Where9() { var xs = new[] { 8, 5, 7, 4, 6, 9, 2, 1, 0 }.ToAsyncEnumerable(); var ys = xs.Where((x, i) => i % 2 == 0); await SequenceIdentity(ys); } [Fact] public void SelectMany_Null() { AssertThrows(() => AsyncEnumerable.SelectMany(null, default(Func>))); AssertThrows(() => AsyncEnumerable.SelectMany(null, default(Func>))); AssertThrows(() => AsyncEnumerable.SelectMany(AsyncEnumerable.Return(42), default(Func>))); AssertThrows(() => AsyncEnumerable.SelectMany(AsyncEnumerable.Return(42), default(Func>))); AssertThrows(() => AsyncEnumerable.SelectMany(null, default(Func>), (x, y) => x)); AssertThrows(() => AsyncEnumerable.SelectMany(null, default(Func>), (x, y) => x)); AssertThrows(() => AsyncEnumerable.SelectMany(AsyncEnumerable.Return(42), default(Func>), (x, y) => x)); AssertThrows(() => AsyncEnumerable.SelectMany(AsyncEnumerable.Return(42), default(Func>), (x, y) => x)); AssertThrows(() => AsyncEnumerable.SelectMany(AsyncEnumerable.Return(42), x => null, default(Func))); AssertThrows(() => AsyncEnumerable.SelectMany(AsyncEnumerable.Return(42), (x, i) => null, default(Func))); } [Fact] public void SelectMany1() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable()); var e = ys.GetAsyncEnumerator(); HasNext(e, 0); HasNext(e, 0); HasNext(e, 1); HasNext(e, 0); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void SelectMany2() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => { if (x < 3) return Enumerable.Range(0, x).ToAsyncEnumerable(); else return AsyncEnumerable.Throw(ex); }); var e = ys.GetAsyncEnumerator(); HasNext(e, 0); HasNext(e, 0); HasNext(e, 1); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany3() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable()); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany4() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => { if (x < 3) return Enumerable.Range(0, x).ToAsyncEnumerable(); else throw ex; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 0); HasNext(e, 0); HasNext(e, 1); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany5() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 5, x).ToAsyncEnumerable()); var e = ys.GetAsyncEnumerator(); HasNext(e, 5); HasNext(e, 6); HasNext(e, 7); HasNext(e, 7); HasNext(e, 8); HasNext(e, 9); NoNext(e); } [Fact] public void SelectMany6() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => { if (i < 2) return Enumerable.Range(0, x).ToAsyncEnumerable(); else return AsyncEnumerable.Throw(ex); }); var e = ys.GetAsyncEnumerator(); HasNext(e, 0); HasNext(e, 0); HasNext(e, 1); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany7() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.SelectMany((x, i) => Enumerable.Range(0, x).ToAsyncEnumerable()); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany8() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => { if (i < 2) return Enumerable.Range(0, x).ToAsyncEnumerable(); else throw ex; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 0); HasNext(e, 0); HasNext(e, 1); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany9() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => x * y); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 6); HasNext(e, 8); HasNext(e, 9); HasNext(e, 12); HasNext(e, 15); NoNext(e); } [Fact] public void SelectMany10() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => x * y); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 8); HasNext(e, 10); HasNext(e, 15); HasNext(e, 18); HasNext(e, 21); NoNext(e); } [Fact] public void SelectMany11() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => { if (x * y > 10) throw ex; return x * y; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 6); HasNext(e, 8); HasNext(e, 9); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SelectMany12() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => { if (x * y > 10) throw ex; return x * y; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 8); HasNext(e, 10); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task SelectMany13() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => Enumerable.Range(0, x).ToAsyncEnumerable()); await SequenceIdentity(ys); } [Fact] public async Task SelectMany14() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 5, x).ToAsyncEnumerable()); await SequenceIdentity(ys); } [Fact] public async Task SelectMany15() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany(x => Enumerable.Range(3, x).ToAsyncEnumerable(), (x, y) => x * y); await SequenceIdentity(ys); } [Fact] public async Task SelectMany16() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.SelectMany((x, i) => Enumerable.Range(i + 3, x).ToAsyncEnumerable(), (x, y) => x * y); await SequenceIdentity(ys); } [Fact] public void OfType_Null() { AssertThrows(() => AsyncEnumerable.OfType(null)); } [Fact] public void OfType() { var xs = new object[] { 1, 1.2, true, 4, "" }.ToAsyncEnumerable(); var ys = xs.OfType(); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 4); NoNext(e); } [Fact] public void Cast_Null() { AssertThrows(() => AsyncEnumerable.Cast(null)); } [Fact] public void Cast1() { var xs = new object[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Cast(); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void Cast2() { var xs = new [] { new EventArgs(), new EventArgs(), new EventArgs() }.ToAsyncEnumerable(); var ys = xs.Cast(); Assert.Same(xs, ys); } [Fact] public void Do_Null() { AssertThrows(() => AsyncEnumerableEx.Do(null, x => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), default(Action))); AssertThrows(() => AsyncEnumerableEx.Do(null, x => { }, () => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), default(Action), () => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), x => { }, default(Action))); AssertThrows(() => AsyncEnumerableEx.Do(null, x => { }, ex => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), default(Action), ex => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), x => { }, default(Action))); AssertThrows(() => AsyncEnumerableEx.Do(null, x => { }, ex => { }, () => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), default(Action), ex => { }, () => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), x => { }, default(Action), () => { })); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), x => { }, ex => { }, default(Action))); AssertThrows(() => AsyncEnumerableEx.Do(null, new MyObs())); AssertThrows(() => AsyncEnumerableEx.Do(AsyncEnumerable.Return(42), default(IObserver))); } class MyObs : IObserver { public void OnCompleted() { throw new NotImplementedException(); } public void OnError(Exception error) { throw new NotImplementedException(); } public void OnNext(int value) { throw new NotImplementedException(); } } [Fact] public void Do1() { var sum = 0; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Do(x => sum += x); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); Assert.Equal(1, sum); HasNext(e, 2); Assert.Equal(3, sum); HasNext(e, 3); Assert.Equal(6, sum); HasNext(e, 4); Assert.Equal(10, sum); NoNext(e); } [Fact] public void Do2() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Do(x => { throw ex; }); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Do3() { var sum = 0; var fail = false; var done = false; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Do(x => sum += x, ex => { fail = true; }, () => { done = true; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); Assert.Equal(1, sum); HasNext(e, 2); Assert.Equal(3, sum); HasNext(e, 3); Assert.Equal(6, sum); HasNext(e, 4); Assert.Equal(10, sum); NoNext(e); Assert.False(fail); Assert.True(done); } [Fact] public void Do4() { var sum = 0; var done = false; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Do(x => sum += x, () => { done = true; }); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); Assert.Equal(1, sum); HasNext(e, 2); Assert.Equal(3, sum); HasNext(e, 3); Assert.Equal(6, sum); HasNext(e, 4); Assert.Equal(10, sum); NoNext(e); Assert.True(done); } [Fact] public void Do5() { var ex = new Exception("Bang"); var exa = default(Exception); var done = false; var hasv = false; var xs = AsyncEnumerable.Throw(ex); var ys = xs.Do(x => { hasv = true; }, exx => { exa = exx; }, () => { done = true; }); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ex_.InnerException == ex); Assert.False(hasv); Assert.False(done); Assert.Same(exa, ex); } [Fact] public void Do6() { var ex = new Exception("Bang"); var exa = default(Exception); var hasv = false; var xs = AsyncEnumerable.Throw(ex); var ys = xs.Do(x => { hasv = true; }, exx => { exa = exx; }); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ex_.InnerException == ex); Assert.False(hasv); Assert.Same(exa, ex); } [Fact] public async Task Do7() { var sum = 0; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Do(x => sum += x); await SequenceIdentity(ys); Assert.Equal(20, sum); } [Fact] public async Task ForEachAsync_Null() { await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(null, x => { })); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(AsyncEnumerable.Return(42), default(Action))); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(null, (x, i) => { })); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(AsyncEnumerable.Return(42), default(Action))); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(null, x => { }, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(AsyncEnumerable.Return(42), default(Action), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(null, (x, i) => { }, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.ForEachAsync(AsyncEnumerable.Return(42), default(Action), CancellationToken.None)); } [Fact] public void ForEach_Null() { AssertThrows(() => AsyncEnumerable.ForEach(null, x => { })); AssertThrows(() => AsyncEnumerable.ForEach(AsyncEnumerable.Return(42), default(Action))); AssertThrows(() => AsyncEnumerable.ForEach(null, (x, i) => { })); AssertThrows(() => AsyncEnumerable.ForEach(AsyncEnumerable.Return(42), default(Action))); AssertThrows(() => AsyncEnumerable.ForEach(null, x => { }, CancellationToken.None)); AssertThrows(() => AsyncEnumerable.ForEach(AsyncEnumerable.Return(42), default(Action), CancellationToken.None)); AssertThrows(() => AsyncEnumerable.ForEach(null, (x, i) => { }, CancellationToken.None)); AssertThrows(() => AsyncEnumerable.ForEach(AsyncEnumerable.Return(42), default(Action), CancellationToken.None)); } [Fact] public void ForEachAsync1() { var sum = 0; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); xs.ForEachAsync(x => sum += x).Wait(WaitTimeoutMs); Assert.Equal(10, sum); } [Fact] public void ForEach1() { var sum = 0; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); xs.ForEach(x => sum += x); Assert.Equal(10, sum); } [Fact] public void ForEachAsync2() { var sum = 0; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); xs.ForEach((x, i) => sum += x * i); Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum); } [Fact] public void ForEach2() { var sum = 0; var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); xs.ForEachAsync((x, i) => sum += x * i).Wait(WaitTimeoutMs); Assert.Equal(1 * 0 + 2 * 1 + 3 * 2 + 4 * 3, sum); } [Fact] public void ForEachAsync3() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); AssertThrows(() => xs.ForEachAsync(x => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEach3() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); AssertThrows(() => xs.ForEach(x => { throw ex; }), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEachAsync4() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); AssertThrows(() => xs.ForEachAsync((x, i) => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEach4() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); AssertThrows(() => xs.ForEach((x, i) => { throw ex; }), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEachAsync5() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); AssertThrows(() => xs.ForEachAsync(x => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEach5() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); AssertThrows(() => xs.ForEach(x => { throw ex; }), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEachAsync6() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); AssertThrows(() => xs.ForEachAsync((x, i) => { throw ex; }).Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void ForEach6() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); AssertThrows(() => xs.ForEach((x, i) => { throw ex; }), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Take_Null() { AssertThrows(() => AsyncEnumerable.Take(null, 5)); } [Fact] public void Take0() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Take(-2); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void Take1() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Take(2); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void Take2() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Take(10); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void Take3() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Take(0); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void Take4() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.Take(2); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task Take5() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Take(2); await SequenceIdentity(ys); } [Fact] public void TakeWhile_Null() { AssertThrows(() => AsyncEnumerable.TakeWhile(null, x => true)); AssertThrows(() => AsyncEnumerable.TakeWhile(null, (x, i) => true)); AssertThrows(() => AsyncEnumerable.TakeWhile(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.TakeWhile(AsyncEnumerable.Return(42), default(Func))); } [Fact] public void TakeWhile1() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(x => x < 3); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void TakeWhile2() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(x => false); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void TakeWhile3() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(x => true); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void TakeWhile4() { var xs = new[] { 1, 2, 3, 4, 3, 2, 1 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(x => x < 3); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void TakeWhile5() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void TakeWhile6() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile((x, i) => i < 2); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void TakeWhile7() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile((x, i) => false); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void TakeWhile8() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile((x, i) => true); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void TakeWhile9() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(new Func((x, i) => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task TakeWhile10() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile(x => x < 3); await SequenceIdentity(ys); } [Fact] public async Task TakeWhile11() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.TakeWhile((x, i) => i < 2); await SequenceIdentity(ys); } [Fact] public void Skip_Null() { AssertThrows(() => AsyncEnumerable.Skip(null, 5)); } //[Fact] //public void Skip0() //{ // var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); // var ys = xs.Skip(-2); // var e = ys.GetEnumerator(); // NoNext(e); //} [Fact] public void Skip1() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Skip(2); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void Skip2() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Skip(10); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void Skip3() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Skip(0); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void Skip4() { var ex = new Exception("Bang"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.Skip(2); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task Skip5() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.Skip(2); await SequenceIdentity(ys); } [Fact] public void SkipWhile_Null() { AssertThrows(() => AsyncEnumerable.SkipWhile(null, x => true)); AssertThrows(() => AsyncEnumerable.SkipWhile(null, (x, i) => true)); AssertThrows(() => AsyncEnumerable.SkipWhile(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.SkipWhile(AsyncEnumerable.Return(42), default(Func))); } [Fact] public void SkipWhile1() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(x => x < 3); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void SkipWhile2() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(x => false); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void SkipWhile3() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(x => true); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void SkipWhile4() { var xs = new[] { 1, 2, 3, 4, 3, 2, 1 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(x => x < 3); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 4); HasNext(e, 3); HasNext(e, 2); HasNext(e, 1); NoNext(e); } [Fact] public void SkipWhile5() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void SkipWhile6() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile((x, i) => i < 2); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void SkipWhile7() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile((x, i) => false); var e = ys.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void SkipWhile8() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile((x, i) => true); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void SkipWhile9() { var ex = new Exception("Bang"); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(new Func((x, i) => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task SkipWhile10() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile(x => x < 3); await SequenceIdentity(ys); } [Fact] public async Task SkipWhile11() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable(); var ys = xs.SkipWhile((x, i) => false); await SequenceIdentity(ys); } [Fact] public void DefaultIfEmpty_Null() { AssertThrows(() => AsyncEnumerable.DefaultIfEmpty(null)); AssertThrows(() => AsyncEnumerable.DefaultIfEmpty(null, 42)); } [Fact] public void DefaultIfEmpty1() { var xs = AsyncEnumerable.Empty().DefaultIfEmpty(); var e = xs.GetAsyncEnumerator(); HasNext(e, 0); NoNext(e); } [Fact] public void DefaultIfEmpty2() { var xs = AsyncEnumerable.Empty().DefaultIfEmpty(42); var e = xs.GetAsyncEnumerator(); HasNext(e, 42); NoNext(e); } [Fact] public void DefaultIfEmpty3() { var xs = AsyncEnumerable.Return(42).DefaultIfEmpty(); var e = xs.GetAsyncEnumerator(); HasNext(e, 42); NoNext(e); } [Fact] public void DefaultIfEmpty4() { var xs = AsyncEnumerable.Return(42).DefaultIfEmpty(24); var e = xs.GetAsyncEnumerator(); HasNext(e, 42); NoNext(e); } [Fact] public void DefaultIfEmpty5() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void DefaultIfEmpty6() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void DefaultIfEmpty7() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Throw(ex).DefaultIfEmpty(); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void DefaultIfEmpty8() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Throw(ex).DefaultIfEmpty(24); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task DefaultIfEmpty9() { var xs = AsyncEnumerable.Empty().DefaultIfEmpty(42); var res = new[] { 42 }; Assert.True(res.SequenceEqual(await xs.ToArray())); } [Fact] public async Task DefaultIfEmpty10() { var xs = AsyncEnumerable.Empty().DefaultIfEmpty(42); var res = new List { 42 }; Assert.True(res.SequenceEqual(await xs.ToList())); } [Fact] public async Task DefaultIfEmpty11() { var xs = AsyncEnumerable.Empty().DefaultIfEmpty(42); Assert.Equal(1, await xs.Count()); } [Fact] public async Task DefaultIfEmpty12() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24); var res = new[] { 1, 2, 3, 4 }; Assert.True(res.SequenceEqual(await xs.ToArray())); } [Fact] public async Task DefaultIfEmpty13() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24); var res = new List { 1, 2, 3, 4 }; Assert.True(res.SequenceEqual(await xs.ToList())); } [Fact] public async Task DefaultIfEmpty14() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24); Assert.Equal(4, await xs.Count()); } [Fact] public async Task DefaultIfEmpty15() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().DefaultIfEmpty(24); await SequenceIdentity(xs); } [Fact] public void Distinct_Null() { AssertThrows(() => AsyncEnumerable.Distinct(null)); AssertThrows(() => AsyncEnumerable.Distinct(null, new Eq())); AssertThrows(() => AsyncEnumerable.Distinct(AsyncEnumerable.Return(42), null)); AssertThrows(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), (Func)null)); } [Fact] public void Distinct1() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 5); HasNext(e, 4); NoNext(e); } [Fact] public void Distinct2() { var xs = new[] { 1, -2, -1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(new Eq()); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, -2); HasNext(e, 3); HasNext(e, 5); HasNext(e, 4); NoNext(e); } [Fact] public async Task Distinct3() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(); var res = new [] { 1, 2, 3, 5, 4 }; Assert.True(res.SequenceEqual(await xs.ToArray())); } [Fact] public async Task Distinct4() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(); var res = new List { 1, 2, 3, 5, 4 }; Assert.True(res.SequenceEqual(await xs.ToList())); } [Fact] public async Task Distinct5() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(); Assert.Equal(5, await xs.Count()); } [Fact] public async Task Distinct6() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k); var res = new[] { 1, 2, 3, 5, 4 }; Assert.True(res.SequenceEqual(await xs.ToArray())); } [Fact] public async Task Distinct7() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k); var res = new List { 1, 2, 3, 5, 4 }; Assert.True(res.SequenceEqual(await xs.ToList())); } [Fact] public async Task Distinct8() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k); Assert.Equal(5, await xs.Count()); } [Fact] public async Task Distinct9() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(k => k); await SequenceIdentity(xs); } [Fact] public async Task Distinct10() { var xs = new[] { 1, 2, 1, 3, 5, 2, 1, 4 }.ToAsyncEnumerable().Distinct(); await SequenceIdentity(xs); } [Fact] public void Distinct11() { var xs = AsyncEnumerable.Empty().Distinct(k => k); var e = xs.GetAsyncEnumerator(); NoNext(e); } [Fact] public void Distinct12() { var xs = AsyncEnumerable.Empty().Distinct(); var e = xs.GetAsyncEnumerator(); NoNext(e); } [Fact] public void Reverse_Null() { AssertThrows(() => AsyncEnumerable.Reverse(null)); } [Fact] public void Reverse1() { var xs = AsyncEnumerable.Empty(); var ys = xs.Reverse(); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void Reverse2() { var xs = AsyncEnumerable.Return(42); var ys = xs.Reverse(); var e = ys.GetAsyncEnumerator(); HasNext(e, 42); NoNext(e); } [Fact] public void Reverse3() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.Reverse(); var e = ys.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 2); HasNext(e, 1); NoNext(e); } [Fact] public void Reverse4() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.Reverse(); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task Reverse5() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.Reverse(); Assert.Equal(new[] { 3, 2, 1 }, await ys.ToArray()); } [Fact] public async Task Reverse6() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.Reverse(); Assert.Equal(new[] { 3, 2, 1 }, await ys.ToList()); } [Fact] public async Task Reverse7() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.Reverse(); Assert.Equal(3, await ys.Count()); } [Fact] public async Task Reverse8() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.Reverse(); await SequenceIdentity(ys); } [Fact] public async Task Reverse9() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.Reverse().Prepend(4); // to trigger onlyIfCheap Assert.Equal(new[] { 4, 3, 2, 1 }, await ys.ToArray()); } [Fact] public void OrderBy_Null() { AssertThrows(() => AsyncEnumerable.OrderBy(default(IAsyncEnumerable), x => x)); AssertThrows(() => AsyncEnumerable.OrderBy(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.OrderBy(default(IAsyncEnumerable), x => x, Comparer.Default)); AssertThrows(() => AsyncEnumerable.OrderBy(AsyncEnumerable.Return(42), default(Func), Comparer.Default)); AssertThrows(() => AsyncEnumerable.OrderBy(AsyncEnumerable.Return(42), x => x, default(IComparer))); AssertThrows(() => AsyncEnumerable.OrderByDescending(default(IAsyncEnumerable), x => x)); AssertThrows(() => AsyncEnumerable.OrderByDescending(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.OrderByDescending(default(IAsyncEnumerable), x => x, Comparer.Default)); AssertThrows(() => AsyncEnumerable.OrderByDescending(AsyncEnumerable.Return(42), default(Func), Comparer.Default)); AssertThrows(() => AsyncEnumerable.OrderByDescending(AsyncEnumerable.Return(42), x => x, default(IComparer))); var xs = AsyncEnumerable.Return(42).OrderBy(x => x); AssertThrows(() => AsyncEnumerable.ThenBy(default(IOrderedAsyncEnumerable), x => x)); AssertThrows(() => AsyncEnumerable.ThenBy(xs, default(Func))); AssertThrows(() => AsyncEnumerable.ThenBy(default(IOrderedAsyncEnumerable), x => x, Comparer.Default)); AssertThrows(() => AsyncEnumerable.ThenBy(xs, default(Func), Comparer.Default)); AssertThrows(() => AsyncEnumerable.ThenBy(xs, x => x, default(IComparer))); AssertThrows(() => AsyncEnumerable.ThenByDescending(default(IOrderedAsyncEnumerable), x => x)); AssertThrows(() => AsyncEnumerable.ThenByDescending(xs, default(Func))); AssertThrows(() => AsyncEnumerable.ThenByDescending(default(IOrderedAsyncEnumerable), x => x, Comparer.Default)); AssertThrows(() => AsyncEnumerable.ThenByDescending(xs, default(Func), Comparer.Default)); AssertThrows(() => AsyncEnumerable.ThenByDescending(xs, x => x, default(IComparer))); } [Fact] public void OrderBy1() { var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderBy(x => x); var e = ys.GetAsyncEnumerator(); for (var i = 0; i < 10; i++) HasNext(e, i); NoNext(e); } [Fact] public void OrderBy2() { var ex = new Exception("Bang!"); var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderBy(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task OrderBy3() { var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderBy(x => x); await SequenceIdentity(ys); } [Fact] public void ThenBy2() { var ex = new Exception("Bang!"); var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderBy(x => x).ThenBy(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void OrderByDescending1() { var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderByDescending(x => x); var e = ys.GetAsyncEnumerator(); for (var i = 9; i >= 0; i--) HasNext(e, i); NoNext(e); } [Fact] public void OrderByDescending2() { var ex = new Exception("Bang!"); var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderByDescending(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task OrderByDescending3() { var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderByDescending(x => x); await SequenceIdentity(ys); } [Fact] public void ThenByDescending2() { var ex = new Exception("Bang!"); var xs = new[] { 2, 6, 1, 5, 7, 8, 9, 3, 4, 0 }.ToAsyncEnumerable(); var ys = xs.OrderBy(x => x).ThenByDescending(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void OrderByThenBy1() { var xs = new[] { new { Name = "Bart", Age = 27 }, new { Name = "John", Age = 62 }, new { Name = "Eric", Age = 27 }, new { Name = "Lisa", Age = 14 }, new { Name = "Brad", Age = 27 }, new { Name = "Lisa", Age = 23 }, new { Name = "Eric", Age = 42 }, }; var ys = xs.ToAsyncEnumerable(); var ress = xs.OrderBy(x => x.Name).ThenBy(x => x.Age); var resa = ys.OrderBy(x => x.Name).ThenBy(x => x.Age); Assert.True(ress.SequenceEqual(resa.ToEnumerable())); } [Fact] public void OrderByThenBy2() { var xs = new[] { new { Name = "Bart", Age = 27 }, new { Name = "John", Age = 62 }, new { Name = "Eric", Age = 27 }, new { Name = "Lisa", Age = 14 }, new { Name = "Brad", Age = 27 }, new { Name = "Lisa", Age = 23 }, new { Name = "Eric", Age = 42 }, }; var ys = xs.ToAsyncEnumerable(); var ress = xs.OrderBy(x => x.Name).ThenByDescending(x => x.Age); var resa = ys.OrderBy(x => x.Name).ThenByDescending(x => x.Age); Assert.True(ress.SequenceEqual(resa.ToEnumerable())); } [Fact] public void OrderByThenBy3() { var xs = new[] { new { Name = "Bart", Age = 27 }, new { Name = "John", Age = 62 }, new { Name = "Eric", Age = 27 }, new { Name = "Lisa", Age = 14 }, new { Name = "Brad", Age = 27 }, new { Name = "Lisa", Age = 23 }, new { Name = "Eric", Age = 42 }, }; var ys = xs.ToAsyncEnumerable(); var ress = xs.OrderByDescending(x => x.Name).ThenBy(x => x.Age); var resa = ys.OrderByDescending(x => x.Name).ThenBy(x => x.Age); Assert.True(ress.SequenceEqual(resa.ToEnumerable())); } [Fact] public void OrderByThenBy4() { var xs = new[] { new { Name = "Bart", Age = 27 }, new { Name = "John", Age = 62 }, new { Name = "Eric", Age = 27 }, new { Name = "Lisa", Age = 14 }, new { Name = "Brad", Age = 27 }, new { Name = "Lisa", Age = 23 }, new { Name = "Eric", Age = 42 }, }; var ys = xs.ToAsyncEnumerable(); var ress = xs.OrderByDescending(x => x.Name).ThenByDescending(x => x.Age); var resa = ys.OrderByDescending(x => x.Name).ThenByDescending(x => x.Age); Assert.True(ress.SequenceEqual(resa.ToEnumerable())); } [Fact] public void GroupBy_Null() { AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(IEqualityComparer))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, x => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), x => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(Func))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, x => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), x => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(Func), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, x => x, default(IEqualityComparer))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, (x, ys) => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), (x, ys) => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(Func, int>))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, (x, ys) => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), (x, ys) => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(Func, int>), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, (x, ys) => x, default(IEqualityComparer))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, x => x, (x, ys) => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), x => x, (x, ys) => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(Func), (x, ys) => x)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, x => x, default(Func, int>))); AssertThrows(() => AsyncEnumerable.GroupBy(null, x => x, x => x, (x, ys) => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), default(Func), x => x, (x, ys) => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, default(Func), (x, ys) => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, x => x, default(Func, int>), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerable.GroupBy(AsyncEnumerable.Return(42), x => x, x => x, (x, ys) => x, default(IEqualityComparer))); } [Fact] public void GroupBy1() { var xs = new[] { new { Name = "Bart", Age = 27 }, new { Name = "John", Age = 62 }, new { Name = "Eric", Age = 27 }, new { Name = "Lisa", Age = 14 }, new { Name = "Brad", Age = 27 }, new { Name = "Lisa", Age = 23 }, new { Name = "Eric", Age = 42 }, }; var ys = xs.ToAsyncEnumerable(); var res = ys.GroupBy(x => x.Age / 10); var e = res.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); Assert.Equal(2, e.Current.Key); var g1 = e.Current.GetAsyncEnumerator(); HasNext(g1, xs[0]); HasNext(g1, xs[2]); HasNext(g1, xs[4]); HasNext(g1, xs[5]); NoNext(g1); Assert.True(e.MoveNextAsync().Result); Assert.Equal(6, e.Current.Key); var g2 = e.Current.GetAsyncEnumerator(); HasNext(g2, xs[1]); NoNext(g2); Assert.True(e.MoveNextAsync().Result); Assert.Equal(1, e.Current.Key); var g3 = e.Current.GetAsyncEnumerator(); HasNext(g3, xs[3]); NoNext(g3); Assert.True(e.MoveNextAsync().Result); Assert.Equal(4, e.Current.Key); var g4 = e.Current.GetAsyncEnumerator(); HasNext(g4, xs[6]); NoNext(g4); NoNext(e); } [Fact] public void GroupBy2() { var xs = new[] { new { Name = "Bart", Age = 27 }, new { Name = "John", Age = 62 }, new { Name = "Eric", Age = 27 }, new { Name = "Lisa", Age = 14 }, new { Name = "Brad", Age = 27 }, new { Name = "Lisa", Age = 23 }, new { Name = "Eric", Age = 42 }, }; var ys = xs.ToAsyncEnumerable(); var res = ys.GroupBy(x => x.Age / 10); var e = res.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); var g1 = e.Current; Assert.Equal(2, g1.Key); Assert.True(e.MoveNextAsync().Result); var g2 = e.Current; Assert.Equal(6, g2.Key); Assert.True(e.MoveNextAsync().Result); var g3 = e.Current; Assert.Equal(1, g3.Key); Assert.True(e.MoveNextAsync().Result); var g4 = e.Current; Assert.Equal(4, g4.Key); NoNext(e); var g1e = g1.GetAsyncEnumerator(); HasNext(g1e, xs[0]); HasNext(g1e, xs[2]); HasNext(g1e, xs[4]); HasNext(g1e, xs[5]); NoNext(g1e); var g2e = g2.GetAsyncEnumerator(); HasNext(g2e, xs[1]); NoNext(g2e); var g3e = g3.GetAsyncEnumerator(); HasNext(g3e, xs[3]); NoNext(g3e); var g4e = g4.GetAsyncEnumerator(); HasNext(g4e, xs[6]); NoNext(g4e); } [Fact] public void GroupBy3() { var xs = AsyncEnumerable.Empty(); var ys = xs.GroupBy(x => x); var e = ys.GetAsyncEnumerator(); NoNext(e); } [Fact] public void GroupBy4() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Throw(ex); var ys = xs.GroupBy(x => x); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void GroupBy5() { var xs = GetXs().ToAsyncEnumerable(); var ys = xs.GroupBy(x => x); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!"); //Assert.True(e.MoveNext().Result); //var g1 = e.Current; //Assert.Equal(g1.Key, 42); //var g1e = g1.GetEnumerator(); //HasNext(g1e, 42); //Assert.True(e.MoveNext().Result); //var g2 = e.Current; //Assert.Equal(g2.Key, 43); //var g2e = g2.GetEnumerator(); //HasNext(g2e, 43); //AssertThrows(() => g1e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!"); //AssertThrows(() => g2e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!"); } [Fact] public void GroupBy6() { var xs = GetXs().ToAsyncEnumerable(); var ys = xs.GroupBy(x => x); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!"); //Assert.True(e.MoveNext().Result); //var g1 = e.Current; //Assert.Equal(g1.Key, 42); //var g1e = g1.GetEnumerator(); //HasNext(g1e, 42); //AssertThrows(() => g1e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single().Message == "Bang!"); } static IEnumerable GetXs() { yield return 42; yield return 43; throw new Exception("Bang!"); } [Fact] public void GroupBy7() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Return(42); var ys = xs.GroupBy(new Func(x => { throw ex; })); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void GroupBy8() { var ex = new Exception("Bang!"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable(); var ys = xs.GroupBy(x => { if (x == 3) throw ex; return x; }); var e = ys.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); //Assert.True(e.MoveNext().Result); //var g1 = e.Current; //Assert.Equal(g1.Key, 1); //var g1e = g1.GetEnumerator(); //HasNext(g1e, 1); //Assert.True(e.MoveNext().Result); //var g2 = e.Current; //Assert.Equal(g2.Key, 2); //var g2e = g2.GetEnumerator(); //HasNext(g2e, 2); //AssertThrows(() => g1e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); //AssertThrows(() => g2e.MoveNext().Wait(WaitTimeoutMs), ex_ => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void GroupBy9() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x)); var e = ys.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); var g1 = e.Current; Assert.Equal(0, g1.Key); var g1e = g1.GetAsyncEnumerator(); HasNext(g1e, 'a'); HasNext(g1e, 'd'); HasNext(g1e, 'g'); HasNext(g1e, 'j'); NoNext(g1e); Assert.True(e.MoveNextAsync().Result); var g2 = e.Current; Assert.Equal(1, g2.Key); var g2e = g2.GetAsyncEnumerator(); HasNext(g2e, 'b'); HasNext(g2e, 'e'); HasNext(g2e, 'h'); NoNext(g2e); Assert.True(e.MoveNextAsync().Result); var g3 = e.Current; Assert.Equal(2, g3.Key); var g3e = g3.GetAsyncEnumerator(); HasNext(g3e, 'c'); HasNext(g3e, 'f'); HasNext(g3e, 'i'); NoNext(g3e); NoNext(e); } [Fact] public void GroupBy10() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result); var e = ys.GetAsyncEnumerator(); HasNext(e, "0 - adgj"); HasNext(e, "1 - beh"); HasNext(e, "2 - cfi"); NoNext(e); } [Fact] public void GroupBy11() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result); var e = ys.GetAsyncEnumerator(); HasNext(e, "0 - 0369"); HasNext(e, "1 - 147"); HasNext(e, "2 - 258"); NoNext(e); } [Fact] public void GroupBy12() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, new EqMod(3)); var e = ys.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); var g1 = e.Current; Assert.Equal(0, g1.Key); var g1e = g1.GetAsyncEnumerator(); HasNext(g1e, 0); HasNext(g1e, 3); HasNext(g1e, 6); HasNext(g1e, 9); NoNext(g1e); Assert.True(e.MoveNextAsync().Result); var g2 = e.Current; Assert.Equal(1, g2.Key); var g2e = g2.GetAsyncEnumerator(); HasNext(g2e, 1); HasNext(g2e, 4); HasNext(g2e, 7); NoNext(g2e); Assert.True(e.MoveNextAsync().Result); var g3 = e.Current; Assert.Equal(2, g3.Key); var g3e = g3.GetAsyncEnumerator(); HasNext(g3e, 2); HasNext(g3e, 5); HasNext(g3e, 8); NoNext(g3e); NoNext(e); } [Fact] public void GroupBy13() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3)); var e = ys.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); var g1 = e.Current; Assert.Equal(0, g1.Key); var g1e = g1.GetAsyncEnumerator(); HasNext(g1e, 'a'); HasNext(g1e, 'd'); HasNext(g1e, 'g'); HasNext(g1e, 'j'); NoNext(g1e); Assert.True(e.MoveNextAsync().Result); var g2 = e.Current; Assert.Equal(1, g2.Key); var g2e = g2.GetAsyncEnumerator(); HasNext(g2e, 'b'); HasNext(g2e, 'e'); HasNext(g2e, 'h'); NoNext(g2e); Assert.True(e.MoveNextAsync().Result); var g3 = e.Current; Assert.Equal(2, g3.Key); var g3e = g3.GetAsyncEnumerator(); HasNext(g3e, 'c'); HasNext(g3e, 'f'); HasNext(g3e, 'i'); NoNext(g3e); NoNext(e); } [Fact] public void GroupBy14() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3)); var e = ys.GetAsyncEnumerator(); HasNext(e, "0 - adgj"); HasNext(e, "1 - beh"); HasNext(e, "2 - cfi"); NoNext(e); } [Fact] public void GroupBy15() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3)); var e = ys.GetAsyncEnumerator(); HasNext(e, "0 - 0369"); HasNext(e, "1 - 147"); HasNext(e, "2 - 258"); NoNext(e); } [Fact] public async Task GroupBy16() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3)); var e = ys.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); var g1 = e.Current; Assert.Equal(0, g1.Key); var g1e = g1.GetAsyncEnumerator(); HasNext(g1e, 'a'); HasNext(g1e, 'd'); HasNext(g1e, 'g'); HasNext(g1e, 'j'); NoNext(g1e); await g1e.DisposeAsync(); Assert.True(e.MoveNextAsync().Result); var g2 = e.Current; Assert.Equal(1, g2.Key); var g2e = g2.GetAsyncEnumerator(); HasNext(g2e, 'b'); HasNext(g2e, 'e'); HasNext(g2e, 'h'); NoNext(g2e); await g2e.DisposeAsync(); Assert.True(e.MoveNextAsync().Result); var g3 = e.Current; Assert.Equal(2, g3.Key); var g3e = g3.GetAsyncEnumerator(); HasNext(g3e, 'c'); HasNext(g3e, 'f'); HasNext(g3e, 'i'); NoNext(g3e); await g3e.DisposeAsync(); NoNext(e); await e.DisposeAsync(); } [Fact] public async Task GroupBy17() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3)); var e = ys.GetAsyncEnumerator(); await e.DisposeAsync(); Assert.False(e.MoveNextAsync().Result); } [Fact] public async Task GroupBy18() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, x => (char)('a' + x), new EqMod(3)); var e = ys.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); var g1 = e.Current; Assert.Equal(0, g1.Key); var g1e = g1.GetAsyncEnumerator(); HasNext(g1e, 'a'); await e.DisposeAsync(); HasNext(g1e, 'd'); HasNext(g1e, 'g'); HasNext(g1e, 'j'); NoNext(g1e); await g1e.DisposeAsync(); Assert.False(e.MoveNextAsync().Result); } [Fact] public async Task GroupBy19() { // We're using Kvp here because the types will eval as equal for this test var xs = new[] { new Kvp("Bart", 27), new Kvp("John", 62), new Kvp("Eric", 27), new Kvp("Lisa", 14), new Kvp("Brad", 27), new Kvp("Lisa", 23), new Kvp("Eric", 42) }; var ys = xs.ToAsyncEnumerable(); var res = ys.GroupBy(x => x.Item/10); await SequenceIdentity(res); } [Fact] public async Task GroupBy20() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result); var arr = new[] { "0 - adgj", "1 - beh", "2 - cfi" }; Assert.Equal(arr, await ys.ToArray()); } [Fact] public async Task GroupBy21() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result); var arr = new List { "0 - adgj", "1 - beh", "2 - cfi" }; Assert.Equal(arr, await ys.ToList()); } [Fact] public async Task GroupBy22() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result); Assert.Equal(3, await ys.Count()); } [Fact] public async Task GroupBy23() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x), (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result); await SequenceIdentity(ys); } [Fact] public async Task GroupBy24() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x)); var g1a = new[] { 'a', 'd', 'g', 'j' }; var g2a = new[] { 'b', 'e', 'h' }; var g3a = new[] { 'c', 'f', 'i' }; var gar = await ys.ToArray(); Assert.Equal(3, gar.Length); var gg1 = gar[0]; var gg1a = await gg1.ToArray(); Assert.Equal(g1a, gg1a); var gg2 = gar[1]; var gg2a = await gg2.ToArray(); Assert.Equal(g2a, gg2a); var gg3 = gar[2]; var gg3a = await gg3.ToArray(); Assert.Equal(g3a, gg3a); } [Fact] public async Task GroupBy25() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x)); var g1a = new List { 'a', 'd', 'g', 'j' }; var g2a = new List { 'b', 'e', 'h' }; var g3a = new List { 'c', 'f', 'i' }; var gar = await ys.ToList(); Assert.Equal(3, gar.Count); var gg1 = gar[0]; var gg1a = await gg1.ToList(); Assert.Equal(g1a, gg1a); var gg2 = gar[1]; var gg2a = await gg2.ToList(); Assert.Equal(g2a, gg2a); var gg3 = gar[2]; var gg3a = await gg3.ToList(); Assert.Equal(g3a, gg3a); } [Fact] public async Task GroupBy26() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x)); var gar = await ys.ToList(); Assert.Equal(3, gar.Count); var gg1 = gar[0]; var gg1a = await gg1.Count(); Assert.Equal(4, gg1a); var gg2 = gar[1]; var gg2a = await gg2.Count(); Assert.Equal(3, gg2a); var gg3 = gar[2]; var gg3a = await gg3.Count(); Assert.Equal(3, gg3a); } [Fact] public async Task GroupBy27() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x)); var gar = await ys.Count(); Assert.Equal(3, gar); } [Fact] public async Task GroupBy28() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x % 3, x => (char)('a' + x)); await SequenceIdentity(ys); } [Fact] public async Task GroupBy29() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, new EqMod(3)); var g1a = new List { 0, 3, 6, 9 }; var g2a = new List { 1, 4, 7 }; var g3a = new List { 2, 5, 8 }; var gar = await ys.ToList(); Assert.Equal(3, gar.Count); var gg1 = gar[0]; var gg1a = await gg1.ToList(); Assert.Equal(g1a, gg1a); var gg2 = gar[1]; var gg2a = await gg2.ToList(); Assert.Equal(g2a, gg2a); var gg3 = gar[2]; var gg3a = await gg3.ToList(); Assert.Equal(g3a, gg3a); } [Fact] public async Task GroupBy30() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, new EqMod(3)); var gar = await ys.ToList(); Assert.Equal(3, gar.Count); var gg1 = gar[0]; var gg1a = await gg1.Count(); Assert.Equal(4, gg1a); var gg2 = gar[1]; var gg2a = await gg2.Count(); Assert.Equal(3, gg2a); var gg3 = gar[2]; var gg3a = await gg3.Count(); Assert.Equal(3, gg3a); } [Fact] public async Task GroupBy31() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, new EqMod(3)); var g1a = new[] { 0, 3, 6, 9 }; var g2a = new[] { 1, 4, 7 }; var g3a = new[] { 2, 5, 8 }; var gar = await ys.ToArray(); Assert.Equal(3, gar.Length); var gg1 = gar[0]; var gg1a = await gg1.ToArray(); Assert.Equal(g1a, gg1a); var gg2 = gar[1]; var gg2a = await gg2.ToArray(); Assert.Equal(g2a, gg2a); var gg3 = gar[2]; var gg3a = await gg3.ToArray(); Assert.Equal(g3a, gg3a); } [Fact] public async Task GroupBy32() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, new EqMod(3)); var gar = await ys.Count(); Assert.Equal(3, gar); } [Fact] public async Task GroupBy33() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, new EqMod(3)); await SequenceIdentity(ys); } [Fact] public async Task GroupBy34() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3)); var arr = new[] { "0 - 0369", "1 - 147", "2 - 258" }; Assert.Equal(arr, await ys.ToArray()); } [Fact] public async Task GroupBy35() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3)); var arr = new List { "0 - 0369", "1 - 147", "2 - 258" }; Assert.Equal(arr, await ys.ToList()); } [Fact] public async Task GroupBy36() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3)); Assert.Equal(3, await ys.Count()); } [Fact] public async Task GroupBy37() { var xs = AsyncEnumerable.Range(0, 10); var ys = xs.GroupBy(x => x, (k, cs) => k + " - " + cs.Aggregate("", (a, c) => a + c).Result, new EqMod(3)); await SequenceIdentity(ys); } class Kvp : IEquatable { public bool Equals(Kvp other) { if (ReferenceEquals(null, other)) return false; if (ReferenceEquals(this, other)) return true; return string.Equals(Key, other.Key) && Item == other.Item; } public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) return false; if (ReferenceEquals(this, obj)) return true; if (obj.GetType() != GetType()) return false; return Equals((Kvp)obj); } public override int GetHashCode() { unchecked { return ((Key != null ? Key.GetHashCode() : 0)*397) ^ Item; } } public static bool operator ==(Kvp left, Kvp right) { return Equals(left, right); } public static bool operator !=(Kvp left, Kvp right) { return !Equals(left, right); } public string Key { get; } public int Item { get; } public Kvp(string key, int item) { Key = key; Item = item; } } class EqMod : IEqualityComparer { private readonly int _d; public EqMod(int d) { _d = d; } public bool Equals(int x, int y) { return EqualityComparer.Default.Equals(x % _d, y % _d); } public int GetHashCode(int obj) { return EqualityComparer.Default.GetHashCode(obj % _d); } } [Fact] public void AsAsyncEnumerable_Null() { AssertThrows(() => AsyncEnumerable.AsAsyncEnumerable((IAsyncEnumerable)null)); } [Fact] public void AsAsyncEnumerable1() { var xs = AsyncEnumerable.Return(42); var ys = xs.AsAsyncEnumerable(); Assert.NotSame(xs, ys); var e = xs.GetAsyncEnumerator(); HasNext(e, 42); NoNext(e); } [Fact] public void RepeatSeq_Null() { AssertThrows(() => AsyncEnumerable.Repeat(default(IAsyncEnumerable))); AssertThrows(() => AsyncEnumerable.Repeat(default(IAsyncEnumerable), 3)); AssertThrows(() => AsyncEnumerable.Repeat(AsyncEnumerable.Return(42), -1)); } [Fact] public void RepeatSeq1() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); } [Fact] public void RepeatSeq2() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); NoNext(e); } [Fact] public void RepeatSeq3() { var i = 0; var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(3); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 1); HasNext(e, 2); HasNext(e, 1); HasNext(e, 2); NoNext(e); Assert.Equal(3, i); } [Fact] public void RepeatSeq0() { var i = 0; var xs = RepeatXs(() => i++).ToAsyncEnumerable().Repeat(0); var e = xs.GetAsyncEnumerator(); NoNext(e); } [Fact] public async Task RepeatSeq6() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Repeat(3); await SequenceIdentity(xs); } static IEnumerable RepeatXs(Action started) { started(); yield return 1; yield return 2; } [Fact] public void RepeatSeq4() { var xs = new FailRepeat().ToAsyncEnumerable().Repeat(); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException); } [Fact] public void RepeatSeq5() { var xs = new FailRepeat().ToAsyncEnumerable().Repeat(3); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NotImplementedException); } class FailRepeat : IEnumerable { public IEnumerator GetEnumerator() { throw new NotImplementedException(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw new NotImplementedException(); } } [Fact] public void IgnoreElements_Null() { AssertThrows(() => AsyncEnumerableEx.IgnoreElements(default(IAsyncEnumerable))); } [Fact] public void IgnoreElements1() { var xs = AsyncEnumerable.Empty().IgnoreElements(); var e = xs.GetAsyncEnumerator(); NoNext(e); AssertThrows(() => { var ignored = e.Current; }); } [Fact] public void IgnoreElements2() { var xs = AsyncEnumerable.Return(42).IgnoreElements(); var e = xs.GetAsyncEnumerator(); NoNext(e); AssertThrows(() => { var ignored = e.Current; }); } [Fact] public void IgnoreElements3() { var xs = AsyncEnumerable.Range(0, 10).IgnoreElements(); var e = xs.GetAsyncEnumerator(); NoNext(e); AssertThrows(() => { var ignored = e.Current; }); } [Fact] public void IgnoreElements4() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Throw(ex).IgnoreElements(); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task IgnoreElements5() { var xs = AsyncEnumerable.Range(0, 10).IgnoreElements(); await SequenceIdentity(xs); } [Fact] public void StartWith_Null() { AssertThrows(() => AsyncEnumerableEx.StartWith(default(IAsyncEnumerable), new[] { 1 })); AssertThrows(() => AsyncEnumerableEx.StartWith(AsyncEnumerable.Return(42), null)); } [Fact] public void StartWith1() { var xs = AsyncEnumerable.Empty().StartWith(1, 2); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void StartWith2() { var xs = AsyncEnumerable.Return(0).StartWith(1, 2); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 0); NoNext(e); } [Fact] public void StartWith3() { var ex = new Exception("Bang!"); var xs = AsyncEnumerable.Throw(ex).StartWith(1, 2); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Buffer_Null() { AssertThrows(() => AsyncEnumerableEx.Buffer(default(IAsyncEnumerable), 1)); AssertThrows(() => AsyncEnumerableEx.Buffer(default(IAsyncEnumerable), 1, 1)); AssertThrows(() => AsyncEnumerableEx.Buffer(AsyncEnumerable.Return(42), -1)); AssertThrows(() => AsyncEnumerableEx.Buffer(AsyncEnumerable.Return(42), -1, 1)); AssertThrows(() => AsyncEnumerableEx.Buffer(AsyncEnumerable.Return(42), 1, -1)); } [Fact] public void Buffer1() { var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(2); var e = xs.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 1, 2 })); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 3, 4 })); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 5 })); Assert.False(e.MoveNextAsync().Result); } [Fact] public void Buffer2() { var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(3, 2); var e = xs.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 1, 2, 3 })); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 3, 4, 5 })); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 5 })); Assert.False(e.MoveNextAsync().Result); } [Fact] public void Buffer3() { var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(2, 3); var e = xs.GetAsyncEnumerator(); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 1, 2 })); Assert.True(e.MoveNextAsync().Result); Assert.True(e.Current.SequenceEqual(new[] { 4, 5 })); Assert.False(e.MoveNextAsync().Result); } [Fact] public async Task Buffer4() { var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Buffer(3, 2); await SequenceIdentity(xs); } [Fact] public void DistinctUntilChanged_Null() { AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable))); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), default(IEqualityComparer))); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable), x => x)); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(default(IAsyncEnumerable), x => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), default(Func), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerableEx.DistinctUntilChanged(AsyncEnumerable.Return(42), x => x, default(IEqualityComparer))); } [Fact] public void DistinctUntilChanged1() { var xs = new[] { 1, 2, 2, 3, 4, 4, 4, 4, 5, 6, 6, 7, 3, 2, 2, 1, 1 }.ToAsyncEnumerable().DistinctUntilChanged(); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); HasNext(e, 5); HasNext(e, 6); HasNext(e, 7); HasNext(e, 3); HasNext(e, 2); HasNext(e, 1); NoNext(e); } [Fact] public void DistinctUntilChanged2() { var xs = new[] { 1, 2, 3, 4, 3, 5, 2 }.ToAsyncEnumerable().DistinctUntilChanged(x => (x + 1) / 2); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 3); HasNext(e, 5); HasNext(e, 2); NoNext(e); } [Fact] public void DistinctUntilChanged3() { var ex = new Exception("Bang!"); var xs = new[] { 1, 2, 3, 4, 3, 5, 2 }.ToAsyncEnumerable().DistinctUntilChanged(x => { if (x == 4) throw ex; return x; }); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task DistinctUntilChanged4() { var xs = new[] { 1, 2, 2, 3, 4, 4, 4, 4, 5, 6, 6, 7, 3, 2, 2, 1, 1 }.ToAsyncEnumerable().DistinctUntilChanged(); await SequenceIdentity(xs); } [Fact] public async Task DistinctUntilChanged5() { var xs = new[] { 1, 2, 3, 4, 3, 5, 2 }.ToAsyncEnumerable().DistinctUntilChanged(x => (x + 1) / 2); await SequenceIdentity(xs); } [Fact] public void Expand_Null() { AssertThrows(() => AsyncEnumerableEx.Expand(default(IAsyncEnumerable), x => default(IAsyncEnumerable))); AssertThrows(() => AsyncEnumerableEx.Expand(AsyncEnumerable.Return(42), default(Func>))); } [Fact] public void Expand1() { var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(x => AsyncEnumerable.Return(x - 1).Repeat(x - 1)); var e = xs.GetAsyncEnumerator(); HasNext(e, 2); HasNext(e, 3); HasNext(e, 1); HasNext(e, 2); HasNext(e, 2); HasNext(e, 1); HasNext(e, 1); NoNext(e); } [Fact] public void Expand2() { var ex = new Exception("Bang!"); var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(new Func>(x => { throw ex; })); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Expand3() { var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(x => default(IAsyncEnumerable)); var e = xs.GetAsyncEnumerator(); HasNext(e, 2); HasNext(e, 3); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() is NullReferenceException); } [Fact] public async Task Expand4() { var xs = new[] { 2, 3 }.ToAsyncEnumerable().Expand(x => AsyncEnumerable.Return(x - 1).Repeat(x - 1)); await SequenceIdentity(xs); } [Fact] public void Scan_Null() { AssertThrows(() => AsyncEnumerableEx.Scan(default(IAsyncEnumerable), 3, (x, y) => x + y)); AssertThrows(() => AsyncEnumerableEx.Scan(AsyncEnumerable.Return(42), 3, default(Func))); AssertThrows(() => AsyncEnumerableEx.Scan(default(IAsyncEnumerable), (x, y) => x + y)); AssertThrows(() => AsyncEnumerableEx.Scan(AsyncEnumerable.Return(42), default(Func))); } [Fact] public void Scan1() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(8, (x, y) => x + y); var e = xs.GetAsyncEnumerator(); HasNext(e, 9); HasNext(e, 11); HasNext(e, 14); NoNext(e); } [Fact] public void Scan2() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan((x, y) => x + y); var e = xs.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 6); NoNext(e); } [Fact] public void Scan3() { var ex = new Exception("Bang!"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(8, new Func((x, y) => { throw ex; })); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public void Scan4() { var ex = new Exception("Bang!"); var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(new Func((x, y) => { throw ex; })); var e = xs.GetAsyncEnumerator(); AssertThrows(() => e.MoveNextAsync().Wait(WaitTimeoutMs), (Exception ex_) => ((AggregateException)ex_).Flatten().InnerExceptions.Single() == ex); } [Fact] public async Task Scan5() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan(8, (x, y) => x + y); await SequenceIdentity(xs); } [Fact] public async Task Scan6() { var xs = new[] { 1, 2, 3 }.ToAsyncEnumerable().Scan((x, y) => x + y); await SequenceIdentity(xs); } [Fact] public void DistinctKey_Null() { AssertThrows(() => AsyncEnumerableEx.Distinct(default(IAsyncEnumerable), x => x)); AssertThrows(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), default(Func))); AssertThrows(() => AsyncEnumerableEx.Distinct(default(IAsyncEnumerable), x => x, EqualityComparer.Default)); AssertThrows(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), default(Func), EqualityComparer.Default)); AssertThrows(() => AsyncEnumerableEx.Distinct(AsyncEnumerable.Return(42), x => x, null)); } [Fact] public void DistinctKey1() { var xs = new[] { 1, 2, 3, 4, 5 }.ToAsyncEnumerable().Distinct(x => x / 2); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 4); NoNext(e); } [Fact] public void TakeLast_Null() { AssertThrows(() => AsyncEnumerable.TakeLast(default(IAsyncEnumerable), 5)); } [Fact] public void TakeLast0() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().TakeLast(-2); var e = xs.GetAsyncEnumerator(); NoNext(e); } [Fact] public void TakeLast1() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().TakeLast(2); var e = xs.GetAsyncEnumerator(); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public void TakeLast2() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().TakeLast(5); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } [Fact] public async Task TakeLast3() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().TakeLast(2); await SequenceIdentity(xs); } [Fact] public void TakeLast_BugFix_TakeLast_Zero_TakesForever() { var isSet = false; new int[] { 1, 2, 3, 4 }.ToAsyncEnumerable() .TakeLast(0) .ForEachAsync(_ => { isSet = true; }) .Wait(WaitTimeoutMs); Assert.False(isSet); var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().TakeLast(0); var e = xs.GetAsyncEnumerator(); NoNext(e); } [Fact] public void SkipLast_Null() { AssertThrows(() => AsyncEnumerable.SkipLast(default(IAsyncEnumerable), 5)); } [Fact] public void SkipLast1() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().SkipLast(2); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); NoNext(e); } [Fact] public void SkipLast2() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().SkipLast(5); var e = xs.GetAsyncEnumerator(); NoNext(e); } [Fact] public async Task SkipLast3() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().SkipLast(2); await SequenceIdentity(xs); } [Fact] public void SkipLast4() { var xs = new[] { 1, 2, 3, 4 }.ToAsyncEnumerable().SkipLast(0); var e = xs.GetAsyncEnumerator(); HasNext(e, 1); HasNext(e, 2); HasNext(e, 3); HasNext(e, 4); NoNext(e); } } }