From ffdf1eb16dd337f236e03c6b4fb6c8b5e0597ae7 Mon Sep 17 00:00:00 2001 From: Sheel Choksi Date: Sun, 9 Jun 2013 12:05:03 -0700 Subject: [PATCH] Add execution time elapsed to JsApiReporter Since this information is desired in ConsoleReporter, HtmlReporter, and now JsApiReporter, the executionTime is passed through in jasmineDone from Env instead of making each reporter compute it. Fixes #30, [Finishes #45659879] --- lib/jasmine-core/jasmine-html.js | 12 ++++-------- lib/jasmine-core/jasmine.js | 17 ++++++++++++++--- spec/console/ConsoleReporterSpec.js | 21 ++++++--------------- spec/core/EnvSpec.js | 12 +++++++++--- spec/core/JsApiReporterSpec.js | 22 ++++++++++++++++++++-- spec/html/HtmlReporterSpec.js | 20 ++++++++------------ src/console/ConsoleReporter.js | 9 ++------- src/console/console.js | 9 ++------- src/core/Env.js | 8 ++++++-- src/core/JsApiReporter.js | 9 ++++++++- src/html/HtmlReporter.js | 12 ++++-------- 11 files changed, 83 insertions(+), 68 deletions(-) diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index 94c2b4ed..08df7bcb 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -30,11 +30,10 @@ jasmineRequire.HtmlReporter = function() { function HtmlReporter(options) { var env = options.env || {}, getContainer = options.getContainer, - now = options.now || function() { return new Date().getTime();}, createElement = options.createElement, createTextNode = options.createTextNode, + onRaiseExceptionsClick = options.onRaiseExceptionsClick, results = [], - startTime, specsExecuted = 0, failureCount = 0, pendingSpecCount = 0, @@ -61,7 +60,6 @@ jasmineRequire.HtmlReporter = function() { var totalSpecsDefined; this.jasmineStarted = function(options) { totalSpecsDefined = options.totalSpecsDefined || 0; - startTime = now(); }; var summary = createDom("div", {className: "summary"}); @@ -122,11 +120,9 @@ jasmineRequire.HtmlReporter = function() { } }; - this.jasmineDone = function() { - var elapsed = now() - startTime; - + this.jasmineDone = function(options) { var banner = find(".banner"); - banner.appendChild(createDom("span", {className: "duration"}, "finished in " + elapsed / 1000 + "s")); + banner.appendChild(createDom("span", {className: "duration"}, "finished in " + options.executionTime / 1000 + "s")); var alert = find(".alert"); @@ -141,7 +137,7 @@ jasmineRequire.HtmlReporter = function() { var checkbox = find("input"); checkbox.checked = !env.catchingExceptions(); - checkbox.onclick = options.onRaiseExceptionsClick; + checkbox.onclick = onRaiseExceptionsClick; if (specsExecuted < totalSpecsDefined) { var skippedMessage = "Ran " + specsExecuted + " of " + totalSpecsDefined + " specs - run all"; diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index b20bccd1..c0667933 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -307,7 +307,8 @@ getJasmineRequireObj().Env = function(j$) { function Env(options) { options = options || {}; var self = this; - var global = options.global || j$.getGlobal(); + var global = options.global || j$.getGlobal(), + now = options.now || function() { return new Date().getTime(); }; var catchExceptions = true; @@ -497,10 +498,13 @@ getJasmineRequireObj().Env = function(j$) { }; this.execute = function() { + var startTime = now(); this.reporter.jasmineStarted({ totalSpecsDefined: totalSpecsDefined }); - this.topSuite.execute(this.reporter.jasmineDone); + this.topSuite.execute(function() { + self.reporter.jasmineDone({executionTime: now() - startTime}); + }); }; } @@ -655,8 +659,11 @@ getJasmineRequireObj().JsApiReporter = function() { status = 'started'; }; - this.jasmineDone = function() { + var executionTime; + + this.jasmineDone = function(options) { this.finished = true; + executionTime = options.executionTime; status = 'done'; }; @@ -697,6 +704,10 @@ getJasmineRequireObj().JsApiReporter = function() { return specs; }; + this.executionTime = function() { + return executionTime; + }; + } return JsApiReporter; diff --git a/spec/console/ConsoleReporterSpec.js b/spec/console/ConsoleReporterSpec.js index d3672f82..252c847b 100644 --- a/spec/console/ConsoleReporterSpec.js +++ b/spec/console/ConsoleReporterSpec.js @@ -69,20 +69,15 @@ describe("ConsoleReporter", function() { }); it("reports a summary when done (singluar spec and time)", function() { - var fakeNow = jasmine.createSpy('fake Date.now'), - reporter = new j$.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print, - now: fakeNow }); - fakeNow.andReturn(500); - reporter.jasmineStarted(); reporter.specDone({status: "passed"}); - fakeNow.andReturn(1500); out.clear(); - reporter.jasmineDone(); + reporter.jasmineDone({executionTime: 1000}); expect(out.getOutput()).toMatch(/1 spec, 0 failures/); expect(out.getOutput()).not.toMatch(/0 pending specs/); @@ -90,13 +85,10 @@ describe("ConsoleReporter", function() { }); it("reports a summary when done (pluralized specs and seconds)", function() { - var fakeNow = jasmine.createSpy('fake Date.now'), - reporter = new j$.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print, - now: fakeNow }); - fakeNow.andReturn(500); reporter.jasmineStarted(); reporter.specDone({status: "passed"}); reporter.specDone({status: "pending"}); @@ -117,8 +109,7 @@ describe("ConsoleReporter", function() { out.clear(); - fakeNow.andReturn(600); - reporter.jasmineDone(); + reporter.jasmineDone({executionTime: 100}); expect(out.getOutput()).toMatch(/3 specs, 1 failure, 1 pending spec/); expect(out.getOutput()).toMatch("Finished in 0.1 seconds\n"); @@ -148,7 +139,7 @@ describe("ConsoleReporter", function() { out.clear(); - reporter.jasmineDone(); + reporter.jasmineDone({}); expect(out.getOutput()).toMatch(/foo bar baz/); }); @@ -160,7 +151,7 @@ describe("ConsoleReporter", function() { onComplete: onComplete }); - reporter.jasmineDone(); + reporter.jasmineDone({}); expect(onComplete).toHaveBeenCalled(); }); diff --git a/spec/core/EnvSpec.js b/spec/core/EnvSpec.js index 8461fae8..d9d7f2ee 100644 --- a/spec/core/EnvSpec.js +++ b/spec/core/EnvSpec.js @@ -167,8 +167,9 @@ describe("Env (integration)", function() { // TODO: something is wrong with this spec it("should report as expected", function() { - var env = new j$.Env(), - reporter = jasmine.createSpyObj('fakeReproter', [ + var fakeNow = jasmine.createSpy('fake Date.now'), + env = new j$.Env({now: fakeNow}), + reporter = jasmine.createSpyObj('fakeReporter', [ "jasmineStarted", "jasmineDone", "suiteStarted", @@ -177,6 +178,9 @@ describe("Env (integration)", function() { "specDone" ]); + fakeNow.andReturn(500); + reporter.suiteDone.andCallFake(function() { fakeNow.andReturn(1500); }); + env.addReporter(reporter); env.describe("A Suite", function() { @@ -200,7 +204,9 @@ describe("Env (integration)", function() { }); var suiteResult = reporter.suiteStarted.calls[0].args[0]; expect(suiteResult.description).toEqual("A Suite"); - expect(reporter.jasmineDone).toHaveBeenCalled(); + expect(reporter.jasmineDone).toHaveBeenCalledWith({ + executionTime: 1000 + }); }); it("should be possible to get full name from a spec", function() { diff --git a/spec/core/JsApiReporterSpec.js b/spec/core/JsApiReporterSpec.js index 24d2f963..7acf948f 100644 --- a/spec/core/JsApiReporterSpec.js +++ b/spec/core/JsApiReporterSpec.js @@ -101,7 +101,7 @@ describe("JsApiReporter", function() { expect(reporter.finished).toBe(false); reporter.jasmineStarted(); - reporter.jasmineDone(); + reporter.jasmineDone({}); expect(reporter.finished).toBe(true); }); @@ -123,7 +123,7 @@ describe("JsApiReporter", function() { it("reports 'done' when Jasmine is done", function() { var reporter = new j$.JsApiReporter(); - reporter.jasmineDone(); + reporter.jasmineDone({}); expect(reporter.status()).toEqual('done'); }); @@ -178,4 +178,22 @@ describe("JsApiReporter", function() { }); }); }); + + describe("#executionTime", function() { + var reporter; + beforeEach(function() { + reporter = new j$.JsApiReporter(); + }); + + it("should return the time it took the specs to run, in ms", function() { + reporter.jasmineDone({executionTime: 1000}); + expect(reporter.executionTime()).toEqual(1000); + }); + + describe("when the specs haven't finished being run", function() { + it("should return undefined", function() { + expect(reporter.executionTime()).toBeUndefined(); + }); + }); + }); }); diff --git a/spec/html/HtmlReporterSpec.js b/spec/html/HtmlReporterSpec.js index 51f91c87..5f15cecb 100644 --- a/spec/html/HtmlReporterSpec.js +++ b/spec/html/HtmlReporterSpec.js @@ -118,23 +118,19 @@ describe("New HtmlReporter", function() { describe("when Jasmine is done", function() { it("reports the run time", function() { var env = new jasmine.Env(), - fakeNow = jasmine.createSpy('fake Date.now'), container = document.createElement("div"), getContainer = function() { return container; }, reporter = new jasmine.HtmlReporter({ env: env, getContainer: getContainer, - now: fakeNow, createElement: function() { return document.createElement.apply(document, arguments); }, createTextNode: function() { return document.createTextNode.apply(document, arguments); } }); reporter.initialize(); - fakeNow.andReturn(500); reporter.jasmineStarted({}); - fakeNow.andReturn(600); - reporter.jasmineDone(); + reporter.jasmineDone({executionTime: 100}); var duration = container.querySelector(".banner .duration"); expect(duration.innerHTML).toMatch(/finished in 0.1s/); @@ -197,7 +193,7 @@ describe("New HtmlReporter", function() { reporter.suiteDone({id: 1}); - reporter.jasmineDone(); + reporter.jasmineDone({}); var summary = container.querySelector(".summary"); expect(summary.childNodes.length).toEqual(1); @@ -247,7 +243,7 @@ describe("New HtmlReporter", function() { }); reporter.initialize(); - reporter.jasmineDone(); + reporter.jasmineDone({}); var raisingExceptionsUI = container.querySelector(".raise"); expect(raisingExceptionsUI.checked).toBe(false); @@ -272,7 +268,7 @@ describe("New HtmlReporter", function() { reporter.initialize(); env.catchExceptions(false); - reporter.jasmineDone(); + reporter.jasmineDone({}); var raisingExceptionsUI = container.querySelector(".raise"); expect(raisingExceptionsUI.checked).toBe(true); @@ -298,7 +294,7 @@ describe("New HtmlReporter", function() { }); reporter.initialize(); - reporter.jasmineDone(); + reporter.jasmineDone({}); var input = container.querySelector(".raise"); input.click(); @@ -333,7 +329,7 @@ describe("New HtmlReporter", function() { fullName: "A Suite inner suite with another spec", status: "passed" }); - reporter.jasmineDone(); + reporter.jasmineDone({}); }); it("reports the specs counts", function() { @@ -378,7 +374,7 @@ describe("New HtmlReporter", function() { fullName: "A Suite with a spec", status: "pending" }); - reporter.jasmineDone(); + reporter.jasmineDone({}); }); it("reports the pending specs count", function() { @@ -429,7 +425,7 @@ describe("New HtmlReporter", function() { }; reporter.specStarted(failingResult); reporter.specDone(failingResult); - reporter.jasmineDone(); + reporter.jasmineDone({}); }); it("reports the specs counts", function() { diff --git a/src/console/ConsoleReporter.js b/src/console/ConsoleReporter.js index a18ce372..2299c229 100644 --- a/src/console/ConsoleReporter.js +++ b/src/console/ConsoleReporter.js @@ -3,8 +3,6 @@ getJasmineRequireObj().ConsoleReporter = function() { var print = options.print, showColors = options.showColors || false, onComplete = options.onComplete || function() {}, - now = options.now || function() { return new Date().getTime();}, - startTime = 0, specCount, failureCount, failedSpecs = [], @@ -17,7 +15,6 @@ getJasmineRequireObj().ConsoleReporter = function() { }; this.jasmineStarted = function() { - startTime = now(); specCount = 0; failureCount = 0; pendingCount = 0; @@ -25,9 +22,7 @@ getJasmineRequireObj().ConsoleReporter = function() { printNewline(); }; - this.jasmineDone = function() { - var elapsed = now() - startTime; - + this.jasmineDone = function(options) { printNewline(); for (var i = 0; i < failedSpecs.length; i++) { specFailureDetails(failedSpecs[i]); @@ -44,7 +39,7 @@ getJasmineRequireObj().ConsoleReporter = function() { print(specCounts); printNewline(); - var seconds = elapsed / 1000; + var seconds = options.executionTime / 1000; print("Finished in " + seconds + " " + plural("second", seconds)); printNewline(); diff --git a/src/console/console.js b/src/console/console.js index 0fe81ccb..85f6166c 100644 --- a/src/console/console.js +++ b/src/console/console.js @@ -38,8 +38,6 @@ getJasmineRequireObj().ConsoleReporter = function() { var print = options.print, showColors = options.showColors || false, onComplete = options.onComplete || function() {}, - now = options.now || function() { return new Date().getTime();}, - startTime = 0, specCount, failureCount, failedSpecs = [], @@ -52,7 +50,6 @@ getJasmineRequireObj().ConsoleReporter = function() { }; this.jasmineStarted = function() { - startTime = now(); specCount = 0; failureCount = 0; pendingCount = 0; @@ -60,9 +57,7 @@ getJasmineRequireObj().ConsoleReporter = function() { printNewline(); }; - this.jasmineDone = function() { - var elapsed = now() - startTime; - + this.jasmineDone = function(options) { printNewline(); for (var i = 0; i < failedSpecs.length; i++) { specFailureDetails(failedSpecs[i]); @@ -79,7 +74,7 @@ getJasmineRequireObj().ConsoleReporter = function() { print(specCounts); printNewline(); - var seconds = elapsed / 1000; + var seconds = options.executionTime / 1000; print("Finished in " + seconds + " " + plural("second", seconds)); printNewline(); diff --git a/src/core/Env.js b/src/core/Env.js index 448b3792..b23c90fc 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -2,7 +2,8 @@ getJasmineRequireObj().Env = function(j$) { function Env(options) { options = options || {}; var self = this; - var global = options.global || j$.getGlobal(); + var global = options.global || j$.getGlobal(), + now = options.now || function() { return new Date().getTime(); }; var catchExceptions = true; @@ -192,10 +193,13 @@ getJasmineRequireObj().Env = function(j$) { }; this.execute = function() { + var startTime = now(); this.reporter.jasmineStarted({ totalSpecsDefined: totalSpecsDefined }); - this.topSuite.execute(this.reporter.jasmineDone); + this.topSuite.execute(function() { + self.reporter.jasmineDone({executionTime: now() - startTime}); + }); }; } diff --git a/src/core/JsApiReporter.js b/src/core/JsApiReporter.js index e482c068..13ec6488 100644 --- a/src/core/JsApiReporter.js +++ b/src/core/JsApiReporter.js @@ -11,8 +11,11 @@ getJasmineRequireObj().JsApiReporter = function() { status = 'started'; }; - this.jasmineDone = function() { + var executionTime; + + this.jasmineDone = function(options) { this.finished = true; + executionTime = options.executionTime; status = 'done'; }; @@ -53,6 +56,10 @@ getJasmineRequireObj().JsApiReporter = function() { return specs; }; + this.executionTime = function() { + return executionTime; + }; + } return JsApiReporter; diff --git a/src/html/HtmlReporter.js b/src/html/HtmlReporter.js index edabafd9..4fc32614 100644 --- a/src/html/HtmlReporter.js +++ b/src/html/HtmlReporter.js @@ -2,11 +2,10 @@ jasmineRequire.HtmlReporter = function() { function HtmlReporter(options) { var env = options.env || {}, getContainer = options.getContainer, - now = options.now || function() { return new Date().getTime();}, createElement = options.createElement, createTextNode = options.createTextNode, + onRaiseExceptionsClick = options.onRaiseExceptionsClick, results = [], - startTime, specsExecuted = 0, failureCount = 0, pendingSpecCount = 0, @@ -33,7 +32,6 @@ jasmineRequire.HtmlReporter = function() { var totalSpecsDefined; this.jasmineStarted = function(options) { totalSpecsDefined = options.totalSpecsDefined || 0; - startTime = now(); }; var summary = createDom("div", {className: "summary"}); @@ -94,11 +92,9 @@ jasmineRequire.HtmlReporter = function() { } }; - this.jasmineDone = function() { - var elapsed = now() - startTime; - + this.jasmineDone = function(options) { var banner = find(".banner"); - banner.appendChild(createDom("span", {className: "duration"}, "finished in " + elapsed / 1000 + "s")); + banner.appendChild(createDom("span", {className: "duration"}, "finished in " + options.executionTime / 1000 + "s")); var alert = find(".alert"); @@ -113,7 +109,7 @@ jasmineRequire.HtmlReporter = function() { var checkbox = find("input"); checkbox.checked = !env.catchingExceptions(); - checkbox.onclick = options.onRaiseExceptionsClick; + checkbox.onclick = onRaiseExceptionsClick; if (specsExecuted < totalSpecsDefined) { var skippedMessage = "Ran " + specsExecuted + " of " + totalSpecsDefined + " specs - run all";