From 03d95cda2cd4f553001b111502406ff0bc3ed003 Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Mon, 24 Sep 2012 11:50:03 +0200 Subject: [PATCH] Make tests runnable under node --- test/driver.js | 107 +++++++++++++++++++++++++------------------------ test/run.js | 14 +++++++ test/tests.js | 5 +++ 3 files changed, 74 insertions(+), 52 deletions(-) create mode 100644 test/run.js diff --git a/test/driver.js b/test/driver.js index d587fd3cc1..78cc8e4328 100644 --- a/test/driver.js +++ b/test/driver.js @@ -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); diff --git a/test/run.js b/test/run.js new file mode 100644 index 0000000000..282b13325f --- /dev/null +++ b/test/run.js @@ -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."); diff --git a/test/tests.js b/test/tests.js index 157537b501..d3d7779da7 100644 --- a/test/tests.js +++ b/test/tests.js @@ -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: {