コード例 #1
0
        public void A_UnfoldResourceAsyncSource_must_unfold_data_from_a_resource()
        {
            var createPromise = new TaskCompletionSource <Done>();
            var closePromise  = new TaskCompletionSource <Done>();

            var values   = Enumerable.Range(0, 1000).ToList();
            var resource = new ResourceDummy <int>(values, createPromise.Task, closeFuture: closePromise.Task);

            var probe = this.CreateSubscriberProbe <int>();

            Source.UnfoldResourceAsync(
                () => resource.Create(),
                r => r.Read(),
                close: r => r.Close())
            .RunWith(Sink.FromSubscriber(probe), Materializer);

            probe.Request(1);
            _ = resource.Created.Result;
            probe.ExpectNoMsg(TimeSpan.FromMilliseconds(200));
            createPromise.SetResult(Done.Instance);

            values.ForEach(i =>
            {
                _ = resource.FirstElementRead.Result;
                probe.ExpectNext().ShouldBe(i);
                probe.Request(1);
            });

            resource.Closed.Wait();
            closePromise.SetResult(Done.Instance);

            probe.ExpectComplete();
        }
コード例 #2
0
        public void A_UnfoldResourceAsyncSource_must_close_resource_successfully_right_after_open()
        {
            this.AssertAllStagesStopped(() =>
            {
                var probe    = this.CreateSubscriberProbe <int>();
                var firtRead = new TaskCompletionSource <Done>();
                var resource = new ResourceDummy <int>(new[] { 1 }, firstReadFuture: firtRead.Task);

                Source.UnfoldResourceAsync(
                    create: () => resource.Create(),
                    read: reader => reader.Read(),
                    close: reader => reader.Close())
                .RunWith(Sink.FromSubscriber(probe), Materializer);

                probe.Request(1L);
                _ = resource.FirstElementRead.Result;
                // we cancel before we complete first read (racy)
                probe.Cancel();
                Thread.Sleep(100);
                firtRead.SetResult(Done.Instance);

                resource.Closed.Wait();
            }, Materializer);
        }