jasmine-core 2.99.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jasmine-core/boot.js +7 -6
  3. data/lib/jasmine-core/boot/boot.js +7 -6
  4. data/lib/jasmine-core/boot/node_boot.js +0 -3
  5. data/lib/jasmine-core/jasmine-html.js +228 -137
  6. data/lib/jasmine-core/jasmine.css +11 -5
  7. data/lib/jasmine-core/jasmine.js +1046 -608
  8. data/lib/jasmine-core/node_boot.js +0 -3
  9. data/lib/jasmine-core/spec/core/CallTrackerSpec.js +130 -0
  10. data/lib/jasmine-core/spec/core/ClearStackSpec.js +137 -0
  11. data/lib/jasmine-core/spec/core/ClockSpec.js +710 -0
  12. data/lib/jasmine-core/spec/core/DelayedFunctionSchedulerSpec.js +286 -0
  13. data/lib/jasmine-core/spec/core/EnvSpec.js +200 -0
  14. data/lib/jasmine-core/spec/core/ExceptionFormatterSpec.js +120 -0
  15. data/lib/jasmine-core/spec/core/ExceptionsSpec.js +46 -0
  16. data/lib/jasmine-core/spec/core/ExpectationResultSpec.js +61 -0
  17. data/lib/jasmine-core/spec/core/ExpectationSpec.js +434 -0
  18. data/lib/jasmine-core/spec/core/GlobalErrorsSpec.js +110 -0
  19. data/lib/jasmine-core/spec/core/JsApiReporterSpec.js +259 -0
  20. data/lib/jasmine-core/spec/core/MockDateSpec.js +200 -0
  21. data/lib/jasmine-core/spec/core/PrettyPrintSpec.js +332 -0
  22. data/lib/jasmine-core/spec/core/QueueRunnerSpec.js +670 -0
  23. data/lib/jasmine-core/spec/core/ReportDispatcherSpec.js +140 -0
  24. data/lib/jasmine-core/spec/core/SpecSpec.js +407 -0
  25. data/lib/jasmine-core/spec/core/SpyRegistrySpec.js +364 -0
  26. data/lib/jasmine-core/spec/core/SpySpec.js +177 -0
  27. data/lib/jasmine-core/spec/core/SpyStrategySpec.js +202 -0
  28. data/lib/jasmine-core/spec/core/StackTraceSpec.js +166 -0
  29. data/lib/jasmine-core/spec/core/SuiteSpec.js +123 -0
  30. data/lib/jasmine-core/spec/core/TimerSpec.js +31 -0
  31. data/lib/jasmine-core/spec/core/TreeProcessorSpec.js +794 -0
  32. data/lib/jasmine-core/spec/core/UserContextSpec.js +54 -0
  33. data/lib/jasmine-core/spec/core/UtilSpec.js +105 -0
  34. data/lib/jasmine-core/spec/core/asymmetric_equality/AnySpec.js +91 -0
  35. data/lib/jasmine-core/spec/core/asymmetric_equality/AnythingSpec.js +76 -0
  36. data/lib/jasmine-core/spec/core/asymmetric_equality/ArrayContainingSpec.js +52 -0
  37. data/lib/jasmine-core/spec/core/asymmetric_equality/ArrayWithExactContentsSpec.js +47 -0
  38. data/lib/jasmine-core/spec/core/asymmetric_equality/ObjectContainingSpec.js +99 -0
  39. data/lib/jasmine-core/spec/core/asymmetric_equality/StringMatchingSpec.js +27 -0
  40. data/lib/jasmine-core/spec/core/formatErrorMsgSpec.js +13 -0
  41. data/lib/jasmine-core/spec/core/integration/CustomMatchersSpec.js +200 -0
  42. data/lib/jasmine-core/spec/core/integration/CustomSpyStrategiesSpec.js +138 -0
  43. data/lib/jasmine-core/spec/core/integration/EnvSpec.js +2344 -0
  44. data/lib/jasmine-core/spec/core/integration/SpecRunningSpec.js +976 -0
  45. data/lib/jasmine-core/spec/core/matchers/DiffBuilderSpec.js +47 -0
  46. data/lib/jasmine-core/spec/core/matchers/NullDiffBuilderSpec.js +13 -0
  47. data/lib/jasmine-core/spec/core/matchers/ObjectPathSpec.js +43 -0
  48. data/lib/jasmine-core/spec/core/matchers/matchersUtilSpec.js +645 -0
  49. data/lib/jasmine-core/spec/core/matchers/nothingSpec.js +8 -0
  50. data/lib/jasmine-core/spec/core/matchers/toBeCloseToSpec.js +93 -0
  51. data/lib/jasmine-core/spec/core/matchers/toBeDefinedSpec.js +18 -0
  52. data/lib/jasmine-core/spec/core/matchers/toBeFalsySpec.js +38 -0
  53. data/lib/jasmine-core/spec/core/matchers/toBeGreaterThanOrEqualSpec.js +29 -0
  54. data/lib/jasmine-core/spec/core/matchers/toBeGreaterThanSpec.js +20 -0
  55. data/lib/jasmine-core/spec/core/matchers/toBeLessThanOrEqualSpec.js +29 -0
  56. data/lib/jasmine-core/spec/core/matchers/toBeLessThanSpec.js +20 -0
  57. data/lib/jasmine-core/spec/core/matchers/toBeNaNSpec.js +37 -0
  58. data/lib/jasmine-core/spec/core/matchers/toBeNegativeInfinitySpec.js +31 -0
  59. data/lib/jasmine-core/spec/core/matchers/toBeNullSpec.js +17 -0
  60. data/lib/jasmine-core/spec/core/matchers/toBePositiveInfinitySpec.js +31 -0
  61. data/lib/jasmine-core/spec/core/matchers/toBeSpec.js +17 -0
  62. data/lib/jasmine-core/spec/core/matchers/toBeTruthySpec.js +38 -0
  63. data/lib/jasmine-core/spec/core/matchers/toBeUndefinedSpec.js +18 -0
  64. data/lib/jasmine-core/spec/core/matchers/toContainSpec.js +26 -0
  65. data/lib/jasmine-core/spec/core/matchers/toEqualSpec.js +785 -0
  66. data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledBeforeSpec.js +99 -0
  67. data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledSpec.js +47 -0
  68. data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledTimesSpec.js +86 -0
  69. data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledWithSpec.js +67 -0
  70. data/lib/jasmine-core/spec/core/matchers/toMatchSpec.js +43 -0
  71. data/lib/jasmine-core/spec/core/matchers/toThrowErrorSpec.js +315 -0
  72. data/lib/jasmine-core/spec/core/matchers/toThrowMatchingSpec.js +73 -0
  73. data/lib/jasmine-core/spec/core/matchers/toThrowSpec.js +100 -0
  74. data/lib/jasmine-core/spec/helpers/BrowserFlags.js +15 -0
  75. data/lib/jasmine-core/spec/helpers/asyncAwait.js +27 -0
  76. data/lib/jasmine-core/spec/helpers/checkForMap.js +37 -0
  77. data/lib/jasmine-core/spec/helpers/checkForSet.js +41 -0
  78. data/lib/jasmine-core/spec/helpers/checkForSymbol.js +28 -0
  79. data/lib/jasmine-core/spec/helpers/checkForTypedArrays.js +20 -0
  80. data/lib/jasmine-core/spec/helpers/defineJasmineUnderTest.js +6 -0
  81. data/lib/jasmine-core/spec/helpers/integrationMatchers.js +43 -0
  82. data/lib/jasmine-core/spec/helpers/nodeDefineJasmineUnderTest.js +30 -0
  83. data/lib/jasmine-core/spec/html/HtmlReporterSpec.js +1261 -0
  84. data/lib/jasmine-core/spec/html/HtmlSpecFilterSpec.js +18 -0
  85. data/lib/jasmine-core/spec/html/MatchersHtmlSpec.js +37 -0
  86. data/lib/jasmine-core/spec/html/PrettyPrintHtmlSpec.js +27 -0
  87. data/lib/jasmine-core/spec/html/QueryStringSpec.js +72 -0
  88. data/lib/jasmine-core/spec/html/ResultsNodeSpec.js +62 -0
  89. data/lib/jasmine-core/spec/html/SpyRegistryHtmlSpec.js +39 -0
  90. data/lib/jasmine-core/spec/html/matchers/toHaveClassSpec.js +48 -0
  91. data/lib/jasmine-core/spec/npmPackage/npmPackageSpec.js +101 -0
  92. data/lib/jasmine-core/spec/performance/large_object_test.js +36 -0
  93. data/lib/jasmine-core/spec/performance/performance_test.js +10 -0
  94. data/lib/jasmine-core/version.rb +1 -1
  95. metadata +88 -4
  96. data/lib/console/console.js +0 -190
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c49e107a0140926c343613207940446f285e816a
4
- data.tar.gz: d239460f82af876a16dbe9d3b6d7d05d9374e7c0
3
+ metadata.gz: 7e5647f35a2c17871621df2d1822a77c638e2a84
4
+ data.tar.gz: 0d30ae54baae843527b0e057715e55766df4b01d
5
5
  SHA512:
6
- metadata.gz: 067bf31fbd4f588ac838644cd072e59c1ff5a772da8ec74db8a4849a58499c889c62524d519465c98c88ad5f813950b085c8562a82c50b2d1e2383e386302a34
7
- data.tar.gz: '014690c428593e0e697fece07e82908469dfb84a2844e91f107a3cc2fd411dbf9e363fb5b6f5bc9a535056debc14cc4ae632b2bf40c13a17455611beb9fdf2a7'
6
+ metadata.gz: 366cce7b5d79ec3defff32ac37246dd92df9418e81c2b9f575f92d58de658337c2b7fab46d5c4f83902ae8165a66f1628e80cdc171394107e851cd93c6742219
7
+ data.tar.gz: b0b62b54f3d7c85d5289227fa5f40417a6e59c481848972e50425ce1215e97f1cccbe3dc737ea30f016ad2695d591e0e5ad48b6a5546d15b1a292e49e7f5b503
@@ -73,14 +73,17 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
73
73
 
74
74
  var filterSpecs = !!queryString.getParam("spec");
75
75
 
76
- var catchingExceptions = queryString.getParam("catch");
77
- env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions);
76
+ var stoppingOnSpecFailure = queryString.getParam("failFast");
77
+ env.stopOnSpecFailure(stoppingOnSpecFailure);
78
78
 
79
79
  var throwingExpectationFailures = queryString.getParam("throwFailures");
80
80
  env.throwOnExpectationFailure(throwingExpectationFailures);
81
81
 
82
82
  var random = queryString.getParam("random");
83
- env.randomizeTests(random);
83
+
84
+ if (random !== undefined && random !== "") {
85
+ env.randomizeTests(random);
86
+ }
84
87
 
85
88
  var seed = queryString.getParam("seed");
86
89
  if (seed) {
@@ -93,9 +96,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
93
96
  */
94
97
  var htmlReporter = new jasmine.HtmlReporter({
95
98
  env: env,
96
- onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); },
97
- onThrowExpectationsClick: function() { queryString.navigateWithNewParam("throwFailures", !env.throwingExpectationFailures()); },
98
- onRandomClick: function() { queryString.navigateWithNewParam("random", !env.randomTests()); },
99
+ navigateWithNewParam: function(key, value) { return queryString.navigateWithNewParam(key, value); },
99
100
  addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); },
100
101
  getContainer: function() { return document.body; },
101
102
  createElement: function() { return document.createElement.apply(document, arguments); },
@@ -51,14 +51,17 @@
51
51
 
52
52
  var filterSpecs = !!queryString.getParam("spec");
53
53
 
54
- var catchingExceptions = queryString.getParam("catch");
55
- env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions);
54
+ var stoppingOnSpecFailure = queryString.getParam("failFast");
55
+ env.stopOnSpecFailure(stoppingOnSpecFailure);
56
56
 
57
57
  var throwingExpectationFailures = queryString.getParam("throwFailures");
58
58
  env.throwOnExpectationFailure(throwingExpectationFailures);
59
59
 
60
60
  var random = queryString.getParam("random");
61
- env.randomizeTests(random);
61
+
62
+ if (random !== undefined && random !== "") {
63
+ env.randomizeTests(random);
64
+ }
62
65
 
63
66
  var seed = queryString.getParam("seed");
64
67
  if (seed) {
@@ -71,9 +74,7 @@
71
74
  */
72
75
  var htmlReporter = new jasmine.HtmlReporter({
73
76
  env: env,
74
- onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); },
75
- onThrowExpectationsClick: function() { queryString.navigateWithNewParam("throwFailures", !env.throwingExpectationFailures()); },
76
- onRandomClick: function() { queryString.navigateWithNewParam("random", !env.randomTests()); },
77
+ navigateWithNewParam: function(key, value) { return queryString.navigateWithNewParam(key, value); },
77
78
  addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); },
78
79
  getContainer: function() { return document.body; },
79
80
  createElement: function() { return document.createElement.apply(document, arguments); },
@@ -1,9 +1,6 @@
1
1
  module.exports = function(jasmineRequire) {
2
2
  var jasmine = jasmineRequire.core(jasmineRequire);
3
3
 
4
- var consoleFns = require('../console/console.js');
5
- consoleFns.console(consoleFns, jasmine);
6
-
7
4
  var env = jasmine.getEnv();
8
5
 
9
6
  var jasmineInterface = jasmineRequire.interface(jasmine, env);
@@ -25,6 +25,7 @@ jasmineRequire.html = function(j$) {
25
25
  j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
26
26
  j$.QueryString = jasmineRequire.QueryString();
27
27
  j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
28
+ j$.matchers.toHaveClass = jasmineRequire.toHaveClass(j$);
28
29
  };
29
30
 
30
31
  jasmineRequire.HtmlReporter = function(j$) {
@@ -48,9 +49,14 @@ jasmineRequire.HtmlReporter = function(j$) {
48
49
  };
49
50
 
50
51
  ResultsStateBuilder.prototype.suiteDone = function(result) {
52
+ this.currentParent.updateResult(result);
51
53
  if (this.currentParent !== this.topResults) {
52
54
  this.currentParent = this.currentParent.parent;
53
55
  }
56
+
57
+ if (result.status === 'failed') {
58
+ this.failureCount++;
59
+ }
54
60
  };
55
61
 
56
62
  ResultsStateBuilder.prototype.specStarted = function(result) {
@@ -59,7 +65,7 @@ jasmineRequire.HtmlReporter = function(j$) {
59
65
  ResultsStateBuilder.prototype.specDone = function(result) {
60
66
  this.currentParent.addChild(result, 'spec');
61
67
 
62
- if (result.status !== 'disabled') {
68
+ if (result.status !== 'excluded') {
63
69
  this.specsExecuted++;
64
70
  }
65
71
 
@@ -79,16 +85,12 @@ jasmineRequire.HtmlReporter = function(j$) {
79
85
  getContainer = options.getContainer,
80
86
  createElement = options.createElement,
81
87
  createTextNode = options.createTextNode,
82
- onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {},
83
- onThrowExpectationsClick = options.onThrowExpectationsClick || function() {},
84
- onRandomClick = options.onRandomClick || function() {},
88
+ navigateWithNewParam = options.navigateWithNewParam || function() {},
85
89
  addToExistingQueryString = options.addToExistingQueryString || defaultQueryString,
86
90
  filterSpecs = options.filterSpecs,
87
91
  timer = options.timer || noopTimer,
88
- results = [],
89
92
  htmlReporterMain,
90
93
  symbols,
91
- failedSuites = [],
92
94
  deprecationWarnings = [];
93
95
 
94
96
  this.initialize = function() {
@@ -122,11 +124,11 @@ jasmineRequire.HtmlReporter = function(j$) {
122
124
  };
123
125
 
124
126
  this.suiteDone = function(result) {
125
- if (result.status == 'failed') {
126
- failedSuites.push(result);
127
- }
128
-
129
127
  stateBuilder.suiteDone(result);
128
+
129
+ if (result.status === 'failed') {
130
+ failures.push(failureDom(result));
131
+ }
130
132
  addDeprecationWarnings(result);
131
133
  };
132
134
 
@@ -153,23 +155,8 @@ jasmineRequire.HtmlReporter = function(j$) {
153
155
  }
154
156
  ));
155
157
 
156
- if (result.status == 'failed') {
157
- var failure =
158
- createDom('div', {className: 'jasmine-spec-detail jasmine-failed'},
159
- createDom('div', {className: 'jasmine-description'},
160
- createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName)
161
- ),
162
- createDom('div', {className: 'jasmine-messages'})
163
- );
164
- var messages = failure.childNodes[1];
165
-
166
- for (var i = 0; i < result.failedExpectations.length; i++) {
167
- var expectation = result.failedExpectations[i];
168
- messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message));
169
- messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack));
170
- }
171
-
172
- failures.push(failure);
158
+ if (result.status === 'failed') {
159
+ failures.push(failureDom(result));
173
160
  }
174
161
 
175
162
  addDeprecationWarnings(result);
@@ -181,59 +168,7 @@ jasmineRequire.HtmlReporter = function(j$) {
181
168
  var order = doneResult && doneResult.order;
182
169
  alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
183
170
 
184
- banner.appendChild(
185
- createDom('div', { className: 'jasmine-run-options' },
186
- createDom('span', { className: 'jasmine-trigger' }, 'Options'),
187
- createDom('div', { className: 'jasmine-payload' },
188
- createDom('div', { className: 'jasmine-exceptions' },
189
- createDom('input', {
190
- className: 'jasmine-raise',
191
- id: 'jasmine-raise-exceptions',
192
- type: 'checkbox'
193
- }),
194
- createDom('label', { className: 'jasmine-label', 'for': 'jasmine-raise-exceptions' }, 'raise exceptions')),
195
- createDom('div', { className: 'jasmine-throw-failures' },
196
- createDom('input', {
197
- className: 'jasmine-throw',
198
- id: 'jasmine-throw-failures',
199
- type: 'checkbox'
200
- }),
201
- createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')),
202
- createDom('div', { className: 'jasmine-random-order' },
203
- createDom('input', {
204
- className: 'jasmine-random',
205
- id: 'jasmine-random-order',
206
- type: 'checkbox'
207
- }),
208
- createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order'))
209
- )
210
- ));
211
-
212
- var raiseCheckbox = find('#jasmine-raise-exceptions');
213
-
214
- raiseCheckbox.checked = !env.catchingExceptions();
215
- raiseCheckbox.onclick = onRaiseExceptionsClick;
216
-
217
- var throwCheckbox = find('#jasmine-throw-failures');
218
- throwCheckbox.checked = env.throwingExpectationFailures();
219
- throwCheckbox.onclick = onThrowExpectationsClick;
220
-
221
- var randomCheckbox = find('#jasmine-random-order');
222
- randomCheckbox.checked = env.randomTests();
223
- randomCheckbox.onclick = onRandomClick;
224
-
225
- var optionsMenu = find('.jasmine-run-options'),
226
- optionsTrigger = optionsMenu.querySelector('.jasmine-trigger'),
227
- optionsPayload = optionsMenu.querySelector('.jasmine-payload'),
228
- isOpen = /\bjasmine-open\b/;
229
-
230
- optionsTrigger.onclick = function() {
231
- if (isOpen.test(optionsPayload.className)) {
232
- optionsPayload.className = optionsPayload.className.replace(isOpen, '');
233
- } else {
234
- optionsPayload.className += ' jasmine-open';
235
- }
236
- };
171
+ banner.appendChild(optionsMenu(env));
237
172
 
238
173
  if (stateBuilder.specsExecuted < totalSpecsDefined) {
239
174
  var skippedMessage = 'Ran ' + stateBuilder.specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all';
@@ -245,15 +180,22 @@ jasmineRequire.HtmlReporter = function(j$) {
245
180
  );
246
181
  }
247
182
  var statusBarMessage = '';
248
- var statusBarClassName = 'jasmine-bar ';
183
+ var statusBarClassName = 'jasmine-overall-result jasmine-bar ';
184
+ var globalFailures = (doneResult && doneResult.failedExpectations) || [];
185
+ var failed = stateBuilder.failureCount + globalFailures.length > 0;
249
186
 
250
- if (totalSpecsDefined > 0) {
187
+ if (totalSpecsDefined > 0 || failed) {
251
188
  statusBarMessage += pluralize('spec', stateBuilder.specsExecuted) + ', ' + pluralize('failure', stateBuilder.failureCount);
252
189
  if (stateBuilder.pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', stateBuilder.pendingSpecCount); }
253
- statusBarClassName += (stateBuilder.failureCount > 0) ? 'jasmine-failed' : 'jasmine-passed';
190
+ }
191
+
192
+ if (doneResult.overallStatus === 'passed') {
193
+ statusBarClassName += ' jasmine-passed ';
194
+ } else if (doneResult.overallStatus === 'incomplete') {
195
+ statusBarClassName += ' jasmine-incomplete ';
196
+ statusBarMessage = 'Incomplete: ' + doneResult.incompleteReason + ', ' + statusBarMessage;
254
197
  } else {
255
- statusBarClassName += 'jasmine-skipped';
256
- statusBarMessage += 'No specs found';
198
+ statusBarClassName += ' jasmine-failed ';
257
199
  }
258
200
 
259
201
  var seedBar;
@@ -267,19 +209,24 @@ jasmineRequire.HtmlReporter = function(j$) {
267
209
  alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage, seedBar));
268
210
 
269
211
  var errorBarClassName = 'jasmine-bar jasmine-errored';
270
- var errorBarMessagePrefix = 'AfterAll ';
212
+ var afterAllMessagePrefix = 'AfterAll ';
271
213
 
272
- for(var i = 0; i < failedSuites.length; i++) {
273
- var failedSuite = failedSuites[i];
274
- for(var j = 0; j < failedSuite.failedExpectations.length; j++) {
275
- alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failedSuite.failedExpectations[j].message));
276
- }
214
+ for(i = 0; i < globalFailures.length; i++) {
215
+ alert.appendChild(createDom('span', {className: errorBarClassName}, globalFailureMessage(globalFailures[i])));
277
216
  }
278
217
 
279
- var globalFailures = (doneResult && doneResult.failedExpectations) || [];
280
- for(i = 0; i < globalFailures.length; i++) {
281
- var failure = globalFailures[i];
282
- alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failure.message));
218
+ function globalFailureMessage(failure) {
219
+ if (failure.globalErrorType === 'load') {
220
+ var prefix = 'Error during loading: ' + failure.message;
221
+
222
+ if (failure.filename) {
223
+ return prefix + ' in ' + failure.filename + ' line ' + failure.lineno;
224
+ } else {
225
+ return prefix;
226
+ }
227
+ } else {
228
+ return afterAllMessagePrefix + failure.message;
229
+ }
283
230
  }
284
231
 
285
232
  addDeprecationWarnings(doneResult);
@@ -295,47 +242,6 @@ jasmineRequire.HtmlReporter = function(j$) {
295
242
 
296
243
  summaryList(stateBuilder.topResults, summary);
297
244
 
298
- function summaryList(resultsTree, domParent) {
299
- var specListNode;
300
- for (var i = 0; i < resultsTree.children.length; i++) {
301
- var resultNode = resultsTree.children[i];
302
- if (filterSpecs && !hasActiveSpec(resultNode)) {
303
- continue;
304
- }
305
- if (resultNode.type == 'suite') {
306
- var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id},
307
- createDom('li', {className: 'jasmine-suite-detail'},
308
- createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description)
309
- )
310
- );
311
-
312
- summaryList(resultNode, suiteListNode);
313
- domParent.appendChild(suiteListNode);
314
- }
315
- if (resultNode.type == 'spec') {
316
- if (domParent.getAttribute('class') != 'jasmine-specs') {
317
- specListNode = createDom('ul', {className: 'jasmine-specs'});
318
- domParent.appendChild(specListNode);
319
- }
320
- var specDescription = resultNode.result.description;
321
- if(noExpectations(resultNode.result)) {
322
- specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
323
- }
324
- if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') {
325
- specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason;
326
- }
327
- specListNode.appendChild(
328
- createDom('li', {
329
- className: 'jasmine-' + resultNode.result.status,
330
- id: 'spec-' + resultNode.result.id
331
- },
332
- createDom('a', {href: specHref(resultNode.result)}, specDescription)
333
- )
334
- );
335
- }
336
- }
337
- }
338
-
339
245
  if (failures.length) {
340
246
  alert.appendChild(
341
247
  createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-spec-list'},
@@ -364,6 +270,153 @@ jasmineRequire.HtmlReporter = function(j$) {
364
270
 
365
271
  return this;
366
272
 
273
+ function failureDom(result) {
274
+ var failure =
275
+ createDom('div', {className: 'jasmine-spec-detail jasmine-failed'},
276
+ failureDescription(result, stateBuilder.currentParent),
277
+ createDom('div', {className: 'jasmine-messages'})
278
+ );
279
+ var messages = failure.childNodes[1];
280
+
281
+ for (var i = 0; i < result.failedExpectations.length; i++) {
282
+ var expectation = result.failedExpectations[i];
283
+ messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message));
284
+ messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack));
285
+ }
286
+
287
+ return failure;
288
+ }
289
+
290
+ function summaryList(resultsTree, domParent) {
291
+ var specListNode;
292
+ for (var i = 0; i < resultsTree.children.length; i++) {
293
+ var resultNode = resultsTree.children[i];
294
+ if (filterSpecs && !hasActiveSpec(resultNode)) {
295
+ continue;
296
+ }
297
+ if (resultNode.type === 'suite') {
298
+ var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id},
299
+ createDom('li', {className: 'jasmine-suite-detail jasmine-' + resultNode.result.status},
300
+ createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description)
301
+ )
302
+ );
303
+
304
+ summaryList(resultNode, suiteListNode);
305
+ domParent.appendChild(suiteListNode);
306
+ }
307
+ if (resultNode.type === 'spec') {
308
+ if (domParent.getAttribute('class') !== 'jasmine-specs') {
309
+ specListNode = createDom('ul', {className: 'jasmine-specs'});
310
+ domParent.appendChild(specListNode);
311
+ }
312
+ var specDescription = resultNode.result.description;
313
+ if(noExpectations(resultNode.result)) {
314
+ specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
315
+ }
316
+ if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') {
317
+ specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason;
318
+ }
319
+ specListNode.appendChild(
320
+ createDom('li', {
321
+ className: 'jasmine-' + resultNode.result.status,
322
+ id: 'spec-' + resultNode.result.id
323
+ },
324
+ createDom('a', {href: specHref(resultNode.result)}, specDescription)
325
+ )
326
+ );
327
+ }
328
+ }
329
+ }
330
+
331
+ function optionsMenu(env) {
332
+ var optionsMenuDom = createDom('div', { className: 'jasmine-run-options' },
333
+ createDom('span', { className: 'jasmine-trigger' }, 'Options'),
334
+ createDom('div', { className: 'jasmine-payload' },
335
+ createDom('div', { className: 'jasmine-stop-on-failure' },
336
+ createDom('input', {
337
+ className: 'jasmine-fail-fast',
338
+ id: 'jasmine-fail-fast',
339
+ type: 'checkbox'
340
+ }),
341
+ createDom('label', { className: 'jasmine-label', 'for': 'jasmine-fail-fast' }, 'stop execution on spec failure')),
342
+ createDom('div', { className: 'jasmine-throw-failures' },
343
+ createDom('input', {
344
+ className: 'jasmine-throw',
345
+ id: 'jasmine-throw-failures',
346
+ type: 'checkbox'
347
+ }),
348
+ createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')),
349
+ createDom('div', { className: 'jasmine-random-order' },
350
+ createDom('input', {
351
+ className: 'jasmine-random',
352
+ id: 'jasmine-random-order',
353
+ type: 'checkbox'
354
+ }),
355
+ createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order'))
356
+ )
357
+ );
358
+
359
+ var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast');
360
+ failFastCheckbox.checked = env.stoppingOnSpecFailure();
361
+ failFastCheckbox.onclick = function() {
362
+ navigateWithNewParam('failFast', !env.stoppingOnSpecFailure());
363
+ };
364
+
365
+ var throwCheckbox = optionsMenuDom.querySelector('#jasmine-throw-failures');
366
+ throwCheckbox.checked = env.throwingExpectationFailures();
367
+ throwCheckbox.onclick = function() {
368
+ navigateWithNewParam('throwFailures', !env.throwingExpectationFailures());
369
+ };
370
+
371
+ var randomCheckbox = optionsMenuDom.querySelector('#jasmine-random-order');
372
+ randomCheckbox.checked = env.randomTests();
373
+ randomCheckbox.onclick = function() {
374
+ navigateWithNewParam('random', !env.randomTests());
375
+ };
376
+
377
+ var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
378
+ optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'),
379
+ isOpen = /\bjasmine-open\b/;
380
+
381
+ optionsTrigger.onclick = function() {
382
+ if (isOpen.test(optionsPayload.className)) {
383
+ optionsPayload.className = optionsPayload.className.replace(isOpen, '');
384
+ } else {
385
+ optionsPayload.className += ' jasmine-open';
386
+ }
387
+ };
388
+
389
+ return optionsMenuDom;
390
+ }
391
+
392
+ function failureDescription(result, suite) {
393
+ var wrapper = createDom('div', {className: 'jasmine-description'},
394
+ createDom('a', {title: result.description, href: specHref(result)}, result.description)
395
+ );
396
+ var suiteLink;
397
+
398
+ while (suite && suite.parent) {
399
+ wrapper.insertBefore(createTextNode(' > '), wrapper.firstChild);
400
+ suiteLink = createDom('a', {href: suiteHref(suite)}, suite.result.description);
401
+ wrapper.insertBefore(suiteLink, wrapper.firstChild);
402
+
403
+ suite = suite.parent;
404
+ }
405
+
406
+ return wrapper;
407
+ }
408
+
409
+ function suiteHref(suite) {
410
+ var els = [];
411
+
412
+ while (suite && suite.parent) {
413
+ els.unshift(suite.result.description);
414
+ suite = suite.parent;
415
+ }
416
+
417
+ return addToExistingQueryString('spec', els.join(' '));
418
+ }
419
+
367
420
  function addDeprecationWarnings(result) {
368
421
  if (result && result.deprecationWarnings) {
369
422
  for(var i = 0; i < result.deprecationWarnings.length; i++) {
@@ -442,7 +495,7 @@ jasmineRequire.HtmlReporter = function(j$) {
442
495
  }
443
496
 
444
497
  function hasActiveSpec(resultNode) {
445
- if (resultNode.type == 'spec' && resultNode.result.status != 'disabled') {
498
+ if (resultNode.type == 'spec' && resultNode.result.status != 'excluded') {
446
499
  return true;
447
500
  }
448
501
 
@@ -487,6 +540,10 @@ jasmineRequire.ResultsNode = function() {
487
540
  this.last = function() {
488
541
  return this.children[this.children.length - 1];
489
542
  };
543
+
544
+ this.updateResult = function(result) {
545
+ this.result = result;
546
+ };
490
547
  }
491
548
 
492
549
  return ResultsNode;
@@ -543,3 +600,37 @@ jasmineRequire.QueryString = function() {
543
600
 
544
601
  return QueryString;
545
602
  };
603
+
604
+ jasmineRequire.toHaveClass = function(j$) {
605
+ /**
606
+ * {@link expect} the actual value to be a DOM element that has the expected class
607
+ * @function
608
+ * @name matchers#toHaveClass
609
+ * @param {Object} expected - The class name to test for
610
+ * @example
611
+ * var el = document.createElement('div');
612
+ * el.className = 'foo bar baz';
613
+ * expect(el).toHaveClass('bar');
614
+ */
615
+ function toHaveClass(util, customEqualityTesters) {
616
+ return {
617
+ compare: function(actual, expected) {
618
+ if (!isElement(actual)) {
619
+ throw new Error(j$.pp(actual) + ' is not a DOM element');
620
+ }
621
+
622
+ return {
623
+ pass: actual.classList.contains(expected)
624
+ };
625
+ }
626
+ };
627
+ }
628
+
629
+ function isElement(maybeEl) {
630
+ return maybeEl &&
631
+ maybeEl.classList &&
632
+ j$.isFunction_(maybeEl.classList.contains);
633
+ }
634
+
635
+ return toHaveClass;
636
+ };