22
33'use strict' ;
44
5- var assert = require ( 'assert' ) ;
5+ var assert = require ( 'core- assert' ) ;
66var Promise = require ( './' ) ;
77
88describe ( 'Promise' , function ( ) {
@@ -189,7 +189,7 @@ describe('unhandledRejection/rejectionHandled events', function () {
189189
190190 it ( 'should not emit any events if handled before the next turn' , function ( done ) {
191191 var promise = Promise . reject ( new Error ( 'handled immediately after rejection' ) ) ;
192- promise . catch ( function ( ) { } ) ;
192+ promise . catch ( noop ) ;
193193 nextLoop ( function ( ) {
194194 assert . deepEqual ( events , [ ] ) ;
195195 done ( ) ;
@@ -199,7 +199,7 @@ describe('unhandledRejection/rejectionHandled events', function () {
199199 it ( 'should emit a rejectionHandled event if handledLater' , function ( done ) {
200200 var promise = Promise . reject ( new Error ( 'eventually handled' ) ) ;
201201 nextLoop ( function ( ) {
202- promise . catch ( function ( ) { } ) ;
202+ promise . catch ( noop ) ;
203203 nextLoop ( function ( ) {
204204 assert . deepEqual ( events , [
205205 [ 'unhandledRejection' , [ 'eventually handled' , promise ] ] ,
@@ -210,27 +210,80 @@ describe('unhandledRejection/rejectionHandled events', function () {
210210 } ) ;
211211 } ) ;
212212
213+ it ( 'should not emit any events when handled by a chained promise' , function ( done ) {
214+ var promise = Promise . reject ( new Error ( 'chained' ) ) ;
215+ promise
216+ . then ( noop )
217+ . then ( noop )
218+ . then ( noop )
219+ . catch ( noop ) ;
220+ later ( function ( ) {
221+ assert . deepStrictEqual ( events , [ ] ) ;
222+ done ( ) ;
223+ } ) ;
224+ } ) ;
225+
226+ it ( 'catch() should only emit rejectionHandled one branch of a forked promise chain at a time' , function ( done ) {
227+ var def = deferred ( ) ;
228+ var root = def . promise ;
229+
230+ // build the first branch
231+ root . then ( noop ) . then ( noop ) . catch ( noop ) ;
232+
233+ // build the second branch
234+ var b1 = root . then ( noop ) . then ( noop ) ;
235+
236+ def . reject ( new Error ( 'branching' ) ) ;
237+
238+ var c ;
239+
240+ later ( step1 ) ;
241+
242+ function step1 ( ) {
243+ b1 . catch ( noop ) ;
244+ c = root . then ( noop ) ;
245+ later ( step2 ) ;
246+ }
247+
248+ function step2 ( ) {
249+ assert . deepStrictEqual ( events , [
250+ [ 'unhandledRejection' , [ 'branching' , b1 ] ] ,
251+ [ 'rejectionHandled' , [ b1 ] ] ,
252+ [ 'unhandledRejection' , [ 'branching' , c ] ]
253+ ] ) ;
254+ done ( ) ;
255+ }
256+ } ) ;
257+
258+ function noop ( ) { }
259+
213260 function nextLoop ( fn ) {
214261 setImmediate ( fn ) ;
215262 }
263+
264+ function later ( fn ) {
265+ setTimeout ( fn , 40 ) ;
266+ }
216267} ) ;
217268
269+ function deferred ( ) {
270+ var resolve ;
271+ var reject ;
272+ var promise = new Promise ( function ( res , rej ) {
273+ resolve = res ;
274+ reject = rej ;
275+ } ) ;
276+
277+ return {
278+ promise : promise ,
279+ resolve : resolve ,
280+ reject : reject
281+ } ;
282+ }
283+
218284describe ( 'Promises/A+ Tests' , function ( ) {
219285 var adapter = {
220- deferred : function ( ) {
221- var resolve ;
222- var reject ;
223- var promise = new Promise ( function ( res , rej ) {
224- resolve = res ;
225- reject = rej ;
226- } ) ;
227-
228- return {
229- promise : promise ,
230- resolve : resolve ,
231- reject : reject
232- } ;
233- }
286+ deferred : deferred
234287 } ;
235288
236289 require ( 'promises-aplus-tests' ) . mocha ( adapter ) ;
0 commit comments