public function groupByUntilInnerMultipleIndependence()
{
$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())]);
$results = [];
$inners = [];
$innerSubscriptions = [];
$outer = null;
$outerSubscription = null;
$outerResults = $this->scheduler->createObserver();
$this->scheduler->scheduleAbsolute(TestScheduler::CREATED, function () use(&$outer, $xs) {
$outer = $xs->groupByUntil(function ($x) {
return trim(strtolower($x));
}, function ($x) {
return strrev($x);
}, function ($g) {
return $g->skip(2);
});
});
$this->scheduler->scheduleAbsolute(TestScheduler::SUBSCRIBED, function () use($outerResults, &$outerSubscription, &$inners, &$results, &$innerSubscriptions, &$outer) {
$outerSubscription = $outer->subscribeCallback(function (GroupedObservable $group) use($outerResults, &$inners, &$results, &$innerSubscriptions) {
$outerResults->onNext($group->getKey());
$result = $this->scheduler->createObserver();
$inners[$group->getKey()] = $group;
$results[$group->getKey()] = $result;
$innerSubscriptions[$group->getKey()] = $group->subscribe($result);
}, function ($e) use($outerResults) {
$outerResults->onError($e);
}, function () use($outerResults) {
$outerResults->onCompleted();
});
});
$this->scheduler->scheduleAbsolute(TestScheduler::DISPOSED, function () use(&$outerSubscription, &$innerSubscriptions) {
$outerSubscription->dispose();
foreach ($innerSubscriptions as $innerSubscription) {
$innerSubscription->dispose();
}
});
$this->scheduler->scheduleAbsolute(320, function () use(&$innerSubscriptions) {
$innerSubscriptions['foo']->dispose();
});
$this->scheduler->scheduleAbsolute(280, function () use(&$innerSubscriptions) {
$innerSubscriptions['bar']->dispose();
});
$this->scheduler->scheduleAbsolute(355, function () use(&$innerSubscriptions) {
$innerSubscriptions['baz']->dispose();
});
$this->scheduler->scheduleAbsolute(400, function () use(&$innerSubscriptions) {
$innerSubscriptions['qux']->dispose();
});
$this->scheduler->start();
$this->assertEquals(4, count($inners));
$this->assertMessages([onNext(270, ' Rab')], $results['bar']->getMessages());
$this->assertMessages([onNext(350, ' zaB ')], $results['baz']->getMessages());
$this->assertMessages([onNext(360, ' xuq ')], $results['qux']->getMessages());
$this->assertMessages([onNext(470, ' OOF'), onNext(530, ' oOf '), onCompleted(570)], $results['foo']->getMessages());
$this->assertSubscriptions([subscribe(200, 570)], $xs->getSubscriptions());
}