taper
Version:
Taper (a fork of tapr) is a tap test runner that shows an appropriate level of detail with colorized output.
90 lines (72 loc) • 2.38 kB
JavaScript
var cp = require('child_process'),
concat = require('concat-stream'),
fs = require('fs'),
path = require('path'),
tape = require('tape');
var bin = path.join(__dirname, '..', '..', 'bin', 'taper.js');
fs.readdir(path.join(__dirname, '..'), function(err, files) {
if (err) throw err;
var toProcess = [];
files.forEach(function(f) {
if (/\.(js|coffee|tap)$/.test(f)) {
processFile(path.join(__dirname, '..', f));
}
});
});
function getExpectedFilename(f, k) {
return path.join(
path.dirname(f),
'expected',
path.basename(f) + '.' + k + '.txt');
}
function removePathsAndLineNumbers(f, s) {
s = s.toString();
if (!/\.tap$/.test(f)) {
s = s
.replace(new RegExp('/.*/', 'g'), '<FILE_PATH>/')
.replace(/\d+:\d+(\)?)$/gm, '<LINE:COL>$1');
}
return s;
}
function processFile(f) {
tape(f, function(t) {
var actual = {
stdout : '',
stderr : ''
},
expected = {
stdout : '',
stderr : ''
};
for (var k in expected) {
try {
expected[k] = fs.readFileSync(getExpectedFilename(f, k), 'utf8');
} catch (err) { }
}
expected.fail = /fail/.test(path.basename(f));
var taper = cp.spawn('node', [bin, '--timeout', '1000', f], { stdio : 'pipe' });
taper.stdout.pipe(concat(function(stdout) {
actual.stdout = removePathsAndLineNumbers(f, stdout);
}));
taper.stderr.pipe(concat(function(stderr) {
actual.stderr = removePathsAndLineNumbers(f, stderr);
}));
taper.on('close', function(code, signal) {
if (expected.fail) {
t.notEqual(code, 0, 'expect test failure');
} else {
t.equal(code, 0, 'expect test success');
}
if (process.env.SAVE_OUTPUT_AS_EXPECTED) {
for (var k in actual) {
fs.writeFileSync(getExpectedFilename(f, k), actual[k]);
}
}
for (var k in actual) {
t.equal(actual[k].trim(), expected[k].trim(), k + ' matches expected');
}
t.end();
});
});
}