/** * @test */ public function range_five() { $results = $this->scheduler->startWithCreate(function () { return Observable::range(10, 5, $this->scheduler); }); $this->assertMessages([onNext(201, 10), onNext(202, 11), onNext(203, 12), onNext(204, 13), onNext(205, 14), onCompleted(206)], $results->getMessages()); }
/** * @test */ public function timer_one_shot_relative_time_negative() { $results = $this->scheduler->startWithCreate(function () { return new TimerObservable(-1, $this->scheduler); }); $this->assertMessages([onNext(201, 0), onCompleted(201)], $results->getMessages()); }
/** * @test */ public function fromArray_one() { $xs = Observable::fromArray([1]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs; }); $this->assertMessages([onNext(201, 1), onCompleted(202)], $results->getMessages()); }
/** * @test */ public function switchLatest_Dispose() { $xs = $this->createHotObservable([onNext(300, $this->createColdObservable([onNext(10, 101), onNext(20, 102), onNext(110, 103), onNext(120, 104), onNext(210, 105), onNext(220, 106), onCompleted(230)])), onNext(400, $this->createColdObservable([onNext(10, 201), onNext(20, 202), onNext(30, 203), onNext(40, 204), onCompleted(50)])), onNext(500, $this->createColdObservable([onNext(10, 301), onNext(20, 302), onNext(30, 303), onNext(40, 304), onCompleted(150)])), onCompleted(600)]); $results = $this->scheduler->startWithDispose(function () use($xs) { return $xs->switchLatest(); }, 500); $this->assertMessages([onNext(310, 101), onNext(320, 102), onNext(410, 201), onNext(420, 202), onNext(430, 203), onNext(440, 204)], $results->getMessages()); }
/** * Adapted from RxJS * * @test */ public function sum_number_some() { $xs = $this->createHotObservable([onNext(150, 1), onNext(210, 2), onNext(220, 3), onNext(230, 4), onCompleted(250)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->sum(); }); $this->assertMessages([onNext(250, 2 + 3 + 4), onCompleted(250)], $results->getMessages()); }
/** * @test */ public function startWith_multiple_before() { $xs = $this->createHotObservable([onNext(150, 1), onNext(202, 4), onCompleted(250)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->startWithArray([1, 2, 3]); }); $this->assertMessages([onNext(201, 1), onNext(202, 2), onNext(203, 3), onCompleted(250)], $results->getMessages()); }
/** * @test */ public function timestamp_dispose() { $xs = $this->createHotObservable([onNext(150, 1), onNext(210, 2), onNext(230, 3), onNext(260, 4), onNext(300, 5), onNext(350, 6), onCompleted(400)]); $results = $this->scheduler->startWithDispose(function () use($xs) { return $xs->timestamp($this->scheduler); }, 275); $this->assertMessages([onNext(210, new Timestamped(210, 2)), onNext(230, new Timestamped(230, 3)), onNext(260, new Timestamped(260, 4))], $results->getMessages()); }
public function testToArrayCompleted() { $xs = $this->createHotObservable([onNext(110, 1), onNext(220, 2), onNext(330, 3), onNext(440, 4), onNext(550, 5), onCompleted(660)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->toArray(); }); $this->assertMessages([onNext(660, [2, 3, 4, 5]), onCompleted(660)], $results->getMessages()); }
/** * @test */ public function it_passes_on_completed_from_sources() { $ys = $this->createHotObservable(array(onCompleted(250))); $results = $this->scheduler->startWithCreate(function () use($ys) { return Observable::mergeAll($ys); }); $this->assertMessages(array(onCompleted(250)), $results->getMessages()); $this->assertSubscriptions(array(subscribe(200, 250)), $ys->getSubscriptions()); }
/** * @test */ public function it_calls_relative_to_subscribe_time() { $xs = $this->createColdObservable(array(onNext(50, "foo"), onNext(75, "Bar"), onCompleted(105))); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs; }); $this->assertCount(3, $results->getMessages()); $this->assertMessages(array(onNext(250, "foo"), onNext(275, "Bar"), onCompleted(305)), $results->getMessages()); }
/** * @test */ public function generator_yields_one() { $generator = $this->genOne(); $xs = new \Rx\Observable\IteratorObservable($generator); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs; }); $this->assertMessages([onNext(201, 1), onCompleted(202)], $results->getMessages()); }
public function testSkipLastThreeCompleted() { $xs = $this->createHotObservable([onNext(180, 1), onNext(210, 2), onNext(250, 3), onNext(270, 4), onNext(310, 5), onNext(360, 6), onNext(380, 7), onNext(410, 8), onNext(590, 9), onCompleted(650)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->skipLast(3); }); $this->assertMessages([onNext(310, 2), onNext(360, 3), onNext(380, 4), onNext(410, 5), onNext(590, 6), onCompleted(650)], $results->getMessages()); $this->assertSubscriptions([subscribe(200, 650)], $xs->getSubscriptions()); }
/** * @test */ public function delay_empty() { $xs = $this->createHotObservable([onNext(150, 1), onCompleted(550)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->delay(10, $this->scheduler); }); $this->assertMessages([onCompleted(560)], $results->getMessages()); $this->assertSubscriptions([subscribe(200, 550)], $xs->getSubscriptions()); }
/** * @test */ public function take_zero_calls_on_completed() { $scheduler = $this->createTestScheduler(); $xs = $this->createHotObservable(array(onNext(300, 21), onNext(500, 42), onNext(800, 84), onCompleted(820))); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->take(0); }); $this->assertMessages(array(onCompleted(201)), $results->getMessages()); }
/** * @test */ public function pluck_array_numeric_index() { $xs = $this->createHotObservable([onNext(180, [-1, -1, -1, -1]), onNext(210, [4, 3, 2, 1]), onNext(240, [4, 3, 20, 10]), onNext(290, [4, 3, 200, 100]), onNext(350, [4, 3, 2000, 1000]), onCompleted(400)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->pluck(2); }); $this->assertMessages([onNext(210, 2), onNext(240, 20), onNext(290, 200), onNext(350, 2000), onCompleted(400)], $results->getMessages()); $this->assertSubscriptions([subscribe(200, 400)], $xs->getSubscriptions()); }
/** * @test */ public function start_action_number() { $results = $this->scheduler->startWithCreate(function () { return Observable::start(function () { return 1; }, $this->scheduler); }); $this->assertMessages([onNext(200, 1), onCompleted(200)], $results->getMessages()); }
/** * @test */ public function it_skips_multiple_values() { $scheduler = $this->createTestScheduler(); $xs = $this->createHotObservable(array(onNext(300, 21), onNext(500, 42), onNext(800, 84), onNext(850, 168), onCompleted(870))); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->skip(2); }); $this->assertMessages(array(onNext(800, 84), onNext(850, 168), onCompleted(870)), $results->getMessages()); }
/** * @test */ public function it_calls_on_complete_when_the_array_is_empte() { $xs = BaseObservable::fromArray(array(), $this->scheduler); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs; }); $this->assertCount(1, $results->getMessages()); $this->assertMessages(array(onCompleted(201)), $results->getMessages()); }
/** * @test */ public function from_promise_success() { $source = PromiseFactory::toObservable(function () { return Promise::resolved(42); }); $results = $this->scheduler->startWithCreate(function () use($source) { return $source; }); $this->assertMessages(array(onNext(200, 42), onCompleted(200)), $results->getMessages()); }
/** * @test */ public function concatAll_timer_missing_item() { $xs = $this->createHotObservable([onNext(201, 0), onNext(206, 1), onNext(211, 2), onCompleted(212)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->map(function ($x) { return Observable::timer(5)->mapTo($x); })->concatAll(); }); $this->assertMessages([onNext(206, 0), onNext(211, 1), onNext(216, 2), onCompleted(216)], $results->getMessages()); }
/** * @test */ public function throttle_error() { $error = new \Exception(); $xs = $this->createHotObservable([onNext(150, 1), onNext(210, 2), onNext(250, 3), onNext(310, 4), onNext(350, 5), onError(410, $error), onNext(450, 7), onCompleted(500)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->throttle(200); }); $this->assertMessages([onNext(210, 2), onError(410, $error)], $results->getMessages()); $this->assertSubscriptions([subscribe(200, 410)], $xs->getSubscriptions()); }
/** * @test */ public function select_calls_selector() { $xs = $this->createHotObservable(array(onNext(100, 2), onNext(300, 21), onNext(500, 42), onNext(800, 84), onCompleted(820))); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->select(function ($elem) { return $elem * 2; }); }); $this->assertMessages(array(onNext(300, 42), onNext(500, 84), onNext(800, 168), onCompleted(820)), $results->getMessages()); }
/** * @test */ public function doOnNext_should_call_after_resubscription() { $xs = $this->createColdObservable([onNext(10, 1), onCompleted(20)]); $messages = []; $xs->doOnNext(function ($x) use(&$messages) { $messages[] = onNext($this->scheduler->getClock(), $x); })->repeat(2)->subscribeCallback(null, null, null, $this->scheduler); $this->scheduler->start(); $this->assertMessages([onNext(10, 1), onNext(30, 1)], $messages); }
/** * @test */ public function doOnError_should_call_after_resubscription() { $xs = $this->createColdObservable([onError(10, new \Exception("Hello")), onCompleted(20)]); $messages = []; $xs->doOnError(function ($x) use(&$messages) { $messages[] = onError($this->scheduler->getClock(), $x); })->retry(2)->subscribeCallback(null, function () { }, null, $this->scheduler); $this->scheduler->start(); $this->assertMessages([onError(10, new \Exception("Hello")), onError(20, new \Exception("Hello"))], $messages); }
/** * @test */ public function it_passes_the_last_on_complete() { $xs = $this->createColdObservable(array(onNext(100, 4), onNext(200, 2), onNext(300, 3), onNext(400, 1), onCompleted(500))); $ys = $this->createColdObservable(array(onNext(50, 'foo'), onNext(100, 'bar'), onNext(150, 'baz'), onNext(200, 'qux'), onCompleted(250))); $results = $this->scheduler->startWithCreate(function () use($xs, $ys) { return $xs->merge($ys); }); $this->assertMessages(array(onNext(250, 'foo'), onNext(300, 4), onNext(300, 'bar'), onNext(350, 'baz'), onNext(400, 2), onNext(400, 'qux'), onNext(500, 3), onNext(600, 1), onCompleted(700)), $results->getMessages()); $this->assertSubscriptions(array(subscribe(200, 700)), $xs->getSubscriptions()); $this->assertSubscriptions(array(subscribe(200, 450)), $ys->getSubscriptions()); }
/** * @test */ public function doOnCompleted_should_be_called() { $xs = $this->createHotObservable([onNext(150, 1), onNext(210, 2), onNext(220, 3), onCompleted(250)]); $called = 0; $this->scheduler->startWithCreate(function () use($xs, &$called) { return $xs->doOnCompleted(function () use(&$called) { $called++; }); }); $this->assertEquals(1, $called); }
/** * @test */ public function flatMapTo_it_passes_on_error() { $xs = $this->createColdObservable(array(onNext(100, 4), onNext(200, 2), onNext(300, 3), onNext(400, 1), onCompleted(510))); $ys = $this->createColdObservable(array(onNext(50, 'foo'), onNext(100, 'bar'), onNext(150, 'baz'), onError(210, new Exception()), onCompleted(250))); $results = $this->scheduler->startWithCreate(function () use($xs, $ys) { return $xs->flatMapTo($ys); }); $this->assertMessages(array(onNext(350, "foo"), onNext(400, "bar"), onNext(450, "baz"), onNext(450, "foo"), onNext(500, "bar"), onError(510, new Exception())), $results->getMessages()); $this->assertSubscriptions(array(subscribe(200, 510)), $xs->getSubscriptions()); $this->assertSubscriptions(array(subscribe(300, 510), subscribe(400, 510), subscribe(500, 510)), $ys->getSubscriptions()); }
/** * @test */ public function defaultIfEmpty_empty_2() { $xs = $this->createHotObservable([onCompleted(420)]); $results = $this->scheduler->startWithCreate(function () use($xs) { return $xs->defaultIfEmpty(new ReturnObservable(-1)); }); // Note: these tests differ from the RxJS tests that they were based on because RxJS was // explicitly using the immediate scheduler on subscribe internally. When we pass the // proper scheduler in, the subscription gets scheduled which requires an extra tick. $this->assertMessages([onNext(421, -1), onCompleted(421)], $results->getMessages()); $this->assertSubscriptions([subscribe(200, 420)], $xs->getSubscriptions()); }
/** * @test */ public function connectable_observable_multiple_non_overlapped_connections() { $xs = $this->createHotObservable([onNext(210, 1), onNext(220, 2), onNext(230, 3), onNext(240, 4), onNext(250, 5), onNext(260, 6), onNext(270, 7), onNext(280, 8), onNext(290, 9), onCompleted(300)]); $subject = new TestSubject(); $conn = $xs->multicast($subject); $c1 = null; $this->scheduler->scheduleAbsolute(225, function () use(&$c1, $conn) { $c1 = $conn->connect(); }); $this->scheduler->scheduleAbsolute(241, function () use(&$c1) { $c1->dispose(); }); $this->scheduler->scheduleAbsolute(245, function () use(&$c1) { $c1->dispose(); }); // idempotency test $this->scheduler->scheduleAbsolute(251, function () use(&$c1) { $c1->dispose(); }); // idempotency test $this->scheduler->scheduleAbsolute(260, function () use(&$c1) { $c1->dispose(); }); // idempotency test $c2 = null; $this->scheduler->scheduleAbsolute(249, function () use(&$c2, $conn) { $c2 = $conn->connect(); }); $this->scheduler->scheduleAbsolute(255, function () use(&$c2) { $c2->dispose(); }); $this->scheduler->scheduleAbsolute(265, function () use(&$c2) { $c2->dispose(); }); // idempotency test $this->scheduler->scheduleAbsolute(280, function () use(&$c2) { $c2->dispose(); }); // idempotency test $c3 = null; $this->scheduler->scheduleAbsolute(275, function () use(&$c3, $conn) { $c3 = $conn->connect(); }); $this->scheduler->scheduleAbsolute(295, function () use(&$c3) { $c3->dispose(); }); $results = $this->scheduler->startWithCreate(function () use($xs, $conn) { return $conn; }); $this->assertMessages([onNext(230, 3), onNext(240, 4), onNext(250, 5), onNext(280, 8), onNext(290, 9)], $results->getMessages()); $this->assertSubscriptions([subscribe(225, 241), subscribe(249, 255), subscribe(275, 295)], $xs->getSubscriptions()); }
/** * @test */ public function create_completed() { $results = $this->scheduler->startWithCreate(function () { return Observable::create(function (ObserverInterface $o) { $o->onCompleted(); $o->onNext(100); $o->onError(new \Exception()); $o->onCompleted(); return new EmptyDisposable(); }); }); $this->assertMessages([onCompleted(200)], $results->getMessages()); }