@@ -57,58 +57,73 @@ function run_tests(testInfo, callback) {
5757 return ;
5858 }
5959
60- var harness = tape . getHarness ( ) ;
61-
62- testInfo . forEach ( function ( info ) {
63- runTest ( info , harness , function ( result ) {
64- callback ( result ) ;
65- } ) ;
66- } ) ;
67-
68- tape . onFinish ( function ( ) {
69- // executes when all tests are done running
60+ var harness = tape . getHarness ( { objectMode : true } ) ;
61+ var capture = false ; // Only capture between 'test' and 'end' events to avoid skipped test events.
62+ harness . createStream ( { objectMode : true } ) . on ( 'data' , function ( evt ) {
63+ switch ( evt . type ) {
64+ case 'test' :
65+ capture = true ;
66+ // Test is starting. Reset the result object. Send a "test start" event.
67+ result = {
68+ 'title' : evt . name ,
69+ 'passed' : true ,
70+ 'stdOut' : '' ,
71+ 'stdErr' : ''
72+ } ;
73+ callback ( {
74+ 'type' : 'test start' ,
75+ 'title' : result . title ,
76+ 'result' : result
77+ } ) ;
78+ break ;
79+ case 'assert' :
80+ if ( ! capture ) break ;
81+ // Correlate the success/failure asserts for this test. There may be multiple per test
82+ var msg = "Operator: " + evt . operator + ". Expected: " + evt . expected + ". Actual: " + evt . actual + "\n" ;
83+ if ( evt . ok ) {
84+ result . stdOut += msg ;
85+ } else {
86+ result . stdErr += msg + ( evt . error . stack || evt . error . message ) + "\n" ;
87+ result . passed = false ;
88+ }
89+ break ;
90+ case 'end' :
91+ if ( ! capture ) break ;
92+ // Test is done. Send a "result" event.
93+ callback ( {
94+ 'type' : 'result' ,
95+ 'title' : result . title ,
96+ 'result' : result
97+ } ) ;
98+ capture = false ;
99+ break ;
100+ default :
101+ break ;
102+ }
70103 } ) ;
71104
72- function runTest ( testInfo , harness , done ) {
73- var stream = harness . createStream ( { objectMode : true } ) ;
74- var title = testInfo . testName ;
105+ loadTestCases ( testInfo [ 0 ] . testFile ) ;
75106
76- stream . on ( ( 'data' ) , function ( result ) {
77- if ( result . type === 'test' ) {
78- done ( {
79- type : 'test start' ,
80- title : title
81- } ) ;
82- }
83- } ) ;
107+ // Skip those not selected to run. The rest will start running on the next tick.
108+ harness [ '_tests' ] . forEach ( function ( test ) {
109+ if ( ! testInfo . some ( function ( ti ) { return ti . testName == test . name ; } ) ) {
110+ test . _skip = true ;
111+ }
112+ } ) ;
84113
85- try {
86- var htest = tape . test ( title , { } , function ( result ) {
87- done ( {
88- type : 'result' ,
89- title : title ,
90- result : {
91- 'title' : title ,
92- 'passed' : result . _ok ,
93- 'stdOut' : '' ,
94- 'stdErr' : ''
95- }
96- } ) ;
97- } ) ;
98- } catch ( e ) {
99- console . error ( 'NTVS_ERROR:' , e ) ;
100- done ( {
101- type : 'result' ,
102- title : title ,
103- result : {
104- 'title' : title ,
105- 'passed' : false ,
106- 'stdOut' : '' ,
107- 'stdErr' : e . message
108- }
114+ harness . onFinish ( function ( ) {
115+ // TODO: This still doesn't seem to handle async tests with plan issues.
116+ if ( capture ) {
117+ // Something didn't finish. Finish it now.
118+ result . passed = false ;
119+ callback ( {
120+ 'type' : 'result' ,
121+ 'title' : result . title ,
122+ 'result' : result
109123 } ) ;
110124 }
111- }
125+ process . exit ( 0 ) ;
126+ } ) ;
112127}
113128module . exports . run_tests = run_tests ;
114129
0 commit comments