public void A_Balance_must_balance_between_all_three_outputs()
{
this.AssertAllStagesStopped(() =>
{
const int numElementsForSink = 10000;
var outputs = Sink.Aggregate<int, int>(0, (sum, i) => sum + i);
var t = RunnableGraph.FromGraph(GraphDsl.Create(outputs, outputs, outputs, Tuple.Create,
(b, o1, o2, o3) =>
{
var balance = b.Add(new Balance<int>(3, true));
var source =
Source.Repeat(1)
.Take(numElementsForSink*3)
.MapMaterializedValue<Tuple<Task<int>, Task<int>, Task<int>>>(_ => null);
b.From(source).To(balance.In);
b.From(balance.Out(0)).To(o1);
b.From(balance.Out(1)).To(o2);
b.From(balance.Out(2)).To(o3);
return ClosedShape.Instance;
})).Run(Materializer);
var task = Task.WhenAll(t.Item1, t.Item2, t.Item3);
task.Wait(TimeSpan.FromSeconds(3)).Should().BeTrue();
task.Result.Should().NotContain(0);
task.Result.Sum().Should().Be(numElementsForSink*3);
}, Materializer);
}