Files
UniTask/src/UniTask.NetCoreTests/Linq/Merge.cs

137 lines
4.1 KiB
C#
Raw Normal View History

2023-09-08 13:04:10 +09:00
using System;
using System.Threading;
using System.Threading.Tasks;
using Cysharp.Threading.Tasks;
using Cysharp.Threading.Tasks.Linq;
using FluentAssertions;
using Xunit;
namespace NetCoreTests.Linq
{
public class MergeTest
{
[Fact]
public async Task TwoSource()
{
2023-09-09 10:16:01 +09:00
var semaphore = new SemaphoreSlim(1, 1);
2023-09-08 13:04:10 +09:00
var a = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await UniTask.SwitchToThreadPool();
2023-09-09 10:16:01 +09:00
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("A1");
2023-09-09 10:16:01 +09:00
semaphore.Release();
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("A2");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-08 13:04:10 +09:00
});
2023-09-08 13:04:10 +09:00
var b = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await UniTask.SwitchToThreadPool();
2023-09-09 10:16:01 +09:00
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("B1");
await writer.YieldAsync("B2");
2023-09-09 10:16:01 +09:00
semaphore.Release();
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("B3");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-08 13:04:10 +09:00
});
var result = await a.Merge(b).ToArrayAsync();
result.Should().Equal("A1", "B1", "B2", "A2", "B3");
}
2023-09-08 13:04:10 +09:00
[Fact]
public async Task ThreeSource()
{
2023-09-09 10:16:01 +09:00
var semaphore = new SemaphoreSlim(0, 1);
2023-09-08 13:04:10 +09:00
var a = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await UniTask.SwitchToThreadPool();
2023-09-09 10:16:01 +09:00
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("A1");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-09 10:16:01 +09:00
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("A2");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-08 13:04:10 +09:00
});
2023-09-08 13:04:10 +09:00
var b = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await UniTask.SwitchToThreadPool();
2023-09-09 10:16:01 +09:00
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("B1");
await writer.YieldAsync("B2");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-09 10:16:01 +09:00
await semaphore.WaitAsync();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("B3");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-08 13:04:10 +09:00
});
2023-09-08 13:04:10 +09:00
var c = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await UniTask.SwitchToThreadPool();
2023-09-08 13:04:10 +09:00
await writer.YieldAsync("C1");
2023-09-09 10:16:01 +09:00
semaphore.Release();
2023-09-08 13:04:10 +09:00
});
var result = await a.Merge(b, c).ToArrayAsync();
result.Should().Equal("C1", "A1", "B1", "B2", "A2", "B3");
}
[Fact]
public async Task Throw()
{
var a = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await writer.YieldAsync("A1");
});
var b = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
throw new UniTaskTestException();
});
var enumerator = a.Merge(b).GetAsyncEnumerator();
(await enumerator.MoveNextAsync()).Should().Be(true);
enumerator.Current.Should().Be("A1");
2023-09-08 13:04:10 +09:00
await Assert.ThrowsAsync<UniTaskTestException>(async () => await enumerator.MoveNextAsync());
}
2023-09-08 13:04:10 +09:00
[Fact]
public async Task Cancel()
{
var cts = new CancellationTokenSource();
2023-09-08 13:04:10 +09:00
var a = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await writer.YieldAsync("A1");
});
var b = UniTaskAsyncEnumerable.Create<string>(async (writer, _) =>
{
await writer.YieldAsync("B1");
});
var enumerator = a.Merge(b).GetAsyncEnumerator(cts.Token);
(await enumerator.MoveNextAsync()).Should().Be(true);
enumerator.Current.Should().Be("A1");
2023-09-08 13:04:10 +09:00
cts.Cancel();
await Assert.ThrowsAsync<OperationCanceledException>(async () => await enumerator.MoveNextAsync());
}
}
}