Skip to content

Commit

Permalink
Removed mocha-debug(1), use mocha --debug
Browse files Browse the repository at this point in the history
  • Loading branch information
tj committed Dec 20, 2011
1 parent a7862b0 commit 221a3c0
Show file tree
Hide file tree
Showing 4 changed files with 317 additions and 306 deletions.
304 changes: 304 additions & 0 deletions bin/_mocha
Original file line number Diff line number Diff line change
@@ -0,0 +1,304 @@
#!/usr/bin/env node

/**
* Module dependencies.
*/

var program = require('commander')
, exec = require('child_process').exec
, notify = require('growl')
, path = require('path')
, mocha = require('../')
, reporters = mocha.reporters
, interfaces = mocha.interfaces
, Runner = mocha.Runner
, Suite = mocha.Suite
, vm = require('vm')
, fs = require('fs')
, join = path.join
, cwd = process.cwd();

/**
* Files.
*/

var files = [];

/**
* Images.
*/

var images = {
fail: __dirname + '/../images/error.png'
, pass: __dirname + '/../images/ok.png'
};

// options

program
.version(mocha.version)
.usage('[options] [files]')
.option('-r, --require <name>', 'require the given module')
.option('-R, --reporter <name>', 'specify the reporter to use', 'dot')
.option('-u, --ui <name>', 'specify user-interface (bdd|tdd|exports)', 'bdd')
.option('-g, --grep <pattern>', 'only run tests matching <pattern>')
.option('-t, --timeout <ms>', 'set test-case timeout in milliseconds [2000]')
.option('-s, --slow <ms>', '"slow" test threshold in milliseconds [75]', parseInt)
.option('-w, --watch', 'watch test files for changes')
.option('-C, --no-colors', 'force disabling of colors')
.option('-c, --colors', 'force enabling of colors')
.option('-G, --growl', 'enable growl notification support')
.option('-d, --debug', "enable node's debugger")
.option('--globals <names>', 'allow the given comma-delimited global [names]', list, [])
.option('--ignore-leaks', 'ignore global variable leaks')
.option('--interfaces', 'display available interfaces')
.option('--reporters', 'display available reporters')

// --reporters

program.on('reporters', function(){
console.log();
console.log(' dot - dot matrix');
console.log(' doc - html documentation');
console.log(' spec - hierarchical spec list');
console.log(' json - single json object');
console.log(' progress - progress bar');
console.log(' list - spec-style listing');
console.log(' tap - test-anything-protocol');
console.log(' landing - unicode landing strip');
console.log(' teamcity - teamcity ci support');
console.log(' json-stream - newline delimited json events');
console.log();
process.exit();
});

// --interfaces

program.on('interfaces', function(){
console.log('');
console.log(' bdd');
console.log(' tdd');
console.log(' exports');
console.log('');
process.exit();
});

// -r, --require

module.paths.push(join(cwd, 'node_modules'));
program.on('require', function(mod){
require(mod);
});

// mocha.opts support

try {
var opts = fs.readFileSync('test/mocha.opts', 'utf8')
.trim()
.split(/\s+/);

process.argv = process.argv
.slice(0, 2)
.concat(opts.concat(process.argv.slice(2)));
} catch (err) {
// ignore
}

// parse args

program.parse(process.argv);

// infinite stack traces

Error.stackTraceLimit = Infinity; // TODO: config

// reporter

var suite = new Suite('')
, Base = require('../lib/reporters/base')
, Reporter = require('../lib/reporters/' + program.reporter)
, ui = interfaces[program.ui](suite);

// --no-colors

if (!program.colors) Base.useColors = false;

// --colors

if (~process.argv.indexOf('--colors') ||
~process.argv.indexOf('-c')) {
Base.useColors = true;
}

// --slow <ms>

if (program.slow) Base.slow = program.slow;

// --timeout

if (program.timeout) suite.timeout(program.timeout);

// files

var files = program.args
, re = /\.js$/;

// coffee-script support

try {
require('coffee-script');
re = /\.(js|coffee)$/;
} catch (err) {
// ignore
}

// default files to test/*.{js,coffee}

if (!files.length) {
files = fs.readdirSync('test').filter(function(path){
return path.match(re);
}).map(function(path){
return join('test', path);
});
}

// resolve

files = files.map(function(path){
path = require.resolve(join(cwd, path));
return path;
});

// --watch

if (program.watch) {
console.log();
hideCursor();
process.on('SIGINT', function(){
showCursor();
console.log('\n');
process.exit();
});

var frames = [
' \033[96m◜ \033[90mwatching\033[0m'
, ' \033[96m◠ \033[90mwatching\033[0m'
, ' \033[96m◝ \033[90mwatching\033[0m'
, ' \033[96m◞ \033[90mwatching\033[0m'
, ' \033[96m◡ \033[90mwatching\033[0m'
, ' \033[96m◟ \033[90mwatching\033[0m'
];

play(frames);

mocha.watch(files, function(){
stop()
suite = suite.clone();
ui = interfaces[program.ui](suite);
load(files, function(){
run(suite, function(){
play(frames);
});
});
});

return;
}

// load

load(files, function(){
run(suite, process.exit);
});

// require test files before
// running the root suite

function load(files, fn) {
var pending = files.length;
files.forEach(function(file){
delete require.cache[file];
suite.emit('pre-require', global, file);
suite.emit('require', require(file), file);
suite.emit('post-require', global, file);
--pending || fn();
});
}

// run the given suite

function run(suite, fn) {
suite.emit('run');
var runner = new Runner(suite);
var reporter = new Reporter(runner);
runner.globals(program.globals);
if (program.ignoreLeaks) runner.ignoreLeaks = true;
if (program.grep) runner.grep(new RegExp(program.grep));
if (program.growl) growl(runner, reporter);
runner.run(fn);
}

// enable growl notifications

function growl(runner, reporter) {
runner.on('end', function(){
var stats = reporter.stats;
if (stats.failures) {
var msg = stats.failures + ' of ' + runner.total + ' tests failed';
notify(msg, { title: 'Failed', image: images.fail });
} else {
notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', {
title: 'Passed'
, image: images.pass
});
}
});
}

/**
* Parse list.
*/

function list(str) {
return str.split(/ *, */);
}

/**
* Hide the cursor.
*/

function hideCursor(){
process.stdout.write('\033[?25l');
};

/**
* Show the cursor.
*/

function showCursor(){
process.stdout.write('\033[?25h');
};

/**
* Stop play()ing.
*/

function stop() {
process.stdout.write('\033[2K');
clearInterval(play.timer);
}

/**
* Play the given array of strings.
*/

function play(arr, interval) {
var len = arr.length
, interval = interval || 100
, i = 0;

play.timer = setInterval(function(){
var str = arr[i++ % len];
process.stdout.write('\r' + str);
}, interval);
}
Loading

0 comments on commit 221a3c0

Please sign in to comment.