diff --git a/spec/core/ClockSpec.js b/spec/core/ClockSpec.js index 9afb5731..111ed0e5 100644 --- a/spec/core/ClockSpec.js +++ b/spec/core/ClockSpec.js @@ -652,4 +652,23 @@ describe("Clock (acceptance)", function() { expect(timeoutDate).toEqual(baseTime.getTime() + 150); }); + + it("mocks the Date object and updates the date per delayed function", function () { + var delayedFunctionScheduler = new jasmineUnderTest.DelayedFunctionScheduler(), + global = {Date: Date}, + mockDate = new jasmineUnderTest.MockDate(global), + clock = new jasmineUnderTest.Clock({setTimeout: setTimeout}, function () { return delayedFunctionScheduler; }, mockDate), + baseTime = new Date(); + + clock.install().mockDate(baseTime); + + var actualTimes = []; + var pushCurrentTime = function() { actualTimes.push(global.Date().getTime()); }; + delayedFunctionScheduler.scheduleFunction(pushCurrentTime); + delayedFunctionScheduler.scheduleFunction(pushCurrentTime, 1); + + clock.tick(1); + + expect(actualTimes).toEqual([baseTime.getTime(), baseTime.getTime() + 1]); + }) }); diff --git a/spec/core/DelayedFunctionSchedulerSpec.js b/spec/core/DelayedFunctionSchedulerSpec.js index 0794bb1e..c26252ef 100644 --- a/spec/core/DelayedFunctionSchedulerSpec.js +++ b/spec/core/DelayedFunctionSchedulerSpec.js @@ -251,5 +251,18 @@ describe("DelayedFunctionScheduler", function() { expect(fn).toHaveBeenCalled(); expect(fn.calls.count()).toBe(1); }); + + it("updates the mockDate per scheduled time", function () { + var scheduler = new jasmineUnderTest.DelayedFunctionScheduler(), + tickDate = jasmine.createSpy('tickDate'); + + scheduler.scheduleFunction(function() {}); + scheduler.scheduleFunction(function() {}, 1); + + scheduler.tick(1, tickDate); + + expect(tickDate).toHaveBeenCalledWith(0); + expect(tickDate).toHaveBeenCalledWith(1); + }) }); diff --git a/src/core/Clock.js b/src/core/Clock.js index 474a4fb7..b6ed66d0 100644 --- a/src/core/Clock.js +++ b/src/core/Clock.js @@ -82,8 +82,7 @@ getJasmineRequireObj().Clock = function() { self.tick = function(millis) { if (installed) { - mockDate.tick(millis); - delayedFunctionScheduler.tick(millis); + delayedFunctionScheduler.tick(millis, function(millis) { mockDate.tick(millis); }); } else { throw new Error('Mock clock is not installed, use jasmine.clock().install()'); } diff --git a/src/core/DelayedFunctionScheduler.js b/src/core/DelayedFunctionScheduler.js index de947c60..dfd3f45e 100644 --- a/src/core/DelayedFunctionScheduler.js +++ b/src/core/DelayedFunctionScheduler.js @@ -6,11 +6,11 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() { var currentTime = 0; var delayedFnCount = 0; - self.tick = function(millis) { + self.tick = function(millis, tickDate) { millis = millis || 0; var endTime = currentTime + millis; - runScheduledFunctions(endTime); + runScheduledFunctions(endTime, tickDate); currentTime = endTime; }; @@ -113,13 +113,18 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() { } } - function runScheduledFunctions(endTime) { + function runScheduledFunctions(endTime, tickDate) { + tickDate = tickDate || function() {}; if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { + tickDate(endTime); return; } do { - currentTime = scheduledLookup.shift(); + var newCurrentTime = scheduledLookup.shift(); + tickDate(newCurrentTime - currentTime); + + currentTime = newCurrentTime; var funcsToRun = scheduledFunctions[currentTime]; delete scheduledFunctions[currentTime];