evergreen 1.0.0.rc → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/README.rdoc +10 -2
  2. data/config/routes.rb +1 -1
  3. data/lib/evergreen.rb +2 -6
  4. data/lib/evergreen/application.rb +38 -59
  5. data/lib/evergreen/cli.rb +2 -2
  6. data/lib/evergreen/runner.rb +6 -3
  7. data/lib/evergreen/server.rb +1 -5
  8. data/lib/evergreen/suite.rb +1 -13
  9. data/lib/evergreen/tasks.rb +1 -1
  10. data/lib/evergreen/version.rb +1 -1
  11. data/lib/jasmine/Contribute.markdown +44 -0
  12. data/lib/jasmine/Gemfile +4 -6
  13. data/lib/jasmine/MIT.LICENSE +1 -1
  14. data/lib/jasmine/README.markdown +17 -14
  15. data/lib/jasmine/Rakefile +21 -170
  16. data/lib/jasmine/Release.markdown +40 -0
  17. data/lib/jasmine/images/jasmine_favicon.png +0 -0
  18. data/lib/jasmine/jasmine-core.gemspec +22 -0
  19. data/lib/jasmine/jshint/jshint.js +5919 -0
  20. data/lib/jasmine/jshint/run.js +99 -0
  21. data/lib/jasmine/lib/jasmine-core.rb +36 -0
  22. data/lib/jasmine/lib/jasmine-core/example/SpecRunner.html +54 -0
  23. data/lib/jasmine/{example → lib/jasmine-core/example}/spec/PlayerSpec.js +0 -0
  24. data/lib/jasmine/{example → lib/jasmine-core/example}/spec/SpecHelper.js +3 -3
  25. data/lib/jasmine/{example → lib/jasmine-core/example}/src/Player.js +0 -0
  26. data/lib/jasmine/{example → lib/jasmine-core/example}/src/Song.js +0 -0
  27. data/lib/jasmine/lib/{jasmine-html.js → jasmine-core/jasmine-html.js} +6 -4
  28. data/lib/jasmine/lib/{jasmine.css → jasmine-core/jasmine.css} +0 -0
  29. data/lib/jasmine/lib/{jasmine.js → jasmine-core/jasmine.js} +103 -48
  30. data/lib/jasmine/lib/{json2.js → jasmine-core/json2.js} +0 -0
  31. data/lib/jasmine/lib/jasmine-core/version.rb +6 -0
  32. data/lib/jasmine/spec/console/ConsoleReporterSpec.js +451 -0
  33. data/lib/jasmine/spec/{suites → core}/BaseSpec.js +0 -0
  34. data/lib/jasmine/spec/{suites → core}/CustomMatchersSpec.js +0 -0
  35. data/lib/jasmine/spec/{suites → core}/EnvSpec.js +3 -2
  36. data/lib/jasmine/spec/{suites → core}/ExceptionsSpec.js +46 -4
  37. data/lib/jasmine/spec/{suites → core}/JsApiReporterSpec.js +1 -1
  38. data/lib/jasmine/spec/{suites → core}/MatchersSpec.js +87 -44
  39. data/lib/jasmine/spec/{suites → core}/MockClockSpec.js +0 -0
  40. data/lib/jasmine/spec/{suites → core}/MultiReporterSpec.js +3 -3
  41. data/lib/jasmine/spec/{suites → core}/NestedResultsSpec.js +0 -0
  42. data/lib/jasmine/spec/{suites → core}/PrettyPrintSpec.js +0 -6
  43. data/lib/jasmine/spec/{suites → core}/QueueSpec.js +0 -0
  44. data/lib/jasmine/spec/{suites → core}/ReporterSpec.js +0 -0
  45. data/lib/jasmine/spec/{suites → core}/RunnerSpec.js +0 -0
  46. data/lib/jasmine/spec/{suites → core}/SpecRunningSpec.js +14 -9
  47. data/lib/jasmine/spec/{suites → core}/SpecSpec.js +1 -1
  48. data/lib/jasmine/spec/{suites → core}/SpySpec.js +0 -0
  49. data/lib/jasmine/spec/{suites → core}/SuiteSpec.js +0 -0
  50. data/lib/jasmine/spec/{suites → core}/UtilSpec.js +0 -1
  51. data/lib/jasmine/spec/{suites → core}/WaitsForBlockSpec.js +32 -1
  52. data/lib/jasmine/spec/html/MatchersHtmlSpec.js +38 -0
  53. data/lib/jasmine/spec/html/PrettyPrintHtmlSpec.js +8 -0
  54. data/lib/jasmine/spec/{suites → html}/TrivialReporterSpec.js +3 -2
  55. data/lib/jasmine/spec/node_suite.js +127 -0
  56. data/lib/jasmine/spec/runner.html +44 -45
  57. data/lib/jasmine/spec/templates/runner.html.erb +49 -0
  58. data/lib/jasmine/spec/templates/script_tag.html.erb +1 -0
  59. data/lib/jasmine/src/SourcesList.json +7 -0
  60. data/lib/jasmine/src/console/ConsoleReporter.js +177 -0
  61. data/lib/jasmine/src/{Block.js → core/Block.js} +1 -1
  62. data/lib/jasmine/src/{Env.js → core/Env.js} +13 -8
  63. data/lib/jasmine/src/{JsApiReporter.js → core/JsApiReporter.js} +0 -0
  64. data/lib/jasmine/src/{Matchers.js → core/Matchers.js} +24 -7
  65. data/lib/jasmine/src/{MultiReporter.js → core/MultiReporter.js} +0 -0
  66. data/lib/jasmine/src/{NestedResults.js → core/NestedResults.js} +0 -0
  67. data/lib/jasmine/src/{PrettyPrinter.js → core/PrettyPrinter.js} +2 -1
  68. data/lib/jasmine/src/{Queue.js → core/Queue.js} +0 -0
  69. data/lib/jasmine/src/{Reporter.js → core/Reporter.js} +0 -0
  70. data/lib/jasmine/src/{Runner.js → core/Runner.js} +1 -1
  71. data/lib/jasmine/src/{Spec.js → core/Spec.js} +2 -1
  72. data/lib/jasmine/src/{Suite.js → core/Suite.js} +1 -1
  73. data/lib/jasmine/src/{WaitsBlock.js → core/WaitsBlock.js} +3 -1
  74. data/lib/jasmine/src/{WaitsForBlock.js → core/WaitsForBlock.js} +4 -2
  75. data/lib/jasmine/src/{base.js → core/base.js} +52 -24
  76. data/lib/jasmine/src/{mock-timeout.js → core/mock-timeout.js} +0 -0
  77. data/lib/jasmine/src/{util.js → core/util.js} +1 -1
  78. data/lib/jasmine/src/html/TrivialReporter.js +6 -4
  79. data/lib/jasmine/src/templates/example_project_jasmine_tags.html.erb +3 -0
  80. data/lib/jasmine/src/templates/version.js.erb +6 -0
  81. data/lib/jasmine/src/templates/version.rb.erb +6 -0
  82. data/lib/jasmine/src/version.js +6 -0
  83. data/lib/jasmine/src/version.json +2 -2
  84. data/lib/jasmine/tasks/build_dist.rb +48 -0
  85. data/lib/jasmine/tasks/build_specs.rb +50 -0
  86. data/lib/jasmine/tasks/docs.rb +17 -0
  87. data/lib/jasmine/tasks/helpers.rb +50 -0
  88. data/lib/jasmine/tasks/pages.rb +13 -0
  89. data/lib/jasmine/tasks/spec.rb +37 -0
  90. data/lib/jasmine/tasks/standalone.rb +91 -0
  91. data/lib/jasmine/tasks/version.rb +5 -0
  92. data/lib/tasks/evergreen.rake +1 -1
  93. data/spec/evergreen_spec.rb +6 -7
  94. data/spec/runner_spec.rb +1 -1
  95. data/spec/spec_helper.rb +5 -8
  96. metadata +95 -77
  97. data/lib/jasmine/cruise_config.rb +0 -21
  98. data/lib/jasmine/example/SpecRunner.html +0 -27
  99. data/lib/jasmine/images/fail-16.png +0 -0
  100. data/lib/jasmine/images/fail.png +0 -0
  101. data/lib/jasmine/images/go-16.png +0 -0
  102. data/lib/jasmine/images/go.png +0 -0
  103. data/lib/jasmine/images/pending-16.png +0 -0
  104. data/lib/jasmine/images/pending.png +0 -0
  105. data/lib/jasmine/images/question-bk.png +0 -0
  106. data/lib/jasmine/images/questionbk-16.png +0 -0
  107. data/lib/jasmine/images/spinner.gif +0 -0
@@ -0,0 +1,38 @@
1
+ describe("MatchersSpec - HTML Dependent", function () {
2
+ var env, spec;
3
+
4
+ beforeEach(function() {
5
+ env = new jasmine.Env();
6
+ env.updateInterval = 0;
7
+
8
+ var suite = env.describe("suite", function() {
9
+ spec = env.it("spec", function() {
10
+ });
11
+ });
12
+ spyOn(spec, 'addMatcherResult');
13
+
14
+ this.addMatchers({
15
+ toPass: function() {
16
+ return lastResult().passed();
17
+ },
18
+ toFail: function() {
19
+ return !lastResult().passed();
20
+ }
21
+ });
22
+ });
23
+
24
+ function match(value) {
25
+ return spec.expect(value);
26
+ }
27
+
28
+ function lastResult() {
29
+ return spec.addMatcherResult.mostRecentCall.args[0];
30
+ }
31
+
32
+ it("toEqual with DOM nodes", function() {
33
+ var nodeA = document.createElement('div');
34
+ var nodeB = document.createElement('div');
35
+ expect((match(nodeA).toEqual(nodeA))).toPass();
36
+ expect((match(nodeA).toEqual(nodeB))).toFail();
37
+ });
38
+ });
@@ -0,0 +1,8 @@
1
+ describe("jasmine.pp (HTML Dependent)", function () {
2
+ it("should stringify HTML nodes properly", function() {
3
+ var sampleNode = document.createElement('div');
4
+ sampleNode.innerHTML = 'foo<b>bar</b>';
5
+ expect(jasmine.pp(sampleNode)).toEqual("HTMLNode");
6
+ expect(jasmine.pp({foo: sampleNode})).toEqual("{ foo : HTMLNode }");
7
+ });
8
+ });
@@ -31,7 +31,9 @@ describe("TrivialReporter", function() {
31
31
 
32
32
  function findElement(divs, withClass) {
33
33
  var els = findElements(divs, withClass);
34
- if (els.length > 0) return els[0];
34
+ if (els.length > 0) {
35
+ return els[0];
36
+ }
35
37
  throw new Error("couldn't find div with class " + withClass);
36
38
  }
37
39
 
@@ -96,7 +98,6 @@ describe("TrivialReporter", function() {
96
98
  });
97
99
  });
98
100
 
99
-
100
101
  describe("failure messages (integration)", function () {
101
102
  var spec, results, expectationResult;
102
103
 
@@ -0,0 +1,127 @@
1
+ var fs = require('fs');
2
+ var sys = require('sys');
3
+ var path = require('path');
4
+
5
+ // yes, really keep this here to keep us honest, but only for jasmine's own runner! [xw]
6
+ // undefined = "diz be undefined yo";
7
+
8
+
9
+ var jasmineGlobals = require('../lib/jasmine-core/jasmine.js');
10
+ for (var k in jasmineGlobals) {
11
+ global[k] = jasmineGlobals[k];
12
+ }
13
+ require('../src/console/ConsoleReporter.js');
14
+
15
+ /*
16
+ Pulling in code from jasmine-node.
17
+
18
+ We can't just depend on jasmine-node because it has its own jasmine that it uses.
19
+ */
20
+
21
+ global.window = {
22
+ setTimeout: setTimeout,
23
+ clearTimeout: clearTimeout,
24
+ setInterval: setInterval,
25
+ clearInterval: clearInterval
26
+ };
27
+
28
+ delete global.window;
29
+
30
+ function noop() {
31
+ }
32
+
33
+ jasmine.executeSpecs = function(specs, done, isVerbose, showColors) {
34
+ for (var i = 0, len = specs.length; i < len; ++i) {
35
+ var filename = specs[i];
36
+ require(filename.replace(/\.\w+$/, ""));
37
+ }
38
+
39
+ var jasmineEnv = jasmine.getEnv();
40
+ var consoleReporter = new jasmine.ConsoleReporter(sys.print, done, showColors);
41
+
42
+ jasmineEnv.addReporter(consoleReporter);
43
+ jasmineEnv.execute();
44
+ };
45
+
46
+ jasmine.getAllSpecFiles = function(dir, matcher) {
47
+ var specs = [];
48
+
49
+ if (fs.statSync(dir).isFile() && dir.match(matcher)) {
50
+ specs.push(dir);
51
+ } else {
52
+ var files = fs.readdirSync(dir);
53
+ for (var i = 0, len = files.length; i < len; ++i) {
54
+ var filename = dir + '/' + files[i];
55
+ if (fs.statSync(filename).isFile() && filename.match(matcher)) {
56
+ specs.push(filename);
57
+ } else if (fs.statSync(filename).isDirectory()) {
58
+ var subfiles = this.getAllSpecFiles(filename, matcher);
59
+ subfiles.forEach(function(result) {
60
+ specs.push(result);
61
+ });
62
+ }
63
+ }
64
+ }
65
+
66
+ return specs;
67
+ };
68
+
69
+ function now() {
70
+ return new Date().getTime();
71
+ }
72
+
73
+ jasmine.asyncSpecWait = function() {
74
+ var wait = jasmine.asyncSpecWait;
75
+ wait.start = now();
76
+ wait.done = false;
77
+ (function innerWait() {
78
+ waits(10);
79
+ runs(function() {
80
+ if (wait.start + wait.timeout < now()) {
81
+ expect('timeout waiting for spec').toBeNull();
82
+ } else if (wait.done) {
83
+ wait.done = false;
84
+ } else {
85
+ innerWait();
86
+ }
87
+ });
88
+ })();
89
+ };
90
+ jasmine.asyncSpecWait.timeout = 4 * 1000;
91
+ jasmine.asyncSpecDone = function() {
92
+ jasmine.asyncSpecWait.done = true;
93
+ };
94
+
95
+ for (var key in jasmine) {
96
+ exports[key] = jasmine[key];
97
+ }
98
+
99
+ /*
100
+ End jasmine-node runner
101
+ */
102
+
103
+ var isVerbose = false;
104
+ var showColors = true;
105
+ process.argv.forEach(function(arg) {
106
+ switch (arg) {
107
+ case '--color': showColors = true; break;
108
+ case '--noColor': showColors = false; break;
109
+ case '--verbose': isVerbose = true; break;
110
+ }
111
+ });
112
+
113
+ var specs = jasmine.getAllSpecFiles(__dirname, new RegExp(".js$"));
114
+ var domIndependentSpecs = [];
115
+ for (var i = 0; i < specs.length; i++) {
116
+ if (fs.readFileSync(specs[i], "utf8").indexOf("document.createElement") < 0) {
117
+ domIndependentSpecs.push(specs[i]);
118
+ }
119
+ }
120
+
121
+ jasmine.executeSpecs(domIndependentSpecs, function(runner, log) {
122
+ if (runner.results().failedCount === 0) {
123
+ process.exit(0);
124
+ } else {
125
+ process.exit(1);
126
+ }
127
+ }, isVerbose, showColors);
@@ -2,56 +2,46 @@
2
2
  "http://www.w3.org/TR/html4/loose.dtd">
3
3
  <html>
4
4
  <head>
5
- <title>Jasmine Test Runner</title>
5
+ <title>Jasmine Spec Runner: Jasmine Core</title>
6
6
 
7
+ <link rel="shortcut icon" type="image/png" href="../images/jasmine_favicon.png">
8
+
9
+ <link href="../lib/jasmine-core/jasmine.css" rel="stylesheet"/>
10
+ <script type="text/javascript" src="../lib/jasmine-core/jasmine.js"></script>
7
11
  <script type="text/javascript">
8
12
  // yes, really keep this here to keep us honest, but only for jasmine's own runner! [xw]
9
13
  undefined = "diz be undefined yo";
10
14
  </script>
11
15
 
12
- <script type="text/javascript" src="../src/base.js"></script>
13
- <script type="text/javascript" src="../src/util.js"></script>
14
- <script type="text/javascript" src="../src/Env.js"></script>
15
- <script type="text/javascript" src="../src/Reporter.js"></script>
16
- <script type="text/javascript" src="../src/Block.js"></script>
17
-
18
- <script type="text/javascript" src="../src/JsApiReporter.js"></script>
19
- <script type="text/javascript" src="../src/Matchers.js"></script>
20
- <script type="text/javascript" src="../src/mock-timeout.js"></script>
21
- <script type="text/javascript" src="../src/MultiReporter.js"></script>
22
- <script type="text/javascript" src="../src/NestedResults.js"></script>
23
- <script type="text/javascript" src="../src/PrettyPrinter.js"></script>
24
- <script type="text/javascript" src="../src/Queue.js"></script>
25
- <script type="text/javascript" src="../src/Runner.js"></script>
26
- <script type="text/javascript" src="../src/Spec.js"></script>
27
- <script type="text/javascript" src="../src/Suite.js"></script>
28
- <script type="text/javascript" src="../src/WaitsBlock.js"></script>
29
- <script type="text/javascript" src="../src/WaitsForBlock.js"></script>
30
-
31
- <script type="text/javascript" src="../src/html/TrivialReporter.js"></script>
32
-
33
-
34
16
 
35
- <script type="text/javascript" src="suites/BaseSpec.js"></script>
36
- <script type="text/javascript" src="suites/CustomMatchersSpec.js"></script>
37
- <script type="text/javascript" src="suites/EnvSpec.js"></script>
38
- <script type="text/javascript" src="suites/ExceptionsSpec.js"></script>
39
- <script type="text/javascript" src="suites/JsApiReporterSpec.js"></script>
40
- <script type="text/javascript" src="suites/MatchersSpec.js"></script>
41
- <script type="text/javascript" src="suites/MockClockSpec.js"></script>
42
- <script type="text/javascript" src="suites/MultiReporterSpec.js"></script>
43
- <script type="text/javascript" src="suites/NestedResultsSpec.js"></script>
44
- <script type="text/javascript" src="suites/PrettyPrintSpec.js"></script>
45
- <script type="text/javascript" src="suites/ReporterSpec.js"></script>
46
- <script type="text/javascript" src="suites/RunnerSpec.js"></script>
47
- <script type="text/javascript" src="suites/QueueSpec.js"></script>
48
- <script type="text/javascript" src="suites/SpecSpec.js"></script>
49
- <script type="text/javascript" src="suites/SpecRunningSpec.js"></script>
50
- <script type="text/javascript" src="suites/SpySpec.js"></script>
51
- <script type="text/javascript" src="suites/SuiteSpec.js"></script>
52
- <script type="text/javascript" src="suites/TrivialReporterSpec.js"></script>
53
- <script type="text/javascript" src="suites/WaitsForBlockSpec.js"></script>
17
+ <!-- include source files here... -->
18
+ <script type="text/javascript" src=".././src/html/TrivialReporter.js"></script>
19
+ <script type="text/javascript" src=".././src/console/ConsoleReporter.js"></script>
54
20
 
21
+ <!-- include spec files here... -->
22
+ <script type="text/javascript" src=".././spec/core/BaseSpec.js"></script>
23
+ <script type="text/javascript" src=".././spec/core/CustomMatchersSpec.js"></script>
24
+ <script type="text/javascript" src=".././spec/core/EnvSpec.js"></script>
25
+ <script type="text/javascript" src=".././spec/core/ExceptionsSpec.js"></script>
26
+ <script type="text/javascript" src=".././spec/core/JsApiReporterSpec.js"></script>
27
+ <script type="text/javascript" src=".././spec/core/MatchersSpec.js"></script>
28
+ <script type="text/javascript" src=".././spec/core/MockClockSpec.js"></script>
29
+ <script type="text/javascript" src=".././spec/core/MultiReporterSpec.js"></script>
30
+ <script type="text/javascript" src=".././spec/core/NestedResultsSpec.js"></script>
31
+ <script type="text/javascript" src=".././spec/core/PrettyPrintSpec.js"></script>
32
+ <script type="text/javascript" src=".././spec/core/QueueSpec.js"></script>
33
+ <script type="text/javascript" src=".././spec/core/ReporterSpec.js"></script>
34
+ <script type="text/javascript" src=".././spec/core/RunnerSpec.js"></script>
35
+ <script type="text/javascript" src=".././spec/core/SpecRunningSpec.js"></script>
36
+ <script type="text/javascript" src=".././spec/core/SpecSpec.js"></script>
37
+ <script type="text/javascript" src=".././spec/core/SpySpec.js"></script>
38
+ <script type="text/javascript" src=".././spec/core/SuiteSpec.js"></script>
39
+ <script type="text/javascript" src=".././spec/core/UtilSpec.js"></script>
40
+ <script type="text/javascript" src=".././spec/core/WaitsForBlockSpec.js"></script>
41
+ <script type="text/javascript" src=".././spec/html/MatchersHtmlSpec.js"></script>
42
+ <script type="text/javascript" src=".././spec/html/PrettyPrintHtmlSpec.js"></script>
43
+ <script type="text/javascript" src=".././spec/html/TrivialReporterSpec.js"></script>
44
+ <script type="text/javascript" src=".././spec/console/ConsoleReporterSpec.js"></script>
55
45
 
56
46
  <script type="text/javascript">
57
47
  (function() {
@@ -66,15 +56,24 @@
66
56
  return trivialReporter.specFilter(spec);
67
57
  };
68
58
 
59
+ var currentWindowOnload = window.onload;
60
+
69
61
  window.onload = function() {
70
- jasmineEnv.execute();
62
+ if (currentWindowOnload) {
63
+ currentWindowOnload();
64
+ }
65
+ execJasmine();
71
66
  };
67
+
68
+ function execJasmine() {
69
+ jasmineEnv.execute();
70
+ }
71
+
72
72
  })();
73
73
  </script>
74
74
 
75
- <link href="../src/html/jasmine.css" rel="stylesheet"/>
76
75
  </head>
77
76
 
78
77
  <body>
79
78
  </body>
80
- </html>
79
+ </html>
@@ -0,0 +1,49 @@
1
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
2
+ "http://www.w3.org/TR/html4/loose.dtd">
3
+ <html>
4
+ <head>
5
+ <title><%= title %></title>
6
+
7
+ <%= favicon %>
8
+ <%= jasmine_tags %>
9
+
10
+ <!-- include source files here... -->
11
+ <%= source_tags %>
12
+
13
+ <!-- include spec files here... -->
14
+ <%= spec_file_tags %>
15
+
16
+ <script type="text/javascript">
17
+ (function() {
18
+ var jasmineEnv = jasmine.getEnv();
19
+ jasmineEnv.updateInterval = 1000;
20
+
21
+ var trivialReporter = new jasmine.TrivialReporter();
22
+
23
+ jasmineEnv.addReporter(trivialReporter);
24
+
25
+ jasmineEnv.specFilter = function(spec) {
26
+ return trivialReporter.specFilter(spec);
27
+ };
28
+
29
+ var currentWindowOnload = window.onload;
30
+
31
+ window.onload = function() {
32
+ if (currentWindowOnload) {
33
+ currentWindowOnload();
34
+ }
35
+ execJasmine();
36
+ };
37
+
38
+ function execJasmine() {
39
+ jasmineEnv.execute();
40
+ }
41
+
42
+ })();
43
+ </script>
44
+
45
+ </head>
46
+
47
+ <body>
48
+ </body>
49
+ </html>
@@ -0,0 +1 @@
1
+ <script type="text/javascript" src="<%= file %>"></script>
@@ -0,0 +1,7 @@
1
+ [
2
+ "base.js",
3
+ "util.js",
4
+ "Env.js",
5
+ "Reporter.js",
6
+ "Block.js"
7
+ ]
@@ -0,0 +1,177 @@
1
+ jasmine.ConsoleReporter = function(print, doneCallback, showColors) {
2
+ //inspired by mhevery's jasmine-node reporter
3
+ //https://github.com/mhevery/jasmine-node
4
+
5
+ doneCallback = doneCallback || function() {};
6
+
7
+ var ansi = {
8
+ green: '\033[32m',
9
+ red: '\033[31m',
10
+ yellow: '\033[33m',
11
+ none: '\033[0m'
12
+ },
13
+ language = {
14
+ spec: "spec",
15
+ failure: "failure"
16
+ };
17
+
18
+ function coloredStr(color, str) {
19
+ return showColors ? (ansi[color] + str + ansi.none) : str;
20
+ }
21
+
22
+ function greenStr(str) {
23
+ return coloredStr("green", str);
24
+ }
25
+
26
+ function redStr(str) {
27
+ return coloredStr("red", str);
28
+ }
29
+
30
+ function yellowStr(str) {
31
+ return coloredStr("yellow", str);
32
+ }
33
+
34
+ function newline() {
35
+ print("\n");
36
+ }
37
+
38
+ function started() {
39
+ print("Started");
40
+ newline();
41
+ }
42
+
43
+ function greenDot() {
44
+ print(greenStr("."));
45
+ }
46
+
47
+ function redF() {
48
+ print(redStr("F"));
49
+ }
50
+
51
+ function yellowStar() {
52
+ print(yellowStr("*"));
53
+ }
54
+
55
+ function plural(str, count) {
56
+ return count == 1 ? str : str + "s";
57
+ }
58
+
59
+ function repeat(thing, times) {
60
+ var arr = [];
61
+ for (var i = 0; i < times; i++) {
62
+ arr.push(thing);
63
+ }
64
+ return arr;
65
+ }
66
+
67
+ function indent(str, spaces) {
68
+ var lines = (str || '').split("\n");
69
+ var newArr = [];
70
+ for (var i = 0; i < lines.length; i++) {
71
+ newArr.push(repeat(" ", spaces).join("") + lines[i]);
72
+ }
73
+ return newArr.join("\n");
74
+ }
75
+
76
+ function specFailureDetails(suiteDescription, specDescription, stackTraces) {
77
+ newline();
78
+ print(suiteDescription + " " + specDescription);
79
+ newline();
80
+ for (var i = 0; i < stackTraces.length; i++) {
81
+ print(indent(stackTraces[i], 2));
82
+ newline();
83
+ }
84
+ }
85
+
86
+ function finished(elapsed) {
87
+ newline();
88
+ print("Finished in " + elapsed / 1000 + " seconds");
89
+ }
90
+
91
+ function summary(colorF, specs, failed) {
92
+ newline();
93
+ print(colorF(specs + " " + plural(language.spec, specs) + ", " +
94
+ failed + " " + plural(language.failure, failed)));
95
+ newline();
96
+ newline();
97
+ }
98
+
99
+ function greenSummary(specs, failed) {
100
+ summary(greenStr, specs, failed);
101
+ }
102
+
103
+ function redSummary(specs, failed) {
104
+ summary(redStr, specs, failed);
105
+ }
106
+
107
+ function fullSuiteDescription(suite) {
108
+ var fullDescription = suite.description;
109
+ if (suite.parentSuite) fullDescription = fullSuiteDescription(suite.parentSuite) + " " + fullDescription;
110
+ return fullDescription;
111
+ }
112
+
113
+ this.now = function() {
114
+ return new Date().getTime();
115
+ };
116
+
117
+ this.reportRunnerStarting = function() {
118
+ this.runnerStartTime = this.now();
119
+ started();
120
+ };
121
+
122
+ this.reportSpecStarting = function() { /* do nothing */
123
+ };
124
+
125
+ this.reportSpecResults = function(spec) {
126
+ var results = spec.results();
127
+ if (results.skipped) {
128
+ yellowStar();
129
+ } else if (results.passed()) {
130
+ greenDot();
131
+ } else {
132
+ redF();
133
+ }
134
+ };
135
+
136
+ this.suiteResults = [];
137
+
138
+ this.reportSuiteResults = function(suite) {
139
+ var suiteResult = {
140
+ description: fullSuiteDescription(suite),
141
+ failedSpecResults: []
142
+ };
143
+
144
+ suite.results().items_.forEach(function(spec) {
145
+ if (spec.failedCount > 0 && spec.description) suiteResult.failedSpecResults.push(spec);
146
+ });
147
+
148
+ this.suiteResults.push(suiteResult);
149
+ };
150
+
151
+ function eachSpecFailure(suiteResults, callback) {
152
+ for (var i = 0; i < suiteResults.length; i++) {
153
+ var suiteResult = suiteResults[i];
154
+ for (var j = 0; j < suiteResult.failedSpecResults.length; j++) {
155
+ var failedSpecResult = suiteResult.failedSpecResults[j];
156
+ var stackTraces = [];
157
+ for (var k = 0; k < failedSpecResult.items_.length; k++) stackTraces.push(failedSpecResult.items_[k].trace.stack);
158
+ callback(suiteResult.description, failedSpecResult.description, stackTraces);
159
+ }
160
+ }
161
+ }
162
+
163
+ this.reportRunnerResults = function(runner) {
164
+ newline();
165
+
166
+ eachSpecFailure(this.suiteResults, function(suiteDescription, specDescription, stackTraces) {
167
+ specFailureDetails(suiteDescription, specDescription, stackTraces);
168
+ });
169
+
170
+ finished(this.now() - this.runnerStartTime);
171
+
172
+ var results = runner.results();
173
+ var summaryFunction = results.failedCount === 0 ? greenSummary : redSummary;
174
+ summaryFunction(runner.specs().length, results.failedCount);
175
+ doneCallback(runner);
176
+ };
177
+ };