backoffice/node_modules/tape/lib/render.js

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;
}