| /*! |
| * 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); |
| } |
| }); |
| }; |
| |