From 528b5abedafc658e773483bd866525a719849793 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 13:35:53 -0800 Subject: [PATCH 01/24] beginning of trivial node reporter, based on jasmine-node. jshint rules exclude bad escapements WRT ansi colors, beacuse that's ok. --- spec/runner.html | 2 + spec/suites/TrivialNodeReporterSpec.js | 70 ++++++++++++++++++++++++++ src/node/TrivialNodeReporter.js | 45 +++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 spec/suites/TrivialNodeReporterSpec.js create mode 100644 src/node/TrivialNodeReporter.js diff --git a/spec/runner.html b/spec/runner.html index 7ce2e7f..18b801e 100644 --- a/spec/runner.html +++ b/spec/runner.html @@ -29,6 +29,7 @@ + @@ -50,6 +51,7 @@ + diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js new file mode 100644 index 0000000..4935ec1 --- /dev/null +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -0,0 +1,70 @@ +describe("TrivialNodeReporter", function() { + + + var green = function(str) { + return '\033[32m' + str + '\033[0m'; //keep these literal. otherwise the test loses value as a test. + }; + + var red = function(str) { + return '\033[31m' + str + '\033[0m'; + }; + + var newline = "\n"; + + beforeEach(function() { + this.fakeSys = (function(){ + var output = ""; + return { + puts:function(str) {output += str + "\n";}, + print:function(str) {output += str;}, + getOutput:function(){return output;} + }; + })(); + + this.env = new jasmine.Env(); + this.env.updateInterval = 0; + + this.reporter = new jasmine.TrivialNodeReporter(this.fakeSys); + }); + + // reportSpecResults: function(spec) { + // var result = spec.results(); + // var msg = ''; + // if (result.passed()) + // { + // msg = (colors) ? (ansi.green + '.' + ansi.none) : '.'; + // // } else if (result.skipped) { TODO: Research why "result.skipped" returns false when "xit" is called on a spec? + // // msg = (colors) ? (ansi.yellow + '*' + ansi.none) : '*'; + // } else { + // msg = (colors) ? (ansi.red + 'F' + ansi.none) : 'F'; + // } + // sys.print(msg); + // if (columnCounter++ < 50) return; + // columnCounter = 0; + // sys.print('\n'); + // }, + + + + describe('A Test Run', function(){ + + describe('A spec runs', function(){ + + it("prints a green dot if the spec passes", function(){ + var passingSpec = { + results: function(){ + return {passed:function(){return true;}}; + } + }; + this.reporter.reportSpecResults(passingSpec); + + expect(this.fakeSys.getOutput()).toEqual( + green(".") + ); + }); + + }); + + }); + +}); \ No newline at end of file diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js new file mode 100644 index 0000000..273f1b0 --- /dev/null +++ b/src/node/TrivialNodeReporter.js @@ -0,0 +1,45 @@ +jasmine.TrivialNodeReporter = function(sys) { + this.sys = sys; + + this.ansi = { + green: '\033[32m', + red: '\033[31m', + yellow: '\033[33m', + none: '\033[0m' + }; +}; + +// reportSpecResults: function(spec) { +// var result = spec.results(); +// var msg = ''; +// if (result.passed()) +// { +// msg = (colors) ? (ansi.green + '.' + ansi.none) : '.'; +// // } else if (result.skipped) { TODO: Research why "result.skipped" returns false when "xit" is called on a spec? +// // msg = (colors) ? (ansi.yellow + '*' + ansi.none) : '*'; +// } else { +// msg = (colors) ? (ansi.red + 'F' + ansi.none) : 'F'; +// } +// sys.print(msg); +// if (columnCounter++ < 50) return; +// columnCounter = 0; +// sys.print('\n'); +// }, + + +jasmine.TrivialNodeReporter.prototype._coloredStr = function(color, str) { + return this.ansi[color] + str + this.ansi.none; +}; + +jasmine.TrivialNodeReporter.prototype._greenStr = function(str) { return this._coloredStr("green", str); }; +jasmine.TrivialNodeReporter.prototype._redStr = function(str) { return this._coloredStr("red", str); }; +jasmine.TrivialNodeReporter.prototype._yellowStr = function(str) { return this._coloredStr("yellow", str); }; + +jasmine.TrivialNodeReporter.prototype._greenDot = function(str) { return this.sys.print(this._greenStr(".")); }; +jasmine.TrivialNodeReporter.prototype._newLine = function(str) { return this.sys.print("\n"); }; + +jasmine.TrivialNodeReporter.prototype.reportSpecResults = function(spec) { + if (spec.results().passed()) this._greenDot(); +}; + + From 945a9ba638b11501e30db20665a9c7d06208decf Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 13:45:22 -0800 Subject: [PATCH 02/24] failing spec makes a red dot --- spec/suites/TrivialNodeReporterSpec.js | 21 +++++++++++++++++---- src/node/TrivialNodeReporter.js | 7 ++++++- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 4935ec1..35823fd 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -1,13 +1,13 @@ describe("TrivialNodeReporter", function() { - var green = function(str) { + function green(str) { return '\033[32m' + str + '\033[0m'; //keep these literal. otherwise the test loses value as a test. - }; + } - var red = function(str) { + function red(str) { return '\033[31m' + str + '\033[0m'; - }; + } var newline = "\n"; @@ -63,6 +63,19 @@ describe("TrivialNodeReporter", function() { ); }); + it("prints a red dot if the spec fails", function(){ + var failingSpec = { + results: function(){ + return {passed:function(){return false;}}; + } + }; + this.reporter.reportSpecResults(failingSpec); + + expect(this.fakeSys.getOutput()).toEqual( + red(".") + ); + }); + }); }); diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index 273f1b0..2768e6f 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -35,11 +35,16 @@ jasmine.TrivialNodeReporter.prototype._greenStr = function(str) { return this._c jasmine.TrivialNodeReporter.prototype._redStr = function(str) { return this._coloredStr("red", str); }; jasmine.TrivialNodeReporter.prototype._yellowStr = function(str) { return this._coloredStr("yellow", str); }; +jasmine.TrivialNodeReporter.prototype._redDot = function(str) { return this.sys.print(this._redStr(".")); }; jasmine.TrivialNodeReporter.prototype._greenDot = function(str) { return this.sys.print(this._greenStr(".")); }; jasmine.TrivialNodeReporter.prototype._newLine = function(str) { return this.sys.print("\n"); }; jasmine.TrivialNodeReporter.prototype.reportSpecResults = function(spec) { - if (spec.results().passed()) this._greenDot(); + if (spec.results().passed()) { + this._greenDot(); + } else { + this._redDot(); + } }; From c1d2718beaa7eaff866031303ae6b5c94467f9f9 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 13:46:30 -0800 Subject: [PATCH 03/24] red F, duh --- spec/suites/TrivialNodeReporterSpec.js | 2 +- src/node/TrivialNodeReporter.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 35823fd..2140a13 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -72,7 +72,7 @@ describe("TrivialNodeReporter", function() { this.reporter.reportSpecResults(failingSpec); expect(this.fakeSys.getOutput()).toEqual( - red(".") + red("F") ); }); diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index 2768e6f..dd68565 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -35,15 +35,16 @@ jasmine.TrivialNodeReporter.prototype._greenStr = function(str) { return this._c jasmine.TrivialNodeReporter.prototype._redStr = function(str) { return this._coloredStr("red", str); }; jasmine.TrivialNodeReporter.prototype._yellowStr = function(str) { return this._coloredStr("yellow", str); }; -jasmine.TrivialNodeReporter.prototype._redDot = function(str) { return this.sys.print(this._redStr(".")); }; + jasmine.TrivialNodeReporter.prototype._greenDot = function(str) { return this.sys.print(this._greenStr(".")); }; +jasmine.TrivialNodeReporter.prototype._redF = function(str) { return this.sys.print(this._redStr("F")); }; jasmine.TrivialNodeReporter.prototype._newLine = function(str) { return this.sys.print("\n"); }; jasmine.TrivialNodeReporter.prototype.reportSpecResults = function(spec) { if (spec.results().passed()) { this._greenDot(); } else { - this._redDot(); + this._redF(); } }; From dccafe33b01dd7bd55bf45fff45f455015128870 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 13:52:03 -0800 Subject: [PATCH 04/24] style reform --- src/node/TrivialNodeReporter.js | 45 ++++++++++++++------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index dd68565..4155922 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -1,12 +1,29 @@ jasmine.TrivialNodeReporter = function(sys) { - this.sys = sys; - this.ansi = { + var ansi = { green: '\033[32m', red: '\033[31m', yellow: '\033[33m', none: '\033[0m' }; + + function coloredStr(color, str) { return ansi[color] + str + ansi.none; } + + function greenStr(str) { return coloredStr("green", str); } + function redStr(str) { return coloredStr("red", str); } + function yellowStr(str) { return coloredStr("yellow", str); } + + function greenDot(str) { sys.print(greenStr(".")); } + function redF(str) { sys.print(redStr("F")); } + function newline(str) { sys.print("\n"); } + + this.reportSpecResults = function(spec) { + if (spec.results().passed()) { + greenDot(); + } else { + redF(); + } + }; }; // reportSpecResults: function(spec) { @@ -25,27 +42,3 @@ jasmine.TrivialNodeReporter = function(sys) { // columnCounter = 0; // sys.print('\n'); // }, - - -jasmine.TrivialNodeReporter.prototype._coloredStr = function(color, str) { - return this.ansi[color] + str + this.ansi.none; -}; - -jasmine.TrivialNodeReporter.prototype._greenStr = function(str) { return this._coloredStr("green", str); }; -jasmine.TrivialNodeReporter.prototype._redStr = function(str) { return this._coloredStr("red", str); }; -jasmine.TrivialNodeReporter.prototype._yellowStr = function(str) { return this._coloredStr("yellow", str); }; - - -jasmine.TrivialNodeReporter.prototype._greenDot = function(str) { return this.sys.print(this._greenStr(".")); }; -jasmine.TrivialNodeReporter.prototype._redF = function(str) { return this.sys.print(this._redStr("F")); }; -jasmine.TrivialNodeReporter.prototype._newLine = function(str) { return this.sys.print("\n"); }; - -jasmine.TrivialNodeReporter.prototype.reportSpecResults = function(spec) { - if (spec.results().passed()) { - this._greenDot(); - } else { - this._redF(); - } -}; - - From 8fbf3ba859010660344c63fe5559b9a565e9b249 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 14:39:59 -0800 Subject: [PATCH 05/24] newline at 50 characters --- spec/suites/TrivialNodeReporterSpec.js | 54 +++++++++++++++++++++++--- src/node/TrivialNodeReporter.js | 25 ++++++++++-- 2 files changed, 69 insertions(+), 10 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 2140a13..67de73a 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -11,6 +11,31 @@ describe("TrivialNodeReporter", function() { var newline = "\n"; + var passingSpec = { + results: function(){ + return {passed:function(){return true;}}; + } + }; + + var failingSpec = { + results: function(){ + return {passed:function(){return false;}}; + } + }; + + function repeatedlyInvoke(f, times) { + for(var i=0; i Date: Mon, 28 Feb 2011 14:51:03 -0800 Subject: [PATCH 06/24] skipped specs mean yellow star --- spec/suites/TrivialNodeReporterSpec.js | 70 ++++++++------------------ src/node/TrivialNodeReporter.js | 12 +++-- 2 files changed, 28 insertions(+), 54 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 67de73a..fdf06aa 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -1,31 +1,18 @@ describe("TrivialNodeReporter", function() { - function green(str) { - return '\033[32m' + str + '\033[0m'; //keep these literal. otherwise the test loses value as a test. - } - - function red(str) { - return '\033[31m' + str + '\033[0m'; - } + //keep these literal. otherwise the test loses value as a test. + function green(str) { return '\033[32m' + str + '\033[0m'; } + function red(str) { return '\033[31m' + str + '\033[0m'; } + function yellow(str) { return '\033[33m' + str + '\033[0m'; } var newline = "\n"; - var passingSpec = { - results: function(){ - return {passed:function(){return true;}}; - } - }; + var passingSpec = { results: function(){ return {passed:function(){return true;}}; } }, + failingSpec = { results: function(){ return {passed:function(){return false;}}; } }, + skippedSpec = { results: function(){ return {skipped:true}; } }; - var failingSpec = { - results: function(){ - return {passed:function(){return false;}}; - } - }; - - function repeatedlyInvoke(f, times) { - for(var i=0; i Date: Mon, 28 Feb 2011 14:56:09 -0800 Subject: [PATCH 07/24] print started when the test run starts --- spec/suites/TrivialNodeReporterSpec.js | 12 ++++++++++- src/node/TrivialNodeReporter.js | 28 +++++++++----------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index fdf06aa..9967b07 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -38,6 +38,16 @@ describe("TrivialNodeReporter", function() { describe('A Test Run', function(){ + + describe('Starts', function(){ + it("prints Started", function(){ + this.reporter.reportRunnerStarting(); + + expect(this.fakeSys.getOutput()).toEqual( + "Started" + newline + ); + }); + }); describe('A spec runs', function(){ it("prints a green dot if the spec passes", function(){ @@ -66,7 +76,7 @@ describe("TrivialNodeReporter", function() { }); - describe('many specs run', function(){ + describe('Many specs run', function(){ it("starts a new line every 50 specs", function(){ var self = this; repeatedlyInvoke(function(){self.reporter.reportSpecResults(failingSpec);}, 49); diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index ecae461..4182530 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -15,10 +15,13 @@ jasmine.TrivialNodeReporter = function(sys) { function redStr(str) { return coloredStr("red", str); } function yellowStr(str) { return coloredStr("yellow", str); } + function newline() { sys.print("\n"); } + function started() { sys.print("Started"); newline(); } function greenDot() { sys.print(greenStr(".")); } function redF() { sys.print(redStr("F")); } function yellowStar() { sys.print(yellowStr("*")); } - function newline() { sys.print("\n"); } + + function lineEnder(columnsPerLine) { @@ -34,6 +37,10 @@ jasmine.TrivialNodeReporter = function(sys) { var startNewLineIfNecessary = lineEnder(defaultColumnsPerLine); + this.reportRunnerStarting = function() { + started(); + }; + this.reportSpecResults = function(spec) { var results = spec.results(); if (results.skipped) { @@ -45,21 +52,4 @@ jasmine.TrivialNodeReporter = function(sys) { } startNewLineIfNecessary(); }; -}; - -// reportSpecResults: function(spec) { -// var result = spec.results(); -// var msg = ''; -// if (result.passed()) -// { -// msg = (colors) ? (ansi.green + '.' + ansi.none) : '.'; -// // } else if (result.skipped) { TODO: Research why "result.skipped" returns false when "xit" is called on a spec? -// // msg = (colors) ? (ansi.yellow + '*' + ansi.none) : '*'; -// } else { -// msg = (colors) ? (ansi.red + 'F' + ansi.none) : 'F'; -// } -// sys.print(msg); -// if (columnCounter++ < 50) return; -// columnCounter = 0; -// sys.print('\n'); -// }, +}; \ No newline at end of file From e8c8a0bdfde3c62517a4fb6bfd6bbe51feb4a27e Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 15:13:46 -0800 Subject: [PATCH 08/24] run result - passed green, failed red --- spec/suites/TrivialNodeReporterSpec.js | 26 +++++++++++++++++++++++++- src/node/TrivialNodeReporter.js | 23 ++++++++++++++++++----- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 9967b07..4815a7b 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -6,11 +6,16 @@ describe("TrivialNodeReporter", function() { function red(str) { return '\033[31m' + str + '\033[0m'; } function yellow(str) { return '\033[33m' + str + '\033[0m'; } + function prefixGreen(str) { return '\033[32m' + str; } + function prefixRed(str) { return '\033[31m' + str; } + var newline = "\n"; var passingSpec = { results: function(){ return {passed:function(){return true;}}; } }, failingSpec = { results: function(){ return {passed:function(){return false;}}; } }, - skippedSpec = { results: function(){ return {skipped:true}; } }; + skippedSpec = { results: function(){ return {skipped:true}; } }, + passingRun = { results: function(){ return {failedCount: 0}; } }, + failingRun = { results: function(){ return {failedCount: 7}; } }; function repeatedlyInvoke(f, times) { for(var i=0; i Date: Mon, 28 Feb 2011 15:31:48 -0800 Subject: [PATCH 09/24] print elapsed time in summary --- spec/suites/TrivialNodeReporterSpec.js | 45 +++++++++++++++++++++++++- src/node/TrivialNodeReporter.js | 15 ++++++--- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 4815a7b..fe82d03 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -34,7 +34,8 @@ describe("TrivialNodeReporter", function() { return { puts:function(str) {output += str + "\n";}, print:function(str) {output += str;}, - getOutput:function(){return output;} + getOutput:function(){return output;}, + clear: function(){output = "";} }; })(); @@ -122,6 +123,48 @@ describe("TrivialNodeReporter", function() { newline + prefixRed("Finished") ); }); + + it("prints the elapsed time in the summary message", function(){ + this.reporter.now = function(){return 1000} + this.reporter.reportRunnerStarting(); + this.reporter.now = function(){return 1777} + this.reporter.reportRunnerResults(passingRun); + expect(this.fakeSys.getOutput()).toContain("0.777 seconds"); + }); + + it("prints round time numbers correctly", function(){ + var self = this; + function run(startTime, endTime) { + self.fakeSys.clear(); + self.reporter.runnerStartTime = startTime; + self.reporter.now = function(){return endTime} + self.reporter.reportRunnerResults(passingRun); + } + + run(1000, 11000); + expect(this.fakeSys.getOutput()).toContain("10 seconds"); + + run(1000, 2000); + expect(this.fakeSys.getOutput()).toContain("1 seconds"); + + run(1000, 1100); + expect(this.fakeSys.getOutput()).toContain("0.1 seconds"); + + run(1000, 1010); + expect(this.fakeSys.getOutput()).toContain("0.01 seconds"); + + run(1000, 1001); + expect(this.fakeSys.getOutput()).toContain("0.001 seconds"); + }); + + it("altogether now", function(){ + this.reporter.now = function(){return 1000} + this.reporter.reportRunnerStarting(); + this.reporter.now = function(){return 1777} + this.reporter.reportRunnerResults(failingRun); + expect(this.fakeSys.getOutput()).toContain(red("Finished in 0.777 seconds")); + }); + }); }); diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index 14164d1..9b4234f 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -22,9 +22,9 @@ jasmine.TrivialNodeReporter = function(sys) { function redF() { sys.print(redStr("F")); } function yellowStar() { sys.print(yellowStr("*")); } - function finished(colorF) { newline(); sys.print(colorF("Finished")); } - function greenFinished() { finished(greenStr); } - function redFinished() { finished(redStr); } + function finished(colorF, elapsed) { newline(); sys.print(colorF("Finished in " + elapsed/1000 + " seconds")); } + function greenFinished(elapsed) { finished(greenStr, elapsed); } + function redFinished(elapsed) { finished(redStr, elapsed); } @@ -42,7 +42,10 @@ jasmine.TrivialNodeReporter = function(sys) { var startNewLineIfNecessary = lineEnder(defaultColumnsPerLine); + this.now = function() { return new Date().getTime(); } + this.reportRunnerStarting = function() { + this.runnerStartTime = this.now(); started(); }; @@ -59,10 +62,12 @@ jasmine.TrivialNodeReporter = function(sys) { }; this.reportRunnerResults = function(runner) { + var elapsed = this.now() - this.runnerStartTime; + if (runner.results().failedCount === 0) { - greenFinished(); + greenFinished(elapsed); } else { - redFinished(); + redFinished(elapsed); } }; }; \ No newline at end of file From f701fdc13270baee131c4cf75957bd354ea8eff0 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 15:34:32 -0800 Subject: [PATCH 10/24] needful --- spec/suites/TrivialNodeReporterSpec.js | 10 +++++----- src/node/TrivialNodeReporter.js | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index fe82d03..359d5bd 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -125,9 +125,9 @@ describe("TrivialNodeReporter", function() { }); it("prints the elapsed time in the summary message", function(){ - this.reporter.now = function(){return 1000} + this.reporter.now = function(){return 1000;}; this.reporter.reportRunnerStarting(); - this.reporter.now = function(){return 1777} + this.reporter.now = function(){return 1777;}; this.reporter.reportRunnerResults(passingRun); expect(this.fakeSys.getOutput()).toContain("0.777 seconds"); }); @@ -137,7 +137,7 @@ describe("TrivialNodeReporter", function() { function run(startTime, endTime) { self.fakeSys.clear(); self.reporter.runnerStartTime = startTime; - self.reporter.now = function(){return endTime} + self.reporter.now = function(){return endTime;}; self.reporter.reportRunnerResults(passingRun); } @@ -158,9 +158,9 @@ describe("TrivialNodeReporter", function() { }); it("altogether now", function(){ - this.reporter.now = function(){return 1000} + this.reporter.now = function(){return 1000;}; this.reporter.reportRunnerStarting(); - this.reporter.now = function(){return 1777} + this.reporter.now = function(){return 1777;}; this.reporter.reportRunnerResults(failingRun); expect(this.fakeSys.getOutput()).toContain(red("Finished in 0.777 seconds")); }); diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index 9b4234f..2554a48 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -42,7 +42,7 @@ jasmine.TrivialNodeReporter = function(sys) { var startNewLineIfNecessary = lineEnder(defaultColumnsPerLine); - this.now = function() { return new Date().getTime(); } + this.now = function() { return new Date().getTime(); }; this.reportRunnerStarting = function() { this.runnerStartTime = this.now(); From 7d2b900b48c8e3a6fd349090c5c4627e08d455fd Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 16:16:20 -0800 Subject: [PATCH 11/24] remember suite results as suites finish --- spec/suites/TrivialNodeReporterSpec.js | 45 ++++++++++++++++++++++++++ src/node/TrivialNodeReporter.js | 21 ++++++++++++ 2 files changed, 66 insertions(+) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 359d5bd..7c42ce7 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -106,6 +106,51 @@ describe("TrivialNodeReporter", function() { }); }); + describe('A suite runs', function(){ + it("remembers suite results", function(){ + var emptyResults = function(){return {items_:[]};}; + this.reporter.reportSuiteResults({description:"Oven", results:emptyResults}) + this.reporter.reportSuiteResults({description:"Mixer", results:emptyResults}) + + var self = this + var descriptions = [] + for(var i=0; i 0 && spec.description) suiteResult.failedSpecResults.push(spec) + }); + + this.suiteResults.push(suiteResult) + }; + this.reportRunnerResults = function(runner) { var elapsed = this.now() - this.runnerStartTime; From 882c28719118c0079c1d7945790bfc3061c650bb Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 16:50:54 -0800 Subject: [PATCH 12/24] specs/assertions/failures --- spec/suites/TrivialNodeReporterSpec.js | 141 ++++++++++++++----------- src/node/TrivialNodeReporter.js | 33 +++--- 2 files changed, 97 insertions(+), 77 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 7c42ce7..f159a87 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -11,11 +11,11 @@ describe("TrivialNodeReporter", function() { var newline = "\n"; - var passingSpec = { results: function(){ return {passed:function(){return true;}}; } }, - failingSpec = { results: function(){ return {passed:function(){return false;}}; } }, - skippedSpec = { results: function(){ return {skipped:true}; } }, - passingRun = { results: function(){ return {failedCount: 0}; } }, - failingRun = { results: function(){ return {failedCount: 7}; } }; + var passingSpec = { results: function(){ return {passed: function(){return true;}}; } }, + failingSpec = { results: function(){ return {passed: function(){return false;}}; } }, + skippedSpec = { results: function(){ return {skipped: true}; } }, + passingRun = { results: function(){ return {failedCount: 0, specs: function(){return [null, null, null];}}; } }, + failingRun = { results: function(){ return {failedCount: 7, specs: function(){return [null, null, null];}}; } }; function repeatedlyInvoke(f, times) { for(var i=0; i 0 && spec.description) suiteResult.failedSpecResults.push(spec) + if (spec.failedCount > 0 && spec.description) suiteResult.failedSpecResults.push(spec); }); - this.suiteResults.push(suiteResult) + this.suiteResults.push(suiteResult); }; this.reportRunnerResults = function(runner) { - var elapsed = this.now() - this.runnerStartTime; + finished(this.now() - this.runnerStartTime); - if (runner.results().failedCount === 0) { - greenFinished(elapsed); + var results = runner.results(); + if (results.failedCount === 0) { + greenSummary(results.specs().length, results.totalCount, results.failedCount); } else { - redFinished(elapsed); + redSummary(results.specs().length, results.totalCount, results.failedCount); } }; }; \ No newline at end of file From 9704550b33f0456123e893c1f9d1363a0cb61358 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 16:54:38 -0800 Subject: [PATCH 13/24] rf --- src/node/TrivialNodeReporter.js | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index d968bf9..dcec5a7 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -9,6 +9,12 @@ jasmine.TrivialNodeReporter = function(sys) { var defaultColumnsPerLine = 50; + var language = { + spec:"spec", + assertion:"assertion", + failure:"failure" + }; + function coloredStr(color, str) { return ansi[color] + str + ansi.none; } function greenStr(str) { return coloredStr("green", str); } @@ -26,9 +32,9 @@ jasmine.TrivialNodeReporter = function(sys) { function finished(elapsed) { newline(); sys.print("Finished in " + elapsed/1000 + " seconds"); } function summary(colorF, specs, assertions, failed) { newline(); - colorF(sys.print(specs + " " + plural("spec", specs) + ", " + - assertions + " " + plural("assertion", assertions) + ", " + - failed + " " + plural("failure", failed))); } + colorF(sys.print(specs + " " + plural(language.spec, specs) + ", " + + assertions + " " + plural(language.assertion, assertions) + ", " + + failed + " " + plural(language.failure, failed))); } function greenSummary(specs, assertions, failed){ summary(greenStr, specs, assertions, failed); } function redSummary(specs, assertions, failed){ summary(redStr, specs, assertions, failed); } @@ -92,10 +98,7 @@ jasmine.TrivialNodeReporter = function(sys) { finished(this.now() - this.runnerStartTime); var results = runner.results(); - if (results.failedCount === 0) { - greenSummary(results.specs().length, results.totalCount, results.failedCount); - } else { - redSummary(results.specs().length, results.totalCount, results.failedCount); - } + var summaryFunction = results.failedCount === 0 ? greenSummary : redSummary; + summaryFunction(results.specs().length, results.totalCount, results.failedCount); }; }; \ No newline at end of file From 5018f0d1c2b957171b03ac5a8a447611f4d94492 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 17:13:04 -0800 Subject: [PATCH 14/24] spec failure - description --- spec/suites/TrivialNodeReporterSpec.js | 23 +++++++++++++++++++++++ src/node/TrivialNodeReporter.js | 22 +++++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index f159a87..fbe45bc 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -153,6 +153,29 @@ describe("TrivialNodeReporter", function() { }); describe('Finishes', function(){ + + describe('Spec failure information', function(){ + + it("prints suite and spec descriptions together as a sentence", function(){ + this.reporter.suiteResults = [ + {description:"The oven", failedSpecResults:[ + {description:"heats up"}, + {description:"cleans itself"} + ]}, + {description:"The mixer", failedSpecResults:[ + {description:"blends things together"} + ]} + ] + + this.reporter.reportRunnerResults(failingRun); + + expect(this.fakeSys.getOutput()).toContain("The oven heats up"); + expect(this.fakeSys.getOutput()).toContain("The oven cleans itself"); + expect(this.fakeSys.getOutput()).toContain("The mixer blends things together"); + }); + + }) + describe('Finished line', function(){ it("prints the elapsed time in the summary message", function(){ diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index dcec5a7..5745370 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -30,11 +30,17 @@ jasmine.TrivialNodeReporter = function(sys) { function plural(str, count) { return count == 1 ? str : str + "s"; } + function specFailureDetails(suiteDescription, specDescription) { + newline(); + sys.print(suiteDescription + " " + specDescription); + newline(); + } function finished(elapsed) { newline(); sys.print("Finished in " + elapsed/1000 + " seconds"); } function summary(colorF, specs, assertions, failed) { newline(); colorF(sys.print(specs + " " + plural(language.spec, specs) + ", " + assertions + " " + plural(language.assertion, assertions) + ", " + - failed + " " + plural(language.failure, failed))); } + failed + " " + plural(language.failure, failed))); + newline(); } function greenSummary(specs, assertions, failed){ summary(greenStr, specs, assertions, failed); } function redSummary(specs, assertions, failed){ summary(redStr, specs, assertions, failed); } @@ -94,7 +100,21 @@ jasmine.TrivialNodeReporter = function(sys) { this.suiteResults.push(suiteResult); }; + function eachSpecFailure(suiteResults, callback) { + for(var i=0; i Date: Mon, 28 Feb 2011 17:20:22 -0800 Subject: [PATCH 15/24] stack traces --- spec/suites/TrivialNodeReporterSpec.js | 28 +++++++++++++++++++++----- src/node/TrivialNodeReporter.js | 16 ++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index fbe45bc..255041f 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -159,13 +159,13 @@ describe("TrivialNodeReporter", function() { it("prints suite and spec descriptions together as a sentence", function(){ this.reporter.suiteResults = [ {description:"The oven", failedSpecResults:[ - {description:"heats up"}, - {description:"cleans itself"} + {description:"heats up", items_:[]}, + {description:"cleans itself", items_:[]} ]}, {description:"The mixer", failedSpecResults:[ - {description:"blends things together"} + {description:"blends things together", items_:[]} ]} - ] + ]; this.reporter.reportRunnerResults(failingRun); @@ -174,7 +174,25 @@ describe("TrivialNodeReporter", function() { expect(this.fakeSys.getOutput()).toContain("The mixer blends things together"); }); - }) + it("prints stack trace of spec failure", function(){ + this.reporter.suiteResults = [ + {description:"The oven", failedSpecResults:[ + {description:"heats up", + items_:[ + {trace:{stack:"stack trace one"}}, + {trace:{stack:"stack trace two"}} + ]} + ]} + ]; + + this.reporter.reportRunnerResults(failingRun); + + expect(this.fakeSys.getOutput()).toContain("The oven heats up"); + expect(this.fakeSys.getOutput()).toContain("stack trace one"); + expect(this.fakeSys.getOutput()).toContain("stack trace two"); + }); + + }); describe('Finished line', function(){ diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index 5745370..33b04aa 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -30,10 +30,14 @@ jasmine.TrivialNodeReporter = function(sys) { function plural(str, count) { return count == 1 ? str : str + "s"; } - function specFailureDetails(suiteDescription, specDescription) { + function specFailureDetails(suiteDescription, specDescription, stackTraces) { newline(); sys.print(suiteDescription + " " + specDescription); newline(); + for(var i=0; i Date: Mon, 28 Feb 2011 17:50:16 -0800 Subject: [PATCH 16/24] integration tests - passing scenarios --- spec/suites/TrivialNodeReporterSpec.js | 78 ++++++++++++++++++++++++++ src/node/TrivialNodeReporter.js | 7 ++- 2 files changed, 83 insertions(+), 2 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 255041f..0f91c7f 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -28,6 +28,15 @@ describe("TrivialNodeReporter", function() { var fiftyRedFs = repeat(red("F"), 50).join(""), fiftyGreenDots = repeat(green("."), 50).join(""); + function simulateRun(reporter, specResults, suiteResults, finalRunner, startTime, endTime) { + reporter.reportRunnerStarting(); + for(var i=0; i Date: Mon, 28 Feb 2011 17:58:29 -0800 Subject: [PATCH 17/24] rf --- spec/suites/TrivialNodeReporterSpec.js | 66 +++++++++++++------------- src/node/TrivialNodeReporter.js | 24 +++++----- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialNodeReporterSpec.js index 0f91c7f..04beac1 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialNodeReporterSpec.js @@ -38,17 +38,16 @@ describe("TrivialNodeReporter", function() { } beforeEach(function() { - this.fakeSys = (function(){ + this.out = (function(){ var output = ""; return { - puts:function(str) {output += str + "\n";}, print:function(str) {output += str;}, getOutput:function(){return output;}, clear: function(){output = "";} }; })(); - this.reporter = new jasmine.TrivialNodeReporter(this.fakeSys); + this.reporter = new jasmine.TrivialNodeReporter(this.out.print); }); @@ -69,7 +68,7 @@ describe("TrivialNodeReporter", function() { 1000, 1777); - expect(this.fakeSys.getOutput()).toEqual( + expect(this.out.getOutput()).toEqual( [ "Started", green(".") + green(".") + green("."), @@ -97,9 +96,11 @@ describe("TrivialNodeReporter", function() { 1000, 1777); - expect(this.fakeSys.getOutput()).toEqual( + expect(this.out.getOutput()).toEqual( [ "Started", + + green(".") + green(".") + green(".") + green(".") + green(".") + //50 green dots green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + @@ -108,10 +109,11 @@ describe("TrivialNodeReporter", function() { green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + green(".") + - green(".") + green(".") + green(".") + green(".") + green(".") + - green(".") + green(".") + green(".") + green(".") + green(".") + "\n" + - green(".") + green(".") + green(".") + green(".") + green(".") + + green(".") + green(".") + green(".") + green(".") + green(".") + newline + + + green(".") + green(".") + green(".") + green(".") + green(".") + //7 green dots green(".") + green("."), + "", "Finished in 0.777 seconds", green("3 specs, 7 assertions, 0 failures"), @@ -127,7 +129,7 @@ describe("TrivialNodeReporter", function() { it("prints Started", function(){ this.reporter.reportRunnerStarting(); - expect(this.fakeSys.getOutput()).toEqual( + expect(this.out.getOutput()).toEqual( "Started" + newline ); }); @@ -137,7 +139,7 @@ describe("TrivialNodeReporter", function() { it("prints a green dot if the spec passes", function(){ this.reporter.reportSpecResults(passingSpec); - expect(this.fakeSys.getOutput()).toEqual( + expect(this.out.getOutput()).toEqual( green(".") ); }); @@ -145,7 +147,7 @@ describe("TrivialNodeReporter", function() { it("prints a red dot if the spec fails", function(){ this.reporter.reportSpecResults(failingSpec); - expect(this.fakeSys.getOutput()).toEqual( + expect(this.out.getOutput()).toEqual( red("F") ); }); @@ -153,7 +155,7 @@ describe("TrivialNodeReporter", function() { it("prints a yellow star if the spec was skipped", function(){ this.reporter.reportSpecResults(skippedSpec); - expect(this.fakeSys.getOutput()).toEqual( + expect(this.out.getOutput()).toEqual( yellow("*") ); }); @@ -165,19 +167,19 @@ describe("TrivialNodeReporter", function() { var self = this; repeatedlyInvoke(function(){self.reporter.reportSpecResults(failingSpec);}, 49); - expect(this.fakeSys.getOutput()). + expect(this.out.getOutput()). toEqual(repeat(red("F"), 49).join("")); repeatedlyInvoke(function(){self.reporter.reportSpecResults(failingSpec);}, 3); - expect(this.fakeSys.getOutput()). + expect(this.out.getOutput()). toEqual(fiftyRedFs + newline + red("F") + red("F")); repeatedlyInvoke(function(){self.reporter.reportSpecResults(failingSpec);}, 48); repeatedlyInvoke(function(){self.reporter.reportSpecResults(passingSpec);}, 2); - expect(this.fakeSys.getOutput()). + expect(this.out.getOutput()). toEqual(fiftyRedFs + newline + fiftyRedFs + newline + green(".") + green(".")); @@ -247,9 +249,9 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerResults(failingRun); - expect(this.fakeSys.getOutput()).toContain("The oven heats up"); - expect(this.fakeSys.getOutput()).toContain("The oven cleans itself"); - expect(this.fakeSys.getOutput()).toContain("The mixer blends things together"); + expect(this.out.getOutput()).toContain("The oven heats up"); + expect(this.out.getOutput()).toContain("The oven cleans itself"); + expect(this.out.getOutput()).toContain("The mixer blends things together"); }); it("prints stack trace of spec failure", function(){ @@ -265,9 +267,9 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerResults(failingRun); - expect(this.fakeSys.getOutput()).toContain("The oven heats up"); - expect(this.fakeSys.getOutput()).toContain("stack trace one"); - expect(this.fakeSys.getOutput()).toContain("stack trace two"); + expect(this.out.getOutput()).toContain("The oven heats up"); + expect(this.out.getOutput()).toContain("stack trace one"); + expect(this.out.getOutput()).toContain("stack trace two"); }); }); @@ -279,32 +281,32 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerStarting(); this.reporter.now = function(){return 1777;}; this.reporter.reportRunnerResults(passingRun); - expect(this.fakeSys.getOutput()).toContain("0.777 seconds"); + expect(this.out.getOutput()).toContain("0.777 seconds"); }); it("prints round time numbers correctly", function(){ var self = this; function run(startTime, endTime) { - self.fakeSys.clear(); + self.out.clear(); self.reporter.runnerStartTime = startTime; self.reporter.now = function(){return endTime;}; self.reporter.reportRunnerResults(passingRun); } run(1000, 11000); - expect(this.fakeSys.getOutput()).toContain("10 seconds"); + expect(this.out.getOutput()).toContain("10 seconds"); run(1000, 2000); - expect(this.fakeSys.getOutput()).toContain("1 seconds"); + expect(this.out.getOutput()).toContain("1 seconds"); run(1000, 1100); - expect(this.fakeSys.getOutput()).toContain("0.1 seconds"); + expect(this.out.getOutput()).toContain("0.1 seconds"); run(1000, 1010); - expect(this.fakeSys.getOutput()).toContain("0.01 seconds"); + expect(this.out.getOutput()).toContain("0.01 seconds"); run(1000, 1001); - expect(this.fakeSys.getOutput()).toContain("0.001 seconds"); + expect(this.out.getOutput()).toContain("0.001 seconds"); }); it("prints the full finished message", function(){ @@ -312,7 +314,7 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerStarting(); this.reporter.now = function(){return 1777;}; this.reporter.reportRunnerResults(failingRun); - expect(this.fakeSys.getOutput()).toContain("Finished in 0.777 seconds"); + expect(this.out.getOutput()).toContain("Finished in 0.777 seconds"); }); }); @@ -321,7 +323,7 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerResults({ results:function(){return {specs: function(){return [null, null, null];}, totalCount: 7, failedCount: 0};} }); - expect(this.fakeSys.getOutput()). + expect(this.out.getOutput()). toContain("3 specs, 7 assertions, 0 failures"); }); @@ -329,7 +331,7 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerResults({ results:function(){return {specs: function(){return [null, null, null];}, totalCount: 7, failedCount: 3};} }); - expect(this.fakeSys.getOutput()). + expect(this.out.getOutput()). toContain("3 specs, 7 assertions, 3 failures"); }); @@ -337,7 +339,7 @@ describe("TrivialNodeReporter", function() { this.reporter.reportRunnerResults({ results:function(){return {specs: function(){return [null];}, totalCount: 1, failedCount: 1};} }); - expect(this.fakeSys.getOutput()). + expect(this.out.getOutput()). toContain("1 spec, 1 assertion, 1 failure"); }); }); diff --git a/src/node/TrivialNodeReporter.js b/src/node/TrivialNodeReporter.js index 2518cea..512a85b 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/node/TrivialNodeReporter.js @@ -1,4 +1,4 @@ -jasmine.TrivialNodeReporter = function(sys) { +jasmine.TrivialNodeReporter = function(print) { var ansi = { green: '\033[32m', @@ -21,31 +21,31 @@ jasmine.TrivialNodeReporter = function(sys) { function redStr(str) { return coloredStr("red", str); } function yellowStr(str) { return coloredStr("yellow", str); } - function newline() { sys.print("\n"); } - function started() { sys.print("Started"); newline(); } + function newline() { print("\n"); } + function started() { print("Started"); newline(); } - function greenDot() { sys.print(greenStr(".")); } - function redF() { sys.print(redStr("F")); } - function yellowStar() { sys.print(yellowStr("*")); } + function greenDot() { print(greenStr(".")); } + function redF() { print(redStr("F")); } + function yellowStar() { print(yellowStr("*")); } function plural(str, count) { return count == 1 ? str : str + "s"; } function specFailureDetails(suiteDescription, specDescription, stackTraces) { newline(); - sys.print(suiteDescription + " " + specDescription); + print(suiteDescription + " " + specDescription); newline(); for(var i=0; i Date: Mon, 28 Feb 2011 18:02:44 -0800 Subject: [PATCH 18/24] rename *node to *console --- spec/runner.html | 4 ++-- ...ivialNodeReporterSpec.js => TrivialConsoleReporterSpec.js} | 4 ++-- .../TrivialConsoleReporter.js} | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename spec/suites/{TrivialNodeReporterSpec.js => TrivialConsoleReporterSpec.js} (99%) rename src/{node/TrivialNodeReporter.js => console/TrivialConsoleReporter.js} (98%) diff --git a/spec/runner.html b/spec/runner.html index 18b801e..8f71893 100644 --- a/spec/runner.html +++ b/spec/runner.html @@ -29,7 +29,7 @@ - + @@ -51,7 +51,7 @@ - + diff --git a/spec/suites/TrivialNodeReporterSpec.js b/spec/suites/TrivialConsoleReporterSpec.js similarity index 99% rename from spec/suites/TrivialNodeReporterSpec.js rename to spec/suites/TrivialConsoleReporterSpec.js index 04beac1..718fff9 100644 --- a/spec/suites/TrivialNodeReporterSpec.js +++ b/spec/suites/TrivialConsoleReporterSpec.js @@ -1,4 +1,4 @@ -describe("TrivialNodeReporter", function() { +describe("TrivialConsoleReporter", function() { //keep these literal. otherwise the test loses value as a test. @@ -47,7 +47,7 @@ describe("TrivialNodeReporter", function() { }; })(); - this.reporter = new jasmine.TrivialNodeReporter(this.out.print); + this.reporter = new jasmine.TrivialConsoleReporter(this.out.print); }); diff --git a/src/node/TrivialNodeReporter.js b/src/console/TrivialConsoleReporter.js similarity index 98% rename from src/node/TrivialNodeReporter.js rename to src/console/TrivialConsoleReporter.js index 512a85b..d349aa4 100644 --- a/src/node/TrivialNodeReporter.js +++ b/src/console/TrivialConsoleReporter.js @@ -1,4 +1,4 @@ -jasmine.TrivialNodeReporter = function(print) { +jasmine.TrivialConsoleReporter = function(print) { var ansi = { green: '\033[32m', From b9cbd3c5a06bdd2285fa7160ecd99b5839ed48d0 Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 22:30:03 -0800 Subject: [PATCH 19/24] integration test - failure scenario --- spec/suites/TrivialConsoleReporterSpec.js | 66 ++++++++++++++++++++++- src/console/TrivialConsoleReporter.js | 19 ++++++- 2 files changed, 82 insertions(+), 3 deletions(-) diff --git a/spec/suites/TrivialConsoleReporterSpec.js b/spec/suites/TrivialConsoleReporterSpec.js index 718fff9..9e438cf 100644 --- a/spec/suites/TrivialConsoleReporterSpec.js +++ b/spec/suites/TrivialConsoleReporterSpec.js @@ -51,7 +51,7 @@ describe("TrivialConsoleReporter", function() { }); - describe('Integration test', function(){ + describe('Integration', function(){ it("prints the proper output under a pass scenario. small numbers.", function(){ simulateRun(this.reporter, repeat(passingSpec, 3), @@ -121,6 +121,70 @@ describe("TrivialConsoleReporter", function() { ].join("\n") + "\n" ); }); + + + it("prints the proper output under a failure scenario.", function(){ + simulateRun(this.reporter, + [failingSpec, passingSpec, failingSpec], + [{description:"The oven", + results:function(){ + return { + items_:[ + {failedCount:2, + description:"heats up", + items_:[ + {trace:{stack:"stack trace one\n second line"}}, + {trace:{stack:"stack trace two"}} + ]} + ] + }; + }}, + {description:"The washing machine", + results:function(){ + return { + items_:[ + {failedCount:2, + description:"washes clothes", + items_:[ + {trace:{stack:"stack trace one"}} + ]} + ] + }; + }} + ], + { + results:function(){ + return { + specs: function(){return [null, null, null];}, + totalCount: 7, + failedCount: 2 + }; + } + }, + 1000, + 1777); + + expect(this.out.getOutput()).toEqual( + [ + "Started", + red("F") + green(".") + red("F"), + "", + "The oven heats up", + " stack trace one", + " second line", + " stack trace two", + "", + "The washing machine washes clothes", + " stack trace one", + "", + "Finished in 0.777 seconds", + red("3 specs, 7 assertions, 2 failures"), + "" + ].join("\n") + "\n" + ); + }); + + }); describe('A Test Run', function(){ diff --git a/src/console/TrivialConsoleReporter.js b/src/console/TrivialConsoleReporter.js index d349aa4..77e5e76 100644 --- a/src/console/TrivialConsoleReporter.js +++ b/src/console/TrivialConsoleReporter.js @@ -30,17 +30,30 @@ jasmine.TrivialConsoleReporter = function(print) { function plural(str, count) { return count == 1 ? str : str + "s"; } + function repeat(thing, times) { var arr = []; + for(var i=0; i Date: Mon, 28 Feb 2011 22:36:31 -0800 Subject: [PATCH 20/24] style rf --- src/console/TrivialConsoleReporter.js | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/console/TrivialConsoleReporter.js b/src/console/TrivialConsoleReporter.js index 77e5e76..af9c7c0 100644 --- a/src/console/TrivialConsoleReporter.js +++ b/src/console/TrivialConsoleReporter.js @@ -1,19 +1,11 @@ jasmine.TrivialConsoleReporter = function(print) { - - var ansi = { - green: '\033[32m', - red: '\033[31m', - yellow: '\033[33m', - none: '\033[0m' - }; - var defaultColumnsPerLine = 50; + //inspired by mhevery's jasmine-node reporter + //https://github.com/mhevery/jasmine-node - var language = { - spec:"spec", - assertion:"assertion", - failure:"failure" - }; + var defaultColumnsPerLine = 50, + ansi = { green: '\033[32m', red: '\033[31m', yellow: '\033[33m', none: '\033[0m' }, + language = { spec:"spec", assertion:"assertion", failure:"failure" }; function coloredStr(color, str) { return ansi[color] + str + ansi.none; } @@ -35,7 +27,6 @@ jasmine.TrivialConsoleReporter = function(print) { return arr; } - function indent(str, spaces) { var lines = str.split("\n"); var newArr = [] for(var i=0; i Date: Mon, 28 Feb 2011 22:39:16 -0800 Subject: [PATCH 21/24] making this consistent --- src/console/TrivialConsoleReporter.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/console/TrivialConsoleReporter.js b/src/console/TrivialConsoleReporter.js index af9c7c0..616cf86 100644 --- a/src/console/TrivialConsoleReporter.js +++ b/src/console/TrivialConsoleReporter.js @@ -14,7 +14,8 @@ jasmine.TrivialConsoleReporter = function(print) { function yellowStr(str) { return coloredStr("yellow", str); } function newline() { print("\n"); } - function started() { print("Started"); newline(); } + function started() { print("Started"); + newline(); } function greenDot() { print(greenStr(".")); } function redF() { print(redStr("F")); } From f5afe18a6b643e7c4886253eeef75abfc329dcad Mon Sep 17 00:00:00 2001 From: Steve Conover Date: Mon, 28 Feb 2011 22:53:39 -0800 Subject: [PATCH 22/24] semicolon fixes subsequent to jshint run --- src/console/TrivialConsoleReporter.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/console/TrivialConsoleReporter.js b/src/console/TrivialConsoleReporter.js index 616cf86..35e2d77 100644 --- a/src/console/TrivialConsoleReporter.js +++ b/src/console/TrivialConsoleReporter.js @@ -29,11 +29,11 @@ jasmine.TrivialConsoleReporter = function(print) { } function indent(str, spaces) { var lines = str.split("\n"); - var newArr = [] + var newArr = []; for(var i=0; i Date: Mon, 28 Feb 2011 23:17:39 -0800 Subject: [PATCH 23/24] integrated trivial console into a real-world situation and dicovered a couple mistakes/misses --- spec/suites/TrivialConsoleReporterSpec.js | 16 ++++++++-------- src/console/TrivialConsoleReporter.js | 4 +++- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/spec/suites/TrivialConsoleReporterSpec.js b/spec/suites/TrivialConsoleReporterSpec.js index 9e438cf..a24e38a 100644 --- a/spec/suites/TrivialConsoleReporterSpec.js +++ b/spec/suites/TrivialConsoleReporterSpec.js @@ -14,8 +14,8 @@ describe("TrivialConsoleReporter", function() { var passingSpec = { results: function(){ return {passed: function(){return true;}}; } }, failingSpec = { results: function(){ return {passed: function(){return false;}}; } }, skippedSpec = { results: function(){ return {skipped: true}; } }, - passingRun = { results: function(){ return {failedCount: 0, specs: function(){return [null, null, null];}}; } }, - failingRun = { results: function(){ return {failedCount: 7, specs: function(){return [null, null, null];}}; } }; + passingRun = { results: function(){ return {failedCount: 0, items_: [null, null, null]}; } }, + failingRun = { results: function(){ return {failedCount: 7, items_: [null, null, null]}; } }; function repeatedlyInvoke(f, times) { for(var i=0; i Date: Mon, 28 Feb 2011 23:58:06 -0800 Subject: [PATCH 24/24] call back when done --- spec/suites/TrivialConsoleReporterSpec.js | 16 +++++++++++++++- src/console/TrivialConsoleReporter.js | 6 ++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/spec/suites/TrivialConsoleReporterSpec.js b/spec/suites/TrivialConsoleReporterSpec.js index a24e38a..c1ada66 100644 --- a/spec/suites/TrivialConsoleReporterSpec.js +++ b/spec/suites/TrivialConsoleReporterSpec.js @@ -47,7 +47,11 @@ describe("TrivialConsoleReporter", function() { }; })(); - this.reporter = new jasmine.TrivialConsoleReporter(this.out.print); + this.done = false + var self = this + this.reporter = new jasmine.TrivialConsoleReporter(this.out.print, function(runner){ + self.done = true + }); }); @@ -408,6 +412,16 @@ describe("TrivialConsoleReporter", function() { }); }); + describe("done callback", function(){ + it("calls back when done", function() { + expect(this.done).toBeFalsy(); + this.reporter.reportRunnerResults({ + results:function(){return {items_: [null, null, null], totalCount: 7, failedCount: 0};} + }); + expect(this.done).toBeTruthy(); + }); + }); + }); }); diff --git a/src/console/TrivialConsoleReporter.js b/src/console/TrivialConsoleReporter.js index fbffc04..0d35606 100644 --- a/src/console/TrivialConsoleReporter.js +++ b/src/console/TrivialConsoleReporter.js @@ -1,8 +1,9 @@ -jasmine.TrivialConsoleReporter = function(print) { - +jasmine.TrivialConsoleReporter = function(print, doneCallback) { //inspired by mhevery's jasmine-node reporter //https://github.com/mhevery/jasmine-node + doneCallback = doneCallback || function(){}; + var defaultColumnsPerLine = 50, ansi = { green: '\033[32m', red: '\033[31m', yellow: '\033[33m', none: '\033[0m' }, language = { spec:"spec", assertion:"assertion", failure:"failure" }; @@ -138,5 +139,6 @@ jasmine.TrivialConsoleReporter = function(print) { var results = runner.results(); var summaryFunction = results.failedCount === 0 ? greenSummary : redSummary; summaryFunction(results.items_.length, results.totalCount, results.failedCount); + doneCallback(runner); }; }; \ No newline at end of file