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() { var a = UniTaskAsyncEnumerable.Create(async (writer, _) => { await UniTask.SwitchToThreadPool(); await writer.YieldAsync("A1"); await Task.Delay(TimeSpan.FromMilliseconds(20)); await writer.YieldAsync("A2"); }); var b = UniTaskAsyncEnumerable.Create(async (writer, _) => { await UniTask.SwitchToThreadPool(); await Task.Delay(TimeSpan.FromMilliseconds(10)); await writer.YieldAsync("B1"); await writer.YieldAsync("B2"); await Task.Delay(TimeSpan.FromMilliseconds(100)); await writer.YieldAsync("B3"); }); var result = await a.Merge(b).ToArrayAsync(); result.Should().Equal("A1", "B1", "B2", "A2", "B3"); } [Fact] public async Task ThreeSource() { var a = UniTaskAsyncEnumerable.Create(async (writer, _) => { await UniTask.SwitchToThreadPool(); await Task.Delay(TimeSpan.FromMilliseconds(10)); await writer.YieldAsync("A1"); await Task.Delay(TimeSpan.FromMilliseconds(40)); await writer.YieldAsync("A2"); }); var b = UniTaskAsyncEnumerable.Create(async (writer, _) => { await UniTask.SwitchToThreadPool(); await Task.Delay(TimeSpan.FromMilliseconds(20)); await writer.YieldAsync("B1"); await writer.YieldAsync("B2"); await Task.Delay(TimeSpan.FromMilliseconds(80)); await writer.YieldAsync("B3"); }); var c = UniTaskAsyncEnumerable.Create(async (writer, _) => { await UniTask.SwitchToThreadPool(); await writer.YieldAsync("C1"); }); 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(async (writer, _) => { await writer.YieldAsync("A1"); }); var b = UniTaskAsyncEnumerable.Create(async (writer, _) => { throw new UniTaskTestException(); }); var enumerator = a.Merge(b).GetAsyncEnumerator(); (await enumerator.MoveNextAsync()).Should().Be(true); enumerator.Current.Should().Be("A1"); await Assert.ThrowsAsync(async () => await enumerator.MoveNextAsync()); } [Fact] public async Task Cancel() { var cts = new CancellationTokenSource(); var a = UniTaskAsyncEnumerable.Create(async (writer, _) => { await writer.YieldAsync("A1"); }); var b = UniTaskAsyncEnumerable.Create(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"); cts.Cancel(); await Assert.ThrowsAsync(async () => await enumerator.MoveNextAsync()); } } }