rally-jasmine-core 1.2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. data/lib/jasmine-core.rb +36 -0
  2. data/lib/jasmine-core/example/SpecRunner.html +54 -0
  3. data/lib/jasmine-core/example/spec/PlayerSpec.js +58 -0
  4. data/lib/jasmine-core/example/spec/SpecHelper.js +9 -0
  5. data/lib/jasmine-core/example/src/Player.js +22 -0
  6. data/lib/jasmine-core/example/src/Song.js +7 -0
  7. data/lib/jasmine-core/jasmine-html.js +681 -0
  8. data/lib/jasmine-core/jasmine.css +82 -0
  9. data/lib/jasmine-core/jasmine.js +2568 -0
  10. data/lib/jasmine-core/json2.js +478 -0
  11. data/lib/jasmine-core/spec/console/ConsoleReporterSpec.js +451 -0
  12. data/lib/jasmine-core/spec/core/BaseSpec.js +27 -0
  13. data/lib/jasmine-core/spec/core/CustomMatchersSpec.js +97 -0
  14. data/lib/jasmine-core/spec/core/EnvSpec.js +159 -0
  15. data/lib/jasmine-core/spec/core/ExceptionsSpec.js +175 -0
  16. data/lib/jasmine-core/spec/core/JsApiReporterSpec.js +103 -0
  17. data/lib/jasmine-core/spec/core/MatchersSpec.js +1145 -0
  18. data/lib/jasmine-core/spec/core/MockClockSpec.js +38 -0
  19. data/lib/jasmine-core/spec/core/MultiReporterSpec.js +45 -0
  20. data/lib/jasmine-core/spec/core/NestedResultsSpec.js +54 -0
  21. data/lib/jasmine-core/spec/core/PrettyPrintSpec.js +94 -0
  22. data/lib/jasmine-core/spec/core/QueueSpec.js +23 -0
  23. data/lib/jasmine-core/spec/core/ReporterSpec.js +56 -0
  24. data/lib/jasmine-core/spec/core/RunnerSpec.js +280 -0
  25. data/lib/jasmine-core/spec/core/SpecRunningSpec.js +1291 -0
  26. data/lib/jasmine-core/spec/core/SpecSpec.js +124 -0
  27. data/lib/jasmine-core/spec/core/SpySpec.js +216 -0
  28. data/lib/jasmine-core/spec/core/SuiteSpec.js +120 -0
  29. data/lib/jasmine-core/spec/core/UtilSpec.js +39 -0
  30. data/lib/jasmine-core/spec/core/WaitsForBlockSpec.js +118 -0
  31. data/lib/jasmine-core/spec/html/HTMLReporterSpec.js +209 -0
  32. data/lib/jasmine-core/spec/html/MatchersHtmlSpec.js +38 -0
  33. data/lib/jasmine-core/spec/html/PrettyPrintHtmlSpec.js +8 -0
  34. data/lib/jasmine-core/spec/html/TrivialReporterSpec.js +239 -0
  35. data/lib/jasmine-core/spec/node_suite.js +127 -0
  36. data/lib/jasmine-core/version.rb +6 -0
  37. metadata +288 -0
@@ -0,0 +1,36 @@
1
+ module Jasmine
2
+ module Core
3
+ class << self
4
+ def path
5
+ File.join(File.dirname(__FILE__), "jasmine-core")
6
+ end
7
+
8
+ def js_files
9
+ (["jasmine.js"] + Dir.glob(File.join(path, "*.js"))).map { |f| File.basename(f) }.uniq
10
+ end
11
+
12
+ SPEC_TYPES = ["core", "html", "node"]
13
+
14
+ def core_spec_files
15
+ spec_files("core")
16
+ end
17
+
18
+ def html_spec_files
19
+ spec_files("html")
20
+ end
21
+
22
+ def node_spec_files
23
+ spec_files("node")
24
+ end
25
+
26
+ def spec_files(type)
27
+ raise ArgumentError.new("Unrecognized spec type") unless SPEC_TYPES.include?(type)
28
+ (Dir.glob(File.join(path, "spec", type, "*.js"))).map { |f| File.join("spec", type, File.basename(f)) }.uniq
29
+ end
30
+
31
+ def css_files
32
+ Dir.glob(File.join(path, "*.css")).map { |f| File.basename(f) }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,54 @@
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>Jasmine Spec Runner</title>
6
+
7
+ <link rel="shortcut icon" type="image/png" href="lib/jasmine-1.1.0.rc1/jasmine_favicon.png">
8
+
9
+ <link rel="stylesheet" type="text/css" href="lib/jasmine-1.1.0.rc1/jasmine.css">
10
+ <script type="text/javascript" src="lib/jasmine-1.1.0.rc1/jasmine.js"></script>
11
+ <script type="text/javascript" src="lib/jasmine-1.1.0.rc1/jasmine-html.js"></script>
12
+
13
+ <!-- include spec files here... -->
14
+ <script type="text/javascript" src="spec/SpecHelper.js"></script>
15
+ <script type="text/javascript" src="spec/PlayerSpec.js"></script>
16
+
17
+ <!-- include source files here... -->
18
+ <script type="text/javascript" src="src/Player.js"></script>
19
+ <script type="text/javascript" src="src/Song.js"></script>
20
+
21
+ <script type="text/javascript">
22
+ (function() {
23
+ var jasmineEnv = jasmine.getEnv();
24
+ jasmineEnv.updateInterval = 1000;
25
+
26
+ var trivialReporter = new jasmine.TrivialReporter();
27
+
28
+ jasmineEnv.addReporter(trivialReporter);
29
+
30
+ jasmineEnv.specFilter = function(spec) {
31
+ return trivialReporter.specFilter(spec);
32
+ };
33
+
34
+ var currentWindowOnload = window.onload;
35
+
36
+ window.onload = function() {
37
+ if (currentWindowOnload) {
38
+ currentWindowOnload();
39
+ }
40
+ execJasmine();
41
+ };
42
+
43
+ function execJasmine() {
44
+ jasmineEnv.execute();
45
+ }
46
+
47
+ })();
48
+ </script>
49
+
50
+ </head>
51
+
52
+ <body>
53
+ </body>
54
+ </html>
@@ -0,0 +1,58 @@
1
+ describe("Player", function() {
2
+ var player;
3
+ var song;
4
+
5
+ beforeEach(function() {
6
+ player = new Player();
7
+ song = new Song();
8
+ });
9
+
10
+ it("should be able to play a Song", function() {
11
+ player.play(song);
12
+ expect(player.currentlyPlayingSong).toEqual(song);
13
+
14
+ //demonstrates use of custom matcher
15
+ expect(player).toBePlaying(song);
16
+ });
17
+
18
+ describe("when song has been paused", function() {
19
+ beforeEach(function() {
20
+ player.play(song);
21
+ player.pause();
22
+ });
23
+
24
+ it("should indicate that the song is currently paused", function() {
25
+ expect(player.isPlaying).toBeFalsy();
26
+
27
+ // demonstrates use of 'not' with a custom matcher
28
+ expect(player).not.toBePlaying(song);
29
+ });
30
+
31
+ it("should be possible to resume", function() {
32
+ player.resume();
33
+ expect(player.isPlaying).toBeTruthy();
34
+ expect(player.currentlyPlayingSong).toEqual(song);
35
+ });
36
+ });
37
+
38
+ // demonstrates use of spies to intercept and test method calls
39
+ it("tells the current song if the user has made it a favorite", function() {
40
+ spyOn(song, 'persistFavoriteStatus');
41
+
42
+ player.play(song);
43
+ player.makeFavorite();
44
+
45
+ expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true);
46
+ });
47
+
48
+ //demonstrates use of expected exceptions
49
+ describe("#resume", function() {
50
+ it("should throw an exception if song is already playing", function() {
51
+ player.play(song);
52
+
53
+ expect(function() {
54
+ player.resume();
55
+ }).toThrow("song is already playing");
56
+ });
57
+ });
58
+ });
@@ -0,0 +1,9 @@
1
+ beforeEach(function() {
2
+ this.addMatchers({
3
+ toBePlaying: function(expectedSong) {
4
+ var player = this.actual;
5
+ return player.currentlyPlayingSong === expectedSong &&
6
+ player.isPlaying;
7
+ }
8
+ });
9
+ });
@@ -0,0 +1,22 @@
1
+ function Player() {
2
+ }
3
+ Player.prototype.play = function(song) {
4
+ this.currentlyPlayingSong = song;
5
+ this.isPlaying = true;
6
+ };
7
+
8
+ Player.prototype.pause = function() {
9
+ this.isPlaying = false;
10
+ };
11
+
12
+ Player.prototype.resume = function() {
13
+ if (this.isPlaying) {
14
+ throw new Error("song is already playing");
15
+ }
16
+
17
+ this.isPlaying = true;
18
+ };
19
+
20
+ Player.prototype.makeFavorite = function() {
21
+ this.currentlyPlayingSong.persistFavoriteStatus(true);
22
+ };
@@ -0,0 +1,7 @@
1
+ function Song() {
2
+ }
3
+
4
+ Song.prototype.persistFavoriteStatus = function(value) {
5
+ // something complicated
6
+ throw new Error("not yet implemented");
7
+ };
@@ -0,0 +1,681 @@
1
+ jasmine.HtmlReporterHelpers = {};
2
+
3
+ jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
4
+ var el = document.createElement(type);
5
+
6
+ for (var i = 2; i < arguments.length; i++) {
7
+ var child = arguments[i];
8
+
9
+ if (typeof child === 'string') {
10
+ el.appendChild(document.createTextNode(child));
11
+ } else {
12
+ if (child) {
13
+ el.appendChild(child);
14
+ }
15
+ }
16
+ }
17
+
18
+ for (var attr in attrs) {
19
+ if (attr == "className") {
20
+ el[attr] = attrs[attr];
21
+ } else {
22
+ el.setAttribute(attr, attrs[attr]);
23
+ }
24
+ }
25
+
26
+ return el;
27
+ };
28
+
29
+ jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
30
+ var results = child.results();
31
+ var status = results.passed() ? 'passed' : 'failed';
32
+ if (results.skipped) {
33
+ status = 'skipped';
34
+ }
35
+
36
+ return status;
37
+ };
38
+
39
+ jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
40
+ var parentDiv = this.dom.summary;
41
+ var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
42
+ var parent = child[parentSuite];
43
+
44
+ if (parent) {
45
+ if (typeof this.views.suites[parent.id] == 'undefined') {
46
+ this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
47
+ }
48
+ parentDiv = this.views.suites[parent.id].element;
49
+ }
50
+
51
+ parentDiv.appendChild(childElement);
52
+ };
53
+
54
+
55
+ jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
56
+ for(var fn in jasmine.HtmlReporterHelpers) {
57
+ ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
58
+ }
59
+ };
60
+
61
+ jasmine.HtmlReporter = function(_doc) {
62
+ var self = this;
63
+ var doc = _doc || window.document;
64
+
65
+ var reporterView;
66
+
67
+ var dom = {};
68
+
69
+ // Jasmine Reporter Public Interface
70
+ self.logRunningSpecs = false;
71
+
72
+ self.reportRunnerStarting = function(runner) {
73
+ var specs = runner.specs() || [];
74
+
75
+ if (specs.length == 0) {
76
+ return;
77
+ }
78
+
79
+ createReporterDom(runner.env.versionString());
80
+ doc.body.appendChild(dom.reporter);
81
+ setExceptionHandling();
82
+
83
+ reporterView = new jasmine.HtmlReporter.ReporterView(dom);
84
+ reporterView.addSpecs(specs, self.specFilter);
85
+ };
86
+
87
+ self.reportRunnerResults = function(runner) {
88
+ reporterView && reporterView.complete();
89
+ };
90
+
91
+ self.reportSuiteResults = function(suite) {
92
+ reporterView.suiteComplete(suite);
93
+ };
94
+
95
+ self.reportSpecStarting = function(spec) {
96
+ if (self.logRunningSpecs) {
97
+ self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
98
+ }
99
+ };
100
+
101
+ self.reportSpecResults = function(spec) {
102
+ reporterView.specComplete(spec);
103
+ };
104
+
105
+ self.log = function() {
106
+ var console = jasmine.getGlobal().console;
107
+ if (console && console.log) {
108
+ if (console.log.apply) {
109
+ console.log.apply(console, arguments);
110
+ } else {
111
+ console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
112
+ }
113
+ }
114
+ };
115
+
116
+ self.specFilter = function(spec) {
117
+ if (!focusedSpecName()) {
118
+ return true;
119
+ }
120
+
121
+ return spec.getFullName().indexOf(focusedSpecName()) === 0;
122
+ };
123
+
124
+ return self;
125
+
126
+ function focusedSpecName() {
127
+ var specName;
128
+
129
+ (function memoizeFocusedSpec() {
130
+ if (specName) {
131
+ return;
132
+ }
133
+
134
+ var paramMap = [];
135
+ var params = jasmine.HtmlReporter.parameters(doc);
136
+
137
+ for (var i = 0; i < params.length; i++) {
138
+ var p = params[i].split('=');
139
+ paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
140
+ }
141
+
142
+ specName = paramMap.spec;
143
+ })();
144
+
145
+ return specName;
146
+ }
147
+
148
+ function createReporterDom(version) {
149
+ dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
150
+ dom.banner = self.createDom('div', { className: 'banner' },
151
+ self.createDom('span', { className: 'title' }, "Jasmine "),
152
+ self.createDom('span', { className: 'version' }, version)),
153
+
154
+ dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
155
+ dom.alert = self.createDom('div', {className: 'alert'},
156
+ self.createDom('span', { className: 'exceptions' },
157
+ self.createDom('label', { className: 'label', 'for': 'no_try_catch' }, 'No try/catch'),
158
+ self.createDom('input', { id: 'no_try_catch', type: 'checkbox' }))),
159
+ dom.results = self.createDom('div', {className: 'results'},
160
+ dom.summary = self.createDom('div', { className: 'summary' }),
161
+ dom.details = self.createDom('div', { id: 'details' }))
162
+ );
163
+ }
164
+
165
+ function noTryCatch() {
166
+ return window.location.search.match(/catch=false/);
167
+ }
168
+
169
+ function searchWithCatch() {
170
+ var params = jasmine.HtmlReporter.parameters(window.document);
171
+ var removed = false;
172
+ var i = 0;
173
+
174
+ while (!removed && i < params.length) {
175
+ if (params[i].match(/catch=/)) {
176
+ params.splice(i, 1);
177
+ removed = true;
178
+ }
179
+ i++;
180
+ }
181
+ if (jasmine.CATCH_EXCEPTIONS) {
182
+ params.push("catch=false");
183
+ }
184
+
185
+ return params.join("&");
186
+ }
187
+
188
+ function setExceptionHandling() {
189
+ var chxCatch = document.getElementById('no_try_catch');
190
+
191
+ if (noTryCatch()) {
192
+ chxCatch.setAttribute('checked', true);
193
+ jasmine.CATCH_EXCEPTIONS = false;
194
+ }
195
+ chxCatch.onclick = function() {
196
+ window.location.search = searchWithCatch();
197
+ };
198
+ }
199
+ };
200
+ jasmine.HtmlReporter.parameters = function(doc) {
201
+ var paramStr = doc.location.search.substring(1);
202
+ var params = [];
203
+
204
+ if (paramStr.length > 0) {
205
+ params = paramStr.split('&');
206
+ }
207
+ return params;
208
+ }
209
+ jasmine.HtmlReporter.sectionLink = function(sectionName) {
210
+ var link = '?';
211
+ var params = [];
212
+
213
+ if (sectionName) {
214
+ params.push('spec=' + encodeURIComponent(sectionName));
215
+ }
216
+ if (!jasmine.CATCH_EXCEPTIONS) {
217
+ params.push("catch=false");
218
+ }
219
+ if (params.length > 0) {
220
+ link += params.join("&");
221
+ }
222
+
223
+ return link;
224
+ };
225
+ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);
226
+ jasmine.HtmlReporter.ReporterView = function(dom) {
227
+ this.startedAt = new Date();
228
+ this.runningSpecCount = 0;
229
+ this.completeSpecCount = 0;
230
+ this.passedCount = 0;
231
+ this.failedCount = 0;
232
+ this.skippedCount = 0;
233
+
234
+ this.createResultsMenu = function() {
235
+ this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
236
+ this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
237
+ ' | ',
238
+ this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
239
+
240
+ this.summaryMenuItem.onclick = function() {
241
+ dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
242
+ };
243
+
244
+ this.detailsMenuItem.onclick = function() {
245
+ showDetails();
246
+ };
247
+ };
248
+
249
+ this.addSpecs = function(specs, specFilter) {
250
+ this.totalSpecCount = specs.length;
251
+
252
+ this.views = {
253
+ specs: {},
254
+ suites: {}
255
+ };
256
+
257
+ for (var i = 0; i < specs.length; i++) {
258
+ var spec = specs[i];
259
+ this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
260
+ if (specFilter(spec)) {
261
+ this.runningSpecCount++;
262
+ }
263
+ }
264
+ };
265
+
266
+ this.specComplete = function(spec) {
267
+ this.completeSpecCount++;
268
+
269
+ if (isUndefined(this.views.specs[spec.id])) {
270
+ this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
271
+ }
272
+
273
+ var specView = this.views.specs[spec.id];
274
+
275
+ switch (specView.status()) {
276
+ case 'passed':
277
+ this.passedCount++;
278
+ break;
279
+
280
+ case 'failed':
281
+ this.failedCount++;
282
+ break;
283
+
284
+ case 'skipped':
285
+ this.skippedCount++;
286
+ break;
287
+ }
288
+
289
+ specView.refresh();
290
+ this.refresh();
291
+ };
292
+
293
+ this.suiteComplete = function(suite) {
294
+ var suiteView = this.views.suites[suite.id];
295
+ if (isUndefined(suiteView)) {
296
+ return;
297
+ }
298
+ suiteView.refresh();
299
+ };
300
+
301
+ this.refresh = function() {
302
+
303
+ if (isUndefined(this.resultsMenu)) {
304
+ this.createResultsMenu();
305
+ }
306
+
307
+ // currently running UI
308
+ if (isUndefined(this.runningAlert)) {
309
+ this.runningAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "runningAlert bar" });
310
+ dom.alert.appendChild(this.runningAlert);
311
+ }
312
+ this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
313
+
314
+ // skipped specs UI
315
+ if (isUndefined(this.skippedAlert)) {
316
+ this.skippedAlert = this.createDom('a', { href: jasmine.HtmlReporter.sectionLink(), className: "skippedAlert bar" });
317
+ }
318
+
319
+ this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
320
+
321
+ if (this.skippedCount === 1 && isDefined(dom.alert)) {
322
+ dom.alert.appendChild(this.skippedAlert);
323
+ }
324
+
325
+ // passing specs UI
326
+ if (isUndefined(this.passedAlert)) {
327
+ this.passedAlert = this.createDom('span', { href: jasmine.HtmlReporter.sectionLink(), className: "passingAlert bar" });
328
+ }
329
+ this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
330
+
331
+ // failing specs UI
332
+ if (isUndefined(this.failedAlert)) {
333
+ this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
334
+ }
335
+ this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
336
+
337
+ if (this.failedCount === 1 && isDefined(dom.alert)) {
338
+ dom.alert.appendChild(this.failedAlert);
339
+ dom.alert.appendChild(this.resultsMenu);
340
+ }
341
+
342
+ // summary info
343
+ this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
344
+ this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
345
+ };
346
+
347
+ this.complete = function() {
348
+ dom.alert.removeChild(this.runningAlert);
349
+
350
+ this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
351
+
352
+ if (this.failedCount === 0) {
353
+ dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
354
+ } else {
355
+ showDetails();
356
+ }
357
+
358
+ dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
359
+ };
360
+
361
+ return this;
362
+
363
+ function showDetails() {
364
+ if (dom.reporter.className.search(/showDetails/) === -1) {
365
+ dom.reporter.className += " showDetails";
366
+ }
367
+ }
368
+
369
+ function isUndefined(obj) {
370
+ return typeof obj === 'undefined';
371
+ }
372
+
373
+ function isDefined(obj) {
374
+ return !isUndefined(obj);
375
+ }
376
+
377
+ function specPluralizedFor(count) {
378
+ var str = count + " spec";
379
+ if (count > 1) {
380
+ str += "s"
381
+ }
382
+ return str;
383
+ }
384
+
385
+ };
386
+
387
+ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
388
+
389
+
390
+ jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
391
+ this.spec = spec;
392
+ this.dom = dom;
393
+ this.views = views;
394
+
395
+ this.symbol = this.createDom('li', { className: 'pending' });
396
+ this.dom.symbolSummary.appendChild(this.symbol);
397
+
398
+ this.summary = this.createDom('div', { className: 'specSummary' },
399
+ this.createDom('a', {
400
+ className: 'description',
401
+ href: jasmine.HtmlReporter.sectionLink(this.spec.getFullName()),
402
+ title: this.spec.getFullName()
403
+ }, this.spec.description)
404
+ );
405
+
406
+ this.detail = this.createDom('div', { className: 'specDetail' },
407
+ this.createDom('a', {
408
+ className: 'description',
409
+ href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
410
+ title: this.spec.getFullName()
411
+ }, this.spec.getFullName())
412
+ );
413
+ };
414
+
415
+ jasmine.HtmlReporter.SpecView.prototype.status = function() {
416
+ return this.getSpecStatus(this.spec);
417
+ };
418
+
419
+ jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
420
+ this.symbol.className = this.status();
421
+
422
+ switch (this.status()) {
423
+ case 'skipped':
424
+ break;
425
+
426
+ case 'passed':
427
+ this.appendSummaryToSuiteDiv();
428
+ break;
429
+
430
+ case 'failed':
431
+ this.appendSummaryToSuiteDiv();
432
+ this.appendFailureDetail();
433
+ break;
434
+ }
435
+ };
436
+
437
+ jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
438
+ this.summary.className += ' ' + this.status();
439
+ this.appendToSummary(this.spec, this.summary);
440
+ };
441
+
442
+ jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
443
+ this.detail.className += ' ' + this.status();
444
+
445
+ var resultItems = this.spec.results().getItems();
446
+ var messagesDiv = this.createDom('div', { className: 'messages' });
447
+
448
+ for (var i = 0; i < resultItems.length; i++) {
449
+ var result = resultItems[i];
450
+
451
+ if (result.type == 'log') {
452
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
453
+ } else if (result.type == 'expect' && result.passed && !result.passed()) {
454
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
455
+
456
+ if (result.trace.stack) {
457
+ messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
458
+ }
459
+ }
460
+ }
461
+
462
+ if (messagesDiv.childNodes.length > 0) {
463
+ this.detail.appendChild(messagesDiv);
464
+ this.dom.details.appendChild(this.detail);
465
+ }
466
+ };
467
+
468
+ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
469
+ this.suite = suite;
470
+ this.dom = dom;
471
+ this.views = views;
472
+
473
+ this.element = this.createDom('div', { className: 'suite' },
474
+ this.createDom('a', { className: 'description', href: jasmine.HtmlReporter.sectionLink(this.suite.getFullName()) }, this.suite.description)
475
+ );
476
+
477
+ this.appendToSummary(this.suite, this.element);
478
+ };
479
+
480
+ jasmine.HtmlReporter.SuiteView.prototype.status = function() {
481
+ return this.getSpecStatus(this.suite);
482
+ };
483
+
484
+ jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
485
+ this.element.className += " " + this.status();
486
+ };
487
+
488
+ jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
489
+
490
+ /* @deprecated Use jasmine.HtmlReporter instead
491
+ */
492
+ jasmine.TrivialReporter = function(doc) {
493
+ this.document = doc || document;
494
+ this.suiteDivs = {};
495
+ this.logRunningSpecs = false;
496
+ };
497
+
498
+ jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
499
+ var el = document.createElement(type);
500
+
501
+ for (var i = 2; i < arguments.length; i++) {
502
+ var child = arguments[i];
503
+
504
+ if (typeof child === 'string') {
505
+ el.appendChild(document.createTextNode(child));
506
+ } else {
507
+ if (child) { el.appendChild(child); }
508
+ }
509
+ }
510
+
511
+ for (var attr in attrs) {
512
+ if (attr == "className") {
513
+ el[attr] = attrs[attr];
514
+ } else {
515
+ el.setAttribute(attr, attrs[attr]);
516
+ }
517
+ }
518
+
519
+ return el;
520
+ };
521
+
522
+ jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
523
+ var showPassed, showSkipped;
524
+
525
+ this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
526
+ this.createDom('div', { className: 'banner' },
527
+ this.createDom('div', { className: 'logo' },
528
+ this.createDom('span', { className: 'title' }, "Jasmine"),
529
+ this.createDom('span', { className: 'version' }, runner.env.versionString())),
530
+ this.createDom('div', { className: 'options' },
531
+ "Show ",
532
+ showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
533
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
534
+ showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
535
+ this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
536
+ )
537
+ ),
538
+
539
+ this.runnerDiv = this.createDom('div', { className: 'runner running' },
540
+ this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
541
+ this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
542
+ this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
543
+ );
544
+
545
+ this.document.body.appendChild(this.outerDiv);
546
+
547
+ var suites = runner.suites();
548
+ for (var i = 0; i < suites.length; i++) {
549
+ var suite = suites[i];
550
+ var suiteDiv = this.createDom('div', { className: 'suite' },
551
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
552
+ this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
553
+ this.suiteDivs[suite.id] = suiteDiv;
554
+ var parentDiv = this.outerDiv;
555
+ if (suite.parentSuite) {
556
+ parentDiv = this.suiteDivs[suite.parentSuite.id];
557
+ }
558
+ parentDiv.appendChild(suiteDiv);
559
+ }
560
+
561
+ this.startedAt = new Date();
562
+
563
+ var self = this;
564
+ showPassed.onclick = function(evt) {
565
+ if (showPassed.checked) {
566
+ self.outerDiv.className += ' show-passed';
567
+ } else {
568
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
569
+ }
570
+ };
571
+
572
+ showSkipped.onclick = function(evt) {
573
+ if (showSkipped.checked) {
574
+ self.outerDiv.className += ' show-skipped';
575
+ } else {
576
+ self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
577
+ }
578
+ };
579
+ };
580
+
581
+ jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
582
+ var results = runner.results();
583
+ var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
584
+ this.runnerDiv.setAttribute("class", className);
585
+ //do it twice for IE
586
+ this.runnerDiv.setAttribute("className", className);
587
+ var specs = runner.specs();
588
+ var specCount = 0;
589
+ for (var i = 0; i < specs.length; i++) {
590
+ if (this.specFilter(specs[i])) {
591
+ specCount++;
592
+ }
593
+ }
594
+ var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
595
+ message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
596
+ this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
597
+
598
+ this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
599
+ };
600
+
601
+ jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
602
+ var results = suite.results();
603
+ var status = results.passed() ? 'passed' : 'failed';
604
+ if (results.totalCount === 0) { // todo: change this to check results.skipped
605
+ status = 'skipped';
606
+ }
607
+ this.suiteDivs[suite.id].className += " " + status;
608
+ };
609
+
610
+ jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
611
+ if (this.logRunningSpecs) {
612
+ this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
613
+ }
614
+ };
615
+
616
+ jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
617
+ var results = spec.results();
618
+ var status = results.passed() ? 'passed' : 'failed';
619
+ if (results.skipped) {
620
+ status = 'skipped';
621
+ }
622
+ var specDiv = this.createDom('div', { className: 'spec ' + status },
623
+ this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
624
+ this.createDom('a', {
625
+ className: 'description',
626
+ href: '?spec=' + encodeURIComponent(spec.getFullName()),
627
+ title: spec.getFullName()
628
+ }, spec.description));
629
+
630
+
631
+ var resultItems = results.getItems();
632
+ var messagesDiv = this.createDom('div', { className: 'messages' });
633
+ for (var i = 0; i < resultItems.length; i++) {
634
+ var result = resultItems[i];
635
+
636
+ if (result.type == 'log') {
637
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
638
+ } else if (result.type == 'expect' && result.passed && !result.passed()) {
639
+ messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
640
+
641
+ if (result.trace.stack) {
642
+ messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
643
+ }
644
+ }
645
+ }
646
+
647
+ if (messagesDiv.childNodes.length > 0) {
648
+ specDiv.appendChild(messagesDiv);
649
+ }
650
+
651
+ this.suiteDivs[spec.suite.id].appendChild(specDiv);
652
+ };
653
+
654
+ jasmine.TrivialReporter.prototype.log = function() {
655
+ var console = jasmine.getGlobal().console;
656
+ if (console && console.log) {
657
+ if (console.log.apply) {
658
+ console.log.apply(console, arguments);
659
+ } else {
660
+ console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
661
+ }
662
+ }
663
+ };
664
+
665
+ jasmine.TrivialReporter.prototype.getLocation = function() {
666
+ return this.document.location;
667
+ };
668
+
669
+ jasmine.TrivialReporter.prototype.specFilter = function(spec) {
670
+ var paramMap = {};
671
+ var params = this.getLocation().search.substring(1).split('&');
672
+ for (var i = 0; i < params.length; i++) {
673
+ var p = params[i].split('=');
674
+ paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
675
+ }
676
+
677
+ if (!paramMap.spec) {
678
+ return true;
679
+ }
680
+ return spec.getFullName().indexOf(paramMap.spec) === 0;
681
+ };