j2s/tests/index.js

82 lines
2.2 KiB
JavaScript

function assert(cond, msg, locDepth) {
if (locDepth < 0 || locDepth === undefined) locDepth = 0;
if (!cond) {
log('Assert failed', (typeof locDepth === 'string' ? locDepth : Error().stack[locDepth + 1]) + ': ', msg);
return false;
}
return true;
}
function assertMatch(expected, actual, depth, msg) {
if (!match(expected, actual, depth)) {
log('Assert failed', Error().stack[1] + ': ', msg);
log('Expected:', expected);
log('Actual:', actual);
return false;
}
return true;
}
function match(expected, actual, depth) {
if (!Array.isArray(expected) || !Array.isArray(actual)) return expected === actual;
else if (expected.length !== actual.length) return false;
else if (depth === undefined) depth = Infinity;
else if (depth < 0) depth = 0;
for (var i = 0; i < expected.length; i++) {
if (!(i in expected) || !(i in actual)) return !(i in expected) && !(i in actual);
if (
expected[i] === actual[i] ||
depth > 0 &&
Array.isArray(expected) &&
Array.isArray(actual) &&
match(expected[i], actual[i], depth - 1)
) continue;
return false;
}
return true;
}
/** @class */ function UnitTest(msg, exec) {
this.name = msg;
this.exec = exec;
this.subtests = [];
}
UnitTest.prototype.run = function(path) {
if (path === undefined) path = [];
path.push(this.name);
var res = true;
if (typeof this.exec === 'function') {
var res = true, err = 'exec() returned false.';
try {
if (this.exec() === false) res = false;
}
catch (e) { res = false; err = e; }
res &= assert(res, path.join('/') + ': ' + err, this.exec.location());
}
for (var i = 0; i < this.subtests.length; i++) {
res &= this.subtests[i].run(path);
}
path.pop();
return res;
}
UnitTest.prototype.add = function(test, exec) {
if (test instanceof UnitTest) this.subtests.push(test);
else this.subtests.push(new UnitTest(test, exec));
return this;
}
return function() {
if (
require('arithmetics/index.js').run() &&
require('array/index.js').run()
) log('All tests passed!');
exit();
}