44
55use React ;
66use React \EventLoop \Loop ;
7+ use React \Promise \Deferred ;
78use React \Promise \Promise ;
9+ use function React \Async \async ;
810
911class AwaitTest extends TestCase
1012{
@@ -22,6 +24,79 @@ public function testAwaitThrowsExceptionWhenPromiseIsRejectedWithException(calla
2224 $ await ($ promise );
2325 }
2426
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+
25100 /**
26101 * @dataProvider provideAwaiters
27102 */
@@ -91,6 +166,70 @@ public function testAwaitReturnsValueWhenPromiseIsFullfilled(callable $await)
91166 $ this ->assertEquals (42 , $ await ($ promise ));
92167 }
93168
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+
94233 /**
95234 * @dataProvider provideAwaiters
96235 */
0 commit comments