Akka.Streams.Tests.Dsl.GraphPartialSpec.FlowFlowGraph_Partial_must_be_able_to_build_and_reuse_complex_materializing_partial_graphs C# (CSharp) Метод

FlowFlowGraph_Partial_must_be_able_to_build_and_reuse_complex_materializing_partial_graphs() приватный Метод

        public void FlowFlowGraph_Partial_must_be_able_to_build_and_reuse_complex_materializing_partial_graphs()
        {
            var summer = Sink.Aggregate<int, int>(0, (i, i1) => i + i1);

            var doubler = GraphDsl.Create(summer, summer, Tuple.Create, (b, s1,s2) =>
            {
                var broadcast = b.Add(new Broadcast<int>(3));
                var broadcast2 = b.Add(new Broadcast<int>(2));
                var zip = b.Add(ZipWith.Apply((int i, int i1) => i + i1));

                b.From(broadcast.Out(0)).To(zip.In0);
                b.From(broadcast.Out(1)).To(zip.In1);
                b.From(broadcast.Out(2)).To(s1.Inlet);

                b.From(zip.Out).To(broadcast2.In);
                b.From(broadcast2.Out(0)).To(s2.Inlet);

                return new FlowShape<int, int>(broadcast.In, broadcast2.Out(1));
            });

            var t =
                RunnableGraph.FromGraph(GraphDsl.Create(doubler, doubler, Sink.First<IEnumerable<int>>(), Tuple.Create,
                    (b, d1, d2, sink) =>
                    {
                        var source =
                            Source.From(Enumerable.Range(1, 3))
                                .MapMaterializedValue<Tuple<Tuple<Task<int>, Task<int>>, Tuple<Task<int>, Task<int>>, Task<IEnumerable<int>>>>(_ => null);

                        b.From(source).To(d1.Inlet);
                        b.From(d1.Outlet).To(d2.Inlet);
                        b.From(d2.Outlet).Via(Flow.Create<int>().Grouped(100)).To(sink.Inlet);

                        return ClosedShape.Instance;
                    })).Run(Materializer);

            var task = Task.WhenAll(t.Item1.Item1, t.Item1.Item2, t.Item2.Item1, t.Item2.Item2);
            task.Wait(TimeSpan.FromSeconds(3)).Should().BeTrue();
            task.Result.ShouldAllBeEquivalentTo(new[] {6, 12, 12, 24});
            t.Item3.Wait(TimeSpan.FromSeconds(3)).Should().BeTrue();
            t.Item3.Result.ShouldAllBeEquivalentTo(new [] {4, 8, 12});
        }