progtest: Async run each test serially

If that makes sense.

The problem is that the browser needs to repaint after each test is
run.  See code comments.
master
Mike Gerwitz 2018-02-16 14:41:39 -05:00
parent f788edd675
commit 0b433e86f4
2 changed files with 58 additions and 18 deletions

View File

@ -68,7 +68,7 @@ module.exports = Class( 'TestRunner',
* *
* @param {Array<TestCase>} dfns array of TestCases * @param {Array<TestCase>} dfns array of TestCases
* *
* @return {Array<Object<desc,i,total,failures>>} results * @return {Promise} promise to complete test cases, yielding results
*/ */
'public runTests'( dfns ) 'public runTests'( dfns )
{ {
@ -76,13 +76,49 @@ module.exports = Class( 'TestRunner',
this._reporter.preRun( total ); this._reporter.preRun( total );
const results = dfns.map( return this._runAsync( dfns ).then(
( test, i ) => this._runTest( test, i, total ) 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<TestCase>} 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();
} );
}, },

View File

@ -86,20 +86,24 @@ describe( "TestRunner", () =>
] ]
]; ];
const results = Sut( NullTestReporter(), program ) Sut( NullTestReporter(), program )
.runTests( test_cases ); .runTests( test_cases )
.then( results =>
{
test_cases.forEach( ( test_case, i ) =>
{
const result = results[ i ];
test_cases.forEach( ( test_case, i ) => expect( result.desc ).to.equal( test_case.description );
{ expect( result.i ).to.equal( i );
const result = results[ i ]; expect( result.total ).to.equal(
Object.keys( test_case.expect ).length
expect( result.desc ).to.equal( test_case.description ); );
expect( result.i ).to.equal( i ); expect( result.failures ).to.deep.equal(
expect( result.total ).to.equal( expect_failures[ i ]
Object.keys( test_case.expect ).length );
); } );
expect( result.failures ).to.deep.equal( expect_failures[ i ] ); } );
} );
} ); } );