train
Version:
Train a fast (FIFO) queue with a rollback mechanism. Behind the scenes it uses 2 arrays to simulate and perform fast shifting and popping operations without using the Array#shift() method..
75 lines (71 loc) • 2.48 kB
JavaScript
function () {
var log = console.log
, fs = require( 'fs' )
, util = require( 'util' )
, iopt = {
showHidden : false
, depth : 10
, colors : true
, customInspect : true
}
, inspect = function ( el ) {
return util.inspect( el, iopt );
}
, tpath = __dirname
, minfo = require( '../package.json' )
, mname = minfo.name.charAt( 0 ).toUpperCase() + minfo.name.slice( 1 )
, mver = minfo.version
;
// catch SIGINT
process.on( 'SIGINT', function () {
log( '\nExit tests with SIGINT.\n' );
process.exit( 0 );
} );
fs.readdir( tpath, function ( err, files ) {
if ( err ) return 1;
var flen = files.length
, fname = files[ 0 ]
, f = 0
, failed = {}
, fails = 0
, success = 0
, executed = 0
, finished = 0
, queue = []
, qpos = 0
, done = function ( wait ) {
if ( ++finished < success ) return setTimeout( next, wait || 500 );
// log( '\n%s files found.', inspect( flen ) );
// log( '%s files skipped.', inspect( flen - executed ) );
log( '\n%s test files executed.', inspect( executed ) );
log( '%s test files succeeded.', inspect( success ) );
log( '%s test files failed.%s', inspect( fails ), fails ? '\n' + inspect( failed ) +'\n' : '\n' );
}
, next = function () {
if ( qpos < queue.length ) {
log( '\n[ %s v%s - %s ]\n', mname, mver, inspect( queue[ qpos++ ] ) );
queue[ qpos++ ]( done );
}
}
;
// load file list
for ( ; f < flen; fname = files[ ++f ] ) {
// load only test files
if ( ~ fname.indexOf( '-test.js' ) ) {
++executed;
// run script
try {
queue.push( fname, require( './' + fname ).test );
++success;
} catch ( e ) {
++fails;
if ( ! failed[ fname ] ) failed[ fname ] = [];
failed[ fname ].push( e, Date.now() );
}
}
}
// start
next();
} );
} )();
(