diff --git a/progtest/src/TestRunner.js b/progtest/src/TestRunner.js index 92690187..d24f38f2 100644 --- a/progtest/src/TestRunner.js +++ b/progtest/src/TestRunner.js @@ -68,7 +68,7 @@ module.exports = Class( 'TestRunner', * * @param {Array} dfns array of TestCases * - * @return {Array>} results + * @return {Promise} promise to complete test cases, yielding results */ 'public runTests'( dfns ) { @@ -76,13 +76,49 @@ module.exports = Class( 'TestRunner', this._reporter.preRun( total ); - const results = dfns.map( - ( test, i ) => this._runTest( test, i, total ) + return this._runAsync( dfns ).then( + results => this._reporter.done( results ) ); + }, - this._reporter.done( results ); - return results; + /** + * Run all tests asynchronously + * + * TODO: This significantly slows down the runner! The better option + * would be to go back to sync and put it in a Web Worker in the client, + * which would also async updating of the UI. + * + * @param {Array} dfns test case definitions + * + * @return {Promise} promise to complete test cases, yielding results + */ + 'private _runAsync'( dfns ) + { + const total = dfns.length; + + return new Promise( resolve => + { + const results = []; + + const runNext = () => + { + if ( dfns.length === 0 ) + { + resolve( results ); + return; + } + + const dfn = dfns.shift(); + const result = this._runTest( dfn, results.length, total ); + + results.push( result ); + + setTimeout( runNext, 0 ); + }; + + runNext(); + } ); }, diff --git a/progtest/test/TestRunnerTest.js b/progtest/test/TestRunnerTest.js index fc06e04b..eff50eb9 100644 --- a/progtest/test/TestRunnerTest.js +++ b/progtest/test/TestRunnerTest.js @@ -86,20 +86,24 @@ describe( "TestRunner", () => ] ]; - const results = Sut( NullTestReporter(), program ) - .runTests( test_cases ); + Sut( NullTestReporter(), program ) + .runTests( test_cases ) + .then( results => + { + test_cases.forEach( ( test_case, i ) => + { + const result = results[ i ]; - test_cases.forEach( ( test_case, i ) => - { - const result = results[ i ]; - - expect( result.desc ).to.equal( test_case.description ); - expect( result.i ).to.equal( i ); - expect( result.total ).to.equal( - Object.keys( test_case.expect ).length - ); - expect( result.failures ).to.deep.equal( expect_failures[ i ] ); - } ); + expect( result.desc ).to.equal( test_case.description ); + expect( result.i ).to.equal( i ); + expect( result.total ).to.equal( + Object.keys( test_case.expect ).length + ); + expect( result.failures ).to.deep.equal( + expect_failures[ i ] + ); + } ); + } ); } );