VulpesOS/gaia/tests/jsmarionette/mocha/mocha-json-proxy/reporter.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

146 lines
3.1 KiB
JavaScript
Executable file

'use strict';
var Base = require('mocha').reporters.Base;
// list of taboo properties to never clone
var TABOO = ['err'];
var EVENTS = [
'pending',
'pass',
'fail',
'test',
'test end',
'suite',
'suite end',
'start',
'end'
];
var ALLOWED_OBJECTS = ['err'];
function write(event, content) {
var args = Array.prototype.slice.call(arguments);
if (!process.env[Reporter.FORK_ENV]) {
process.stdout.write(JSON.stringify(args) + '\n');
return;
}
process.send(['mocha-proxy', args]);
}
function cloneValue(value) {
switch (typeof value) {
case 'object':
return cloneTestObject(value);
case 'function':
return value.toString();
}
return value;
}
function cloneTestObject(object) {
var keys = Object.keys(object),
result = {};
for (var i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
var value = object[key];
// don't clone taboo properties
if (TABOO.indexOf(key) !== -1) {
continue;
}
// In order to optimize transmission, don't clone the parent. Annotate its
// ID so the consumer can correctly re-create the relationship.
if (key === 'parent') {
result._parentId = value._id;
continue;
}
// don't copy objects recursively
if (typeof value === 'object' && ALLOWED_OBJECTS.indexOf(key) === -1) {
continue;
}
result[key] = cloneValue(value);
}
return result;
}
function cloneError(err) {
var result = {
name: err.name || '',
stack: err.stack,
type: err.type || 'Error',
constructorName: err.constructorName || 'Error',
expected: err.expected || null,
actual: err.actual || null
};
if (err && 'uncaught' in err) {
result.uncaught = err.uncaught;
}
return result;
}
function defaultHandler(type, runner, payload) {
return write(type, cloneValue(payload));
}
/**
* Static object responsible for converting each event type.
*/
var EventHandler = {
fail: function(event, runner, payload, err) {
var jsonPayload = cloneValue(payload);
// remove .err so it does not override the real error.
if (jsonPayload.err) {
delete jsonPayload.err;
}
write(event, jsonPayload, cloneError(err));
}
};
function Reporter(runner) {
var objects = [];
var ids = 1;
Base.call(this, runner);
EVENTS.forEach(function(event) {
var handler = EventHandler[event] || defaultHandler;
handler = handler.bind(this, event, runner);
runner.on(event, function() {
var args = Array.prototype.slice.call(arguments);
var runnable = args[0];
// when we find an object create a unique ID for it.
if (typeof runnable === 'object' && runnable !== null) {
var idx = objects.indexOf(runnable);
if (idx === -1) {
runnable._id = ids++;
objects.push(runnable);
} else {
// assign a unique objects[idx]._id to the runnable.
runnable._id = objects[idx]._id;
}
}
handler.apply(this, args);
}.bind(this));
}, this);
}
Reporter.write = write;
Reporter.prototype = Object.create(Base.prototype);
Reporter.FORK_ENV = 'MOCHA_PROXY_SEND_ONLY';
module.exports = Reporter;