lib/base.js
function Base(runner) {
  var self = this
    , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }
    , failures = this.failures = [];

  if (!runner) return;
  this.runner = runner;

  runner.stats = stats;

  runner.on('start', function(){
    stats.start = new Date;
  });

  runner.on('suite', function(suite){
    stats.suites = stats.suites || 0;
    suite.root || stats.suites++;
  });

  runner.on('test end', function(test){
    stats.tests = stats.tests || 0;
    stats.tests++;
  });

  runner.on('pass', function(test){
    stats.passes = stats.passes || 0;

    var medium = test.slow() / 2;
    test.speed = test.duration > test.slow()
      ? 'slow'
      : test.duration > medium
        ? 'medium'
        : 'fast';

    stats.passes++;
  });

  runner.on('fail', function(test, err){
    stats.failures = stats.failures || 0;
    stats.failures++;
    test.err = err;
    failures.push(test);
  });

  runner.on('end', function(){
    stats.end = new Date;
    stats.duration = new Date - stats.start;
  });

  runner.on('pending', function(){
    stats.pending++;
  });
}
function Base(runner) {
  var self = this
    , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 }
    , failures = this.failures = [];

  if (!runner) return;
  this.runner = runner;

  runner.stats = stats;

  runner.on('start', function(){
    stats.start = new Date;
  });

  runner.on('suite', function(suite){
    stats.suites = stats.suites || 0;
    suite.root || stats.suites++;
  });

  runner.on('test end', function(test){
    stats.tests = stats.tests || 0;
    stats.tests++;
  });

  runner.on('pass', function(test){
    stats.passes = stats.passes || 0;

    var medium = test.slow() / 2;
    test.speed = test.duration > test.slow()
      ? 'slow'
      : test.duration > medium
        ? 'medium'
        : 'fast';

    stats.passes++;
  });

  runner.on('fail', function(test, err){
    stats.failures = stats.failures || 0;
    stats.failures++;
    test.err = err;
    failures.push(test);
  });

  runner.on('end', function(){
    stats.end = new Date;
    stats.duration = new Date - stats.start;
  });

  runner.on('pending', function(){
    stats.pending++;
  });
}
function Base ( runner ) { var self = this , stats = this . stats = { suites : 0 , tests : 0 , passes : 0 , pending : 0 , failures : 0 } , failures = this . failures = [ ] ; if ( ! runner ) return ; this . runner = runner ; runner . stats = stats ; runner . on ( 'start' , function ( ) { stats . start = new Date ; } ) ; runner . on ( 'suite' , function ( suite ) { stats . suites = stats . suites || 0 ; suite . root || stats . suites ++ ; } ) ; runner . on ( 'test end' , function ( test ) { stats . tests = stats . tests || 0 ; stats . tests ++ ; } ) ; runner . on ( 'pass' , function ( test ) { stats . passes = stats . passes || 0 ; var medium = test . slow ( ) / 2 ; test . speed = test . duration > test . slow ( ) ? 'slow' : test . duration > medium ? 'medium' : 'fast' ; stats . passes ++ ; } ) ; runner . on ( 'fail' , function ( test , err ) { stats . failures = stats . failures || 0 ; stats . failures ++ ; test . err = err ; failures . push ( test ) ; } ) ; runner . on ( 'end' , function ( ) { stats . end = new Date ; stats . duration = new Date - stats . start ; } ) ; runner . on ( 'pending' , function ( ) { stats . pending ++ ; } ) ; }
Initialize a new `Base` reporter.

All other reporters generally
inherit from this reporter, providing
stats such as test duration, number
of tests passed / failed etc.

@param {Runner} runner
@api public
Initialize a new Base reporter .