// 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.Linq; using System.Threading; using System.Threading.Tasks; using Xunit; namespace Tests { public class Max : AsyncEnumerableTests { [Fact] public async Task MaxAsync_Null() { // Max(IAE

) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); // Max(IAE

, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); // Max(IAE, Func) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); // Max(IAE, Func, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); // Max(IAE, Func>) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); // Max(IAE, Func>, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); #if !NO_DEEP_CANCELLATION // Max(IAE, Func>, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); #endif // Max(IAE) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable)).AsTask()); // Max(IAE, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None).AsTask()); // Max(IAE, Func) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func)).AsTask()); // Max(IAE, Func, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None).AsTask()); // Max(IAE, Func>) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x)).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>)).AsTask()); // Max(IAE, Func>, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(default(IAsyncEnumerable), x => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); #if !NO_DEEP_CANCELLATION // Max(IAE, Func>, CT) await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(default(IAsyncEnumerable), (x, ct) => new ValueTask(x), CancellationToken.None).AsTask()); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAwaitWithCancellationAsync(AsyncEnumerable.Empty(), default(Func>), CancellationToken.None).AsTask()); #endif } [Fact] public async Task MaxAsync_Int32() { var xs = new[] { 2, 1, 3 }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Nullable_Int32() { var xs = new[] { 2, default(int?), 3 }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Int64() { var xs = new[] { 2L, 1L, 3L }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Nullable_Int64() { var xs = new[] { 2L, default(long?), 3L }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Double() { var xs = new[] { 2.0, 1.0, 3.0 }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Nullable_Double() { var xs = new[] { 2.0, default(double?), 3.0 }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Single() { var xs = new[] { 2.0f, 1.0f, 3.0f }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Nullable_Single() { var xs = new[] { 2.0f, default(float?), 3.0f }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Decimal() { var xs = new[] { 2.0m, 1.0m, 3.0m }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_Nullable_Decimal() { var xs = new[] { 2.0m, default(decimal?), 3.0m }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_TSource_Value() { var xs = new[] { DateTime.Now.AddDays(1), DateTime.Now.Subtract(TimeSpan.FromDays(1)), DateTime.Now.AddDays(2), DateTime.Now }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_TSource_NonValue() { var xs = new[] { "foo", "bar", "qux", "baz", "fred", "wilma" }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_TSource_Value_Empty() { var xs = new DateTimeOffset[0].ToAsyncEnumerable(); await AssertThrowsAsync(xs.MaxAsync().AsTask()); await AssertThrowsAsync(xs.MaxAsync(x => x).AsTask()); await AssertThrowsAsync(xs.MaxAwaitAsync(x => new ValueTask(x)).AsTask()); #if !NO_DEEP_CANCELLATION await AssertThrowsAsync(xs.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x)).AsTask()); #endif } [Fact] public async Task MaxAsync_TSource_NonValue_Empty() { var xs = new string[0].ToAsyncEnumerable(); Assert.Null(await xs.MaxAsync()); Assert.Null(await xs.MaxAsync(x => x)); Assert.Null(await xs.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Null(await xs.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_TSource_NullableValue_Empty() { var xs = new DateTimeOffset?[0].ToAsyncEnumerable(); Assert.Null(await xs.MaxAsync()); Assert.Null(await xs.MaxAsync(x => x)); Assert.Null(await xs.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Null(await xs.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } [Fact] public async Task MaxAsync_TSource_NullableValue_SomeNull() { var xs = new DateTimeOffset?[] { null, null, DateTime.Now.AddDays(1), DateTime.Now.Subtract(TimeSpan.FromDays(1)), null, DateTime.Now.AddDays(2), DateTime.Now, null }; var ys = xs.ToAsyncEnumerable(); Assert.Equal(xs.Max(), await ys.MaxAsync()); Assert.Equal(xs.Max(), await ys.MaxAsync(x => x)); Assert.Equal(xs.Max(), await ys.MaxAwaitAsync(x => new ValueTask(x))); #if !NO_DEEP_CANCELLATION Assert.Equal(xs.Max(), await ys.MaxAwaitWithCancellationAsync((x, ct) => new ValueTask(x))); #endif } } }