123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- var path = require('path');
- var fs = require('fs');
- var nodeunit = require('nodeunit');
- var filepaths = fs.readdirSync('test').map(function(filename) {
- return path.join('test', filename);
- });
- var unfinished = {};
- var currentModule;
- function sendMessage(message) {
- process.stdout.write(JSON.stringify(message) + '\n');
- }
- // If an exception is thrown, let the parent process know and exit.
- process.on('uncaughtException', function (e) {
- sendMessage({error: [e.name, e.message, e.stack]});
- process.exit();
- });
- // If Nodeunit explodes because a test was missing test.done(), handle it.
- var unfinished = {};
- process.on('exit', function (e) {
- var len = Object.keys(unfinished).length
- if (len > 0) {
- sendMessage({exit: ['UNFINISHED']});
- // process.reallyExit(len);
- } else {
- sendMessage({exit: ['finished']});
- }
- // process.exit();
- });
- nodeunit.reporters.test = {
- run: function(files, options, callback) {
- // Nodeunit needs absolute paths.
- var paths = files.map(function (filepath) {
- return path.resolve(filepath);
- });
- nodeunit.runFiles(paths, {
- // No idea.
- testspec: undefined,
- // Executed when the first test in a file is run. If no tests exist in
- // the file, this doesn't execute.
- moduleStart: function(name) {
- // Keep track of this so that moduleDone output can be suppressed in
- // cases where a test file contains no tests.
- currentModule = name;
- // Send back to the parent process.
- sendMessage({moduleStart: [name.toString()]});
- },
- // Executed after a file is done being processed. This executes whether
- // tests exist in the file or not.
- moduleDone: function(name) {
- // Abort if no tests actually ran.
- if (name !== currentModule) { return; }
- // Send back to the parent process.
- sendMessage({moduleDone: [name.toString()]});
- },
- // Executed before each test is run.
- testStart: function(name) {
- // Keep track of the current test, in case test.done() was omitted
- // and Nodeunit explodes.
- unfinished[name] = name;
- // Send back to the parent process.
- sendMessage({testStart: [name.toString()]});
- },
- // Executed after each test and all its assertions are run.
- testDone: function(name, assertions) {
- delete unfinished[name];
- // Send back to the parent process.
- sendMessage({testDone: [
- name.toString(),
- assertions.failures(),
- assertions.map(function(assertion) {
- var e = assertion.error;
- if (e) {
- assertion.error = {
- name: e.name,
- message: e.message,
- stack: e.stack
- };
- }
- return assertion;
- })
- ]});
- },
- // Executed when everything is all done.
- done: function (assertions) {
- // Send back to the parent process.
- sendMessage({done: [
- assertions.failures(),
- assertions.duration,
- assertions
- ]});
- }
- });
- }
- }
- nodeunit.reporters.test.run(filepaths, {});
|