From 81b822fea9ec14d345ee0165759d37c0c2eea8ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Javier=20L=C3=B3pez=20Pardo?= Date: Fri, 25 Oct 2013 14:41:32 +0200 Subject: [PATCH] Add specs for mock date --- spec/core/MockDateSpec.js | 139 ++++++++++++++++++++++++++++++++++++++ src/core/Clock.js | 12 +--- src/core/MockDate.js | 31 +++++---- 3 files changed, 157 insertions(+), 25 deletions(-) create mode 100644 spec/core/MockDateSpec.js diff --git a/spec/core/MockDateSpec.js b/spec/core/MockDateSpec.js new file mode 100644 index 00000000..05bf86f9 --- /dev/null +++ b/spec/core/MockDateSpec.js @@ -0,0 +1,139 @@ +describe("FakeDate", function() { + it("does not fail if no global date is found", function() { + var fakeGlobal = {}, + mockDate = new j$.MockDate(fakeGlobal); + + mockDate.install(); + + fakeGlobal.Date = jasmine.createSpy("Date"); + + mockDate.tick(0); + + expect(fakeGlobal.Date).not.toHaveBeenCalled(); + }); + + it("does not replace global Date if it is not installed", function() { + var fakeDate = jasmine.createSpy("global Date"), + fakeGlobal = { Date: fakeDate }, + mockDate = new j$.MockDate(fakeGlobal); + + fakeDate.now = function(){}; + + expect(fakeDate).toEqual(fakeGlobal.Date); + mockDate.install(); + + expect(fakeDate).not.toEqual(fakeGlobal.Date); + }); + + it("replaces the global Date on uninstall", function() { + var fakeDate = jasmine.createSpy("global Date"), + fakeGlobal = { Date: fakeDate }, + mockDate = new j$.MockDate(fakeGlobal); + + fakeDate.now = function(){}; + + mockDate.install(); + mockDate.uninstall(); + + expect(fakeDate).toEqual(fakeGlobal.Date); + + }); + + it("takes the current time as the base when installing without parameters", function() { + var fakeDate = jasmine.createSpy("global Date"), + fakeGlobal = { Date: fakeDate }, + mockDate = new j$.MockDate(fakeGlobal); + + fakeGlobal.Date.prototype.getTime = function() { + return 1000; + }; + fakeDate.now = function(){ return 1000; }; + + mockDate.install(); + + expect(new fakeGlobal.Date().getTime()).toEqual(1000); + }); + + it("can accept a date as time base when installing", function() { + var fakeGlobal = { Date: Date }, + mockDate = new j$.MockDate(fakeGlobal), + baseDate = new Date(2013, 9, 23); + + mockDate.install(baseDate); + + expect(new fakeGlobal.Date().getTime()).toEqual(baseDate.getTime()); + }); + + + it("fakes current time when using Date.now()", function() { + var fakeGlobal = { Date: Date }, + mockDate = new j$.MockDate(fakeGlobal), + baseDate = new Date(2013, 9, 23); + + mockDate.install(baseDate); + + expect(fakeGlobal.Date.now()).toEqual(baseDate.getTime()); + }); + + it("makes time passes using tick", function() { + var fakeDate = jasmine.createSpy("global Date"), + fakeGlobal = { Date: fakeDate }, + mockDate = new j$.MockDate(fakeGlobal); + + fakeDate.now = function(){ return 1000; }; + + mockDate.install(); + + mockDate.tick(100); + + expect(fakeGlobal.Date.now()).toEqual(1100); + + mockDate.tick(1000); + + expect(fakeGlobal.Date.now()).toEqual(2100); + }); + + it("allows to increase 0 milliseconds using tick", function() { + var fakeDate = jasmine.createSpy("global Date"), + fakeGlobal = { Date: fakeDate }, + mockDate = new j$.MockDate(fakeGlobal); + + fakeDate.now = function(){ return 1000; }; + + mockDate.install(); + + mockDate.tick(0); + expect(fakeGlobal.Date.now()).toEqual(1000); + + mockDate.tick(); + expect(fakeGlobal.Date.now()).toEqual(1000); + }); + + it("allows to create a Date in a different time than now", function() { + var fakeGlobal = { Date: Date }, + mockDate = new j$.MockDate(fakeGlobal), + baseDate = new Date(2013, 9, 23, 0, 0, 0, 0); + + mockDate.install(baseDate); + + var otherDate = new fakeGlobal.Date(2013, 9, 23, 0, 0, 1, 0); + + mockDate.tick(1000); + + expect(fakeGlobal.Date.now()).toEqual(otherDate.getTime()); + }); + + it("copies all Date properties to the mocked date", function() { + var fakeGlobal = { Date: Date }, + mockDate = new j$.MockDate(fakeGlobal), + baseDate = new Date(2013, 9, 23, 0, 0, 0, 0); + + mockDate.install(baseDate); + + var otherDate = new fakeGlobal.Date(); + + expect(otherDate).toEqual(jasmine.any(Date)); + + expect(fakeGlobal.Date.UTC(2013, 9, 23)).toEqual(Date.UTC(2013, 9, 23)); + }); +}); diff --git a/src/core/Clock.js b/src/core/Clock.js index 96304ed2..7c8472d4 100644 --- a/src/core/Clock.js +++ b/src/core/Clock.js @@ -15,14 +15,6 @@ getJasmineRequireObj().Clock = function() { }, installed = false; - if (date) { - var realDate = { - Date: global.Date - }, - fakeDate = { - Date: date.Date - }; - } self.install = function(mockDate) { replace(global, fakeTimingFunctions); @@ -31,15 +23,13 @@ getJasmineRequireObj().Clock = function() { if (date && mockDate) { date.install(mockDate); - replace(global, fakeDate); } }; self.uninstall = function() { delayedFunctionScheduler.reset(); if (date) { - date.reset(); - replace(global, realDate); + date.uninstall(); } replace(global, realTimingFunctions); diff --git a/src/core/MockDate.js b/src/core/MockDate.js index db17e006..294579bb 100644 --- a/src/core/MockDate.js +++ b/src/core/MockDate.js @@ -6,16 +6,20 @@ getJasmineRequireObj().MockDate = function() { if (!global || !global.Date) { self.install = function() {}; self.tick = function() {}; - self.reset = function() {}; + self.uninstall = function() {}; return self; } + var GlobalDate = global.Date; + self.install = function(mockDate) { if (mockDate instanceof Date) { currentTime = mockDate.getTime(); } else { - currentTime = global.Date.now(); + currentTime = GlobalDate.now(); } + + global.Date = FakeDate; }; self.tick = function(millis) { @@ -23,35 +27,34 @@ getJasmineRequireObj().MockDate = function() { currentTime = currentTime + millis; }; - self.reset = function() { + self.uninstall = function() { currentTime = 0; + global.Date = GlobalDate; }; - self.Date = FakeDate; - createDateProperties(); return self; function FakeDate() { if (arguments.length === 0) { - return new global.Date(currentTime); + return new GlobalDate(currentTime); } else { - return global.Date.apply(this, arguments); + return new GlobalDate(arguments[0], arguments[1], arguments[2], + arguments[3], arguments[4], arguments[5], arguments[6]); } - } + } function createDateProperties() { - FakeDate.prototype = global.Date.prototype; FakeDate.now = function() { return currentTime; - } + }; - FakeDate.toSource = global.Date.toSource; - FakeDate.toString = global.Date.toString; - FakeDate.parse = global.Date.parse; - FakeDate.UTC = global.Date.UTC; + FakeDate.toSource = GlobalDate.toSource; + FakeDate.toString = GlobalDate.toString; + FakeDate.parse = GlobalDate.parse; + FakeDate.UTC = GlobalDate.UTC; } }