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()));
        }
Exemplo n.º 3
0
        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");
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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");
        }
Exemplo n.º 6
0
        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()));
        }
Exemplo n.º 7
0
        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()));
        }
Exemplo n.º 8
0
        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()));
        }
Exemplo n.º 10
0
        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()));
        }
Exemplo n.º 11
0
        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()));
        }
Exemplo n.º 12
0
        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");
        }
Exemplo n.º 13
0
        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");
        }
Exemplo n.º 14
0
        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);
        }
Exemplo n.º 15
0
 public static async Task <IList <(T, TimeSpan)> > ConsumeFast <T>(this IAsyncObservable <T> obs, TestAsyncScheduler scheduler)
 {