public void A_GroupedWithin_must_group_elements_within_the_duration()
{
this.AssertAllStagesStopped(() =>
{
var input = new Iterator<int>(Enumerable.Range(1, 10000));
var p = TestPublisher.CreateManualProbe<int>(this);
var c = TestSubscriber.CreateManualProbe<IEnumerable<int>>(this);
Source.FromPublisher(p)
.GroupedWithin(1000, TimeSpan.FromSeconds(1))
.To(Sink.FromSubscriber(c))
.Run(Materializer);
var pSub = p.ExpectSubscription();
var cSub = c.ExpectSubscription();
cSub.Request(100);
var demand1 = (int)pSub.ExpectRequest();
for (var i = 1; i <= demand1; i++)
pSub.SendNext(input.Next());
var demand2 = (int)pSub.ExpectRequest();
for (var i = 1; i <= demand2; i++)
pSub.SendNext(input.Next());
var demand3 = (int)pSub.ExpectRequest();
c.ExpectNext().ShouldAllBeEquivalentTo(Enumerable.Range(1, demand1 + demand2));
for (var i = 1; i <= demand3; i++)
pSub.SendNext(input.Next());
c.ExpectNoMsg(TimeSpan.FromMilliseconds(300));
c.ExpectNext()
.ShouldAllBeEquivalentTo(Enumerable.Range(demand1 + demand2 + 1, demand3));
c.ExpectNoMsg(TimeSpan.FromMilliseconds(300));
pSub.ExpectRequest();
var last = input.Next();
pSub.SendNext(last);
pSub.SendComplete();
c.ExpectNext().Should().HaveCount(1).And.HaveElementAt(0, last);
c.ExpectComplete();
c.ExpectNoMsg(TimeSpan.FromMilliseconds(200));
}, Materializer);
}