public function groupByUntilInnerComplete()
{
$xs = $this->createHotObservable([onNext(90, new \Exception()), onNext(110, new \Exception()), onNext(130, new \Exception()), onNext(220, ' foo'), onNext(240, ' FoO '), onNext(270, 'baR '), onNext(310, 'foO '), onNext(350, ' Baz '), onNext(360, ' qux '), onNext(390, ' bar'), onNext(420, ' BAR '), onNext(470, 'FOO '), onNext(480, 'baz '), onNext(510, ' bAZ '), onNext(530, ' fOo '), onCompleted(570), onNext(580, new \Exception()), onCompleted(600), onError(650, new \Exception())]);
$inners = [];
$innerSubscriptions = [];
$results = [];
$outer = null;
$outerSubscription = null;
$this->scheduler->scheduleAbsolute(TestScheduler::CREATED, function () use($xs, &$outer) {
$outer = $xs->groupByUntil(function ($x) {
return trim(strtolower($x));
}, function ($x) {
return strrev($x);
}, function (Observable $g) {
return $g->skip(2);
});
});
$this->scheduler->scheduleAbsolute(TestScheduler::SUBSCRIBED, function () use(&$outer, &$outerSubscription, &$inners, &$results, &$innerSubscriptions) {
$outerSubscription = $outer->subscribeCallback(function (GroupedObservable $group) use(&$inners, &$results) {
$result = $this->scheduler->createObserver();
$inners[$group->getKey()] = $group;
$results[$group->getKey()] = $result;
$this->scheduler->scheduleRelativeWithState(null, 100, function () use($group, $result) {
$innerSubscriptions[$group->getKey()] = $group->subscribe($result);
});
});
});
$this->scheduler->scheduleAbsolute(TestScheduler::DISPOSED, function () use(&$outerSubscription, &$innerSubscriptions) {
$outerSubscription->dispose();
foreach ($innerSubscriptions as $innerSubscription) {
$innerSubscription->dispose();
}
});
$this->scheduler->start();
$this->assertEquals(4, count($inners));
$this->assertMessages([onNext(390, 'rab '), onCompleted(420)], $results['bar']->getMessages());
$this->assertMessages([onNext(480, ' zab'), onCompleted(510)], $results['baz']->getMessages());
$this->assertMessages([onCompleted(570)], $results['qux']->getMessages());
$this->assertMessages([onCompleted(570)], $results['foo']->getMessages());
$this->assertSubscriptions([subscribe(200, 570)], $xs->getSubscriptions());
}