101 lines
2.7 KiB
JavaScript
101 lines
2.7 KiB
JavaScript
|
var Stream = require('stream');
|
||
|
var json = typeof JSON === 'object' ? JSON : require('jsonify');
|
||
|
|
||
|
module.exports = Render;
|
||
|
|
||
|
function Render () {
|
||
|
Stream.call(this);
|
||
|
this.readable = true;
|
||
|
this.count = 0;
|
||
|
this.fail = 0;
|
||
|
this.pass = 0;
|
||
|
}
|
||
|
|
||
|
Render.prototype = new Stream;
|
||
|
|
||
|
Render.prototype.pipe = function () {
|
||
|
this.piped = true;
|
||
|
return Stream.prototype.pipe.apply(this, arguments);
|
||
|
};
|
||
|
|
||
|
Render.prototype.begin = function () {
|
||
|
this.emit('data', 'TAP version 13\n');
|
||
|
};
|
||
|
|
||
|
Render.prototype.push = function (t) {
|
||
|
var self = this;
|
||
|
this.emit('data', '# ' + t.name + '\n');
|
||
|
|
||
|
t.on('result', function (res) {
|
||
|
if (typeof res === 'string') {
|
||
|
self.emit('data', '# ' + res + '\n');
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
self.emit('data', encodeResult(res, self.count + 1));
|
||
|
self.count ++;
|
||
|
|
||
|
if (res.ok) self.pass ++
|
||
|
else self.fail ++
|
||
|
});
|
||
|
};
|
||
|
|
||
|
Render.prototype.close = function () {
|
||
|
this.emit('data', '\n1..' + this.count + '\n');
|
||
|
this.emit('data', '# tests ' + this.count + '\n');
|
||
|
this.emit('data', '# pass ' + this.pass + '\n');
|
||
|
if (this.fail) {
|
||
|
this.emit('data', '# fail ' + this.fail + '\n');
|
||
|
}
|
||
|
else {
|
||
|
this.emit('data', '\n# ok\n');
|
||
|
}
|
||
|
|
||
|
this.emit('end');
|
||
|
};
|
||
|
|
||
|
function encodeResult (res, count) {
|
||
|
var output = '';
|
||
|
output += (res.ok ? 'ok ' : 'not ok ') + count;
|
||
|
output += res.name ? ' ' + res.name.replace(/\s+/g, ' ') : '';
|
||
|
|
||
|
if (res.skip) output += ' # SKIP';
|
||
|
else if (res.todo) output += ' # TODO';
|
||
|
|
||
|
output += '\n';
|
||
|
|
||
|
if (!res.ok) {
|
||
|
var outer = ' ';
|
||
|
var inner = outer + ' ';
|
||
|
output += outer + '---\n';
|
||
|
output += inner + 'operator: ' + res.operator + '\n';
|
||
|
|
||
|
var ex = json.stringify(res.expected) || '';
|
||
|
var ac = json.stringify(res.actual) || '';
|
||
|
|
||
|
if (Math.max(ex.length, ac.length) > 65) {
|
||
|
output += inner + 'expected:\n' + inner + ' ' + ex + '\n';
|
||
|
output += inner + 'actual:\n' + inner + ' ' + ac + '\n';
|
||
|
}
|
||
|
else {
|
||
|
output += inner + 'expected: ' + ex + '\n';
|
||
|
output += inner + 'actual: ' + ac + '\n';
|
||
|
}
|
||
|
if (res.at) {
|
||
|
output += inner + 'at: ' + res.at + '\n';
|
||
|
}
|
||
|
if (res.operator === 'error' && res.actual && res.actual.stack) {
|
||
|
var lines = String(res.actual.stack).split('\n');
|
||
|
output += inner + 'stack:\n';
|
||
|
output += inner + ' ' + lines[0] + '\n';
|
||
|
for (var i = 1; i < lines.length; i++) {
|
||
|
output += inner + lines[i] + '\n';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
output += outer + '...\n';
|
||
|
}
|
||
|
|
||
|
return output;
|
||
|
}
|