public async Task AwaitAlreadyEnqueuedDataTest()
        {
            ISequencerUC sequencer =
                SequencerUC
                .Construct()
                .Register(AwaitAlreadyEnqueuedDataEnum.Enqueue2ItemsBegin, new StrategyOneOnOneUC())
                .Register(AwaitAlreadyEnqueuedDataEnum.Enqueue2ItemsEnd, new StrategyOneOnOneUC())
                .Register(AwaitAlreadyEnqueuedDataEnum.EnqueuedItemsAsyncBegin, new StrategyOneOnOneUC())
                .Register(AwaitAlreadyEnqueuedDataEnum.EnqueuedItemsAsyncEnd, new StrategyOneOnOneUC())
            ;

            const int throttle = 3;

            IConcurrentQueueNotifier <string> notifier = new ConcurrentQueueNotifier <string>(throttle);

            sequencer.Run(() => Insert2Items(sequencer, notifier));
            sequencer.Run(() => AwaitEnqueuedData(sequencer, notifier));

            await sequencer.TestPointCompleteAsync(AwaitAlreadyEnqueuedDataEnum.Enqueue2ItemsBegin);          //enqueue data

            await sequencer.TestPointCompleteAsync(AwaitAlreadyEnqueuedDataEnum.Enqueue2ItemsEnd);            //enqueue completed

            Assert.AreEqual(2, notifier.Count());

            await sequencer.TestPointCompleteAsync(AwaitAlreadyEnqueuedDataEnum.EnqueuedItemsAsyncBegin);          //begin awaiting enqueued data

            await sequencer.TestPointCompleteAsync(AwaitAlreadyEnqueuedDataEnum.EnqueuedItemsAsyncEnd);            //enqueued data should be detected

            await sequencer.WhenAll();

            sequencer.TryReThrowException();
        }
        public async Task Insert3ItemsThrottleTest()
        {
            ISequencerUC sequencer =
                SequencerUC
                .Construct()
                .Register(Insert3ItemsThrottleTestEnum.Enqueue3Items_Begin, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.Enqueue3Items_A, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.Enqueue3Items_B, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.Enqueue3Items_C_Throttle, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.Enqueue3Items_End, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncBegin, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncDataItem, new StrategyOneOnOneUC())
                .Register(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncEnd, new StrategyOneOnOneUC())
            ;

            const int throttle = 3;

            IConcurrentQueueNotifier <string> notifier = new ConcurrentQueueNotifier <string>(throttle);

            sequencer.Run(() => Insert3ItemsThrottle(sequencer, notifier));
            sequencer.Run(() => AwaitDequeue3(sequencer, notifier));

            IProductionPointUC prodPoint;


            await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.Enqueue3Items_Begin);

            await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.Enqueue3Items_A);

            await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.Enqueue3Items_B);

            prodPoint = await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.Enqueue3Items_C_Throttle);

            Assert.IsFalse((prodPoint?.ProductionArg as Task)?.IsCompleted);
            Assert.AreEqual(3, notifier.Count());

            await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncBegin);

            prodPoint = await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncDataItem);

            Assert.AreEqual("A", prodPoint?.ProductionArg as string);

            //throttling should be deactivated, resuming
            await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.Enqueue3Items_End);

            prodPoint = await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncDataItem);

            Assert.AreEqual("B", prodPoint?.ProductionArg as string);

            prodPoint = await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncDataItem);

            Assert.AreEqual("C", prodPoint?.ProductionArg as string);

            await sequencer.TestPointCompleteAsync(Insert3ItemsThrottleTestEnum.EnqueuedItemsAsyncEnd);

            await sequencer.WhenAll();

            sequencer.TryReThrowException();
        }
Beispiel #3
0
        public async Task AwaitAheadOfDataTest()
        {
            ISequencerUC sequencer =
                SequencerUC
                .Construct()
                .Register(AwaitAheadOfDataEnum.Enqueue2ItemsBegin, new StrategyOneOnOneUC())
                .Register(AwaitAheadOfDataEnum.Enqueue2ItemsA, new StrategyOneOnOneUC())
                .Register(AwaitAheadOfDataEnum.Enqueue2ItemsEnd, new StrategyOneOnOneUC())
                .Register(AwaitAheadOfDataEnum.EnqueuedItemsAsyncBegin, new StrategyOneOnOneUC())
                .Register(AwaitAheadOfDataEnum.EnqueuedItemsAsyncAwaiting, new StrategyOneOnOneUC())
                .Register(AwaitAheadOfDataEnum.EnqueuedItemsAsyncEnd, new StrategyOneOnOneUC())
            ;

            const int throttle = 3;

            IConcurrentQueueNotifier <string> notifier = new ConcurrentQueueNotifier <string>(throttle);

            sequencer.Run(() => Enque2Items(sequencer, notifier));
            sequencer.Run(() => AwaitAhedOfData(sequencer, notifier));

            await sequencer.TestPointCompleteAsync(AwaitAheadOfDataEnum.EnqueuedItemsAsyncBegin);

            IProductionPointUC point = await sequencer.TestPointCompleteAsync(AwaitAheadOfDataEnum.EnqueuedItemsAsyncAwaiting);

            Task t = point.ProductionArg as Task;

            Assert.IsFalse(t?.IsCompleted);

            await sequencer.TestPointCompleteAsync(AwaitAheadOfDataEnum.Enqueue2ItemsBegin);

            await sequencer.TestPointCompleteAsync(AwaitAheadOfDataEnum.Enqueue2ItemsA);

            await sequencer.TestPointCompleteAsync(AwaitAheadOfDataEnum.EnqueuedItemsAsyncEnd);

            await sequencer.TestPointCompleteAsync(AwaitAheadOfDataEnum.Enqueue2ItemsEnd);

            Assert.AreEqual(1, notifier.Count());

            await sequencer.WhenAll();

            sequencer.TryReThrowException();
        }