@@ -500,14 +500,22 @@ class StatusLoader {
500500
501501 load ( ) {
502502 const dir = path . join ( __dirname , '..' , 'wpt' ) ;
503- let statusFile = path . join ( dir , 'status' , `${ this . path } .json` ) ;
503+ const jsonFile = path . join ( dir , 'status' , `${ this . path } .json` ) ;
504504 let result ;
505505
506- if ( fs . existsSync ( statusFile ) ) {
507- result = JSON . parse ( fs . readFileSync ( statusFile , 'utf8' ) ) ;
506+ let fd ;
507+ try {
508+ fd = fs . openSync ( jsonFile , 'r' ) ;
509+ } catch ( err ) {
510+ if ( err ?. code !== 'ENOENT' ) throw err ;
511+ }
512+ if ( fd ) {
513+ this . statusFile = `${ this . path } .json` ;
514+ result = JSON . parse ( fs . readFileSync ( fd , 'utf8' ) ) ;
515+ fs . closeSync ( fd ) ;
508516 } else {
509- statusFile = path . join ( dir , 'status' , `${ this . path } .cjs` ) ;
510- result = require ( statusFile ) ;
517+ this . statusFile = `${ this . path } .cjs` ;
518+ result = require ( path . join ( dir , 'status' , this . statusFile ) ) ;
511519 }
512520
513521 this . rules . addRules ( result ) ;
@@ -573,13 +581,16 @@ class WPTRunner {
573581
574582 this . status = new StatusLoader ( path ) ;
575583 this . status . load ( ) ;
584+ this . statusFile = this . status . statusFile ;
576585 this . specs = new Set ( this . status . specs ) ;
577586
578587 this . results = { } ;
579588 this . inProgress = new Set ( ) ;
580589 this . workers = new Map ( ) ;
581590 this . unexpectedFailures = [ ] ;
582591
592+ this . subtestCounts = { passed : 0 , failed : 0 , expectedFailures : 0 , skipped : 0 , unexpectedPasses : 0 } ;
593+
583594 if ( process . env . WPT_REPORT != null ) {
584595 this . report = new WPTReport ( path ) ;
585596 }
@@ -775,7 +786,6 @@ class WPTRunner {
775786 const failures = [ ] ;
776787 let expectedFailures = 0 ;
777788 let skipped = 0 ;
778- let skippedTests = 0 ;
779789 for ( const [ key , item ] of Object . entries ( this . results ) ) {
780790 if ( item . fail ?. unexpected ) {
781791 failures . push ( key ) ;
@@ -786,9 +796,6 @@ class WPTRunner {
786796 if ( item . skip ) {
787797 skipped ++ ;
788798 }
789- if ( item . skipTests ) {
790- skippedTests += item . skipTests . length ;
791- }
792799 }
793800
794801 const unexpectedPasses = [ ] ;
@@ -823,23 +830,28 @@ class WPTRunner {
823830 // so that results survive if the process is killed.
824831 this . report ?. write ( ) ;
825832
833+ const p = ( n , word , suffix = 's' ) => `${ n } ${ word } ${ n === 1 ? '' : suffix } ` ;
826834 const ran = queue . length ;
827835 const total = ran + skipped ;
828836 const passed = ran - expectedFailures - failures . length ;
837+ const { subtestCounts } = this ;
829838 console . log ( '' ) ;
830- console . log ( `Ran ${ ran } /${ total } tests, ${ skipped } skipped,` ,
831- `${ passed } passed, ${ expectedFailures } expected failures,` ,
832- `${ failures . length } unexpected failures,` ,
833- `${ unexpectedPasses . length } unexpected passes` +
834- ( skippedTests ? `, ${ skippedTests } subtests skipped` : '' ) ) ;
839+ console . log ( `Files: ${ ran } /${ total } ran, ${ passed } passed,` ,
840+ `${ skipped } skipped, ${ p ( expectedFailures , 'expected failure' ) } ,` ,
841+ `${ p ( failures . length , 'unexpected failure' ) } ,` ,
842+ `${ p ( unexpectedPasses . length , 'unexpected pass' , 'es' ) } ` ) ;
843+ console . log ( `Subtests: ${ subtestCounts . passed } passed,` ,
844+ `${ subtestCounts . skipped } skipped, ${ p ( subtestCounts . expectedFailures , 'expected failure' ) } ,` ,
845+ `${ p ( subtestCounts . failed , 'unexpected failure' ) } ,` ,
846+ `${ p ( subtestCounts . unexpectedPasses , 'unexpected pass' , 'es' ) } ` ) ;
835847 if ( failures . length > 0 ) {
836- const file = path . join ( 'test' , 'wpt' , 'status' , ` ${ this . path } .json` ) ;
848+ const file = path . join ( 'test' , 'wpt' , 'status' , this . statusFile ) ;
837849 throw new Error (
838850 `Found ${ failures . length } unexpected failures. ` +
839851 `Consider updating ${ file } for these files:\n${ failures . join ( '\n' ) } ` ) ;
840852 }
841853 if ( unexpectedPasses . length > 0 ) {
842- const file = path . join ( 'test' , 'wpt' , 'status' , ` ${ this . path } .json` ) ;
854+ const file = path . join ( 'test' , 'wpt' , 'status' , this . statusFile ) ;
843855 throw new Error (
844856 `Found ${ unexpectedPasses . length } unexpected passes. ` +
845857 `Consider updating ${ file } for these files:\n${ unexpectedPasses . join ( '\n' ) } ` ) ;
@@ -875,7 +887,7 @@ class WPTRunner {
875887 if ( status !== kPass ) {
876888 this . fail ( spec , test , status , reportResult ) ;
877889 } else {
878- this . succeed ( test , status , reportResult ) ;
890+ this . succeed ( spec , test , status , reportResult ) ;
879891 }
880892 }
881893
@@ -943,14 +955,22 @@ class WPTRunner {
943955 }
944956 }
945957
946- succeed ( test , status , reportResult ) {
947- console . log ( `[${ status . toUpperCase ( ) } ] ${ test . name } ` ) ;
958+ succeed ( spec , test , status , reportResult ) {
959+ const unexpectedPass = spec . failedTests . includes ( test . name ) ;
960+ if ( unexpectedPass ) {
961+ console . log ( `[UNEXPECTED_PASS][${ status . toUpperCase ( ) } ] ${ test . name } ` ) ;
962+ this . subtestCounts . unexpectedPasses ++ ;
963+ } else {
964+ console . log ( `[${ status . toUpperCase ( ) } ] ${ test . name } ` ) ;
965+ this . subtestCounts . passed ++ ;
966+ }
948967 reportResult ?. addSubtest ( test . name , 'PASS' ) ;
949968 }
950969
951970 skipTest ( spec , test , reportResult ) {
952971 console . log ( `[SKIP] ${ test . name } ` ) ;
953972 reportResult ?. addSubtest ( test . name , 'NOTRUN' ) ;
973+ this . subtestCounts . skipped ++ ;
954974 this . addTestResult ( spec , {
955975 name : test . name ,
956976 status : kSkip ,
@@ -973,6 +993,11 @@ class WPTRunner {
973993 console . log ( `Command: ${ command } \n` ) ;
974994
975995 reportResult ?. addSubtest ( test . name , 'FAIL' , test . message ) ;
996+ if ( expected ) {
997+ this . subtestCounts . expectedFailures ++ ;
998+ } else {
999+ this . subtestCounts . failed ++ ;
1000+ }
9761001
9771002 this . addTestResult ( spec , {
9781003 name : test . name ,
0 commit comments