public function groupByUntilInnerEleThrow()
{
$error = new \Exception();
$eleInvoked = 0;
$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(&$outer, $xs, &$eleInvoked, $error) {
$outer = $xs->groupByUntil(function ($x) {
return trim(strtolower($x));
}, function ($x) use(&$eleInvoked, $error) {
$eleInvoked++;
if ($eleInvoked === 6) {
throw $error;
}
return strrev($x);
}, function ($g) {
return $g->skip(2);
});
});
$this->scheduler->scheduleAbsolute(TestScheduler::SUBSCRIBED, function () use(&$outerSubscription, &$outer, &$inners, &$results) {
$outerSubscription = $outer->subscribeCallback(function (GroupedObservable $group) use(&$inners, &$results, &$innerSubscriptions) {
$result = $this->scheduler->createObserver();
$inners[$group->getKey()] = $group;
$results[$group->getKey()] = $result;
$innerSubscriptions[$group->getKey()] = $group->subscribe($result);
}, function () {
});
});
$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(270, ' Rab'), onError(360, $error)], $results['bar']->getMessages());
$this->assertMessages([onNext(350, ' zaB '), onError(360, $error)], $results['baz']->getMessages());
$this->assertMessages([onError(360, $error)], $results['qux']->getMessages());
$this->assertMessages([onNext(220, 'oof '), onNext(240, ' OoF '), onNext(310, ' Oof'), onCompleted(310)], $results['foo']->getMessages());
$this->assertSubscriptions([subscribe(200, 360)], $xs->getSubscriptions());
}