Make tests runnable under node

This commit is contained in:
Marijn Haverbeke 2012-09-24 11:50:03 +02:00
parent 587c790f7b
commit 03d95cda2c
3 changed files with 74 additions and 52 deletions

View File

@ -1,58 +1,61 @@
var tests = [];
(function(exports) {
var tests = [];
var acorn = typeof require == "undefined" ? window.acorn : require("../acorn.js");
function test(code, ast, options) {
tests.push({code: code, ast: ast, options: options});
}
function testFail(code, message, options) {
tests.push({code: code, error: message, options: options});
}
exports.test = function(code, ast, options) {
tests.push({code: code, ast: ast, options: options});
};
exports.testFail = function(code, message, options) {
tests.push({code: code, error: message, options: options});
};
function runTests(callback) {
var opts = {linePositions: true};
for (var i = 0; i < tests.length; ++i) {
var test = tests[i];
try {
var ast = acorn.parse(test.code, test.options || opts);
if (test.error) callback("fail", test.code,
"Expected error message: " + test.error + "\nBut parsing succeeded.");
else {
var mis = misMatch(test.ast, ast);
if (!mis) callback("ok", test.code);
else callback("fail", test.code, mis);
exports.runTests = function(callback) {
var opts = {linePositions: true};
for (var i = 0; i < tests.length; ++i) {
var test = tests[i];
try {
var ast = acorn.parse(test.code, test.options || opts);
if (test.error) callback("fail", test.code,
"Expected error message: " + test.error + "\nBut parsing succeeded.");
else {
var mis = misMatch(test.ast, ast);
if (!mis) callback("ok", test.code);
else callback("fail", test.code, mis);
}
} catch(e) {
if (test.error && e instanceof SyntaxError) {
if (e.message == test.error) callback("ok", test.code);
else callback("fail", test.code,
"Expected error message: " + test.error + "\nGot error message: " + e.message);
} else {
callback("error", test.code, e.message || e.toString());
}
}
} catch(e) {
if (test.error && e instanceof SyntaxError) {
if (e.message == test.error) callback("ok", test.code);
else callback("fail", test.code,
"Expected error message: " + test.error + "\nGot error message: " + e.message);
} else {
callback("error", test.code, e.message || e.toString());
}
};
function ppJSON(v) { return JSON.stringify(v, null, 2); }
function addPath(str, pt) {
if (str.charAt(str.length-1) == ")")
return str.slice(0, str.length-1) + "/" + pt + ")";
return str + " (" + pt + ")";
}
function misMatch(exp, act) {
if (!exp || !act || (typeof exp != "object") || (typeof act != "object")) {
if (exp !== act) return ppJSON(exp) + " !== " + ppJSON(act);
} else if (exp.splice) {
if (!act.slice) return ppJSON(exp) + " != " + ppJSON(act);
if (act.length != exp.length) return "array length mismatch " + exp.length + " != " + act.length;
for (var i = 0; i < act.length; ++i) {
var mis = misMatch(exp[i], act[i]);
if (mis) return addPath(mis, i);
}
} else {
for (var prop in exp) {
var mis = misMatch(exp[prop], act[prop]);
if (mis) return addPath(mis, prop);
}
}
}
}
function ppJSON(v) { return JSON.stringify(v, null, 2); }
function addPath(str, pt) {
if (str.charAt(str.length-1) == ")")
return str.slice(0, str.length-1) + "/" + pt + ")";
return str + " (" + pt + ")";
}
function misMatch(exp, act) {
if (!exp || !act || (typeof exp != "object") || (typeof act != "object")) {
if (exp !== act) return ppJSON(exp) + " !== " + ppJSON(act);
} else if (exp.splice) {
if (!act.slice) return ppJSON(exp) + " != " + ppJSON(act);
if (act.length != exp.length) return "array length mismatch " + exp.length + " != " + act.length;
for (var i = 0; i < act.length; ++i) {
var mis = misMatch(exp[i], act[i]);
if (mis) return addPath(mis, i);
}
} else {
for (var prop in exp) {
var mis = misMatch(exp[prop], act[prop]);
if (mis) return addPath(mis, prop);
}
}
}
})(typeof exports == "undefined" ? window : exports);

14
test/run.js Normal file
View File

@ -0,0 +1,14 @@
var driver = require("./driver.js");
require("./tests.js");
var testsRun = 0, failed = 0;
function report(state, code, message) {
if (state != "ok") {++failed; console.log(code, message);}
++testsRun;
}
var t0 = +new Date;
driver.runTests(report);
console.log(testsRun + " tests run in " + (+new Date - t0) + "ms");
if (failed) console.log(failed + " failures.");
else console.log("All passed.");

View File

@ -1,6 +1,11 @@
// Tests largely based on those of Esprima
// (http://esprima.org/test/)
if (typeof exports != "undefined") {
var test = require("./driver.js").test;
var testFail = require("./driver.js").testFail;
}
test("this\n", {
type: "Program",
start: {