blob: c58ee40a69c03ae5cacd1a7e0825ff189e86da8a [file] [log] [blame]
/*!
* Nodeunit
*
* @author Alisue (lambdalisue@hashnote.net)
* @url http://hashnote.net/
*
* Copyright (c) 2011 Alisue
* MIT Licensed
*/
/**
* Module dependencies
*/
var nodeunit = require('../nodeunit'),
utils = require('../utils'),
fs = require('fs'),
track = require('../track'),
path = require('path'),
AssertionError = require('../assert').AssertionError;
/**
* Reporter info string
*/
exports.info = "Tests reporter for machinally analysis";
/**
* Run all tests within each module, reporting the results to the command-line.
*
* @param {Array} files
* @api public
*/
exports.run = function (files, options, callback) {
// options doesn't effect
var parseStack = function (stack, delimiter) {
var parseTrace = function (trace) {
var filename, row, column;
pattern1 = /\s{4}at\s\S+\s\(([^:]+):(\d+):(\d+)\)/;
pattern2 = /\s{4}at\s([^:]+):(\d+):(\d+)/;
if (trace.match(pattern1) !== null) {
filename = RegExp.$1;
row = RegExp.$2;
column = RegExp.$3;
} else if (trace.match(pattern2) !== null) {
filename = RegExp.$1;
row = RegExp.$2;
column = RegExp.$3;
} else {
throw new Error("Could not parse a line of stack trace: " + trace);
}
return {filename: filename, row: row, column: column};
};
if (delimiter === undefined) {
delimiter = ':';
}
traceback = stack.split('\n');
firstline = traceback.shift();
trace = parseTrace(traceback[0]);
return {filename: trace.filename, row: trace.row, column: trace.column, message: firstline};
};
var createErrorMessage = function(type, name, filename, row, column, message){
return [type, name, filename, row, column, message].join(":");
};
var paths = files.map(function (p) {
return path.resolve(p);
});
var tracker = track.createTracker(function (tracker) {
if (tracker.unfinished()) {
var names = tracker.names();
for (var i = 0; i < names.length; i += 1) {
console.log(createErrorMessage(
'Error', names[i],
'', '', '',
'Undone tests - To fix this, make sure all tests call test.done()'
));
}
process.reallyExit(tracker.unfinished());
}
});
nodeunit.runFiles(paths, {
testspec: options.testspec,
testFullSpec: options.testFullSpec,
moduleStart: function (name) {},
testDone: function (name, assertions) {
tracker.remove(name);
if (assertions.failures()) {
assertions.forEach(function (a) {
var stacks, message, filename, row, column;
if (a.failed()) {
stackinfo = parseStack(a.error.stack, ':');
console.log(createErrorMessage(
'Fail', name, stackinfo.filename,
stackinfo.row, stackinfo.column, stackinfo.message));
}
});
}
},
done: function (assertions, end) {
if (callback) callback(assertions.failures() ? new Error('We have got test failures.') : undefined);
},
testStart: function(name) {
tracker.put(name);
}
});
};