Skip to content

Commit c76f3bc

Browse files
committed
Add functional tests for select
1 parent 20c0eac commit c76f3bc

File tree

7 files changed

+134
-26
lines changed

7 files changed

+134
-26
lines changed

lib/Rx/Observable/EmptyObservable.php

+5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
namespace Rx\Observable;
44

5+
use Rx\Disposable\EmptyDisposable;
6+
57
class EmptyObservable extends BaseObservable
68
{
79
protected function doStart($scheduler)
@@ -13,5 +15,8 @@ protected function doStart($scheduler)
1315
$observer->onCompleted();
1416
}
1517
});
18+
19+
//todo: add "real" disposable
20+
return new EmptyDisposable();
1621
}
1722
}

lib/Rx/Observable/ThrowObservable.php

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Rx\Observable;
44

55
use Exception;
6+
use Rx\Disposable\EmptyDisposable;
67

78
class ThrowObservable extends BaseObservable
89
{
@@ -24,5 +25,8 @@ protected function doStart($scheduler)
2425
$observer->onError($exception);
2526
}
2627
});
28+
29+
// todo: real disposable
30+
return new EmptyDisposable();
2731
}
2832
}

test/Rx/Functional/FunctionalTestCase.php

+5-16
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,11 @@
66
use Rx\Scheduler\VirtualTimeScheduler;
77
use Rx\TestCase;
88
use Rx\Testing\HotObservable;
9-
use Rx\Testing\Recorded;
109
use Rx\Testing\Subscription;
11-
use Rx\Notification\OnCompletedNotification;
12-
use Rx\Notification\OnErrorNotification;
13-
use Rx\Notification\OnNextNotification;
10+
use Rx\Testing\TestScheduler;
1411

1512
abstract class FunctionalTestCase extends TestCase
1613
{
17-
1814
public function assertMessages(array $expected, array $recorded)
1915
{
2016
if (count($expected) !== count($recorded)) {
@@ -50,16 +46,9 @@ public function assertSubscription(HotObservable $observable, Subscription $expe
5046

5147
$this->assertTrue(true); // success
5248
}
53-
}
54-
55-
function onError($dueTime, $error) {
56-
return new Recorded($dueTime, new OnErrorNotification($error));
57-
}
5849

59-
function onNext($dueTime, $value) {
60-
return new Recorded($dueTime, new OnNextNotification($value));
61-
}
62-
63-
function onCompleted($dueTime) {
64-
return new Recorded($dueTime, new OnCompletedNotification());
50+
protected function createTestScheduler()
51+
{
52+
return new TestScheduler();
53+
}
6554
}
+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
<?php
2+
3+
namespace Rx\Functional\Operator;
4+
5+
use Exception;
6+
use Rx\Functional\FunctionalTestCase;
7+
use Rx\Testing\HotObservable;
8+
use Rx\Testing\TestScheduler;
9+
use Rx\Observable\ReturnObservable;
10+
use Rx\Observable\EmptyObservable;
11+
use Rx\Observable\ThrowObservable;
12+
13+
class SelectTest extends FunctionalTestCase
14+
{
15+
/**
16+
* @test
17+
*/
18+
public function exception_thrown_in_callable_is_not_catched()
19+
{
20+
$observable = new ReturnObservable(1);
21+
22+
$called = false;
23+
$observable->select(function() { throw new Exception(); })
24+
->subscribeCallback(function() {}, function($ex) use (&$called) { $called = true; });
25+
26+
$this->assertTrue($called);
27+
}
28+
29+
/**
30+
* @test
31+
*/
32+
public function select_calls_on_completed()
33+
{
34+
$observable = new EmptyObservable();
35+
36+
$called = false;
37+
$observable->select('RxIdentity')
38+
->subscribeCallback(function() {}, function() {}, function() use (&$called) { $called = true; });
39+
40+
$this->assertTrue($called);
41+
}
42+
43+
/**
44+
* @test
45+
*/
46+
public function select_calls_on_error()
47+
{
48+
$observable = new ThrowObservable(new Exception);
49+
50+
$called = false;
51+
$observable->select('RxIdentity')
52+
->subscribeCallback(function() {}, function() use (&$called) { $called = true; });
53+
54+
$this->assertTrue($called);
55+
}
56+
57+
/**
58+
* @test
59+
* @expectedException InvalidArgumentException
60+
*/
61+
public function select_expects_a_callable()
62+
{
63+
$observable = new ReturnObservable(1);
64+
$observable->select(42);
65+
}
66+
67+
/**
68+
* @test
69+
*/
70+
public function select_calls_selector()
71+
{
72+
$scheduler = $this->createTestScheduler();
73+
$xs = new HotObservable($scheduler, array(
74+
onNext(100, 2),
75+
onNext(300, 21),
76+
onNext(500, 42),
77+
onNext(800, 84),
78+
onCompleted(820),
79+
));
80+
81+
$results = $scheduler->startWithCreate(function() use ($xs) {
82+
return $xs->select(function($elem) { return $elem * 2; });
83+
});
84+
85+
$this->assertMessages(array(
86+
onNext(300, 42),
87+
onNext(500, 84),
88+
onNext(800, 168),
89+
onCompleted(820),
90+
), $results->getMessages());
91+
92+
}
93+
}

test/Rx/Functional/WhereOperatorTest.php renamed to test/Rx/Functional/Operator/WhereTest.php

+3-10
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
<?php
22

3-
namespace Rx\Functional;
3+
namespace Rx\Functional\Operator;
44

55
use Exception;
6-
use Rx\TestCase;
6+
use Rx\Functional\FunctionalTestCase;
77
use Rx\Testing\HotObservable;
8-
use Rx\Testing\Recorded;
9-
use Rx\Testing\Subscription;
108
use Rx\Testing\TestScheduler;
119

12-
class WhereOperatorTest extends FunctionalTestCase
10+
class WhereTest extends FunctionalTestCase
1311
{
1412
/**
1513
* @test
@@ -83,9 +81,4 @@ protected function createHotObservableWithData($scheduler)
8381
onCompleted(820),
8482
));
8583
}
86-
87-
protected function createTestScheduler()
88-
{
89-
return new TestScheduler();
90-
}
9184
}

test/bootstrap.php

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
if (file_exists($file = __DIR__.'/../vendor/autoload.php')) {
1313
$loader = require_once $file;
1414
$loader->add('Rx', __DIR__);
15+
require_once __DIR__ . '/helper-functions.php';
1516
} else {
1617
throw new RuntimeException('Install dependencies to run test suite.');
1718
}
19+

test/helper-functions.php

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
use Rx\Testing\Recorded;
4+
use Rx\Notification\OnCompletedNotification;
5+
use Rx\Notification\OnErrorNotification;
6+
use Rx\Notification\OnNextNotification;
7+
8+
function onError($dueTime, $error) {
9+
return new Recorded($dueTime, new OnErrorNotification($error));
10+
}
11+
12+
function onNext($dueTime, $value) {
13+
return new Recorded($dueTime, new OnNextNotification($value));
14+
}
15+
16+
function onCompleted($dueTime) {
17+
return new Recorded($dueTime, new OnCompletedNotification());
18+
}
19+
20+
function RxIdentity($x) {
21+
return $x;
22+
}

0 commit comments

Comments
 (0)