@@ -14,6 +14,18 @@ var ParsePromise = require('../ParsePromise');
14
14
var asyncHelper = require ( './test_helpers/asyncHelper' ) ;
15
15
16
16
describe ( 'Promise' , ( ) => {
17
+ it ( 'can disable A+ compliance' , ( ) => {
18
+ ParsePromise . disableAPlusCompliant ( ) ;
19
+ expect ( ParsePromise . isPromisesAPlusCompliant ( ) ) . toBe ( false ) ;
20
+ } ) ;
21
+
22
+ it ( 'can enable A+ compliance' , ( ) => {
23
+ ParsePromise . enableAPlusCompliant ( ) ;
24
+ expect ( ParsePromise . isPromisesAPlusCompliant ( ) ) . toBe ( true ) ;
25
+ } ) ;
26
+ } ) ;
27
+
28
+ function promiseTests ( ) {
17
29
it ( 'can be initially resolved' , ( ) => {
18
30
var promise = ParsePromise . as ( 'foo' ) ;
19
31
promise . then ( ( result ) => {
@@ -297,6 +309,27 @@ describe('Promise', () => {
297
309
jest . runAllTimers ( ) ;
298
310
} ) ) ;
299
311
312
+ it ( 'immediately resolves when processing an empty array in parallel' , asyncHelper ( ( done ) => {
313
+ ParsePromise . when ( [ ] ) . then ( ( result ) => {
314
+ expect ( result ) . toEqual ( [ ] ) ;
315
+ done ( ) ;
316
+ } ) ;
317
+ } ) ) ;
318
+
319
+ it ( 'can handle rejected promises in parallel' , asyncHelper ( ( done ) => {
320
+ ParsePromise . when ( [ ParsePromise . as ( 1 ) , ParsePromise . error ( 'an error' ) ] ) . then ( null , ( errors ) => {
321
+ expect ( errors ) . toEqual ( [ undefined , 'an error' ] ) ;
322
+ done ( ) ;
323
+ } ) ;
324
+ } ) ) ;
325
+
326
+ it ( 'can automatically resolve non-promises in parallel' , asyncHelper ( ( done ) => {
327
+ ParsePromise . when ( [ 1 , 2 , 3 ] ) . then ( ( results ) => {
328
+ expect ( results ) . toEqual ( [ 1 , 2 , 3 ] ) ;
329
+ done ( ) ;
330
+ } ) ;
331
+ } ) ) ;
332
+
300
333
it ( 'passes on errors' , ( ) => {
301
334
ParsePromise . error ( 'foo' ) . then ( ( ) => {
302
335
// This should not be reached
@@ -428,6 +461,40 @@ describe('Promise', () => {
428
461
} ) ;
429
462
} ) ;
430
463
464
+ it ( 'runs catch callbacks on error' , ( ) => {
465
+ var promise = ParsePromise . error ( 'foo' ) ;
466
+ promise . fail ( ( error ) => {
467
+ expect ( error ) . toBe ( 'foo' ) ;
468
+ } ) . then ( ( result ) => {
469
+ if ( ParsePromise . isPromisesAPlusCompliant ( ) ) {
470
+ expect ( result ) . toBe ( undefined ) ;
471
+ } else {
472
+ // This should not be reached
473
+ expect ( true ) . toBe ( false ) ;
474
+ }
475
+ } , ( error ) => {
476
+ if ( ParsePromise . isPromisesAPlusCompliant ( ) ) {
477
+ // This should not be reached
478
+ expect ( true ) . toBe ( false ) ;
479
+ } else {
480
+ expect ( error ) . toBe ( undefined ) ;
481
+ }
482
+ } ) ;
483
+ } ) ;
484
+
485
+ it ( 'does not run catch callbacks on success' , ( ) => {
486
+ var promise = ParsePromise . as ( 'foo' ) ;
487
+ promise . catch ( ( error ) => {
488
+ // This should not be reached
489
+ expect ( true ) . toBe ( false ) ;
490
+ } ) . then ( ( result ) => {
491
+ expect ( result ) . toBe ( 'foo' ) ;
492
+ } , ( error ) => {
493
+ // This should not be reached
494
+ expect ( true ) . toBe ( false ) ;
495
+ } ) ;
496
+ } ) ;
497
+
431
498
it ( 'operates asynchonously' , ( ) => {
432
499
var triggered = false ;
433
500
ParsePromise . as ( ) . then ( ( ) => {
@@ -518,4 +585,130 @@ describe('Promise', () => {
518
585
done ( ) ;
519
586
} ) ;
520
587
} ) ) ;
588
+
589
+ it ( 'resolves Promise.all with the set of resolved results' , asyncHelper ( ( done ) => {
590
+ let firstSet = [
591
+ new ParsePromise ( ) ,
592
+ new ParsePromise ( ) ,
593
+ new ParsePromise ( ) ,
594
+ new ParsePromise ( )
595
+ ] ;
596
+
597
+ let secondSet = [ 5 , 6 , 7 ] ;
598
+
599
+ ParsePromise . all ( [ ] ) . then ( ( results ) => {
600
+ expect ( results ) . toEqual ( [ ] ) ;
601
+
602
+ return ParsePromise . all ( firstSet ) ;
603
+ } ) . then ( ( results ) => {
604
+ expect ( results ) . toEqual ( [ 1 , 2 , 3 , 4 ] ) ;
605
+ return ParsePromise . all ( secondSet ) ;
606
+ } ) . then ( ( results ) => {
607
+ expect ( results ) . toEqual ( [ 5 , 6 , 7 ] ) ;
608
+ done ( ) ;
609
+ } ) ;
610
+ firstSet [ 0 ] . resolve ( 1 ) ;
611
+ firstSet [ 1 ] . resolve ( 2 ) ;
612
+ firstSet [ 2 ] . resolve ( 3 ) ;
613
+ firstSet [ 3 ] . resolve ( 4 ) ;
614
+ } ) ) ;
615
+
616
+ it ( 'rejects Promise.all with the first rejected promise' , asyncHelper ( ( done ) => {
617
+ let promises = [
618
+ new ParsePromise ( ) ,
619
+ new ParsePromise ( ) ,
620
+ new ParsePromise ( )
621
+ ] ;
622
+
623
+ ParsePromise . all ( promises ) . then ( ( ) => {
624
+ // this should not be reached
625
+ } , ( error ) => {
626
+ expect ( error ) . toBe ( 'an error' ) ;
627
+ done ( ) ;
628
+ } ) ;
629
+ promises [ 0 ] . resolve ( 1 ) ;
630
+ promises [ 1 ] . reject ( 'an error' ) ;
631
+ promises [ 2 ] . resolve ( 3 ) ;
632
+ } ) ) ;
633
+
634
+ it ( 'resolves Promise.race with the first resolved result' , asyncHelper ( ( done ) => {
635
+ let firstSet = [
636
+ new ParsePromise ( ) ,
637
+ new ParsePromise ( ) ,
638
+ new ParsePromise ( )
639
+ ] ;
640
+
641
+ let secondSet = [ 4 , 5 , ParsePromise . error ( ) ] ;
642
+
643
+ ParsePromise . race ( firstSet ) . then ( ( result ) => {
644
+ expect ( result ) . toBe ( 2 ) ;
645
+
646
+ return ParsePromise . race ( secondSet ) ;
647
+ } ) . then ( ( result ) => {
648
+ expect ( result ) . toBe ( 4 ) ;
649
+ done ( ) ;
650
+ } ) ;
651
+ firstSet [ 1 ] . resolve ( 2 ) ;
652
+ firstSet [ 0 ] . resolve ( 1 ) ;
653
+ } ) ) ;
654
+
655
+ it ( 'rejects Promise.race with the first rejected reason' , asyncHelper ( ( done ) => {
656
+ let promises = [
657
+ new ParsePromise ( ) ,
658
+ new ParsePromise ( ) ,
659
+ new ParsePromise ( )
660
+ ] ;
661
+
662
+ ParsePromise . race ( promises ) . fail ( ( error ) => {
663
+ expect ( error ) . toBe ( 'error 2' ) ;
664
+ done ( ) ;
665
+ } ) ;
666
+ promises [ 1 ] . reject ( 'error 2' ) ;
667
+ promises [ 0 ] . resolve ( 'error 1' ) ;
668
+ } ) ) ;
669
+
670
+ it ( 'can implement continuations' , asyncHelper ( ( done ) => {
671
+ let count = 0 ;
672
+ let loop = ( ) => {
673
+ count ++ ;
674
+ return ParsePromise . as ( ) ;
675
+ }
676
+ ParsePromise . _continueWhile (
677
+ ( ) => { return count < 5 } ,
678
+ loop
679
+ ) . then ( ( ) => {
680
+ expect ( count ) . toBe ( 5 ) ;
681
+ done ( ) ;
682
+ } ) ;
683
+ } ) ) ;
684
+
685
+ it ( 'can attach a universal callback to a promise' , asyncHelper ( ( done ) => {
686
+ ParsePromise . as ( 15 ) . _continueWith ( ( result , err ) => {
687
+ expect ( result ) . toEqual ( [ 15 ] ) ;
688
+ expect ( err ) . toBe ( null ) ;
689
+
690
+ ParsePromise . error ( 'an error' ) . _continueWith ( ( result , err ) => {
691
+ expect ( result ) . toBe ( null ) ;
692
+ expect ( err ) . toBe ( 'an error' ) ;
693
+
694
+ done ( ) ;
695
+ } ) ;
696
+ } ) ;
697
+ } ) ) ;
698
+ }
699
+
700
+ describe ( 'Promise (A Compliant)' , ( ) => {
701
+ beforeEach ( ( ) => {
702
+ ParsePromise . disableAPlusCompliant ( ) ;
703
+ } ) ;
704
+
705
+ promiseTests ( ) ;
706
+ } ) ;
707
+
708
+ describe ( 'Promise (A+ Compliant)' , ( ) => {
709
+ beforeEach ( ( ) => {
710
+ ParsePromise . enableAPlusCompliant ( ) ;
711
+ } ) ;
712
+
713
+ promiseTests ( ) ;
521
714
} ) ;
0 commit comments