2012-10-03 18:37:48 +02:00
$ ( function ( ) {
2020-06-07 10:53:10 +02:00
function stringifyException ( exception ) {
var err = exception . stack || exception . toString ( ) ;
// FF / Opera do not add the message
if ( ! ~ err . indexOf ( exception . message ) ) {
err = exception . message + '\n' + err ;
}
// <=IE7 stringifies to [Object Error]. Since it can be overloaded, we
// check for the result of the stringifying.
if ( '[object Error]' == err ) err = exception . message ;
// Safari doesn't give you a stack. Let's at least provide a source line.
if ( ! exception . stack && exception . sourceURL && exception . line !== undefined ) {
err += "\n(" + exception . sourceURL + ":" + exception . line + ")" ;
}
return err ;
}
function CustomRunner ( runner ) {
2020-07-28 20:57:33 +02:00
var stats = { suites : 0 , tests : 0 , passes : 0 , pending : 0 , failures : 0 } ;
2012-11-03 15:31:33 +01:00
if ( ! runner ) return ;
runner . on ( 'start' , function ( ) {
stats . start = new Date ;
} ) ;
runner . on ( 'suite' , function ( suite ) {
suite . root || stats . suites ++ ;
2020-06-07 10:53:10 +02:00
if ( suite . root ) return ;
append ( suite . title ) ;
level ++ ;
} ) ;
runner . on ( 'suite end' , function ( suite ) {
if ( suite . root ) return ;
level -- ;
if ( level == 0 ) {
append ( "" ) ;
}
} ) ;
// Scroll down test display after each test
2020-07-28 20:57:33 +02:00
let mochaEl = $ ( '#mocha' ) [ 0 ] ;
2020-06-07 10:53:10 +02:00
runner . on ( 'test' , function ( ) {
2020-07-28 20:57:33 +02:00
mochaEl . scrollTop = mochaEl . scrollHeight ;
2012-11-03 15:31:33 +01:00
} ) ;
2020-07-28 20:57:33 +02:00
// max time a test is allowed to run
// TODO this should be lowered once timeslider_revision.js is faster
2020-06-07 10:53:10 +02:00
var killTimeout ;
2020-07-28 20:57:33 +02:00
runner . on ( 'test end' , function ( ) {
2012-11-03 15:31:33 +01:00
stats . tests ++ ;
2020-07-28 20:57:33 +02:00
} ) ;
2020-06-07 10:53:10 +02:00
2020-07-28 20:57:33 +02:00
runner . on ( 'pass' , function ( test ) {
2020-06-07 10:53:10 +02:00
if ( killTimeout ) clearTimeout ( killTimeout ) ;
killTimeout = setTimeout ( function ( ) {
append ( "FINISHED - [red]no test started since 3 minutes, tests stopped[clear]" ) ;
} , 60000 * 3 ) ;
2012-11-03 15:31:33 +01:00
var medium = test . slow ( ) / 2 ;
test . speed = test . duration > test . slow ( )
? 'slow'
: test . duration > medium
? 'medium'
: 'fast' ;
stats . passes ++ ;
2020-07-28 20:57:33 +02:00
append ( "->" , "[green]PASSED[clear] :" , test . title , " " , test . duration , "ms" ) ;
2012-11-03 15:31:33 +01:00
} ) ;
runner . on ( 'fail' , function ( test , err ) {
2020-07-28 20:57:33 +02:00
if ( killTimeout ) clearTimeout ( killTimeout ) ;
killTimeout = setTimeout ( function ( ) {
append ( "FINISHED - [red]no test started since 3 minutes, tests stopped[clear]" ) ;
} , 60000 * 3 ) ;
2012-11-03 15:31:33 +01:00
stats . failures ++ ;
test . err = err ;
2020-07-28 20:57:33 +02:00
append ( "->" , "[red]FAILED[clear] :" , test . title , stringifyException ( test . err ) ) ;
2012-11-03 15:31:33 +01:00
} ) ;
2020-07-28 20:57:33 +02:00
runner . on ( 'pending' , function ( test ) {
if ( killTimeout ) clearTimeout ( killTimeout ) ;
killTimeout = setTimeout ( function ( ) {
append ( "FINISHED - [red]no test started since 3 minutes, tests stopped[clear]" ) ;
} , 60000 * 3 ) ;
2012-11-03 15:31:33 +01:00
stats . pending ++ ;
2020-07-28 20:57:33 +02:00
append ( "->" , "[yellow]PENDING[clear]:" , test . title ) ;
2012-11-03 15:31:33 +01:00
} ) ;
2012-11-18 12:49:34 +01:00
2020-06-07 10:53:10 +02:00
var $console = $ ( "#console" ) ;
2012-10-28 14:16:41 +01:00
var level = 0 ;
var append = function ( ) {
var text = Array . prototype . join . apply ( arguments , [ " " ] ) ;
var oldText = $console . text ( ) ;
var space = "" ;
for ( var i = 0 ; i < level * 2 ; i ++ ) {
space += " " ;
}
2012-11-03 19:14:54 +01:00
var splitedText = "" ;
_ ( text . split ( "\n" ) ) . each ( function ( line ) {
while ( line . length > 0 ) {
var split = line . substr ( 0 , 100 ) ;
line = line . substr ( 100 ) ;
if ( splitedText . length > 0 ) splitedText += "\n" ;
splitedText += split ;
}
} ) ;
2012-10-28 14:16:41 +01:00
//indent all lines with the given amount of space
2012-11-03 19:14:54 +01:00
var newText = _ ( splitedText . split ( "\n" ) ) . map ( function ( line ) {
2012-10-28 14:16:41 +01:00
return space + line ;
2012-11-03 18:02:28 +01:00
} ) . join ( "\\n" ) ;
2012-10-28 14:16:41 +01:00
2012-11-03 18:02:28 +01:00
$console . text ( oldText + newText + "\\n" ) ;
2012-10-28 14:16:41 +01:00
}
2012-11-03 15:31:33 +01:00
var total = runner . total ;
2012-10-28 14:16:41 +01:00
runner . on ( 'end' , function ( ) {
2020-07-28 20:57:33 +02:00
stats . end = new Date ;
stats . duration = stats . end - stats . start ;
var minutes = Math . floor ( stats . duration / 1000 / 60 ) ;
var seconds = Math . round ( ( stats . duration / 1000 ) % 60 ) // chrome < 57 does not like this .toString().padStart("2","0");
if ( stats . tests === total ) {
append ( "FINISHED -" , stats . passes , "tests passed," , stats . failures , "tests failed," , stats . pending , " pending, duration: " + minutes + ":" + seconds ) ;
} else if ( stats . tests > total ) {
append ( "FINISHED - but more tests than planned returned" , stats . passes , "tests passed," , stats . failures , "tests failed," , stats . pending , " pending, duration: " + minutes + ":" + seconds ) ;
append ( total , "tests, but" , stats . tests , "returned. There is probably a problem with your async code or error handling, see https://github.com/mochajs/mocha/issues/1327" ) ;
}
else {
append ( "FINISHED - but not all tests returned" , stats . passes , "tests passed," , stats . failures , "tests failed," , stats . pending , "tests pending, duration: " + minutes + ":" + seconds ) ;
append ( total , "tests, but only" , stats . tests , "returned. Check for failed before/beforeEach-hooks (no `test end` is called for them and subsequent tests of the same suite are skipped), see https://github.com/mochajs/mocha/pull/1043" ) ;
2012-11-03 15:31:33 +01:00
}
2012-10-28 14:16:41 +01:00
} ) ;
}
2012-10-27 18:50:59 +02:00
//http://stackoverflow.com/questions/1403888/get-url-parameter-with-jquery
var getURLParameter = function ( name ) {
return decodeURI (
( RegExp ( name + '=' + '(.+?)(&|$)' ) . exec ( location . search ) || [ , null ] ) [ 1 ]
) ;
}
//get the list of specs and filter it if requested
2012-10-27 18:05:26 +02:00
var specs = specs _list . slice ( ) ;
2020-03-24 01:04:24 +01:00
2012-10-27 18:50:59 +02:00
//inject spec scripts into the dom
var $body = $ ( 'body' ) ;
2012-10-27 18:05:26 +02:00
$ . each ( specs , function ( i , spec ) {
2013-02-04 01:03:25 +01:00
if ( spec [ 0 ] != "/" ) { // if the spec isn't a plugin spec which means the spec file might be in a different subfolder
$body . append ( '<script src="specs/' + spec + '"></script>' )
} else {
$body . append ( '<script src="' + spec + '"></script>' )
}
2012-10-27 18:05:26 +02:00
} ) ;
2012-10-03 18:37:48 +02:00
//initalize the test helper
2012-10-08 00:34:29 +02:00
helper . init ( function ( ) {
2013-12-05 08:41:29 +01:00
//configure and start the test framework
2012-10-27 18:50:59 +02:00
var grep = getURLParameter ( "grep" ) ;
if ( grep != "null" ) {
mocha . grep ( grep ) ;
}
2012-10-28 14:16:41 +01:00
2020-06-07 10:53:10 +02:00
var runner = mocha . run ( ) ;
CustomRunner ( runner )
2012-10-08 00:34:29 +02:00
} ) ;
2020-03-24 01:04:24 +01:00
} ) ;