Example #1
0
        public async Task SplitJoin_CorrectlyBuild()
        {
            // arrange
            var process = new ConcurrentBag <string> ();

            var split_block = DataflowSplitJoin.CreateSplitBlockAsync <string, char> (async s =>
            {
                await Task.Yield();
                process.Add(s);
                return(s.ToCharArray());
            });

            var join_block = DataflowSplitJoin.CreateFinalJoinBlock <string, char> ();

            split_block.LinkWithCompletionPropagation(join_block);


            // act
            foreach (var str in new[] { "a", "bb", "ccc" })
            {
                await split_block.SendAsync(str);
            }

            split_block.Complete();
            await Task.WhenAll(split_block.Completion, join_block.Completion);


            // assert
            process.Should().BeEquivalentTo("a", "bb", "ccc");
        }
Example #2
0
        public async Task SplitJoin_SplitReturnsNull_DoesNotThrow()
        {
            // arrange
            var exceptions = new ConcurrentBag <Exception> ();

            var split_block = DataflowSplitJoin.CreateSplitBlockAsync <string, char>
                                  (async s =>
            {
                await Task.Yield();
                return(null);
            },
                                  defaultExceptionLogger: (ex, obj) => exceptions.Add(ex));

            var join_block = DataflowSplitJoin.CreateFinalJoinBlock <string, char> ();

            split_block.LinkWithCompletionPropagation(join_block);


            // act
            await split_block.SendAsync("abc");

            split_block.Complete();
            await Task.WhenAll(split_block.Completion, join_block.Completion);


            // assert
            exceptions.Should().BeEmpty();
        }
Example #3
0
        public async Task SplitProcessJoin_CorrectlyBuild()
        {
            // arrange
            var process = new ConcurrentBag <char> ();

            var split_block   = DataflowSplitJoin.CreateSplitBlock <string, char> (s => s.ToCharArray());
            var process_block = DataflowSplitJoin.CreateProcessBlock <string, char> ((s, c) => process.Add(c));
            var join_block    = DataflowSplitJoin.CreateFinalJoinBlock <string, char> ();

            split_block.LinkWithCompletionPropagation(process_block);
            process_block.LinkWithCompletionPropagation(join_block);


            // act
            foreach (var str in new[] { "a", "bb", "ccc" })
            {
                await split_block.SendAsync(str);
            }

            split_block.Complete();
            await Task.WhenAll(split_block.Completion, join_block.Completion);


            // assert
            process.Should().BeEquivalentTo('a', 'b', 'b', 'c', 'c', 'c');
        }
Example #4
0
        /// <summary>
        ///     Creates a dataflow block from current configuration.
        /// </summary>
        protected override ITargetBlock <SplitJoinItem <TParent, TItem> > CreateBlock()
        {
            ITargetBlock <SplitJoinItem <TParent, TItem> > block;

            if (this.processAsync != null)
            {
                block = DataflowSplitJoin.CreateFinalJoinBlockAsync(this.processAsync, this.DefaultExceptionLogger);
            }
            else if (this.processSync != null)
            {
                block = DataflowSplitJoin.CreateFinalJoinBlock(this.processSync, this.DefaultExceptionLogger);
            }
            else
            {
                block = DataflowSplitJoin.CreateFinalJoinBlock <TParent, TItem> ();
            }

            return(block);
        }