4
4
5
5
use React ;
6
6
use React \EventLoop \Loop ;
7
+ use React \Promise \Deferred ;
7
8
use React \Promise \Promise ;
9
+ use function React \Async \async ;
8
10
9
11
class AwaitTest extends TestCase
10
12
{
@@ -22,6 +24,79 @@ public function testAwaitThrowsExceptionWhenPromiseIsRejectedWithException(calla
22
24
$ await ($ promise );
23
25
}
24
26
27
+ /**
28
+ * @dataProvider provideAwaiters
29
+ */
30
+ public function testAwaitThrowsExceptionWithoutRunningLoop (callable $ await )
31
+ {
32
+ $ now = true ;
33
+ Loop::futureTick (function () use (&$ now ) {
34
+ $ now = false ;
35
+ });
36
+
37
+ $ promise = new Promise (function () {
38
+ throw new \Exception ('test ' );
39
+ });
40
+
41
+ try {
42
+ $ await ($ promise );
43
+ } catch (\Exception $ e ) {
44
+ $ this ->assertTrue ($ now );
45
+ }
46
+ }
47
+
48
+ /**
49
+ * @dataProvider provideAwaiters
50
+ */
51
+ public function testAwaitThrowsExceptionImmediatelyWhenPromiseIsRejected (callable $ await )
52
+ {
53
+ $ deferred = new Deferred ();
54
+
55
+ $ ticks = 0 ;
56
+ Loop::futureTick (function () use (&$ ticks ) {
57
+ ++$ ticks ;
58
+ Loop::futureTick (function () use (&$ ticks ) {
59
+ ++$ ticks ;
60
+ });
61
+ });
62
+
63
+ Loop::futureTick (fn () => $ deferred ->reject (new \RuntimeException ()));
64
+
65
+ try {
66
+ $ await ($ deferred ->promise ());
67
+ } catch (\RuntimeException $ e ) {
68
+ $ this ->assertEquals (1 , $ ticks );
69
+ }
70
+ }
71
+
72
+ /**
73
+ * @dataProvider provideAwaiters
74
+ */
75
+ public function testAwaitAsyncThrowsExceptionImmediatelyWhenPromiseIsRejected (callable $ await )
76
+ {
77
+ $ deferred = new Deferred ();
78
+
79
+ $ ticks = 0 ;
80
+ Loop::futureTick (function () use (&$ ticks ) {
81
+ ++$ ticks ;
82
+ Loop::futureTick (function () use (&$ ticks ) {
83
+ ++$ ticks ;
84
+ });
85
+ });
86
+
87
+ Loop::futureTick (fn () => $ deferred ->reject (new \RuntimeException ()));
88
+
89
+ $ promise = async (function () use ($ deferred , $ await ) {
90
+ return $ await ($ deferred ->promise ());
91
+ })();
92
+
93
+ try {
94
+ $ await ($ promise );
95
+ } catch (\RuntimeException $ e ) {
96
+ $ this ->assertEquals (1 , $ ticks );
97
+ }
98
+ }
99
+
25
100
/**
26
101
* @dataProvider provideAwaiters
27
102
*/
@@ -91,6 +166,70 @@ public function testAwaitReturnsValueWhenPromiseIsFullfilled(callable $await)
91
166
$ this ->assertEquals (42 , $ await ($ promise ));
92
167
}
93
168
169
+ /**
170
+ * @dataProvider provideAwaiters
171
+ */
172
+ public function testAwaitReturnsValueImmediatelyWithoutRunningLoop (callable $ await )
173
+ {
174
+ $ now = true ;
175
+ Loop::futureTick (function () use (&$ now ) {
176
+ $ now = false ;
177
+ });
178
+
179
+ $ promise = new Promise (function ($ resolve ) {
180
+ $ resolve (42 );
181
+ });
182
+
183
+ $ this ->assertEquals (42 , $ await ($ promise ));
184
+ $ this ->assertTrue ($ now );
185
+ }
186
+
187
+ /**
188
+ * @dataProvider provideAwaiters
189
+ */
190
+ public function testAwaitReturnsValueImmediatelyWhenPromiseIsFulfilled (callable $ await )
191
+ {
192
+ $ deferred = new Deferred ();
193
+
194
+ $ ticks = 0 ;
195
+ Loop::futureTick (function () use (&$ ticks ) {
196
+ ++$ ticks ;
197
+ Loop::futureTick (function () use (&$ ticks ) {
198
+ ++$ ticks ;
199
+ });
200
+ });
201
+
202
+ Loop::futureTick (fn () => $ deferred ->resolve (42 ));
203
+
204
+ $ this ->assertEquals (42 , $ await ($ deferred ->promise ()));
205
+ $ this ->assertEquals (1 , $ ticks );
206
+ }
207
+
208
+ /**
209
+ * @dataProvider provideAwaiters
210
+ */
211
+ public function testAwaitAsyncReturnsValueImmediatelyWhenPromiseIsFulfilled (callable $ await )
212
+ {
213
+ $ deferred = new Deferred ();
214
+
215
+ $ ticks = 0 ;
216
+ Loop::futureTick (function () use (&$ ticks ) {
217
+ ++$ ticks ;
218
+ Loop::futureTick (function () use (&$ ticks ) {
219
+ ++$ ticks ;
220
+ });
221
+ });
222
+
223
+ Loop::futureTick (fn () => $ deferred ->resolve (42 ));
224
+
225
+ $ promise = async (function () use ($ deferred , $ await ) {
226
+ return $ await ($ deferred ->promise ());
227
+ })();
228
+
229
+ $ this ->assertEquals (42 , $ await ($ promise ));
230
+ $ this ->assertEquals (1 , $ ticks );
231
+ }
232
+
94
233
/**
95
234
* @dataProvider provideAwaiters
96
235
*/
0 commit comments