| /* |
| * 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(); |