/* * a node.js test runner that executes all conformance * tests and outputs results to console. * Process returns zero on success, non-zero on failure. */ const fs = require('fs'), path = require('path'), jsonselect = require('../jsonselect.js'), sys = require('sys'); var pathToTests = path.join(__dirname, "tests"); // a map: document nametest name -> list of se var numTests = 0; var numPassed = 0; var tests = {}; function runOneSync(name, selname, p) { var testDocPath = path.join(p, name + ".json"); var selDocPath = path.join(p, name + '_' + selname + ".selector"); var outputDocPath = selDocPath.replace(/selector$/, "output"); // take `obj`, apply `sel, get `got`, is it what we `want`? var obj = JSON.parse(fs.readFileSync(testDocPath)); var want = String(fs.readFileSync(outputDocPath)).trim(); var got = ""; var sel = String(fs.readFileSync(selDocPath)).trim(); try { jsonselect.forEach(sel, obj, function(m) { got += JSON.stringify(m, undefined, 4) + "\n"; }); } catch(e) { got = e.toString(); if (want.trim() != got.trim()) throw e; } if (want.trim() != got.trim()) throw "mismatch"; } function runTests() { console.log("Running Tests:"); for (var l in tests) { for (var d in tests[l]) { console.log(" level " + l + " tests against \"" + d + ".json\":"); for (var i = 0; i < tests[l][d].length; i++) { sys.print(" " + tests[l][d][i][0] + ": "); try { runOneSync(d, tests[l][d][i][0], tests[l][d][i][1]); numPassed++; console.log("pass"); } catch (e) { console.log("fail (" + e.toString() + ")"); } } } } console.log(numPassed + "/" + numTests + " passed"); process.exit(numPassed == numTests ? 0 : 1); } // discover all tests var pathToTests = path.join(__dirname, "tests"); fs.readdirSync(pathToTests).forEach(function(subdir) { var p = path.join(pathToTests, subdir); if (!fs.statSync(p).isDirectory()) return; var l = /^level_([\d+])$/.exec(subdir); if (!l) return; l = l[1]; var files = fs.readdirSync(p); for (var i = 0; i < files.length; i++) { var f = files[i]; var m = /^([A-Za-z]+)_(.+)\.selector$/.exec(f); if (m) { if (!tests.hasOwnProperty(l)) tests[l] = []; if (!tests[l].hasOwnProperty(m[1])) tests[l][m[1]] = []; numTests++; tests[l][m[1]].push([m[2], p]); } } }); runTests();