marko/test/autotest.js
2017-02-09 14:34:55 -08:00

113 lines
3.3 KiB
JavaScript

'use strict';
var fs = require('fs');
var enabledTest = process.env.TEST;
var updateExpectations = process.env.hasOwnProperty('UPDATE_EXPECTATIONS');
var path = require('path');
var assert = require('assert');
var enabledTestNames = enabledTest && enabledTest.split(/[\s*,\s*/]/);
var enabledTests = null;
if (enabledTestNames && enabledTestNames.length > 1) {
enabledTests = {};
enabledTest = null;
enabledTestNames.forEach((testName) => {
enabledTests[testName] = true;
});
}
function compareHelper(dir, actual, prefix, suffix) {
var actualPath = path.join(dir, prefix + 'actual' + suffix);
var expectedPath = path.join(dir, prefix + 'expected' + suffix);
var isObject = typeof actual === 'string' ? false : true;
var actualString = isObject ? JSON.stringify(actual, null, 4) : actual;
fs.writeFileSync(actualPath, actualString, { encoding: 'utf8' });
var expectedString;
try {
expectedString = fs.readFileSync(expectedPath, { encoding: 'utf8' });
} catch(e) {
expectedString = isObject ? '"TBD"' : 'TBD';
fs.writeFileSync(expectedPath, expectedString, {encoding: 'utf8'});
}
actual = isObject ? JSON.parse(actualString) : actualString.replace(/\r?\n$/, '');
var expected = isObject ? JSON.parse(expectedString) : expectedString.replace(/\r?\n$/, '');
try {
assert.deepEqual(actual, expected);
} catch(e) {
if (updateExpectations) {
fs.writeFileSync(expectedPath, actualString, { encoding: 'utf8' });
} else {
throw e;
}
}
}
function autoTest(name, dir, run, options, done) {
options = options || {};
var helpers = {
compare(actual, prefix, suffix) {
if (typeof prefix === 'object') {
var options = prefix;
prefix = options.prefix;
suffix = options.suffix;
} else if (arguments.length === 2) {
suffix = prefix;
prefix = null;
}
compareHelper(dir, actual, prefix || '', suffix || '');
}
};
run(dir, helpers, done);
}
exports.scanDir = function(autoTestDir, run, options) {
var testGroup = path.basename(autoTestDir);
var describeFunc = describe;
if(enabledTest && testGroup === enabledTest) {
describeFunc = describe.only;
}
describeFunc('autotest', function() {
if(options && options.timeout) {
this.timeout(options.timeout);
}
fs.readdirSync(autoTestDir)
.forEach(function(name) {
if (name.charAt(0) === '.') {
return;
}
if (name.endsWith('.skip')) {
return;
}
if (enabledTests && !enabledTests[name] && !enabledTests[testGroup] && !enabledTests[testGroup+'/'+name]) {
return;
}
var itFunc = it;
if (enabledTest && (name === enabledTest || testGroup+'/'+name === enabledTest)) {
itFunc = it.only;
}
var dir = path.join(autoTestDir, name);
itFunc(`[${name}] `, function(done) {
autoTest(name, dir, run, options, done);
});
});
});
};