294 lines
7.2 KiB
Plaintext
294 lines
7.2 KiB
Plaintext
|
#!/usr/bin/env node
|
||
|
|
||
|
var nodeunit = require('nodeunit'),
|
||
|
fs = require('fs'),
|
||
|
path = require('path'),
|
||
|
AssertionError = require('assert').AssertionError;
|
||
|
|
||
|
var optimist = require('optimist')
|
||
|
.usage('Run the jsdom test suite')
|
||
|
.alias('s', 'suites')
|
||
|
.string('s')
|
||
|
.describe('s', 'suites that you want to run. ie: -s level1/core,1/html,html')
|
||
|
.alias('f', 'fail-fast')
|
||
|
.describe('f', 'stop on the first failed test')
|
||
|
.alias('h', 'help')
|
||
|
.describe('h', 'show the help')
|
||
|
.alias('t', 'tests')
|
||
|
.describe('t', 'choose the test cases to run. ie: -t jquery')
|
||
|
.alias('d', 'debug')
|
||
|
.describe('d', 'run in node\'s interactive debugger mode')
|
||
|
.alias('p', 'parser')
|
||
|
.describe('p', 'the HTML parser to use (e.g. html5); default is htmlparser')
|
||
|
.alias('v', 'verbose')
|
||
|
.describe('v', 'show all tests that are being run');
|
||
|
|
||
|
var argv = optimist.argv;
|
||
|
if (argv.help) {
|
||
|
optimist.showHelp();
|
||
|
process.exit();
|
||
|
}
|
||
|
|
||
|
|
||
|
var totalTests = 0;
|
||
|
var failedTests = 0;
|
||
|
var passedTests = 0;
|
||
|
var modules = {};
|
||
|
var currentModule = "";
|
||
|
var moduleIndex = 0;
|
||
|
var start = new Date().getTime();
|
||
|
var fileFilter = [];
|
||
|
var testFilter = [];
|
||
|
|
||
|
Error.stackTraceLimit = 100;
|
||
|
|
||
|
|
||
|
if (argv.suites) {
|
||
|
fileFilter = argv.suites.replace(/\s/g, '').split(',');
|
||
|
}
|
||
|
|
||
|
if (argv.tests) {
|
||
|
testFilter = argv.tests.replace(/\s/g, '').split(',');
|
||
|
}
|
||
|
|
||
|
var assert = require('nodeunit/lib/assert');
|
||
|
require('nodeunit/lib/assert').equal = function equal(actual, expected, message) {
|
||
|
if (actual != expected) {
|
||
|
if (actual && actual.nodeType) {
|
||
|
actual = actual.toString();
|
||
|
}
|
||
|
|
||
|
if (expected && expected.nodeType) {
|
||
|
expected = expected.toString();
|
||
|
}
|
||
|
|
||
|
assert.fail(actual, expected, message, '==', assert.equal);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
assert.domSame = function(actual, expected, message) {
|
||
|
if(expected != actual) {
|
||
|
assert.equal(expected.nodeType, actual.nodeType);
|
||
|
assert.equal(expected.nodeValue, actual.nodeValue);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var files = [
|
||
|
"level1/core.js",
|
||
|
"level1/html.js",
|
||
|
"level1/svg.js",
|
||
|
"level2/core.js",
|
||
|
"level2/html.js",
|
||
|
"level2/style.js",
|
||
|
"level2/extra.js",
|
||
|
"level2/events.js",
|
||
|
//"level3/core.js",
|
||
|
//"level3/ls.js",
|
||
|
"level3/xpath.js",
|
||
|
"whatwg/attributes.js",
|
||
|
"window/index.js",
|
||
|
"window/history.js",
|
||
|
"window/script.js",
|
||
|
"window/console.js",
|
||
|
"window/frame.js",
|
||
|
"sizzle/index.js",
|
||
|
"jsdom/index.js",
|
||
|
"jsdom/parsing.js",
|
||
|
"jsdom/env.js",
|
||
|
"jsdom/utils.js",
|
||
|
"jsonp/jsonp.js",
|
||
|
"browser/css.js",
|
||
|
"browser/index.js"
|
||
|
];
|
||
|
|
||
|
if (fileFilter.length > 0) {
|
||
|
files = files.filter(function(val) {
|
||
|
var ok = false;
|
||
|
fileFilter.forEach(function(v) {
|
||
|
if (val.indexOf(v) > -1) {
|
||
|
ok = true;
|
||
|
}
|
||
|
});
|
||
|
return ok;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
|
||
|
var modules = {};
|
||
|
var modulesToRun = {};
|
||
|
|
||
|
files.map(function (p) {
|
||
|
var required = require(path.join(__dirname, p));
|
||
|
var module = required.tests || required;
|
||
|
var filteredModule = {};
|
||
|
|
||
|
if (testFilter.length) {
|
||
|
var moduleKeys = Object.keys(module);
|
||
|
testFilter.forEach(function(filter) {
|
||
|
filter = filter.toLowerCase();
|
||
|
moduleKeys.forEach(function(moduleKey) {
|
||
|
if (moduleKey.toLowerCase().indexOf(filter) > -1) {
|
||
|
filteredModule[moduleKey] = module[moduleKey];
|
||
|
}
|
||
|
});
|
||
|
});
|
||
|
module = filteredModule;
|
||
|
}
|
||
|
|
||
|
if (module && Object.keys(module).length > 0) {
|
||
|
modulesToRun[p] = module;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (argv.parser) {
|
||
|
var browser = require("../lib/jsdom/browser/index");
|
||
|
console.log("Using parser " + argv.parser);
|
||
|
browser.setDefaultParser(argv.parser);
|
||
|
}
|
||
|
|
||
|
nodeunit.runModules(modulesToRun, {
|
||
|
moduleStart: function (name) {
|
||
|
currentModule = name.replace('.js', '');
|
||
|
console.log("running", name, currentModule);
|
||
|
modules[currentModule] = {
|
||
|
total : 0,
|
||
|
fail : 0,
|
||
|
pass : 0
|
||
|
};
|
||
|
moduleIndex++;
|
||
|
},
|
||
|
moduleDone: function (name, assertions) {
|
||
|
if (argv['verbose']) {
|
||
|
console.log(' ');
|
||
|
}
|
||
|
},
|
||
|
testStart: function (test) {
|
||
|
modules[currentModule].total++;
|
||
|
if (argv['verbose']) {
|
||
|
process.stdout.write(' ' + test[0] + ' ...');
|
||
|
}
|
||
|
},
|
||
|
testDone: function (test, assertions) {
|
||
|
if (argv['verbose']) {
|
||
|
console.log(' done');
|
||
|
}
|
||
|
totalTests++;
|
||
|
if (!assertions.failures()) {
|
||
|
passedTests++;
|
||
|
modules[currentModule].pass++;
|
||
|
}
|
||
|
else {
|
||
|
failedTests++;
|
||
|
modules[currentModule].fail++;
|
||
|
|
||
|
console.log('✖ ' + currentModule + '/' + test);
|
||
|
assertions.forEach(function (a) {
|
||
|
if (a.failed()) {
|
||
|
if (a.error instanceof AssertionError) {
|
||
|
a = nodeunit.utils.betterErrors(a);
|
||
|
if (a.message) {
|
||
|
console.log(
|
||
|
'Assertion Message: ' + assertion_message(a.message) + '\n' +
|
||
|
'expected:', a.error.expected, 'got:', a.error.actual
|
||
|
);
|
||
|
}
|
||
|
} else {
|
||
|
if (a.error.expected || a.error.actual) {
|
||
|
console.log('\nERROR', a.error.expected, 'vs', a.error.actual, '\n');
|
||
|
}
|
||
|
|
||
|
console.log(a.error.message, a.error.stack, (new Error()).stack);
|
||
|
}
|
||
|
} else {
|
||
|
console.log(a.message);
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (argv['fail-fast']) {
|
||
|
process.exit();
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
done: function (assertions) {
|
||
|
var end = new Date().getTime();
|
||
|
var duration = end - start;
|
||
|
var maxWidths = {
|
||
|
name : 0,
|
||
|
ratio : 0,
|
||
|
percent : 4
|
||
|
};
|
||
|
var width = 0;
|
||
|
var keys = Object.keys(modules);
|
||
|
|
||
|
var calculateMax = function(name, value) {
|
||
|
if (!maxWidths[name] || value.length > maxWidths[name]) {
|
||
|
maxWidths[name] = value.length;
|
||
|
}
|
||
|
|
||
|
width = 2;
|
||
|
Object.keys(maxWidths).forEach(function(v) {
|
||
|
width += maxWidths[v] + 2;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
var pad = function(name, value, rightJustified) {
|
||
|
var ret = '';
|
||
|
var padding = '';
|
||
|
|
||
|
var amount = maxWidths[name] - value.length;
|
||
|
while(amount--) {
|
||
|
padding += " ";
|
||
|
}
|
||
|
|
||
|
if (rightJustified) {
|
||
|
return ' ' + padding + value + ' ';
|
||
|
} else {
|
||
|
return ' ' + value + padding + ' ';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// First pass, calculate the max widths
|
||
|
keys.forEach(function(v) {
|
||
|
var module = modules[v];
|
||
|
var ratio = module.pass + '/' + module.total;
|
||
|
var percentage = Math.floor((module.pass/module.total)*100) + '%';
|
||
|
modules[v].ratio = ratio;
|
||
|
modules[v].percentage = percentage;
|
||
|
calculateMax('name', v);
|
||
|
calculateMax('ratio', ratio);
|
||
|
calculateMax('percentage', percentage);
|
||
|
});
|
||
|
|
||
|
var caps = '';
|
||
|
var gen = width;
|
||
|
|
||
|
while(gen--) {
|
||
|
caps += '-';
|
||
|
}
|
||
|
|
||
|
console.log('');
|
||
|
Object.keys(modules).forEach(function(v) {
|
||
|
var module = modules[v];
|
||
|
process.stdout.write(pad('name', v, false));
|
||
|
process.stdout.write(pad('ratio', module.ratio, true));
|
||
|
process.stdout.write(pad('percentage', module.percentage, true));
|
||
|
process.stdout.write('\n');
|
||
|
});
|
||
|
console.log(caps);
|
||
|
var ratio = failedTests + '/' + totalTests;
|
||
|
var percent = 0;
|
||
|
if (totalTests === 0) {
|
||
|
percent = '100%';
|
||
|
} else {
|
||
|
percent = Math.floor((passedTests/totalTests)*100) + '%';
|
||
|
}
|
||
|
console.log('TOTALS: %s failed; %s success', ratio, percent);
|
||
|
console.log('TIME: %dms', duration);
|
||
|
|
||
|
if (passedTests !== totalTests) {
|
||
|
process.exit(1);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
});
|