|
@@ -16,84 +16,318 @@ namespace Tests
|
|
|
public async Task LastOrDefault_Null()
|
|
|
{
|
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default));
|
|
|
+
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, CancellationToken.None));
|
|
|
+
|
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, x => true));
|
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync(Return42, default(Func<int, bool>)));
|
|
|
|
|
|
- await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, CancellationToken.None));
|
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, x => true, CancellationToken.None));
|
|
|
await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync(Return42, default(Func<int, bool>), CancellationToken.None));
|
|
|
+
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, x => new ValueTask<bool>(true)));
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync(Return42, default(Func<int, ValueTask<bool>>)));
|
|
|
+
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, x => new ValueTask<bool>(true), CancellationToken.None));
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync(Return42, default(Func<int, ValueTask<bool>>), CancellationToken.None));
|
|
|
+
|
|
|
+#if !NO_DEEP_CANCELLATION
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync<int>(default, (x, ct) => new ValueTask<bool>(true), CancellationToken.None));
|
|
|
+ await Assert.ThrowsAsync<ArgumentNullException>(() => AsyncEnumerable.LastOrDefaultAsync(Return42, default(Func<int, CancellationToken, ValueTask<bool>>), CancellationToken.None));
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault1Async()
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Empty()
|
|
|
{
|
|
|
var res = AsyncEnumerable.Empty<int>().LastOrDefaultAsync();
|
|
|
Assert.Equal(0, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault2Async()
|
|
|
+ public async Task LasyOrDefaultAsync_NoParam_Empty_Enumerable()
|
|
|
{
|
|
|
- var res = AsyncEnumerable.Empty<int>().LastOrDefaultAsync(x => true);
|
|
|
+ var res = new int[0].Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync();
|
|
|
Assert.Equal(0, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault3Async()
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Empty_IList()
|
|
|
{
|
|
|
- var res = Return42.LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ var res = new int[0].ToAsyncEnumerable().LastOrDefaultAsync();
|
|
|
Assert.Equal(0, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault4Async()
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Throw()
|
|
|
+ {
|
|
|
+ var ex = new Exception("Bang!");
|
|
|
+ var res = Throw<int>(ex).LastOrDefaultAsync();
|
|
|
+ await AssertThrowsAsync(res, ex);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Single_IList()
|
|
|
{
|
|
|
var res = Return42.LastOrDefaultAsync();
|
|
|
Assert.Equal(42, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault5Async()
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Single()
|
|
|
{
|
|
|
- var res = Return42.LastOrDefaultAsync(x => x % 2 == 0);
|
|
|
+ var res = new[] { 42 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync();
|
|
|
Assert.Equal(42, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault6Async()
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Many_IList()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 43, 44 }.ToAsyncEnumerable().LastOrDefaultAsync();
|
|
|
+ Assert.Equal(44, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_NoParam_Many()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 43, 44 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync();
|
|
|
+ Assert.Equal(44, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Empty()
|
|
|
+ {
|
|
|
+ var res = AsyncEnumerable.Empty<int>().LastOrDefaultAsync(x => true);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Throw()
|
|
|
{
|
|
|
var ex = new Exception("Bang!");
|
|
|
- var res = Throw<int>(ex).LastOrDefaultAsync();
|
|
|
+ var res = Throw<int>(ex).LastOrDefaultAsync(x => true);
|
|
|
await AssertThrowsAsync(res, ex);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault7Async()
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Single_None()
|
|
|
+ {
|
|
|
+ var res = Return42.LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Many_IList_None()
|
|
|
+ {
|
|
|
+ var res = new[] { 40, 42, 44 }.ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Many_None()
|
|
|
+ {
|
|
|
+ var res = new[] { 40, 42, 44 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Single_Pass()
|
|
|
+ {
|
|
|
+ var res = Return42.LastOrDefaultAsync(x => x % 2 == 0);
|
|
|
+ Assert.Equal(42, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Many_IList_Pass1()
|
|
|
+ {
|
|
|
+ var res = new[] { 43, 44, 45 }.ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Many_IList_Pass2()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 45, 90 }.ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Many_Pass1()
|
|
|
+ {
|
|
|
+ var res = new[] { 43, 44, 45 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_Many_Pass2()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 45, 90 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_Predicate_PredicateThrows()
|
|
|
+ {
|
|
|
+ var res = new[] { 0, 1, 2 }.ToAsyncEnumerable().LastOrDefaultAsync(x => 1 / x > 0);
|
|
|
+ await AssertThrowsAsync<DivideByZeroException>(res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Empty()
|
|
|
+ {
|
|
|
+ var res = AsyncEnumerable.Empty<int>().LastOrDefaultAsync(x => new ValueTask<bool>(true));
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Throw()
|
|
|
{
|
|
|
var ex = new Exception("Bang!");
|
|
|
- var res = Throw<int>(ex).LastOrDefaultAsync(x => true);
|
|
|
+ var res = Throw<int>(ex).LastOrDefaultAsync(x => new ValueTask<bool>(true));
|
|
|
await AssertThrowsAsync(res, ex);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault8Async()
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Single_None()
|
|
|
{
|
|
|
- var res = new[] { 42, 45, 90 }.ToAsyncEnumerable().LastOrDefaultAsync();
|
|
|
- Assert.Equal(90, await res);
|
|
|
+ var res = Return42.LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Many_IList_None()
|
|
|
+ {
|
|
|
+ var res = new[] { 40, 42, 44 }.ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Many_None()
|
|
|
+ {
|
|
|
+ var res = new[] { 40, 42, 44 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
+ Assert.Equal(0, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault9Async()
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Single_Pass()
|
|
|
{
|
|
|
- var res = new[] { 42, 23, 45, 90 }.ToAsyncEnumerable().LastOrDefaultAsync(x => x % 2 != 0);
|
|
|
+ var res = Return42.LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 == 0));
|
|
|
+ Assert.Equal(42, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Many_IList_Pass1()
|
|
|
+ {
|
|
|
+ var res = new[] { 43, 44, 45 }.ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
Assert.Equal(45, await res);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public async Task LastOrDefault10Async()
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Many_IList_Pass2()
|
|
|
{
|
|
|
- var res = new[] { 42, 45, 90 }.ToAsyncEnumerable().LastOrDefaultAsync(x => x < 10);
|
|
|
+ var res = new[] { 42, 45, 90 }.ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Many_Pass1()
|
|
|
+ {
|
|
|
+ var res = new[] { 43, 44, 45 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_Many_Pass2()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 45, 90 }.Select(x => x).ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(x % 2 != 0));
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicate_AsyncPredicateThrows()
|
|
|
+ {
|
|
|
+ var res = new[] { 0, 1, 2 }.ToAsyncEnumerable().LastOrDefaultAsync(x => new ValueTask<bool>(1 / x > 0));
|
|
|
+ await AssertThrowsAsync<DivideByZeroException>(res);
|
|
|
+ }
|
|
|
+
|
|
|
+#if !NO_DEEP_CANCELLATION
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Empty()
|
|
|
+ {
|
|
|
+ var res = AsyncEnumerable.Empty<int>().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(true), CancellationToken.None);
|
|
|
Assert.Equal(0, await res);
|
|
|
}
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Throw()
|
|
|
+ {
|
|
|
+ var ex = new Exception("Bang!");
|
|
|
+ var res = Throw<int>(ex).LastOrDefaultAsync((x, ct) => new ValueTask<bool>(true), CancellationToken.None);
|
|
|
+ await AssertThrowsAsync(res, ex);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Single_None()
|
|
|
+ {
|
|
|
+ var res = Return42.LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Many_IList_None()
|
|
|
+ {
|
|
|
+ var res = new[] { 40, 42, 44 }.ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Many_None()
|
|
|
+ {
|
|
|
+ var res = new[] { 40, 42, 44 }.Select((x, ct) => x).ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(0, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Single_Pass()
|
|
|
+ {
|
|
|
+ var res = Return42.LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 == 0), CancellationToken.None);
|
|
|
+ Assert.Equal(42, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Many_IList_Pass1()
|
|
|
+ {
|
|
|
+ var res = new[] { 43, 44, 45 }.ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Many_IList_Pass2()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 45, 90 }.ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Many_Pass1()
|
|
|
+ {
|
|
|
+ var res = new[] { 43, 44, 45 }.Select((x, ct) => x).ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_Many_Pass2()
|
|
|
+ {
|
|
|
+ var res = new[] { 42, 45, 90 }.Select((x, ct) => x).ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(x % 2 != 0), CancellationToken.None);
|
|
|
+ Assert.Equal(45, await res);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ public async Task LastOrDefaultAsync_AsyncPredicateWithCancellation_AsyncPredicateWithCancellationThrows()
|
|
|
+ {
|
|
|
+ var res = new[] { 0, 1, 2 }.ToAsyncEnumerable().LastOrDefaultAsync((x, ct) => new ValueTask<bool>(1 / x > 0), CancellationToken.None);
|
|
|
+ await AssertThrowsAsync<DivideByZeroException>(res);
|
|
|
+ }
|
|
|
+#endif
|
|
|
}
|
|
|
}
|