#pragma warning disable CS1998 #pragma warning disable CS0162 using Cysharp.Threading.Tasks; using Cysharp.Threading.Tasks.Linq; using FluentAssertions; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using Xunit; namespace NetCoreTests.Linq { public class CreateTest { [Fact] public async Task SyncCreation() { var from = 10; var count = 100; var xs = await UniTaskAsyncEnumerable.Create(async (writer, token) => { for (int i = 0; i < count; i++) { await writer.YieldAsync(from + i); } }).ToArrayAsync(); var ys = await Range(from, count).AsUniTaskAsyncEnumerable().ToArrayAsync(); xs.Should().BeEquivalentTo(ys); } [Fact] public async Task SyncManually() { var list = new List(); var xs = UniTaskAsyncEnumerable.Create(async (writer, token) => { list.Add(100); await writer.YieldAsync(10); list.Add(200); await writer.YieldAsync(20); list.Add(300); await writer.YieldAsync(30); list.Add(400); }); list.Should().BeEmpty(); var e = xs.GetAsyncEnumerator(); list.Should().BeEmpty(); await e.MoveNextAsync(); list.Should().BeEquivalentTo(100); e.Current.Should().Be(10); await e.MoveNextAsync(); list.Should().BeEquivalentTo(100, 200); e.Current.Should().Be(20); await e.MoveNextAsync(); list.Should().BeEquivalentTo(100, 200, 300); e.Current.Should().Be(30); (await e.MoveNextAsync()).Should().BeFalse(); list.Should().BeEquivalentTo(100, 200, 300, 400); } [Fact] public async Task SyncExceptionFirst() { var from = 10; var count = 100; var xs = UniTaskAsyncEnumerable.Create(async (writer, token) => { for (int i = 0; i < count; i++) { throw new UniTaskTestException(); await writer.YieldAsync(from + i); } }); await Assert.ThrowsAsync(async () => await xs.ToArrayAsync()); } [Fact] public async Task SyncException() { var from = 10; var count = 100; var xs = UniTaskAsyncEnumerable.Create(async (writer, token) => { for (int i = 0; i < count; i++) { await writer.YieldAsync(from + i); if (i == 15) { throw new UniTaskTestException(); } } }); await Assert.ThrowsAsync(async () => await xs.ToArrayAsync()); } [Fact] public async Task ASyncManually() { var list = new List(); var xs = UniTaskAsyncEnumerable.Create(async (writer, token) => { await UniTask.Yield(); list.Add(100); await writer.YieldAsync(10); await UniTask.Yield(); list.Add(200); await writer.YieldAsync(20); await UniTask.Yield(); list.Add(300); await UniTask.Yield(); await writer.YieldAsync(30); await UniTask.Yield(); list.Add(400); }); list.Should().BeEmpty(); var e = xs.GetAsyncEnumerator(); list.Should().BeEmpty(); await e.MoveNextAsync(); list.Should().BeEquivalentTo(100); e.Current.Should().Be(10); await e.MoveNextAsync(); list.Should().BeEquivalentTo(100, 200); e.Current.Should().Be(20); await e.MoveNextAsync(); list.Should().BeEquivalentTo(100, 200, 300); e.Current.Should().Be(30); (await e.MoveNextAsync()).Should().BeFalse(); list.Should().BeEquivalentTo(100, 200, 300, 400); } async IAsyncEnumerable Range(int from, int count) { for (int i = 0; i < count; i++) { yield return from + i; } } } }