コード例 #1
0
        public void GetShouldReturnItemToAwaiterEvenIfFirstTryWasException()
        {
            int callCount = 0;

            string item;

            Mock.Arrange(() => _itemsContainer.TryGet(out item))
            .DoInstead <OutAction <string> >((out string item2) =>
            {
                callCount++;
                if (callCount == 3)
                {
                    throw new Exception();
                }

                if (_queue.Count == 0)
                {
                    item2 = null;
                    return(false);
                }
                item2 = _queue.Dequeue();
                return(true);
            }).Returns <string>(o => o != null);

            var blockingPipe = new InfinityPipe <string>(_itemsContainer);
            var t1           = blockingPipe.ReceiveAsync();

            Assert.Catch(() => blockingPipe.SendAsync("1").Wait());
            Assert.AreEqual(TaskStatus.WaitingForActivation, t1.Status);

            blockingPipe.SendAsync("1").Wait();

            Assert.AreEqual("1", t1.Result);
        }
コード例 #2
0
        public void GetShouldBeBlockedWhenItemsContainerHasNoItems()
        {
            var blockingPipe = new InfinityPipe <string>(_itemsContainer);

            var t1 = blockingPipe.ReceiveAsync();

            Assert.AreEqual(TaskStatus.WaitingForActivation, t1.Status);
        }
コード例 #3
0
        public void GetShouldReturnItemImmediatlyWhenItemIsValid()
        {
            var blockingPipe = new InfinityPipe <string>(_itemsContainer);

            blockingPipe.SendAsync("1").Wait();

            var t1 = blockingPipe.ReceiveAsync();

            Assert.AreEqual("1", t1.Result);
        }
コード例 #4
0
        public void ShouldReturnDifferentItemsToEachAwaitedClients()
        {
            var blockingPipe = new InfinityPipe <string>(_itemsContainer);

            var t1 = blockingPipe.ReceiveAsync();
            var t2 = blockingPipe.ReceiveAsync();

            blockingPipe.SendAsync("1").Wait();
            blockingPipe.SendAsync("2").Wait();

            Assert.AreEqual("1", t1.Result);
            Assert.AreEqual("2", t2.Result);
        }
コード例 #5
0
        public void TestMethod2()
        {
            var exceptionHandler = Mock.Create <IExceptionHandler>();

            Mock.Arrange(() => exceptionHandler.Handle(null)).IgnoreArguments().Returns <Exception>(o =>
            {
                Console.WriteLine(o);
                return(true);
            });

            var itemStore    = new ItemStore();
            var uniqueQueue  = new ItemsQueueContainer <ItemWithDate>();
            var infinityPipe = new InfinityPipe <ItemWithDate>(uniqueQueue);

            var dataflow = DataflowBuilder
                           .StartFrom(infinityPipe)
                           .ConvertItemsTo(o => new ScheduledTransmitterItem <int>(o.DateTime, o.Num, stopSchedule: o.Count == 4))
                           .TransmitWith(o => o.ScheduledTransmitter(new DateTimeProvider(), exceptionHandler))
                           .Transform(itemStore.GetItem)
                           .BroadcastTo(t1 => t1.SendToTarget(new LoggingTarget <ItemWithDate>()),
                                        t2 => t2.Transform(o =>
            {
                o.Count++;
                o.DateTime = DateTime.Now.AddSeconds(o.Num + 1);
                return(o);
            })
                                        .RouteTo(condition => condition.Case(o => o.Count == 4)
                                                 .BroadcastTo(t21 => t21.SendToTarget(new DeleteTarget(itemStore)),
                                                              t22 => t22.SendToTarget(infinityPipe)),

                                                 condition => condition.Default()
                                                 .BroadcastTo(t21 => t21.SendToTarget(new UpdateTarget(itemStore)),
                                                              t22 => t22.SendToTarget(infinityPipe))))
                           .Build();

            dataflow.Start();

            var items = itemStore.Load();

            foreach (var item in items)
            {
                infinityPipe.SendAsync(item).Wait();
            }

            Task.Delay(10000).Wait();
        }
コード例 #6
0
        public void WhenSendBatchPipeShouldReturnItemToAwaiterOnlyWhenAllItemsInBatchWillBeAdded()
        {
            string receivedItem        = null;
            int    itemsContainerCount = -1;

            var blockingPipe = new InfinityPipe <string>(_itemsContainer);
            var t1           = blockingPipe.ReceiveAsync();

            t1.ContinueWith(o =>
            {
                receivedItem        = o.Result;
                itemsContainerCount = _queue.Count;
            }, TaskContinuationOptions.ExecuteSynchronously);

            blockingPipe.SendAsync(new[] { "1", "2" }).Wait();

            Assert.AreEqual("1", receivedItem);
            Assert.AreEqual(1, itemsContainerCount);
        }