mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
124 lines
3.8 KiB
JavaScript
124 lines
3.8 KiB
JavaScript
var nodePath = require('path');
|
|
var fs = require('fs');
|
|
|
|
var StringBuilder = require('raptor-strings/StringBuilder');
|
|
|
|
var ONLY_TEST = process.env.TEST;
|
|
|
|
// We provide a simple way to run a single test by allowing
|
|
// a "TEST=<test_name>" environment variable
|
|
//
|
|
// TEST=if-else npm run test-fast
|
|
|
|
function createTestRender(options) {
|
|
var extname = options.ext || '.marko';
|
|
|
|
return function testRender(dir, templateData, expectedFile, options, done) {
|
|
var templatePath = nodePath.join(dir, 'template' + extname);
|
|
if (!expectedFile) {
|
|
expectedFile = nodePath.join(dir, 'expected.html');
|
|
}
|
|
|
|
var actualPath = nodePath.join(dir, 'actual.html');
|
|
options = options || {};
|
|
|
|
// if (foundDirs[dir]) {
|
|
// console.log('DUPLICATE DIRECTORY: ' + dir);
|
|
// }
|
|
// foundDirs[dir] = true;
|
|
|
|
var marko = require('../');
|
|
|
|
require('../compiler').defaultOptions.checkUpToDate = false;
|
|
|
|
var AsyncWriter = marko.AsyncWriter;
|
|
var out = options.out || new AsyncWriter(new StringBuilder());
|
|
|
|
marko.render(templatePath, templateData, out)
|
|
.on('finish', function() {
|
|
var output = out.getOutput();
|
|
|
|
fs.writeFileSync(actualPath, output, {encoding: 'utf8'});
|
|
|
|
var expected;
|
|
try {
|
|
expected = options.expected || fs.readFileSync(expectedFile, {encoding: 'utf8'});
|
|
}
|
|
catch(e) {
|
|
expected = 'TBD';
|
|
fs.writeFileSync(expectedFile, expected, {encoding: 'utf8'});
|
|
}
|
|
|
|
if (output !== expected) {
|
|
throw new Error('Unexpected output for "' + templatePath + '":\nEXPECTED (' + expectedFile + '):\n---------\n' + expected +
|
|
'\n---------\nACTUAL (' + actualPath + '):\n---------\n' + output + '\n---------');
|
|
}
|
|
|
|
done();
|
|
})
|
|
.on('error', done)
|
|
.end();
|
|
|
|
};
|
|
}
|
|
|
|
exports.loadRenderTests = function(dirname, desc, options) {
|
|
var testRender = createTestRender(options);
|
|
|
|
function loadTest(testInfo, desc, basename, dir) {
|
|
it(desc, function(done) {
|
|
var templateData;
|
|
|
|
if (testInfo.getTemplateData) {
|
|
templateData = testInfo.getTemplateData();
|
|
} else {
|
|
templateData = testInfo.templateData;
|
|
}
|
|
|
|
var expectedFile = testInfo.expectedFile;
|
|
|
|
if (!expectedFile) {
|
|
expectedFile = nodePath.join(dir, 'expected.html');
|
|
}
|
|
|
|
var testOptions = testInfo.options;
|
|
|
|
testRender(dir, templateData || {}, expectedFile, testOptions, done);
|
|
});
|
|
}
|
|
|
|
describe(desc, function() {
|
|
dirname = nodePath.join(__dirname, dirname);
|
|
|
|
var testDirs = fs.readdirSync(dirname);
|
|
testDirs.forEach(function(testDir) {
|
|
var basename = testDir;
|
|
|
|
if (ONLY_TEST && basename !== ONLY_TEST) {
|
|
return;
|
|
}
|
|
|
|
testDir = nodePath.join(dirname, testDir);
|
|
|
|
var testInfoFile = nodePath.join(testDir, 'test.js');
|
|
if (!fs.existsSync(testInfoFile)) {
|
|
return;
|
|
}
|
|
|
|
var testInfo = require(testInfoFile);
|
|
if (testInfo.tests) {
|
|
testInfo.tests.forEach(function(testInfo, i) {
|
|
var desc = testInfo.desc;
|
|
|
|
if (!desc) {
|
|
desc = basename + '(' + (i+1) + ')';
|
|
}
|
|
loadTest(testInfo, desc, basename, testDir);
|
|
});
|
|
} else {
|
|
loadTest(testInfo, testInfo.desc || basename, basename, testDir);
|
|
}
|
|
|
|
});
|
|
});
|
|
}; |