@@ -204,4 +204,72 @@ public function cancelShouldAlwaysTriggerCancellerWhenCalledOnRootPromise()
204204
205205 $ adapter ->promise ()->cancel ();
206206 }
207+
208+ /** @test */
209+ public function cancelShouldTriggerCancellerWhenFollowerCancels ()
210+ {
211+ $ adapter1 = $ this ->getPromiseTestAdapter ($ this ->expectCallableOnce ());
212+
213+ $ root = $ adapter1 ->promise ();
214+
215+ $ adapter2 = $ this ->getPromiseTestAdapter ($ this ->expectCallableOnce ());
216+
217+ $ follower = $ adapter2 ->promise ();
218+ $ adapter2 ->resolve ($ root );
219+
220+ $ follower ->cancel ();
221+ }
222+
223+ /** @test */
224+ public function cancelShouldNotTriggerCancellerWhenCancellingOnlyOneFollower ()
225+ {
226+ $ adapter1 = $ this ->getPromiseTestAdapter ($ this ->expectCallableNever ());
227+
228+ $ root = $ adapter1 ->promise ();
229+
230+ $ adapter2 = $ this ->getPromiseTestAdapter ($ this ->expectCallableOnce ());
231+
232+ $ follower1 = $ adapter2 ->promise ();
233+ $ adapter2 ->resolve ($ root );
234+
235+ $ adapter3 = $ this ->getPromiseTestAdapter ($ this ->expectCallableNever ());
236+ $ adapter3 ->resolve ($ root );
237+
238+ $ follower1 ->cancel ();
239+ }
240+
241+ /** @test */
242+ public function cancelCalledOnFollowerShouldOnlyCancelWhenAllChildrenAndFollowerCancelled ()
243+ {
244+ $ adapter1 = $ this ->getPromiseTestAdapter ($ this ->expectCallableOnce ());
245+
246+ $ root = $ adapter1 ->promise ();
247+
248+ $ child = $ root ->then ();
249+
250+ $ adapter2 = $ this ->getPromiseTestAdapter ($ this ->expectCallableOnce ());
251+
252+ $ follower = $ adapter2 ->promise ();
253+ $ adapter2 ->resolve ($ root );
254+
255+ $ follower ->cancel ();
256+ $ child ->cancel ();
257+ }
258+
259+ /** @test */
260+ public function cancelShouldNotTriggerCancellerWhenCancellingFollowerButNotChildren ()
261+ {
262+ $ adapter1 = $ this ->getPromiseTestAdapter ($ this ->expectCallableNever ());
263+
264+ $ root = $ adapter1 ->promise ();
265+
266+ $ root ->then ();
267+
268+ $ adapter2 = $ this ->getPromiseTestAdapter ($ this ->expectCallableOnce ());
269+
270+ $ follower = $ adapter2 ->promise ();
271+ $ adapter2 ->resolve ($ root );
272+
273+ $ follower ->cancel ();
274+ }
207275}
0 commit comments