- Add 'afterAllException' hook to reporter dispatch, we might want to make this more generic in the future - Add afterAllException function to HtmlReporter [#66789174]
100 lines
2.8 KiB
JavaScript
100 lines
2.8 KiB
JavaScript
getJasmineRequireObj().QueueRunner = function(j$) {
|
|
|
|
function once(fn) {
|
|
var called = false;
|
|
return function() {
|
|
if (!called) {
|
|
called = true;
|
|
fn();
|
|
}
|
|
};
|
|
}
|
|
|
|
function QueueRunner(attrs) {
|
|
this.queueableFns = attrs.queueableFns || [];
|
|
this.onComplete = attrs.onComplete || function() {};
|
|
this.clearStack = attrs.clearStack || function(fn) {fn();};
|
|
this.onException = attrs.onException || function() {};
|
|
this.catchException = attrs.catchException || function() { return true; };
|
|
this.userContext = attrs.userContext || {};
|
|
this.timer = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout};
|
|
this.reporter = attrs.reporter;
|
|
}
|
|
|
|
QueueRunner.prototype.execute = function() {
|
|
this.run(this.queueableFns, 0);
|
|
};
|
|
|
|
QueueRunner.prototype.run = function(queueableFns, recursiveIndex) {
|
|
var runner = this,
|
|
length = queueableFns.length,
|
|
self = this,
|
|
iterativeIndex;
|
|
|
|
for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) {
|
|
var queueableFn = queueableFns[iterativeIndex];
|
|
if (queueableFn.fn.length > 0) {
|
|
return attemptAsync(queueableFn);
|
|
} else {
|
|
attemptSync(queueableFn);
|
|
}
|
|
}
|
|
|
|
var runnerDone = iterativeIndex >= length;
|
|
|
|
if (runnerDone) {
|
|
this.clearStack(this.onComplete);
|
|
}
|
|
|
|
function attemptSync(queueableFn) {
|
|
try {
|
|
queueableFn.fn.call(self.userContext);
|
|
} catch (e) {
|
|
if(queueableFn.isAfterAll){
|
|
runner.reporter.afterAllException(e);
|
|
}
|
|
handleException(e);
|
|
}
|
|
}
|
|
|
|
function attemptAsync(queueableFn) {
|
|
var clearTimeout = function () {
|
|
Function.prototype.apply.apply(self.timer.clearTimeout, [j$.getGlobal(), [timeoutId]]);
|
|
},
|
|
next = once(function () {
|
|
clearTimeout(timeoutId);
|
|
self.run(queueableFns, iterativeIndex + 1);
|
|
}),
|
|
timeoutId;
|
|
|
|
if (queueableFn.timeout) {
|
|
timeoutId = Function.prototype.apply.apply(self.timer.setTimeout, [j$.getGlobal(), [function() {
|
|
self.onException(new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.'));
|
|
next();
|
|
}, queueableFn.timeout()]]);
|
|
}
|
|
|
|
try {
|
|
queueableFn.fn.call(self.userContext, next);
|
|
} catch (e) {
|
|
if(queueableFn.isAfterAll) {
|
|
runner.reporter.afterAllException(e);
|
|
}
|
|
handleException(e);
|
|
next();
|
|
}
|
|
}
|
|
|
|
function handleException(e) {
|
|
self.onException(e);
|
|
if (!self.catchException(e)) {
|
|
//TODO: set a var when we catch an exception and
|
|
//use a finally block to close the loop in a nice way..
|
|
throw e;
|
|
}
|
|
}
|
|
};
|
|
|
|
return QueueRunner;
|
|
};
|