113 lines
3.5 KiB
JavaScript
Executable File
113 lines
3.5 KiB
JavaScript
Executable File
/*!
|
|
* 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);
|
|
}
|
|
});
|
|
};
|
|
|