diff --git a/lib/jasmine.js b/lib/jasmine.js index 41dbad1f..bf8419ce 100644 --- a/lib/jasmine.js +++ b/lib/jasmine.js @@ -852,6 +852,10 @@ jasmine.ActionCollection.prototype.waitForDone = function(action) { jasmine.Reporter = function() { }; +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { +}; + //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportRunnerResults = function(runner) { }; @@ -1140,164 +1144,164 @@ jasmine.Matchers.Any.prototype.toString = function() { return ''; }; -// Mock setTimeout, clearTimeout -// Contributed by Pivotal Computer Systems, www.pivotalsf.com - -jasmine.FakeTimer = function() { - this.reset(); - - var self = this; - self.setTimeout = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); - return self.timeoutsMade; - }; - - self.setInterval = function(funcToCall, millis) { - self.timeoutsMade++; - self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); - return self.timeoutsMade; - }; - - self.clearTimeout = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = undefined; - }; - - self.clearInterval = function(timeoutKey) { - self.scheduledFunctions[timeoutKey] = undefined; - }; - -}; - -jasmine.FakeTimer.prototype.reset = function() { - this.timeoutsMade = 0; - this.scheduledFunctions = {}; - this.nowMillis = 0; -}; - -jasmine.FakeTimer.prototype.tick = function(millis) { - var oldMillis = this.nowMillis; - var newMillis = oldMillis + millis; - this.runFunctionsWithinRange(oldMillis, newMillis); - this.nowMillis = newMillis; -}; - -jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { - var scheduledFunc; - var funcsToRun = []; - for (var timeoutKey in this.scheduledFunctions) { - scheduledFunc = this.scheduledFunctions[timeoutKey]; - if (scheduledFunc != undefined && - scheduledFunc.runAtMillis >= oldMillis && - scheduledFunc.runAtMillis <= nowMillis) { - funcsToRun.push(scheduledFunc); - this.scheduledFunctions[timeoutKey] = undefined; - } - } - - if (funcsToRun.length > 0) { - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); - for (var i = 0; i < funcsToRun.length; ++i) { - try { - var funcToRun = funcsToRun[i]; - this.nowMillis = funcToRun.runAtMillis; - funcToRun.funcToCall(); - if (funcToRun.recurring) { - this.scheduleFunction(funcToRun.timeoutKey, - funcToRun.funcToCall, - funcToRun.millis, - true); - } - } catch(e) { - } - } - this.runFunctionsWithinRange(oldMillis, nowMillis); - } -}; - -jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { - this.scheduledFunctions[timeoutKey] = { - runAtMillis: this.nowMillis + millis, - funcToCall: funcToCall, - recurring: recurring, - timeoutKey: timeoutKey, - millis: millis - }; -}; - - -jasmine.Clock = { - defaultFakeTimer: new jasmine.FakeTimer(), - - reset: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.reset(); - }, - - tick: function(millis) { - jasmine.Clock.assertInstalled(); - jasmine.Clock.defaultFakeTimer.tick(millis); - }, - - runFunctionsWithinRange: function(oldMillis, nowMillis) { - jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); - }, - - scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { - jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); - }, - - useMock: function() { - var spec = jasmine.getEnv().currentSpec; - spec.after(jasmine.Clock.uninstallMock); - - jasmine.Clock.installMock(); - }, - - installMock: function() { - jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; - }, - - uninstallMock: function() { - jasmine.Clock.assertInstalled(); - jasmine.Clock.installed = jasmine.Clock.real; - }, - - real: { - setTimeout: window.setTimeout, - clearTimeout: window.clearTimeout, - setInterval: window.setInterval, - clearInterval: window.clearInterval - }, - - assertInstalled: function() { - if (jasmine.Clock.installed != jasmine.Clock.defaultFakeTimer) { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); - } - }, - - installed: null -}; -jasmine.Clock.installed = jasmine.Clock.real; - -window.setTimeout = function(funcToCall, millis) { - return jasmine.Clock.installed.setTimeout.apply(this, arguments); -}; - -window.setInterval = function(funcToCall, millis) { - return jasmine.Clock.installed.setInterval.apply(this, arguments); -}; - -window.clearTimeout = function(timeoutKey) { - return jasmine.Clock.installed.clearTimeout.apply(this, arguments); -}; - -window.clearInterval = function(timeoutKey) { - return jasmine.Clock.installed.clearInterval.apply(this, arguments); -}; - +// Mock setTimeout, clearTimeout +// Contributed by Pivotal Computer Systems, www.pivotalsf.com + +jasmine.FakeTimer = function() { + this.reset(); + + var self = this; + self.setTimeout = function(funcToCall, millis) { + self.timeoutsMade++; + self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); + return self.timeoutsMade; + }; + + self.setInterval = function(funcToCall, millis) { + self.timeoutsMade++; + self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); + return self.timeoutsMade; + }; + + self.clearTimeout = function(timeoutKey) { + self.scheduledFunctions[timeoutKey] = undefined; + }; + + self.clearInterval = function(timeoutKey) { + self.scheduledFunctions[timeoutKey] = undefined; + }; + +}; + +jasmine.FakeTimer.prototype.reset = function() { + this.timeoutsMade = 0; + this.scheduledFunctions = {}; + this.nowMillis = 0; +}; + +jasmine.FakeTimer.prototype.tick = function(millis) { + var oldMillis = this.nowMillis; + var newMillis = oldMillis + millis; + this.runFunctionsWithinRange(oldMillis, newMillis); + this.nowMillis = newMillis; +}; + +jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { + var scheduledFunc; + var funcsToRun = []; + for (var timeoutKey in this.scheduledFunctions) { + scheduledFunc = this.scheduledFunctions[timeoutKey]; + if (scheduledFunc != undefined && + scheduledFunc.runAtMillis >= oldMillis && + scheduledFunc.runAtMillis <= nowMillis) { + funcsToRun.push(scheduledFunc); + this.scheduledFunctions[timeoutKey] = undefined; + } + } + + if (funcsToRun.length > 0) { + funcsToRun.sort(function(a, b) { + return a.runAtMillis - b.runAtMillis; + }); + for (var i = 0; i < funcsToRun.length; ++i) { + try { + var funcToRun = funcsToRun[i]; + this.nowMillis = funcToRun.runAtMillis; + funcToRun.funcToCall(); + if (funcToRun.recurring) { + this.scheduleFunction(funcToRun.timeoutKey, + funcToRun.funcToCall, + funcToRun.millis, + true); + } + } catch(e) { + } + } + this.runFunctionsWithinRange(oldMillis, nowMillis); + } +}; + +jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { + this.scheduledFunctions[timeoutKey] = { + runAtMillis: this.nowMillis + millis, + funcToCall: funcToCall, + recurring: recurring, + timeoutKey: timeoutKey, + millis: millis + }; +}; + + +jasmine.Clock = { + defaultFakeTimer: new jasmine.FakeTimer(), + + reset: function() { + jasmine.Clock.assertInstalled(); + jasmine.Clock.defaultFakeTimer.reset(); + }, + + tick: function(millis) { + jasmine.Clock.assertInstalled(); + jasmine.Clock.defaultFakeTimer.tick(millis); + }, + + runFunctionsWithinRange: function(oldMillis, nowMillis) { + jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); + }, + + scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { + jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); + }, + + useMock: function() { + var spec = jasmine.getEnv().currentSpec; + spec.after(jasmine.Clock.uninstallMock); + + jasmine.Clock.installMock(); + }, + + installMock: function() { + jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; + }, + + uninstallMock: function() { + jasmine.Clock.assertInstalled(); + jasmine.Clock.installed = jasmine.Clock.real; + }, + + real: { + setTimeout: window.setTimeout, + clearTimeout: window.clearTimeout, + setInterval: window.setInterval, + clearInterval: window.clearInterval + }, + + assertInstalled: function() { + if (jasmine.Clock.installed != jasmine.Clock.defaultFakeTimer) { + throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); + } + }, + + installed: null +}; +jasmine.Clock.installed = jasmine.Clock.real; + +window.setTimeout = function(funcToCall, millis) { + return jasmine.Clock.installed.setTimeout.apply(this, arguments); +}; + +window.setInterval = function(funcToCall, millis) { + return jasmine.Clock.installed.setInterval.apply(this, arguments); +}; + +window.clearTimeout = function(timeoutKey) { + return jasmine.Clock.installed.clearTimeout.apply(this, arguments); +}; + +window.clearInterval = function(timeoutKey) { + return jasmine.Clock.installed.clearInterval.apply(this, arguments); +}; + /** * @constructor */ @@ -1311,13 +1315,16 @@ jasmine.MultiReporter.prototype.addReporter = function(reporter) { }; (function() { - var functionNames = ["reportRunnerResults", "reportSuiteResults", "reportSpecResults", "log"]; + var functionNames = ["reportRunnerStarting", "reportRunnerResults", "reportSuiteResults", "reportSpecResults", "log"]; for (var i = 0; i < functionNames.length; i++) { var functionName = functionNames[i]; jasmine.MultiReporter.prototype[functionName] = (function(functionName) { return function() { for (var j = 0; j < this.subReporters_.length; j++) { - this.subReporters_[j][functionName].apply(this.subReporters_[j], arguments); + var subReporter = this.subReporters_[j]; + if (subReporter[functionName]) { + subReporter[functionName].apply(subReporter, arguments); + } } }; })(functionName); @@ -1648,6 +1655,13 @@ jasmine.Runner = function(env) { }; jasmine.util.inherit(jasmine.Runner, jasmine.ActionCollection); +jasmine.Runner.prototype.execute = function() { + if (this.env.reporter.reportRunnerStarting) { + this.env.reporter.reportRunnerStarting(this); + } + jasmine.ActionCollection.prototype.execute.call(this); +}; + jasmine.Runner.prototype.finishCallback = function() { this.env.reporter.reportRunnerResults(this); }; diff --git a/spec/suites/EnvTest.js b/spec/suites/EnvTest.js index 85d8f4d8..62676ae5 100644 --- a/spec/suites/EnvTest.js +++ b/spec/suites/EnvTest.js @@ -13,9 +13,5 @@ describe("jasmine.Env", function() { env.reporter.log("message"); expect(fakeReporter.log).wasCalledWith("message"); }); - - xit("should report when the tests start running", function() { - - }); }); }); \ No newline at end of file diff --git a/spec/suites/MultiReporterTest.js b/spec/suites/MultiReporterTest.js index 3f65497f..1118efa3 100644 --- a/spec/suites/MultiReporterTest.js +++ b/spec/suites/MultiReporterTest.js @@ -1,13 +1,30 @@ describe("jasmine.MultiReporter", function() { - it("should delegate to any and all subreporters", function() { - var multiReporter = new jasmine.MultiReporter(); - var fakeReporter1 = jasmine.createSpyObj("fakeReporter1", ["reportSpecResults"]); - var fakeReporter2 = jasmine.createSpyObj("fakeReporter2", ["reportSpecResults"]); + var multiReporter, fakeReporter1, fakeReporter2; + + beforeEach(function() { + multiReporter = new jasmine.MultiReporter(); + fakeReporter1 = jasmine.createSpyObj("fakeReporter1", ["reportSpecResults"]); + fakeReporter2 = jasmine.createSpyObj("fakeReporter2", ["reportSpecResults", "reportRunnerStarting"]); multiReporter.addReporter(fakeReporter1); multiReporter.addReporter(fakeReporter2); + }); + it("should support all the method calls that jasmine.Reporter supports", function() { + multiReporter.reportRunnerStarting(); + multiReporter.reportRunnerResults(); + multiReporter.reportSuiteResults(); + multiReporter.reportSpecResults(); + multiReporter.log(); + }); + + it("should delegate to any and all subreporters", function() { multiReporter.reportSpecResults('blah', 'foo'); expect(fakeReporter1.reportSpecResults).wasCalledWith('blah', 'foo'); expect(fakeReporter2.reportSpecResults).wasCalledWith('blah', 'foo'); }); + + it("should quietly skip delegating to any subreporters which lack the given method", function() { + multiReporter.reportRunnerStarting('blah', 'foo'); + expect(fakeReporter2.reportRunnerStarting).wasCalledWith('blah', 'foo'); + }); }); \ No newline at end of file diff --git a/spec/suites/RunnerTest.js b/spec/suites/RunnerTest.js index 1bcf6bff..c0009b39 100644 --- a/spec/suites/RunnerTest.js +++ b/spec/suites/RunnerTest.js @@ -114,4 +114,13 @@ describe('RunnerTest', function() { expect(foo).toEqual(1); }); + it("should report when the tests start running", function() { + var fakeReporter = jasmine.createSpyObj("fakeReporter", ["log", "reportRunnerStarting"]); + env.addReporter(fakeReporter); + + var runner = new jasmine.Runner(env); + runner.execute(); + expect(fakeReporter.reportRunnerStarting).wasCalledWith(env.currentRunner); + }); + }); \ No newline at end of file diff --git a/src/MultiReporter.js b/src/MultiReporter.js index d3a4fb9c..cb8110ae 100644 --- a/src/MultiReporter.js +++ b/src/MultiReporter.js @@ -11,13 +11,16 @@ jasmine.MultiReporter.prototype.addReporter = function(reporter) { }; (function() { - var functionNames = ["reportRunnerResults", "reportSuiteResults", "reportSpecResults", "log"]; + var functionNames = ["reportRunnerStarting", "reportRunnerResults", "reportSuiteResults", "reportSpecResults", "log"]; for (var i = 0; i < functionNames.length; i++) { var functionName = functionNames[i]; jasmine.MultiReporter.prototype[functionName] = (function(functionName) { return function() { for (var j = 0; j < this.subReporters_.length; j++) { - this.subReporters_[j][functionName].apply(this.subReporters_[j], arguments); + var subReporter = this.subReporters_[j]; + if (subReporter[functionName]) { + subReporter[functionName].apply(subReporter, arguments); + } } }; })(functionName); diff --git a/src/Reporter.js b/src/Reporter.js index 2f1c705f..0e4350ce 100644 --- a/src/Reporter.js +++ b/src/Reporter.js @@ -5,6 +5,10 @@ jasmine.Reporter = function() { }; +//noinspection JSUnusedLocalSymbols +jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { +}; + //noinspection JSUnusedLocalSymbols jasmine.Reporter.prototype.reportRunnerResults = function(runner) { }; diff --git a/src/Runner.js b/src/Runner.js index 2dfc1384..725cbe1f 100644 --- a/src/Runner.js +++ b/src/Runner.js @@ -11,6 +11,13 @@ jasmine.Runner = function(env) { }; jasmine.util.inherit(jasmine.Runner, jasmine.ActionCollection); +jasmine.Runner.prototype.execute = function() { + if (this.env.reporter.reportRunnerStarting) { + this.env.reporter.reportRunnerStarting(this); + } + jasmine.ActionCollection.prototype.execute.call(this); +}; + jasmine.Runner.prototype.finishCallback = function() { this.env.reporter.reportRunnerResults(this); };