// 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 Max_Null() { await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func))); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(default(IAsyncEnumerable), x => x, CancellationToken.None)); await Assert.ThrowsAsync(() => AsyncEnumerable.MaxAsync(AsyncEnumerable.Empty(), default(Func), CancellationToken.None)); } [Fact] public async Task Max1Async() { var xs = new[] { 2, 7, 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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max2Async() { var xs = new[] { 2, default(int?), 3, 1 }; 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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max3Async() { var xs = new[] { 2L, 7L, 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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max4Async() { var xs = new[] { 2L, default(long?), 3L, 1L }; 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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max5Async() { var xs = new[] { 2.0, 7.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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max6Async() { var xs = new[] { 2.0, default(double?), 3.0, 1.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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max7Async() { var xs = new[] { 2.0f, 7.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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max8Async() { var xs = new[] { 2.0f, default(float?), 3.0f, 1.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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max9Async() { var xs = new[] { 2.0m, 7.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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max10Async() { var xs = new[] { 2.0m, default(decimal?), 3.0m, 1.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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max11Async() { 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.MaxAsync(x => new ValueTask(x))); } [Fact] public async Task Max12Async() { 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.MaxAsync(x => new ValueTask(x))); } } }