@@ -365,9 +365,8 @@ Runner.prototype.hook = function(name, fn) {
365
365
366
366
function nextHook ( i ) {
367
367
var hook = hooks [ i ] ;
368
- if ( ! hook ) {
369
- return fn ( ) ;
370
- }
368
+ if ( ! hook ) return fn ( ) ;
369
+
371
370
self . currentRunnable = hook ;
372
371
373
372
if ( name === HOOK_TYPE_BEFORE_ALL ) {
@@ -399,13 +398,6 @@ Runner.prototype.hook = function(name, fn) {
399
398
if ( self . test ) {
400
399
self . test . pending = true ;
401
400
}
402
- } else if ( name === HOOK_TYPE_BEFORE_EACH ) {
403
- if ( self . test ) {
404
- self . test . pending = true ;
405
- }
406
- self . emit ( constants . EVENT_HOOK_END , hook ) ;
407
- hook . pending = false ; // activates hook for next test
408
- return fn ( new Error ( 'abort hookDown' ) ) ;
409
401
} else if ( name === HOOK_TYPE_BEFORE_ALL ) {
410
402
suite . tests . forEach ( function ( test ) {
411
403
test . pending = true ;
@@ -414,6 +406,13 @@ Runner.prototype.hook = function(name, fn) {
414
406
suite . pending = true ;
415
407
} ) ;
416
408
hooks = [ ] ;
409
+ } else if ( name === HOOK_TYPE_BEFORE_EACH ) {
410
+ if ( self . test ) {
411
+ self . test . pending = true ;
412
+ }
413
+ self . emit ( constants . EVENT_HOOK_END , hook ) ;
414
+ hook . pending = false ;
415
+ return fn ( new Error ( 'abort hookDown' ) ) ;
417
416
} else {
418
417
hook . pending = false ;
419
418
var errForbid = createUnsupportedError ( '`this.skip` forbidden' ) ;
@@ -431,6 +430,17 @@ Runner.prototype.hook = function(name, fn) {
431
430
suite . skipped = true ;
432
431
} ) ;
433
432
hooks = [ ] ;
433
+ } else if ( name === HOOK_TYPE_BEFORE_EACH ) {
434
+ ( function skipTests ( sui ) {
435
+ sui . tests . forEach ( function ( t ) {
436
+ if ( ! t . state ) t . skipped = true ;
437
+ } ) ;
438
+ sui . suites . forEach ( function ( s ) {
439
+ skipTests ( s ) ;
440
+ } ) ;
441
+ } ) ( suite ) ;
442
+ self . emit ( constants . EVENT_HOOK_END , hook ) ;
443
+ return fn ( err ) ;
434
444
} else {
435
445
// stop executing hooks, notify callee of hook err
436
446
return fn ( err ) ;
@@ -571,20 +581,18 @@ Runner.prototype.runTests = function(suite, fn) {
571
581
var tests = suite . tests . slice ( ) ;
572
582
var test ;
573
583
574
- function hookErr ( _ , errSuite , after ) {
575
- // before-/ afterEach hook for errSuite failed
584
+ function hookErr ( _ , errSuite ) {
585
+ // afterEach hook for errSuite failed
576
586
var orig = self . suite ;
577
587
578
- // for failed afterEach hook start from errSuite parent,
579
- // otherwise start from errSuite itself
580
- self . suite = after ? errSuite . parent : errSuite ;
588
+ self . suite = errSuite . parent ;
581
589
582
590
if ( self . suite ) {
583
591
self . hookUp ( HOOK_TYPE_AFTER_EACH , function ( err2 , errSuite2 ) {
584
592
self . suite = orig ;
585
593
// some hooks may fail even now
586
594
if ( err2 ) {
587
- return hookErr ( err2 , errSuite2 , true ) ;
595
+ return hookErr ( err2 , errSuite2 ) ;
588
596
}
589
597
// report error suite
590
598
fn ( errSuite ) ;
@@ -602,12 +610,10 @@ Runner.prototype.runTests = function(suite, fn) {
602
610
603
611
if ( self . _abort ) return fn ( ) ;
604
612
605
- if ( err ) return hookErr ( err , errSuite , true ) ;
613
+ if ( err ) return hookErr ( err , errSuite ) ;
606
614
607
615
// next test
608
616
test = tests . shift ( ) ;
609
-
610
- // all done
611
617
if ( ! test ) return fn ( ) ;
612
618
613
619
// grep
@@ -632,7 +638,7 @@ Runner.prototype.runTests = function(suite, fn) {
632
638
return ;
633
639
}
634
640
635
- // static skip or conditional skip within beforeAll
641
+ // static skip or conditional skip within hooks
636
642
if ( test . isPending ( ) ) {
637
643
if ( self . forbidPending ) {
638
644
self . fail ( test , new Error ( 'Pending test forbidden' ) , true ) ;
@@ -644,7 +650,7 @@ Runner.prototype.runTests = function(suite, fn) {
644
650
return nextTest ( ) ;
645
651
}
646
652
647
- // skipped by failing beforeAll
653
+ // skipped by failing hooks
648
654
if ( test . isSkipped ( ) ) {
649
655
test . state = STATE_SKIPPED ;
650
656
self . emit ( constants . EVENT_TEST_SKIPPED , test ) ;
@@ -655,13 +661,17 @@ Runner.prototype.runTests = function(suite, fn) {
655
661
// execute test and hook(s)
656
662
self . emit ( constants . EVENT_TEST_BEGIN , ( self . test = test ) ) ;
657
663
self . hookDown ( HOOK_TYPE_BEFORE_EACH , function ( err , errSuite ) {
658
- // conditional skip within beforeEach
659
- if ( test . isPending ( ) ) {
660
- if ( self . forbidPending ) {
661
- self . fail ( test , new Error ( 'Pending test forbidden' ) , true ) ;
664
+ if ( err || test . isPending ( ) ) {
665
+ if ( test . isPending ( ) ) {
666
+ if ( self . forbidPending ) {
667
+ self . fail ( test , new Error ( 'Pending test forbidden' ) , true ) ;
668
+ } else {
669
+ test . state = STATE_PENDING ;
670
+ self . emit ( constants . EVENT_TEST_PENDING , test ) ;
671
+ }
662
672
} else {
663
- test . state = STATE_PENDING ;
664
- self . emit ( constants . EVENT_TEST_PENDING , test ) ;
673
+ test . state = STATE_SKIPPED ;
674
+ self . emit ( constants . EVENT_TEST_SKIPPED , test ) ;
665
675
}
666
676
self . emit ( constants . EVENT_TEST_END , test ) ;
667
677
// skip inner afterEach hooks below errSuite level
@@ -672,9 +682,7 @@ Runner.prototype.runTests = function(suite, fn) {
672
682
nextTest ( e , eSuite ) ;
673
683
} ) ;
674
684
}
675
- if ( err ) {
676
- return hookErr ( err , errSuite , false ) ;
677
- }
685
+
678
686
self . currentRunnable = self . test ;
679
687
self . runTest ( function ( err ) {
680
688
test = self . test ;
0 commit comments