Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02c18a3596 | ||
|
|
0c6397d802 | ||
|
|
eb4671452e | ||
|
|
b38decf050 | ||
|
|
ca5b1de2eb | ||
|
|
a3bc74776a |
@@ -1600,7 +1600,9 @@ getJasmineRequireObj().CallTracker = function(j$) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
getJasmineRequireObj().clearStack = function(j$) {
|
getJasmineRequireObj().clearStack = function(j$) {
|
||||||
function messageChannelImpl(global) {
|
var maxInlineCallCount = 10;
|
||||||
|
|
||||||
|
function messageChannelImpl(global, setTimeout) {
|
||||||
var channel = new global.MessageChannel(),
|
var channel = new global.MessageChannel(),
|
||||||
head = {},
|
head = {},
|
||||||
tail = head;
|
tail = head;
|
||||||
@@ -1623,25 +1625,44 @@ getJasmineRequireObj().clearStack = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var currentCallCount = 0;
|
||||||
return function clearStack(fn) {
|
return function clearStack(fn) {
|
||||||
tail = tail.next = { task: fn };
|
currentCallCount++;
|
||||||
channel.port2.postMessage(0);
|
|
||||||
|
if (currentCallCount < maxInlineCallCount) {
|
||||||
|
tail = tail.next = { task: fn };
|
||||||
|
channel.port2.postMessage(0);
|
||||||
|
} else {
|
||||||
|
currentCallCount = 0;
|
||||||
|
setTimeout(fn);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getClearStack(global) {
|
function getClearStack(global) {
|
||||||
|
var currentCallCount = 0;
|
||||||
|
var realSetTimeout = global.setTimeout;
|
||||||
|
var setTimeoutImpl = function clearStack(fn) {
|
||||||
|
Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
|
||||||
|
};
|
||||||
|
|
||||||
if (j$.isFunction_(global.setImmediate)) {
|
if (j$.isFunction_(global.setImmediate)) {
|
||||||
var realSetImmediate = global.setImmediate;
|
var realSetImmediate = global.setImmediate;
|
||||||
return function(fn) {
|
return function(fn) {
|
||||||
realSetImmediate(fn);
|
currentCallCount++;
|
||||||
|
|
||||||
|
if (currentCallCount < maxInlineCallCount) {
|
||||||
|
realSetImmediate(fn);
|
||||||
|
} else {
|
||||||
|
currentCallCount = 0;
|
||||||
|
|
||||||
|
setTimeoutImpl(fn);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} else if (!j$.util.isUndefined(global.MessageChannel)) {
|
} else if (!j$.util.isUndefined(global.MessageChannel)) {
|
||||||
return messageChannelImpl(global);
|
return messageChannelImpl(global, setTimeoutImpl);
|
||||||
} else {
|
} else {
|
||||||
var realSetTimeout = global.setTimeout;
|
return setTimeoutImpl;
|
||||||
return function clearStack(fn) {
|
|
||||||
Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3884,6 +3905,10 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
var clearTimeout = function () {
|
var clearTimeout = function () {
|
||||||
Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]);
|
Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]);
|
||||||
},
|
},
|
||||||
|
completedSynchronously = true,
|
||||||
|
setTimeout = function(delayedFn, delay) {
|
||||||
|
return Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [delayedFn, delay]]);
|
||||||
|
},
|
||||||
handleError = function(error) {
|
handleError = function(error) {
|
||||||
onException(error);
|
onException(error);
|
||||||
next();
|
next();
|
||||||
@@ -3891,7 +3916,13 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
next = once(function () {
|
next = once(function () {
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
self.globalErrors.popListener(handleError);
|
self.globalErrors.popListener(handleError);
|
||||||
self.run(queueableFns, iterativeIndex + 1);
|
if (completedSynchronously) {
|
||||||
|
setTimeout(function() {
|
||||||
|
self.run(queueableFns, iterativeIndex + 1);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.run(queueableFns, iterativeIndex + 1);
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
timeoutId;
|
timeoutId;
|
||||||
|
|
||||||
@@ -3903,15 +3934,16 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
self.globalErrors.pushListener(handleError);
|
self.globalErrors.pushListener(handleError);
|
||||||
|
|
||||||
if (queueableFn.timeout) {
|
if (queueableFn.timeout) {
|
||||||
timeoutId = Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [function() {
|
timeoutId = setTimeout(function() {
|
||||||
var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
|
var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
|
||||||
onException(error);
|
onException(error);
|
||||||
next();
|
next();
|
||||||
}, queueableFn.timeout()]]);
|
}, queueableFn.timeout());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
queueableFn.fn.call(self.userContext, next);
|
queueableFn.fn.call(self.userContext, next);
|
||||||
|
completedSynchronously = false;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
handleException(e, queueableFn);
|
handleException(e, queueableFn);
|
||||||
next();
|
next();
|
||||||
@@ -4965,5 +4997,5 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
getJasmineRequireObj().version = function() {
|
getJasmineRequireObj().version = function() {
|
||||||
return '2.6.2';
|
return '2.6.4';
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,6 +4,6 @@
|
|||||||
#
|
#
|
||||||
module Jasmine
|
module Jasmine
|
||||||
module Core
|
module Core
|
||||||
VERSION = "2.6.2"
|
VERSION = "2.6.4"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "jasmine-core",
|
"name": "jasmine-core",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"version": "2.6.2",
|
"version": "2.6.4",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/jasmine/jasmine.git"
|
"url": "https://github.com/jasmine/jasmine.git"
|
||||||
|
|||||||
17
release_notes/2.6.3.md
Normal file
17
release_notes/2.6.3.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Jasmine 2.6.3 Release Notes
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
This is a patch release to fix some regressions and performance problems in the 2.6.0 release
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
* Make sure the queue runner goes async for async specs
|
||||||
|
- Fixes [#1327](https://github.com/jasmine/jasmine/issues/1327)
|
||||||
|
- Fixes [#1334](https://github.com/jasmine/jasmine/issues/1334)
|
||||||
|
- Fixes [jasmine/gulp-jasmine-browser#48](https://github.com/jasmine/gulp-jasmine-browser/issues/48)
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_
|
||||||
17
release_notes/2.6.4.md
Normal file
17
release_notes/2.6.4.md
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Jasmine 2.6.4 Release Notes
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
This is a patch release to fix some regressions and performance problems in the 2.6.0 release
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
* Break into a `setTimeout` every once in a while allowing the CPU to run other things that used the real `setTimeout`
|
||||||
|
- Fixes [#1327](https://github.com/jasmine/jasmine/issues/1327)
|
||||||
|
- See [#1334](https://github.com/jasmine/jasmine/issues/1334)
|
||||||
|
- Fixes [jasmine/gulp-jasmine-browser#48](https://github.com/jasmine/gulp-jasmine-browser/issues/48)
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_
|
||||||
@@ -21,6 +21,34 @@ describe("ClearStack", function() {
|
|||||||
expect(setImmediate).toHaveBeenCalled();
|
expect(setImmediate).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("uses setTimeout instead of setImmediate every 10 calls to make sure we release the CPU", function() {
|
||||||
|
var setImmediate = jasmine.createSpy('setImmediate'),
|
||||||
|
setTimeout = jasmine.createSpy('setTimeout'),
|
||||||
|
global = { setImmediate: setImmediate, setTimeout: setTimeout },
|
||||||
|
clearStack = jasmineUnderTest.getClearStack(global);
|
||||||
|
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
|
||||||
|
expect(setImmediate).toHaveBeenCalled();
|
||||||
|
expect(setTimeout).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
clearStack(function() { });
|
||||||
|
expect(setImmediate.calls.count()).toEqual(9);
|
||||||
|
expect(setTimeout.calls.count()).toEqual(1);
|
||||||
|
|
||||||
|
clearStack(function() { });
|
||||||
|
expect(setImmediate.calls.count()).toEqual(10);
|
||||||
|
expect(setTimeout.calls.count()).toEqual(1);
|
||||||
|
});
|
||||||
|
|
||||||
it("uses MessageChannels when available", function() {
|
it("uses MessageChannels when available", function() {
|
||||||
var fakeChannel = {
|
var fakeChannel = {
|
||||||
port1: {},
|
port1: {},
|
||||||
@@ -37,6 +65,41 @@ describe("ClearStack", function() {
|
|||||||
expect(called).toBe(true);
|
expect(called).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("uses setTimeout instead of MessageChannel every 10 calls to make sure we release the CPU", function() {
|
||||||
|
var fakeChannel = {
|
||||||
|
port1: {},
|
||||||
|
port2: {
|
||||||
|
postMessage: jasmine.createSpy('postMessage').and.callFake(function() {
|
||||||
|
fakeChannel.port1.onmessage();
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
|
setTimeout = jasmine.createSpy('setTimeout'),
|
||||||
|
global = { MessageChannel: function() { return fakeChannel; }, setTimeout: setTimeout },
|
||||||
|
clearStack = jasmineUnderTest.getClearStack(global);
|
||||||
|
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
clearStack(function() { });
|
||||||
|
|
||||||
|
expect(fakeChannel.port2.postMessage).toHaveBeenCalled();
|
||||||
|
expect(setTimeout).not.toHaveBeenCalled();
|
||||||
|
|
||||||
|
clearStack(function() { });
|
||||||
|
expect(fakeChannel.port2.postMessage.calls.count()).toEqual(9);
|
||||||
|
expect(setTimeout.calls.count()).toEqual(1);
|
||||||
|
|
||||||
|
clearStack(function() { });
|
||||||
|
expect(fakeChannel.port2.postMessage.calls.count()).toEqual(10);
|
||||||
|
expect(setTimeout.calls.count()).toEqual(1);
|
||||||
|
});
|
||||||
|
|
||||||
it("calls setTimeout when onmessage is called recursively", function() {
|
it("calls setTimeout when onmessage is called recursively", function() {
|
||||||
var fakeChannel = {
|
var fakeChannel = {
|
||||||
port1: {},
|
port1: {},
|
||||||
|
|||||||
@@ -170,6 +170,7 @@ describe("QueueRunner", function() {
|
|||||||
|
|
||||||
queueRunner.execute();
|
queueRunner.execute();
|
||||||
|
|
||||||
|
jasmine.clock().tick();
|
||||||
expect(onComplete).toHaveBeenCalled();
|
expect(onComplete).toHaveBeenCalled();
|
||||||
expect(onException).toHaveBeenCalled();
|
expect(onException).toHaveBeenCalled();
|
||||||
|
|
||||||
@@ -189,6 +190,7 @@ describe("QueueRunner", function() {
|
|||||||
|
|
||||||
queueRunner.execute();
|
queueRunner.execute();
|
||||||
|
|
||||||
|
jasmine.clock().tick(1);
|
||||||
expect(onComplete).toHaveBeenCalled();
|
expect(onComplete).toHaveBeenCalled();
|
||||||
|
|
||||||
jasmine.clock().tick(jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL);
|
jasmine.clock().tick(jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL);
|
||||||
@@ -197,12 +199,13 @@ describe("QueueRunner", function() {
|
|||||||
|
|
||||||
it("only moves to the next spec the first time you call done", function() {
|
it("only moves to the next spec the first time you call done", function() {
|
||||||
var queueableFn = { fn: function(done) {done(); done();} },
|
var queueableFn = { fn: function(done) {done(); done();} },
|
||||||
nextQueueableFn = { fn: jasmine.createSpy('nextFn') };
|
nextQueueableFn = { fn: jasmine.createSpy('nextFn') },
|
||||||
queueRunner = new jasmineUnderTest.QueueRunner({
|
queueRunner = new jasmineUnderTest.QueueRunner({
|
||||||
queueableFns: [queueableFn, nextQueueableFn]
|
queueableFns: [queueableFn, nextQueueableFn]
|
||||||
});
|
});
|
||||||
|
|
||||||
queueRunner.execute();
|
queueRunner.execute();
|
||||||
|
jasmine.clock().tick(1);
|
||||||
expect(nextQueueableFn.fn.calls.count()).toEqual(1);
|
expect(nextQueueableFn.fn.calls.count()).toEqual(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -211,10 +214,10 @@ describe("QueueRunner", function() {
|
|||||||
setTimeout(done, 1);
|
setTimeout(done, 1);
|
||||||
throw new Error('error!');
|
throw new Error('error!');
|
||||||
} },
|
} },
|
||||||
nextQueueableFn = { fn: jasmine.createSpy('nextFn') };
|
nextQueueableFn = { fn: jasmine.createSpy('nextFn') },
|
||||||
queueRunner = new jasmineUnderTest.QueueRunner({
|
queueRunner = new jasmineUnderTest.QueueRunner({
|
||||||
queueableFns: [queueableFn, nextQueueableFn]
|
queueableFns: [queueableFn, nextQueueableFn]
|
||||||
});
|
});
|
||||||
|
|
||||||
queueRunner.execute();
|
queueRunner.execute();
|
||||||
jasmine.clock().tick(1);
|
jasmine.clock().tick(1);
|
||||||
@@ -271,6 +274,33 @@ describe("QueueRunner", function() {
|
|||||||
expect(onException).toHaveBeenCalledWith(errorWithMessage(/^foo$/));
|
expect(onException).toHaveBeenCalledWith(errorWithMessage(/^foo$/));
|
||||||
expect(nextQueueableFn.fn).toHaveBeenCalled();
|
expect(nextQueueableFn.fn).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("handles exceptions thrown while waiting for the stack to clear", function() {
|
||||||
|
var queueableFn = { fn: function(done) { done() } },
|
||||||
|
global = {},
|
||||||
|
errorListeners = [],
|
||||||
|
globalErrors = {
|
||||||
|
pushListener: function(f) { errorListeners.push(f); },
|
||||||
|
popListener: function() { errorListeners.pop(); }
|
||||||
|
},
|
||||||
|
clearStack = jasmine.createSpy('clearStack'),
|
||||||
|
onException = jasmine.createSpy('onException'),
|
||||||
|
queueRunner = new jasmineUnderTest.QueueRunner({
|
||||||
|
queueableFns: [queueableFn],
|
||||||
|
globalErrors: globalErrors,
|
||||||
|
clearStack: clearStack,
|
||||||
|
onException: onException
|
||||||
|
}),
|
||||||
|
error = new Error('nope');
|
||||||
|
|
||||||
|
queueRunner.execute();
|
||||||
|
jasmine.clock().tick();
|
||||||
|
expect(clearStack).toHaveBeenCalled();
|
||||||
|
expect(errorListeners.length).toEqual(1);
|
||||||
|
errorListeners[0](error);
|
||||||
|
clearStack.calls.argsFor(0)[0]();
|
||||||
|
expect(onException).toHaveBeenCalledWith(error);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("calls exception handlers when an exception is thrown in a fn", function() {
|
it("calls exception handlers when an exception is thrown in a fn", function() {
|
||||||
@@ -306,40 +336,20 @@ describe("QueueRunner", function() {
|
|||||||
it("continues running the functions even after an exception is thrown in an async spec", function() {
|
it("continues running the functions even after an exception is thrown in an async spec", function() {
|
||||||
var queueableFn = { fn: function(done) { throw new Error("error"); } },
|
var queueableFn = { fn: function(done) { throw new Error("error"); } },
|
||||||
nextQueueableFn = { fn: jasmine.createSpy("nextFunction") },
|
nextQueueableFn = { fn: jasmine.createSpy("nextFunction") },
|
||||||
|
timeout = { setTimeout: jasmine.createSpy("setTimeout"),
|
||||||
|
clearTimeout: jasmine.createSpy("setTimeout")
|
||||||
|
},
|
||||||
queueRunner = new jasmineUnderTest.QueueRunner({
|
queueRunner = new jasmineUnderTest.QueueRunner({
|
||||||
queueableFns: [queueableFn, nextQueueableFn]
|
queueableFns: [queueableFn, nextQueueableFn],
|
||||||
|
timeout: timeout
|
||||||
});
|
});
|
||||||
|
|
||||||
queueRunner.execute();
|
queueRunner.execute();
|
||||||
|
timeout.setTimeout.calls.argsFor(0)[0]();
|
||||||
|
|
||||||
expect(nextQueueableFn.fn).toHaveBeenCalled();
|
expect(nextQueueableFn.fn).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("handles exceptions thrown while waiting for the stack to clear", function() {
|
|
||||||
var queueableFn = { fn: function(done) { done() } },
|
|
||||||
global = {},
|
|
||||||
errorListeners = [],
|
|
||||||
globalErrors = {
|
|
||||||
pushListener: function(f) { errorListeners.push(f); },
|
|
||||||
popListener: function() { errorListeners.pop(); }
|
|
||||||
},
|
|
||||||
clearStack = jasmine.createSpy('clearStack'),
|
|
||||||
onException = jasmine.createSpy('onException'),
|
|
||||||
queueRunner = new jasmineUnderTest.QueueRunner({
|
|
||||||
queueableFns: [queueableFn],
|
|
||||||
globalErrors: globalErrors,
|
|
||||||
clearStack: clearStack,
|
|
||||||
onException: onException
|
|
||||||
}),
|
|
||||||
error = new Error('nope');
|
|
||||||
|
|
||||||
queueRunner.execute();
|
|
||||||
expect(clearStack).toHaveBeenCalled();
|
|
||||||
expect(errorListeners.length).toEqual(1);
|
|
||||||
errorListeners[0](error);
|
|
||||||
clearStack.calls.argsFor(0)[0]();
|
|
||||||
expect(onException).toHaveBeenCalledWith(error);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("calls a provided complete callback when done", function() {
|
it("calls a provided complete callback when done", function() {
|
||||||
var queueableFn = { fn: jasmine.createSpy('fn') },
|
var queueableFn = { fn: jasmine.createSpy('fn') },
|
||||||
completeCallback = jasmine.createSpy('completeCallback'),
|
completeCallback = jasmine.createSpy('completeCallback'),
|
||||||
@@ -353,23 +363,34 @@ describe("QueueRunner", function() {
|
|||||||
expect(completeCallback).toHaveBeenCalled();
|
expect(completeCallback).toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("calls a provided stack clearing function when done", function() {
|
describe("clearing the stack", function() {
|
||||||
var asyncFn = { fn: function(done) { done() } },
|
beforeEach(function() {
|
||||||
afterFn = { fn: jasmine.createSpy('afterFn') },
|
jasmine.clock().install();
|
||||||
completeCallback = jasmine.createSpy('completeCallback'),
|
});
|
||||||
clearStack = jasmine.createSpy('clearStack'),
|
|
||||||
queueRunner = new jasmineUnderTest.QueueRunner({
|
|
||||||
queueableFns: [asyncFn, afterFn],
|
|
||||||
clearStack: clearStack,
|
|
||||||
onComplete: completeCallback
|
|
||||||
});
|
|
||||||
|
|
||||||
clearStack.and.callFake(function(fn) { fn(); });
|
afterEach(function() {
|
||||||
|
jasmine.clock().uninstall();
|
||||||
|
});
|
||||||
|
|
||||||
queueRunner.execute();
|
it("calls a provided stack clearing function when done", function() {
|
||||||
expect(afterFn.fn).toHaveBeenCalled();
|
var asyncFn = { fn: function(done) { done() } },
|
||||||
expect(clearStack).toHaveBeenCalled();
|
afterFn = { fn: jasmine.createSpy('afterFn') },
|
||||||
clearStack.calls.argsFor(0)[0]();
|
completeCallback = jasmine.createSpy('completeCallback'),
|
||||||
expect(completeCallback).toHaveBeenCalled();
|
clearStack = jasmine.createSpy('clearStack'),
|
||||||
|
queueRunner = new jasmineUnderTest.QueueRunner({
|
||||||
|
queueableFns: [asyncFn, afterFn],
|
||||||
|
clearStack: clearStack,
|
||||||
|
onComplete: completeCallback
|
||||||
|
});
|
||||||
|
|
||||||
|
clearStack.and.callFake(function(fn) { fn(); });
|
||||||
|
|
||||||
|
queueRunner.execute();
|
||||||
|
jasmine.clock().tick();
|
||||||
|
expect(afterFn.fn).toHaveBeenCalled();
|
||||||
|
expect(clearStack).toHaveBeenCalled();
|
||||||
|
clearStack.calls.argsFor(0)[0]();
|
||||||
|
expect(completeCallback).toHaveBeenCalled();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -456,7 +456,7 @@ describe("Env integration", function() {
|
|||||||
env.execute();
|
env.execute();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("copes with late async failures", function(done) {
|
it("copes with async failures after done has been called", function(done) {
|
||||||
var global = {
|
var global = {
|
||||||
setTimeout: function(fn, delay) { setTimeout(fn, delay) },
|
setTimeout: function(fn, delay) { setTimeout(fn, delay) },
|
||||||
clearTimeout: function(fn, delay) { clearTimeout(fn, delay) },
|
clearTimeout: function(fn, delay) { clearTimeout(fn, delay) },
|
||||||
@@ -466,6 +466,7 @@ describe("Env integration", function() {
|
|||||||
reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone", "suiteDone" ]);
|
reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone", "suiteDone" ]);
|
||||||
|
|
||||||
reporter.jasmineDone.and.callFake(function() {
|
reporter.jasmineDone.and.callFake(function() {
|
||||||
|
expect(reporter.specDone).not.toHaveFailedExpecationsForRunnable('A suite fails', ['fail thrown']);
|
||||||
expect(reporter.suiteDone).toHaveFailedExpecationsForRunnable('A suite', ['fail thrown']);
|
expect(reporter.suiteDone).toHaveFailedExpecationsForRunnable('A suite', ['fail thrown']);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@@ -474,9 +475,11 @@ describe("Env integration", function() {
|
|||||||
|
|
||||||
env.fdescribe('A suite', function() {
|
env.fdescribe('A suite', function() {
|
||||||
env.it('fails', function(specDone) {
|
env.it('fails', function(specDone) {
|
||||||
specDone();
|
|
||||||
setTimeout(function() {
|
setTimeout(function() {
|
||||||
global.onerror('fail');
|
specDone();
|
||||||
|
setTimeout(function() {
|
||||||
|
global.onerror('fail');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -949,16 +952,15 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
describe("with a mock clock", function() {
|
describe("with a mock clock", function() {
|
||||||
var originalTimeout;
|
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
originalTimeout = jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL;
|
this.originalTimeout = jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL;
|
||||||
|
this.realSetTimeout = setTimeout;
|
||||||
jasmine.clock().install();
|
jasmine.clock().install();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(function() {
|
afterEach(function() {
|
||||||
jasmine.clock().uninstall();
|
jasmine.clock().uninstall();
|
||||||
jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL = originalTimeout;
|
jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL = this.originalTimeout;
|
||||||
});
|
});
|
||||||
|
|
||||||
it("should wait a specified interval before failing specs haven't called done yet", function(done) {
|
it("should wait a specified interval before failing specs haven't called done yet", function(done) {
|
||||||
@@ -1077,7 +1079,8 @@ describe("Env integration", function() {
|
|||||||
|
|
||||||
it('should wait a custom interval before reporting async functions that fail to call done', function(done) {
|
it('should wait a custom interval before reporting async functions that fail to call done', function(done) {
|
||||||
var env = new jasmineUnderTest.Env(),
|
var env = new jasmineUnderTest.Env(),
|
||||||
reporter = jasmine.createSpyObj('fakeReport', ['jasmineDone', 'suiteDone', 'specDone']);
|
reporter = jasmine.createSpyObj('fakeReport', ['jasmineDone', 'suiteDone', 'specDone']),
|
||||||
|
realSetTimeout = this.realSetTimeout;
|
||||||
|
|
||||||
reporter.jasmineDone.and.callFake(function() {
|
reporter.jasmineDone.and.callFake(function() {
|
||||||
expect(reporter.specDone).toHaveFailedExpecationsForRunnable('suite beforeAll times out', [
|
expect(reporter.specDone).toHaveFailedExpecationsForRunnable('suite beforeAll times out', [
|
||||||
@@ -1107,6 +1110,11 @@ describe("Env integration", function() {
|
|||||||
jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL = 10000;
|
jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL = 10000;
|
||||||
|
|
||||||
env.describe('suite', function() {
|
env.describe('suite', function() {
|
||||||
|
env.afterAll(function() {
|
||||||
|
realSetTimeout(function() {
|
||||||
|
jasmine.clock().tick(10);
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
env.describe('beforeAll', function() {
|
env.describe('beforeAll', function() {
|
||||||
env.beforeAll(function(innerDone) {
|
env.beforeAll(function(innerDone) {
|
||||||
jasmine.clock().tick(5001);
|
jasmine.clock().tick(5001);
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
getJasmineRequireObj().clearStack = function(j$) {
|
getJasmineRequireObj().clearStack = function(j$) {
|
||||||
function messageChannelImpl(global) {
|
var maxInlineCallCount = 10;
|
||||||
|
|
||||||
|
function messageChannelImpl(global, setTimeout) {
|
||||||
var channel = new global.MessageChannel(),
|
var channel = new global.MessageChannel(),
|
||||||
head = {},
|
head = {},
|
||||||
tail = head;
|
tail = head;
|
||||||
@@ -22,25 +24,44 @@ getJasmineRequireObj().clearStack = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var currentCallCount = 0;
|
||||||
return function clearStack(fn) {
|
return function clearStack(fn) {
|
||||||
tail = tail.next = { task: fn };
|
currentCallCount++;
|
||||||
channel.port2.postMessage(0);
|
|
||||||
|
if (currentCallCount < maxInlineCallCount) {
|
||||||
|
tail = tail.next = { task: fn };
|
||||||
|
channel.port2.postMessage(0);
|
||||||
|
} else {
|
||||||
|
currentCallCount = 0;
|
||||||
|
setTimeout(fn);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getClearStack(global) {
|
function getClearStack(global) {
|
||||||
|
var currentCallCount = 0;
|
||||||
|
var realSetTimeout = global.setTimeout;
|
||||||
|
var setTimeoutImpl = function clearStack(fn) {
|
||||||
|
Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
|
||||||
|
};
|
||||||
|
|
||||||
if (j$.isFunction_(global.setImmediate)) {
|
if (j$.isFunction_(global.setImmediate)) {
|
||||||
var realSetImmediate = global.setImmediate;
|
var realSetImmediate = global.setImmediate;
|
||||||
return function(fn) {
|
return function(fn) {
|
||||||
realSetImmediate(fn);
|
currentCallCount++;
|
||||||
|
|
||||||
|
if (currentCallCount < maxInlineCallCount) {
|
||||||
|
realSetImmediate(fn);
|
||||||
|
} else {
|
||||||
|
currentCallCount = 0;
|
||||||
|
|
||||||
|
setTimeoutImpl(fn);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
} else if (!j$.util.isUndefined(global.MessageChannel)) {
|
} else if (!j$.util.isUndefined(global.MessageChannel)) {
|
||||||
return messageChannelImpl(global);
|
return messageChannelImpl(global, setTimeoutImpl);
|
||||||
} else {
|
} else {
|
||||||
var realSetTimeout = global.setTimeout;
|
return setTimeoutImpl;
|
||||||
return function clearStack(fn) {
|
|
||||||
Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,10 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
var clearTimeout = function () {
|
var clearTimeout = function () {
|
||||||
Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]);
|
Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]);
|
||||||
},
|
},
|
||||||
|
completedSynchronously = true,
|
||||||
|
setTimeout = function(delayedFn, delay) {
|
||||||
|
return Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [delayedFn, delay]]);
|
||||||
|
},
|
||||||
handleError = function(error) {
|
handleError = function(error) {
|
||||||
onException(error);
|
onException(error);
|
||||||
next();
|
next();
|
||||||
@@ -72,7 +76,13 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
next = once(function () {
|
next = once(function () {
|
||||||
clearTimeout(timeoutId);
|
clearTimeout(timeoutId);
|
||||||
self.globalErrors.popListener(handleError);
|
self.globalErrors.popListener(handleError);
|
||||||
self.run(queueableFns, iterativeIndex + 1);
|
if (completedSynchronously) {
|
||||||
|
setTimeout(function() {
|
||||||
|
self.run(queueableFns, iterativeIndex + 1);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
self.run(queueableFns, iterativeIndex + 1);
|
||||||
|
}
|
||||||
}),
|
}),
|
||||||
timeoutId;
|
timeoutId;
|
||||||
|
|
||||||
@@ -84,15 +94,16 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
self.globalErrors.pushListener(handleError);
|
self.globalErrors.pushListener(handleError);
|
||||||
|
|
||||||
if (queueableFn.timeout) {
|
if (queueableFn.timeout) {
|
||||||
timeoutId = Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [function() {
|
timeoutId = setTimeout(function() {
|
||||||
var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
|
var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
|
||||||
onException(error);
|
onException(error);
|
||||||
next();
|
next();
|
||||||
}, queueableFn.timeout()]]);
|
}, queueableFn.timeout());
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
queueableFn.fn.call(self.userContext, next);
|
queueableFn.fn.call(self.userContext, next);
|
||||||
|
completedSynchronously = false;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
handleException(e, queueableFn);
|
handleException(e, queueableFn);
|
||||||
next();
|
next();
|
||||||
|
|||||||
Reference in New Issue
Block a user