96 lines
3.5 KiB
JavaScript
96 lines
3.5 KiB
JavaScript
getJasmineRequireObj().ParallelReportDispatcher = function(j$) {
|
|
'use strict';
|
|
|
|
/**
|
|
* @class ParallelReportDispatcher
|
|
* @implements Reporter
|
|
* @classdesc A report dispatcher packaged for convenient use from outside jasmine-core.
|
|
*
|
|
* This is intended to help packages like `jasmine` (the Jasmine runner for
|
|
* Node.js) do their own report dispatching in order to support parallel
|
|
* execution. If you aren't implementing a runner package that supports
|
|
* parallel execution, this class probably isn't what you're looking for.
|
|
*
|
|
* Warning: Do not use ParallelReportDispatcher in the same process that
|
|
* Jasmine specs run in. Doing so will break Jasmine's error handling.
|
|
* @param onError {function} Function called when an unhandled exception, unhandled promise rejection, or explicit reporter failure occurs
|
|
*/
|
|
function ParallelReportDispatcher(onError, deps = {}) {
|
|
const ReportDispatcher = deps.ReportDispatcher || j$.ReportDispatcher;
|
|
const QueueRunner = deps.QueueRunner || j$.QueueRunner;
|
|
const globalErrors = deps.globalErrors || new j$.GlobalErrors();
|
|
const dispatcher = new ReportDispatcher(
|
|
j$.reporterEvents,
|
|
function(queueRunnerOptions) {
|
|
queueRunnerOptions = {
|
|
...queueRunnerOptions,
|
|
globalErrors,
|
|
timeout: { setTimeout, clearTimeout },
|
|
fail: function(error) {
|
|
// A callback-style async reporter called either done.fail()
|
|
// or done(anError).
|
|
if (!error) {
|
|
error = new Error('A reporter called done.fail()');
|
|
}
|
|
|
|
onError(error);
|
|
},
|
|
onException: function(error) {
|
|
// A reporter method threw an exception or returned a rejected
|
|
// promise, or there was an unhandled exception or unhandled promise
|
|
// rejection while an asynchronous reporter method was running.
|
|
onError(error);
|
|
}
|
|
};
|
|
new QueueRunner(queueRunnerOptions).execute();
|
|
},
|
|
function(error) {
|
|
// A reporter called done() more than once.
|
|
onError(error);
|
|
}
|
|
);
|
|
|
|
const self = {
|
|
/**
|
|
* Adds a reporter to the list of reporters that events will be dispatched to.
|
|
* @function
|
|
* @name ParallelReportDispatcher#addReporter
|
|
* @param {Reporter} reporterToAdd The reporter to be added.
|
|
* @see custom_reporter
|
|
*/
|
|
addReporter: dispatcher.addReporter.bind(dispatcher),
|
|
/**
|
|
* Clears all registered reporters.
|
|
* @function
|
|
* @name ParallelReportDispatcher#clearReporters
|
|
*/
|
|
clearReporters: dispatcher.clearReporters.bind(dispatcher),
|
|
/**
|
|
* Installs a global error handler. After this method is called, any
|
|
* unhandled exceptions or unhandled promise rejections will be passed to
|
|
* the onError callback that was passed to the constructor.
|
|
* @function
|
|
* @name ParallelReportDispatcher#installGlobalErrors
|
|
*/
|
|
installGlobalErrors: globalErrors.install.bind(globalErrors),
|
|
/**
|
|
* Uninstalls the global error handler.
|
|
* @function
|
|
* @name ParallelReportDispatcher#uninstallGlobalErrors
|
|
*/
|
|
uninstallGlobalErrors: function() {
|
|
// late-bind uninstall because it doesn't exist until install is called
|
|
globalErrors.uninstall(globalErrors);
|
|
}
|
|
};
|
|
|
|
for (const eventName of j$.reporterEvents) {
|
|
self[eventName] = dispatcher[eventName].bind(dispatcher);
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
return ParallelReportDispatcher;
|
|
};
|