bin/jaribu
#!/usr/bin/env node
// -*- mode:js; js-indent-level:2 -*-
(function (undefined) {
"use strict";
var walk = require('walk'),
requirejs = require('requirejs'),
files = [],
cwd = process.cwd(),
argv = process.argv.slice(2),
jaribuDir = __dirname + '/../',
appDir = __dirname + '/../',
requestedFiles;
if (__dirname.match(/node_modules\/jaribu\/bin$/)) {
// we're a node module, set the require root
// to the root of the app, not this module.
appDir = __dirname + '/../../../';
}
console.log('jaribu is in: ' + jaribuDir);
console.log('app is in: ' + appDir);
requirejs.config({
//Pass the top-level main.js/index.js require
//function to requirejs so that node modules
//are loaded relative to the top-level JS file.
baseUrl: appDir,
paths: {
jaribu: jaribuDir,
'jaribu/colors': jaribuDir + '/lib/colors',
'jaribu/display': jaribuDir + '/lib/display',
'jaribu/tools/Env': jaribuDir + '/lib/tools/Env',
'jaribu/Scaffolding': jaribuDir + '/lib/Scaffolding',
'jaribu/Test': jaribuDir + '/lib/Test',
'jaribu/Suite': jaribuDir + '/lib/Suite',
'jaribu/helpers': jaribuDir + '/lib/helpers',
'jaribu/tools/Write': jaribuDir + '/lib/tools/Write',
'jaribu/tools/result': jaribuDir + '/lib/tools/result',
'jaribu/tools/assert': jaribuDir + '/lib/tools/assert',
'jaribu/tools/assertType': jaribuDir + '/lib/tools/assertType',
'jaribu/fakes/Stub': jaribuDir + '/lib/fakes/Stub',
'jaribu/fakes/remoteStorageMock': jaribuDir + '/lib/fakes/remoteStorageMock',
'jaribu/tools/HttpServer': jaribuDir + '/lib/tools/HttpServer',
'jaribu/tools/Throws': jaribuDir + '/lib/tools/Throws',
'jaribu/tools/WebSocketClient': jaribuDir + '/lib/tools/WebSocketClient',
'jaribu/tools/WebSocketServer': jaribuDir + '/lib/tools/WebSocketServer',
'jaribu/testlib2': jaribuDir + '/lib/testlib2',
'jaribu/testlib': jaribuDir + '/lib/testlib'
},
nodeRequire: require
});
if (argv.length > 0) {
requestedFiles = {};
argv.forEach(function (arg) {
var path = arg[0] == '/' ? arg : (cwd + '/' + arg);
requestedFiles[path] = true;
});
}
// Walker options
var walker = walk.walk(cwd + '/test', { followLinks: false });
walker.on('file', function (root, stat, next) {
var path = root + '/' + stat.name;
if (stat.name.match(/\-suite\.js$/g)) {
// Add this file to the list of files
if ((! requestedFiles) || requestedFiles[path]) {
files.push(path);
}
} else if ((requestedFiles) && (requestedFiles[path])) {
files.push(path);
}
next();
});
walker.on('end', function () {
files = files.sort();
console.log(files);
var jaribu = requirejs('jaribu/lib/jaribu');
var failedToLoad = [];
var len_files = files.length;
if (files.length === 0) {
console.log('no tests found to run');
return;
}
for (var i = 0; i < len_files; i += 1) {
var s = requirejs(files[i]);
var suites = [];
if (typeof s === 'undefined') {
console.error('expected an array of tests, but got \'undefined\' from file: ' + files[i]);
failedToLoad.push({
desc: files[i],
error: 'unable to read suite data from file'
});
continue;
} else if ((s.hasOwnProperty('name')) && (typeof s.name !== 'undefined')) {
suites.push(s);
} else {
suites = s;
}
for (var n = 0, nlen = suites.length; n < nlen; n += 1) {
if (! jaribu.loadSuite(suites[n]) ) {
console.error("\n" + 'unable to load suite: ' + suites[n].desc);
console.error(jaribu.getErrorMessage());
failedToLoad.push({ 'desc': suites[n].desc, 'error': jaribu.getErrorMessage() });
}
}
}
jaribu.begin(function () {
// on complete
for (var i = 0, len = failedToLoad.length; i < len; i += 1) {
console.log("\nsuite failed to load: " + failedToLoad[i].desc);
console.log(failedToLoad[i].error);
}
console.log("\n");
});
});
}());