public async Task ProduceConsumeSlowly() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { return(await scheduler.ProduceSlowly( 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds()) .ConsumeSlowly(scheduler, 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds())); }); result .Should().Equal( (0, 20.Seconds()), (1, 40.Seconds()), (2, 60.Seconds()), (3, 80.Seconds()), (4, 100.Seconds())); }
public async Task ProduceConsumeSlowly2() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { return(await scheduler.ProduceSlowly( 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds()) .DropOnBackpressure() .ConsumeSlowly(scheduler, 20.Seconds(), 20.Seconds(), 20.Seconds(), 20.Seconds(), 20.Seconds())); }); result .Should().Equal( (0, 30.Seconds()), (2, 50.Seconds()), (4, 70.Seconds())); }
public async Task ExceptionBefore() { string result = ""; var scheduler = new TestAsyncScheduler(); var catched = false; try { await AsyncObservable.Range(0, 5) .Do(i => result += i) .Do(i => { if (i == 2) { throw new TestException(); } }) .Prefetch() .Do(i => result += i) .SubscribeAsync() .ConfigureAwait(false); } catch (TestException) { catched = true; } catched .Should().BeTrue(); result .Should().Be("00112"); }
public async Task ManyParallel() { var scheduler = new TestAsyncScheduler(); async Task <List <TimeSpan> > Run(TimeSpan delay, int n) { var l = new List <TimeSpan>(); for (int i = 0; i < n; i++) { await scheduler.Delay(delay, default); l.Add(scheduler.EllapsedTime); } return(l); } var t1 = Run(20.Seconds(), 10); var t2 = Run(20.Seconds(), 10); scheduler.Run(); var list1 = await t1; var list2 = await t1; var expected = Enumerable.Range(1, 10).Select(i => (i * 20).Seconds()); list1 .Should().Equal(expected); list2 .Should().Equal(expected); }
public async Task IntermediateCancel() { var result = ""; var scheduler = new TestAsyncScheduler(); await scheduler.RunAsync(async() => { using (var cts = new CancellationTokenSource()) { var t1 = AsyncObservable.Range(0, 10) .Select(async(i, ca) => { await scheduler.Delay(20.Seconds(), ca); return(i); }) .SubscribeAsync(i => result += i, onCompleted: () => result += "C", ca: cts.Token); await scheduler.Delay(50.Seconds(), default); cts.Cancel(); await t1; } return(Unit.Default); }); result .Should().Be("01"); }
public async Task ProduceSlowlyMultiple() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { var inner1 = scheduler.ProduceSlowly( 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds()); var inner2 = inner1 .Select(i => i + 10); return(await new [] { inner1, inner2 } .ToAsyncObservable() .Merge() .ConsumeFast(scheduler)); }); result .Should().Equal( (0, 10.Seconds()), (10, 10.Seconds()), (1, 20.Seconds()), (11, 20.Seconds()), (2, 30.Seconds()), (12, 30.Seconds()), (3, 40.Seconds()), (13, 40.Seconds()), (4, 50.Seconds()), (14, 50.Seconds())); }
public async Task ConsumeSlowlySingle() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { var inner = AsyncObservable.Range(0, 5); return(await new [] { inner } .ToAsyncObservable() .Merge() .ConsumeSlowly(scheduler, 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds())); }); result .Should().Equal( (0, 10.Seconds()), (1, 20.Seconds()), (2, 30.Seconds()), (3, 40.Seconds()), (4, 50.Seconds())); }
public void EmptyRun() { var scheduler = new TestAsyncScheduler(); var t1 = scheduler.Now; scheduler.Run(); scheduler.EllapsedTime .Should().Be(TimeSpan.Zero); (scheduler.Now - t1) .Should().Be(TimeSpan.Zero); }
public async Task ConsumeSlowly() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { return(await AsyncObservable.Range(0, 5) .DropOnBackpressure() .ConsumeSlowly(scheduler, 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds())); }); result .Should().Equal((0, 10.Seconds())); }
public async Task ConsumeSlowlyMultiple() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { var inner1 = AsyncObservable.Range(0, 5); var inner2 = inner1 .Select(i => i + 10); return(await new [] { inner1, inner2 } .ToAsyncObservable() .Merge() .ConsumeSlowly(scheduler, 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds())); }); result .Should().Equal( (0, 10.Seconds()), (10, 20.Seconds()), (1, 30.Seconds()), (11, 40.Seconds()), (2, 50.Seconds()), (12, 60.Seconds()), (3, 70.Seconds()), (13, 80.Seconds()), (4, 90.Seconds()), (14, 100.Seconds())); }
public async Task ProduceSlowly() { var scheduler = new TestAsyncScheduler(); var result = await scheduler.RunAsync(async() => { return(await scheduler.ProduceSlowly( 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds()) .SampleFirst(20.Seconds(), scheduler) .ConsumeFast(scheduler)); }); result .Should().Equal( (0, 10.Seconds()), (2, 30.Seconds()), (4, 50.Seconds())); }
public async Task SlowProduce() { string result = ""; var scheduler = new TestAsyncScheduler(); await scheduler.RunAsync(async() => { return(await scheduler.ProduceSlowly( 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds()) .Do(i => result += i) .Prefetch() .Do(i => result += i) .ConsumeFast(scheduler)); }); result .Should().Be("0011223344"); }
public async Task SlowConsumer() { string result = ""; var scheduler = new TestAsyncScheduler(); await scheduler.RunAsync(async() => { return(await AsyncObservable.Range(0, 5) .Do(i => result += i) .Prefetch() .Do(i => result += i) .ConsumeSlowly(scheduler, 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds(), 10.Seconds())); }); result .Should().Be("0012341234"); }
public async Task OneItem(int ms) { var delay = TimeSpan.FromMilliseconds(ms); var scheduler = new TestAsyncScheduler(); var t1 = scheduler.Now; var t2 = default(DateTimeOffset); var task = scheduler.Delay(delay, default); var task2 = task.ContinueWith(t => t2 = scheduler.Now); scheduler.Run(); await task2; scheduler.EllapsedTime .Should().Be(delay); (t2 - t1) .Should().Be(delay); (scheduler.Now - t1) .Should().Be(delay); }
public static async Task <IList <(T, TimeSpan)> > ConsumeFast <T>(this IAsyncObservable <T> obs, TestAsyncScheduler scheduler) {