generics MinMax and tests

This commit is contained in:
neuecc
2020-05-09 22:06:51 +09:00
parent d4511c0f67
commit dd6a8da96f
6 changed files with 711 additions and 1635 deletions

View File

@@ -3,6 +3,7 @@ using Cysharp.Threading.Tasks.Linq;
using FluentAssertions;
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
@@ -118,5 +119,231 @@ namespace NetCoreTests.Linq
break;
}
}
public static IEnumerable<object[]> array2 = new object[][]
{
new object[]{new int[] { } },
new object[]{new int[] { 5 } },
new object[]{new int[] { 5, 10, 100 } },
new object[]{new int[] { 10, 5,100 } },
new object[]{new int[] { 100, 10, 5 } },
new object[]{new int?[] { } },
new object[]{new int?[] { 5 } },
new object[]{new int?[] { null, null, null } },
new object[]{new int?[] { null, 5, 10, 100 } },
new object[]{new int?[] { 10, 5,100, null } },
new object[]{new int?[] { 100, 10, 5 } },
new object[]{new X[] { } },
new object[]{new X[] { new X(5) } },
new object[]{new X[] { new X(5), new X(10), new X(100) } },
new object[]{new X[] { new X(10),new X( 5),new X(100) } },
new object[]{new X[] { new X(100), new X(10),new X(5) } },
new object[]{new XX[] { } },
new object[]{new XX[] { new XX(new X(5)) } },
new object[]{new XX[] { new XX(new X(5)), new XX(new X(10)), new XX(new X(100)) } },
new object[]{new XX[] { new XX(new X(10)),new XX(new X( 5)),new XX(new X(100)) } },
new object[]{new XX[] { new XX(new X(100)), new XX(new X(10)),new XX(new X(5)) } },
};
[Theory]
[MemberData(nameof(array2))]
public async Task Min<T>(T arr)
{
switch (arr)
{
case int[] array:
{
{
if (array.Length == 0)
{
await Assert.ThrowsAsync<InvalidOperationException>(async () => await array.ToUniTaskAsyncEnumerable().MinAsync());
Assert.Throws<InvalidOperationException>(() => array.Min());
}
else
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync();
var ys = array.Min();
xs.Should().Be(ys);
}
}
{
if (array.Length == 0)
{
await Assert.ThrowsAsync<InvalidOperationException>(async () => await array.ToUniTaskAsyncEnumerable().MinAsync(x => x * 2));
Assert.Throws<InvalidOperationException>(() => array.Min(x => x * 2));
}
else
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync(x => x * 2);
var ys = array.Min(x => x * 2);
xs.Should().Be(ys);
}
}
}
break;
case int?[] array:
{
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync();
var ys = array.Min();
xs.Should().Be(ys);
}
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync(x => x);
var ys = array.Min(x => x);
xs.Should().Be(ys);
}
}
break;
case X[] array:
{
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync();
var ys = array.Min();
xs.Should().Be(ys);
}
{
if (array.Length == 0)
{
await Assert.ThrowsAsync<InvalidOperationException>(async () => await array.ToUniTaskAsyncEnumerable().MinAsync(x => x.Value));
Assert.Throws<InvalidOperationException>(() => array.Min(x => x.Value));
}
else
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync(x => x.Value);
var ys = array.Min(x => x.Value);
xs.Should().Be(ys);
}
}
}
break;
case XX[] array:
{
var xs = await array.ToUniTaskAsyncEnumerable().MinAsync(x => x.Value);
var ys = array.Min(x => x.Value);
xs.Should().Be(ys);
}
break;
default:
break;
}
}
[Theory]
[MemberData(nameof(array2))]
public async Task Max<T>(T arr)
{
switch (arr)
{
case int[] array:
{
{
if (array.Length == 0)
{
await Assert.ThrowsAsync<InvalidOperationException>(async () => await array.ToUniTaskAsyncEnumerable().MaxAsync());
Assert.Throws<InvalidOperationException>(() => array.Max());
}
else
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync();
var ys = array.Max();
xs.Should().Be(ys);
}
}
{
if (array.Length == 0)
{
await Assert.ThrowsAsync<InvalidOperationException>(async () => await array.ToUniTaskAsyncEnumerable().MaxAsync(x => x * 2));
Assert.Throws<InvalidOperationException>(() => array.Max(x => x * 2));
}
else
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync(x => x * 2);
var ys = array.Max(x => x * 2);
xs.Should().Be(ys);
}
}
}
break;
case int?[] array:
{
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync();
var ys = array.Max();
xs.Should().Be(ys);
}
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync(x => x);
var ys = array.Max(x => x);
xs.Should().Be(ys);
}
}
break;
case X[] array:
{
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync();
var ys = array.Max();
xs.Should().Be(ys);
}
{
if (array.Length == 0)
{
await Assert.ThrowsAsync<InvalidOperationException>(async () => await array.ToUniTaskAsyncEnumerable().MaxAsync(x => x.Value));
Assert.Throws<InvalidOperationException>(() => array.Max(x => x.Value));
}
else
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync(x => x.Value);
var ys = array.Max(x => x.Value);
xs.Should().Be(ys);
}
}
}
break;
case XX[] array:
{
var xs = await array.ToUniTaskAsyncEnumerable().MaxAsync(x => x.Value);
var ys = array.Max(x => x.Value);
xs.Should().Be(ys);
}
break;
default:
break;
}
}
public class XX
{
public readonly X Value;
public XX(X value)
{
this.Value = value;
}
}
public class X : IComparable<X>
{
public readonly int Value;
public X(int value)
{
Value = value;
}
public int CompareTo([AllowNull] X other)
{
return Comparer<int>.Default.Compare(Value, other.Value);
}
}
}
}