jasmine-core 2.1.3 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/lib/console/console.js +1 -1
  3. data/lib/jasmine-core/boot.js +3 -2
  4. data/lib/jasmine-core/boot/boot.js +2 -1
  5. data/lib/jasmine-core/example/node_example/{src → lib/jasmine_examples}/Player.js +0 -0
  6. data/lib/jasmine-core/example/node_example/{src → lib/jasmine_examples}/Song.js +0 -0
  7. data/lib/jasmine-core/example/node_example/spec/{SpecHelper.js → helpers/jasmine_examples/SpecHelper.js} +0 -0
  8. data/lib/jasmine-core/example/node_example/spec/{PlayerSpec.js → jasmine_examples/PlayerSpec.js} +2 -2
  9. data/lib/jasmine-core/jasmine-html.js +17 -5
  10. data/lib/jasmine-core/jasmine.css +10 -10
  11. data/lib/jasmine-core/jasmine.js +295 -155
  12. data/lib/jasmine-core/node_boot.js +1 -1
  13. data/lib/jasmine-core/spec/core/DelayedFunctionSchedulerSpec.js +37 -0
  14. data/lib/jasmine-core/spec/core/EnvSpec.js +6 -0
  15. data/lib/jasmine-core/spec/core/PrettyPrintSpec.js +14 -14
  16. data/lib/jasmine-core/spec/core/SpecSpec.js +24 -1
  17. data/lib/jasmine-core/spec/core/SpyRegistrySpec.js +9 -0
  18. data/lib/jasmine-core/spec/core/SpySpec.js +9 -1
  19. data/lib/jasmine-core/spec/core/SuiteSpec.js +26 -0
  20. data/lib/jasmine-core/spec/core/{AnySpec.js → asymmetric_equality/AnySpec.js} +6 -6
  21. data/lib/jasmine-core/spec/core/asymmetric_equality/AnythingSpec.js +44 -0
  22. data/lib/jasmine-core/spec/core/asymmetric_equality/ArrayContainingSpec.js +39 -0
  23. data/lib/jasmine-core/spec/core/asymmetric_equality/ObjectContainingSpec.js +58 -0
  24. data/lib/jasmine-core/spec/core/asymmetric_equality/StringMatchingSpec.js +27 -0
  25. data/lib/jasmine-core/spec/core/integration/EnvSpec.js +79 -3
  26. data/lib/jasmine-core/spec/core/integration/SpecRunningSpec.js +26 -2
  27. data/lib/jasmine-core/spec/core/matchers/matchersUtilSpec.js +112 -2
  28. data/lib/jasmine-core/spec/core/matchers/toMatchSpec.js +8 -0
  29. data/lib/jasmine-core/spec/html/HtmlReporterSpec.js +19 -8
  30. data/lib/jasmine-core/spec/html/PrettyPrintHtmlSpec.js +1 -1
  31. data/lib/jasmine-core/spec/html/QueryStringSpec.js +32 -3
  32. data/lib/jasmine-core/version.rb +1 -1
  33. metadata +96 -93
  34. data/lib/jasmine-core/spec/core/ObjectContainingSpec.js +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a8e855de982d40d9f03ddfd966fc1b7c24309d4c
4
- data.tar.gz: 9e7f2a03a29150b0f34e9d013fc35e8d2d962798
3
+ metadata.gz: 5a0184015b60b7028b11f2d2b46199c10b900341
4
+ data.tar.gz: aabb66631039d23d531cf7e50d6214f9465df18a
5
5
  SHA512:
6
- metadata.gz: 674d4625c6587ea39326e8c7d3756bf1301992315b7fff0fe9859293ee2c0eae67ed0ab8421c0fb5a9055055c2318250fbf76ca562c0d26607ed9de262057056
7
- data.tar.gz: bd93de41687c83ab3052f0660804f1a5ff83a20f641c8a4f9b2f6cf2601ed1406c355ca3b34efffd57b6d83f4e1cf85dd531b69e7bd37fbf35e6ff24f8581971
6
+ metadata.gz: 0d62b564c1c0873c2acda50c126b37104da40495bf69d7af14a661e9c2194397bf1b59c5b8076e00603fe5dfe1454b3493543ebdfa5413d6d9af27cec7f96e3c
7
+ data.tar.gz: e91aad664b12546dd0e9809d5e7749446ee375c421c723b35ca19c0457356f8be5fbd3680fba65f41cfed4536acfd602e4604b64a2ae4770ef2fc166904d86aa
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright (c) 2008-2014 Pivotal Labs
2
+ Copyright (c) 2008-2015 Pivotal Labs
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
5
5
  a copy of this software and associated documentation files (the
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright (c) 2008-2014 Pivotal Labs
2
+ Copyright (c) 2008-2015 Pivotal Labs
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
5
5
  a copy of this software and associated documentation files (the
@@ -84,7 +84,8 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
84
84
  */
85
85
  var htmlReporter = new jasmine.HtmlReporter({
86
86
  env: env,
87
- onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); },
87
+ onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); },
88
+ addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); },
88
89
  getContainer: function() { return document.body; },
89
90
  createElement: function() { return document.createElement.apply(document, arguments); },
90
91
  createTextNode: function() { return document.createTextNode.apply(document, arguments); },
@@ -62,7 +62,8 @@
62
62
  */
63
63
  var htmlReporter = new jasmine.HtmlReporter({
64
64
  env: env,
65
- onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); },
65
+ onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); },
66
+ addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); },
66
67
  getContainer: function() { return document.body; },
67
68
  createElement: function() { return document.createElement.apply(document, arguments); },
68
69
  createTextNode: function() { return document.createTextNode.apply(document, arguments); },
@@ -1,6 +1,6 @@
1
1
  describe("Player", function() {
2
- var Player = require('../src/Player.js');
3
- var Song = require('../src/Song.js');
2
+ var Player = require('../../lib/jasmine_examples/Player');
3
+ var Song = require('../../lib/jasmine_examples/Song');
4
4
  var player;
5
5
  var song;
6
6
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright (c) 2008-2014 Pivotal Labs
2
+ Copyright (c) 2008-2015 Pivotal Labs
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
5
5
  a copy of this software and associated documentation files (the
@@ -40,6 +40,7 @@ jasmineRequire.HtmlReporter = function(j$) {
40
40
  createElement = options.createElement,
41
41
  createTextNode = options.createTextNode,
42
42
  onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {},
43
+ addToExistingQueryString = options.addToExistingQueryString || defaultQueryString,
43
44
  timer = options.timer || noopTimer,
44
45
  results = [],
45
46
  specsExecuted = 0,
@@ -220,6 +221,9 @@ jasmineRequire.HtmlReporter = function(j$) {
220
221
  if(noExpectations(resultNode.result)) {
221
222
  specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
222
223
  }
224
+ if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') {
225
+ specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason;
226
+ }
223
227
  specListNode.appendChild(
224
228
  createDom('li', {
225
229
  className: resultNode.result.status,
@@ -267,7 +271,7 @@ jasmineRequire.HtmlReporter = function(j$) {
267
271
  function clearPrior() {
268
272
  // return the reporter
269
273
  var oldReporter = find('');
270
-
274
+
271
275
  if(oldReporter) {
272
276
  getContainer().removeChild(oldReporter);
273
277
  }
@@ -306,7 +310,11 @@ jasmineRequire.HtmlReporter = function(j$) {
306
310
  }
307
311
 
308
312
  function specHref(result) {
309
- return '?spec=' + encodeURIComponent(result.fullName);
313
+ return addToExistingQueryString('spec', result.fullName);
314
+ }
315
+
316
+ function defaultQueryString(key, value) {
317
+ return '?' + key + '=' + value;
310
318
  }
311
319
 
312
320
  function setMenuModeTo(mode) {
@@ -358,10 +366,14 @@ jasmineRequire.ResultsNode = function() {
358
366
  jasmineRequire.QueryString = function() {
359
367
  function QueryString(options) {
360
368
 
361
- this.setParam = function(key, value) {
369
+ this.navigateWithNewParam = function(key, value) {
370
+ options.getWindowLocation().search = this.fullStringWithNewParam(key, value);
371
+ };
372
+
373
+ this.fullStringWithNewParam = function(key, value) {
362
374
  var paramMap = queryStringToParamMap();
363
375
  paramMap[key] = value;
364
- options.getWindowLocation().search = toQueryString(paramMap);
376
+ return toQueryString(paramMap);
365
377
  };
366
378
 
367
379
  this.getParam = function(key) {
@@ -1,18 +1,18 @@
1
1
  body { overflow-y: scroll; }
2
2
 
3
- .jasmine_html-reporter { background-color: #eeeeee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
3
+ .jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; }
4
4
  .jasmine_html-reporter a { text-decoration: none; }
5
5
  .jasmine_html-reporter a:hover { text-decoration: underline; }
6
6
  .jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; }
7
7
  .jasmine_html-reporter .banner, .jasmine_html-reporter .symbol-summary, .jasmine_html-reporter .summary, .jasmine_html-reporter .result-message, .jasmine_html-reporter .spec .description, .jasmine_html-reporter .spec-detail .description, .jasmine_html-reporter .alert .bar, .jasmine_html-reporter .stack-trace { padding-left: 9px; padding-right: 9px; }
8
8
  .jasmine_html-reporter .banner { position: relative; }
9
- .jasmine_html-reporter .banner .title { background: url('data:image/png;base64,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') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -webkit-background-size: 100%; -moz-background-size: 100%; -o-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; }
9
+ .jasmine_html-reporter .banner .title { background: url('data:image/png;base64,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') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; }
10
10
  .jasmine_html-reporter .banner .version { margin-left: 14px; position: relative; top: 6px; }
11
11
  .jasmine_html-reporter .banner .duration { position: absolute; right: 14px; top: 6px; }
12
12
  .jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; }
13
- .jasmine_html-reporter .version { color: #aaaaaa; }
13
+ .jasmine_html-reporter .version { color: #aaa; }
14
14
  .jasmine_html-reporter .banner { margin-top: 14px; }
15
- .jasmine_html-reporter .duration { color: #aaaaaa; float: right; }
15
+ .jasmine_html-reporter .duration { color: #aaa; float: right; }
16
16
  .jasmine_html-reporter .symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; }
17
17
  .jasmine_html-reporter .symbol-summary li { display: inline-block; height: 8px; width: 14px; font-size: 16px; }
18
18
  .jasmine_html-reporter .symbol-summary li.passed { font-size: 14px; }
@@ -31,12 +31,12 @@ body { overflow-y: scroll; }
31
31
  .jasmine_html-reporter .bar.passed { background-color: #007069; }
32
32
  .jasmine_html-reporter .bar.skipped { background-color: #bababa; }
33
33
  .jasmine_html-reporter .bar.errored { background-color: #ca3a11; }
34
- .jasmine_html-reporter .bar.menu { background-color: #fff; color: #aaaaaa; }
35
- .jasmine_html-reporter .bar.menu a { color: #333333; }
34
+ .jasmine_html-reporter .bar.menu { background-color: #fff; color: #aaa; }
35
+ .jasmine_html-reporter .bar.menu a { color: #333; }
36
36
  .jasmine_html-reporter .bar a { color: white; }
37
37
  .jasmine_html-reporter.spec-list .bar.menu.failure-list, .jasmine_html-reporter.spec-list .results .failures { display: none; }
38
38
  .jasmine_html-reporter.failure-list .bar.menu.spec-list, .jasmine_html-reporter.failure-list .summary { display: none; }
39
- .jasmine_html-reporter .running-alert { background-color: #666666; }
39
+ .jasmine_html-reporter .running-alert { background-color: #666; }
40
40
  .jasmine_html-reporter .results { margin-top: 14px; }
41
41
  .jasmine_html-reporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
42
42
  .jasmine_html-reporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
@@ -53,10 +53,10 @@ body { overflow-y: scroll; }
53
53
  .jasmine_html-reporter .summary li.pending a { color: #ba9d37; }
54
54
  .jasmine_html-reporter .description + .suite { margin-top: 0; }
55
55
  .jasmine_html-reporter .suite { margin-top: 14px; }
56
- .jasmine_html-reporter .suite a { color: #333333; }
56
+ .jasmine_html-reporter .suite a { color: #333; }
57
57
  .jasmine_html-reporter .failures .spec-detail { margin-bottom: 28px; }
58
58
  .jasmine_html-reporter .failures .spec-detail .description { background-color: #ca3a11; }
59
59
  .jasmine_html-reporter .failures .spec-detail .description a { color: white; }
60
- .jasmine_html-reporter .result-message { padding-top: 14px; color: #333333; white-space: pre; }
60
+ .jasmine_html-reporter .result-message { padding-top: 14px; color: #333; white-space: pre; }
61
61
  .jasmine_html-reporter .result-message span.result { display: block; }
62
- .jasmine_html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
62
+ .jasmine_html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; }
@@ -1,5 +1,5 @@
1
1
  /*
2
- Copyright (c) 2008-2014 Pivotal Labs
2
+ Copyright (c) 2008-2015 Pivotal Labs
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
5
5
  a copy of this software and associated documentation files (the
@@ -20,13 +20,16 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
20
  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
21
  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  */
23
- getJasmineRequireObj = (function (jasmineGlobal) {
23
+ var getJasmineRequireObj = (function (jasmineGlobal) {
24
24
  var jasmineRequire;
25
25
 
26
26
  if (typeof module !== 'undefined' && module.exports) {
27
27
  jasmineGlobal = global;
28
28
  jasmineRequire = exports;
29
29
  } else {
30
+ if (typeof window !== 'undefined' && typeof window.toString === 'function' && window.toString() === '[object GjsGlobal]') {
31
+ jasmineGlobal = window;
32
+ }
30
33
  jasmineRequire = jasmineGlobal.jasmineRequire = jasmineGlobal.jasmineRequire || {};
31
34
  }
32
35
 
@@ -40,6 +43,7 @@ getJasmineRequireObj = (function (jasmineGlobal) {
40
43
  jRequire.base(j$, jasmineGlobal);
41
44
  j$.util = jRequire.util();
42
45
  j$.Any = jRequire.Any();
46
+ j$.Anything = jRequire.Anything(j$);
43
47
  j$.CallTracker = jRequire.CallTracker();
44
48
  j$.MockDate = jRequire.MockDate();
45
49
  j$.Clock = jRequire.Clock();
@@ -51,12 +55,14 @@ getJasmineRequireObj = (function (jasmineGlobal) {
51
55
  j$.JsApiReporter = jRequire.JsApiReporter();
52
56
  j$.matchersUtil = jRequire.matchersUtil(j$);
53
57
  j$.ObjectContaining = jRequire.ObjectContaining(j$);
58
+ j$.ArrayContaining = jRequire.ArrayContaining(j$);
54
59
  j$.pp = jRequire.pp(j$);
55
60
  j$.QueueRunner = jRequire.QueueRunner(j$);
56
61
  j$.ReportDispatcher = jRequire.ReportDispatcher();
57
62
  j$.Spec = jRequire.Spec(j$);
58
63
  j$.SpyRegistry = jRequire.SpyRegistry(j$);
59
64
  j$.SpyStrategy = jRequire.SpyStrategy();
65
+ j$.StringMatching = jRequire.StringMatching(j$);
60
66
  j$.Suite = jRequire.Suite();
61
67
  j$.Timer = jRequire.Timer();
62
68
  j$.version = jRequire.version();
@@ -138,14 +144,30 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
138
144
  return obj.nodeType > 0;
139
145
  };
140
146
 
147
+ j$.fnNameFor = function(func) {
148
+ return func.name || func.toString().match(/^\s*function\s*(\w*)\s*\(/)[1];
149
+ };
150
+
141
151
  j$.any = function(clazz) {
142
152
  return new j$.Any(clazz);
143
153
  };
144
154
 
155
+ j$.anything = function() {
156
+ return new j$.Anything();
157
+ };
158
+
145
159
  j$.objectContaining = function(sample) {
146
160
  return new j$.ObjectContaining(sample);
147
161
  };
148
162
 
163
+ j$.stringMatching = function(expected) {
164
+ return new j$.StringMatching(expected);
165
+ };
166
+
167
+ j$.arrayContaining = function(sample) {
168
+ return new j$.ArrayContaining(sample);
169
+ };
170
+
149
171
  j$.createSpy = function(name, originalFn) {
150
172
 
151
173
  var spyStrategy = new j$.SpyStrategy({
@@ -190,6 +212,11 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
190
212
  };
191
213
 
192
214
  j$.createSpyObj = function(baseName, methodNames) {
215
+ if (j$.isArray_(baseName) && j$.util.isUndefined(methodNames)) {
216
+ methodNames = baseName;
217
+ baseName = 'unknown';
218
+ }
219
+
193
220
  if (!j$.isArray_(methodNames) || methodNames.length === 0) {
194
221
  throw 'createSpyObj requires a non-empty array of method names to create spies for';
195
222
  }
@@ -285,7 +312,8 @@ getJasmineRequireObj().Spec = function(j$) {
285
312
  description: this.description,
286
313
  fullName: this.getFullName(),
287
314
  failedExpectations: [],
288
- passedExpectations: []
315
+ passedExpectations: [],
316
+ pendingReason: ''
289
317
  };
290
318
  }
291
319
 
@@ -334,7 +362,7 @@ getJasmineRequireObj().Spec = function(j$) {
334
362
 
335
363
  Spec.prototype.onException = function onException(e) {
336
364
  if (Spec.isPendingSpecException(e)) {
337
- this.pend();
365
+ this.pend(extractCustomPendingMessage(e));
338
366
  return;
339
367
  }
340
368
 
@@ -351,8 +379,11 @@ getJasmineRequireObj().Spec = function(j$) {
351
379
  this.disabled = true;
352
380
  };
353
381
 
354
- Spec.prototype.pend = function() {
382
+ Spec.prototype.pend = function(message) {
355
383
  this.markedPending = true;
384
+ if (message) {
385
+ this.result.pendingReason = message;
386
+ }
356
387
  };
357
388
 
358
389
  Spec.prototype.status = function() {
@@ -379,6 +410,14 @@ getJasmineRequireObj().Spec = function(j$) {
379
410
  return this.getSpecName(this);
380
411
  };
381
412
 
413
+ var extractCustomPendingMessage = function(e) {
414
+ var fullMessage = e.toString(),
415
+ boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage),
416
+ boilerplateEnd = boilerplateStart + Spec.pendingSpecExceptionMessage.length;
417
+
418
+ return fullMessage.substr(boilerplateEnd);
419
+ };
420
+
382
421
  Spec.pendingSpecExceptionMessage = '=> marked Pending';
383
422
 
384
423
  Spec.isPendingSpecException = function(e) {
@@ -631,11 +670,12 @@ getJasmineRequireObj().Env = function(j$) {
631
670
  onStart: suiteStarted,
632
671
  expectationFactory: expectationFactory,
633
672
  expectationResultFactory: expectationResultFactory,
673
+ runnablesExplictlySetGetter: runnablesExplictlySetGetter,
634
674
  resultCallback: function(attrs) {
635
675
  if (!suite.disabled) {
636
676
  clearResourcesForRunnable(suite.id);
637
- currentlyExecutingSuites.pop();
638
677
  }
678
+ currentlyExecutingSuites.pop();
639
679
  reporter.suiteDone(attrs);
640
680
  }
641
681
  });
@@ -823,8 +863,12 @@ getJasmineRequireObj().Env = function(j$) {
823
863
  });
824
864
  };
825
865
 
826
- this.pending = function() {
827
- throw j$.Spec.pendingSpecExceptionMessage;
866
+ this.pending = function(message) {
867
+ var fullMessage = j$.Spec.pendingSpecExceptionMessage;
868
+ if(message) {
869
+ fullMessage += message;
870
+ }
871
+ throw fullMessage;
828
872
  };
829
873
 
830
874
  this.fail = function(error) {
@@ -839,7 +883,8 @@ getJasmineRequireObj().Env = function(j$) {
839
883
  passed: false,
840
884
  expected: '',
841
885
  actual: '',
842
- message: message
886
+ message: message,
887
+ error: error && error.message ? error : null
843
888
  });
844
889
  };
845
890
  }
@@ -926,43 +971,6 @@ getJasmineRequireObj().JsApiReporter = function() {
926
971
  return JsApiReporter;
927
972
  };
928
973
 
929
- getJasmineRequireObj().Any = function() {
930
-
931
- function Any(expectedObject) {
932
- this.expectedObject = expectedObject;
933
- }
934
-
935
- Any.prototype.jasmineMatches = function(other) {
936
- if (this.expectedObject == String) {
937
- return typeof other == 'string' || other instanceof String;
938
- }
939
-
940
- if (this.expectedObject == Number) {
941
- return typeof other == 'number' || other instanceof Number;
942
- }
943
-
944
- if (this.expectedObject == Function) {
945
- return typeof other == 'function' || other instanceof Function;
946
- }
947
-
948
- if (this.expectedObject == Object) {
949
- return typeof other == 'object';
950
- }
951
-
952
- if (this.expectedObject == Boolean) {
953
- return typeof other == 'boolean';
954
- }
955
-
956
- return other instanceof this.expectedObject;
957
- };
958
-
959
- Any.prototype.jasmineToString = function() {
960
- return '<jasmine.any(' + this.expectedObject + ')>';
961
- };
962
-
963
- return Any;
964
- };
965
-
966
974
  getJasmineRequireObj().CallTracker = function() {
967
975
 
968
976
  function CallTracker() {
@@ -1244,6 +1252,12 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
1244
1252
  scheduledFn.runAtMillis + scheduledFn.millis);
1245
1253
  }
1246
1254
 
1255
+ function forEachFunction(funcsToRun, callback) {
1256
+ for (var i = 0; i < funcsToRun.length; ++i) {
1257
+ callback(funcsToRun[i]);
1258
+ }
1259
+ }
1260
+
1247
1261
  function runScheduledFunctions(endTime) {
1248
1262
  if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
1249
1263
  return;
@@ -1255,15 +1269,15 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
1255
1269
  var funcsToRun = scheduledFunctions[currentTime];
1256
1270
  delete scheduledFunctions[currentTime];
1257
1271
 
1258
- for (var i = 0; i < funcsToRun.length; ++i) {
1259
- var funcToRun = funcsToRun[i];
1260
-
1272
+ forEachFunction(funcsToRun, function(funcToRun) {
1261
1273
  if (funcToRun.recurring) {
1262
1274
  reschedule(funcToRun);
1263
1275
  }
1276
+ });
1264
1277
 
1278
+ forEachFunction(funcsToRun, function(funcToRun) {
1265
1279
  funcToRun.funcToCall.apply(null, funcToRun.params || []);
1266
- }
1280
+ });
1267
1281
  } while (scheduledLookup.length > 0 &&
1268
1282
  // checking first if we're out of time prevents setTimeout(0)
1269
1283
  // scheduled in a funcToRun from forcing an extra iteration
@@ -1506,7 +1520,7 @@ getJasmineRequireObj().MockDate = function() {
1506
1520
  case 6:
1507
1521
  return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3],
1508
1522
  arguments[4], arguments[5]);
1509
- case 7:
1523
+ default:
1510
1524
  return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3],
1511
1525
  arguments[4], arguments[5], arguments[6]);
1512
1526
  }
@@ -1533,41 +1547,6 @@ getJasmineRequireObj().MockDate = function() {
1533
1547
  return MockDate;
1534
1548
  };
1535
1549
 
1536
- getJasmineRequireObj().ObjectContaining = function(j$) {
1537
-
1538
- function ObjectContaining(sample) {
1539
- this.sample = sample;
1540
- }
1541
-
1542
- ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) {
1543
- if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); }
1544
-
1545
- mismatchKeys = mismatchKeys || [];
1546
- mismatchValues = mismatchValues || [];
1547
-
1548
- var hasKey = function(obj, keyName) {
1549
- return obj !== null && !j$.util.isUndefined(obj[keyName]);
1550
- };
1551
-
1552
- for (var property in this.sample) {
1553
- if (!hasKey(other, property) && hasKey(this.sample, property)) {
1554
- mismatchKeys.push('expected has key \'' + property + '\', but missing from actual.');
1555
- }
1556
- else if (!j$.matchersUtil.equals(other[property], this.sample[property])) {
1557
- mismatchValues.push('\'' + property + '\' was \'' + (other[property] ? j$.util.htmlEscape(other[property].toString()) : other[property]) + '\' in actual, but was \'' + (this.sample[property] ? j$.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + '\' in expected.');
1558
- }
1559
- }
1560
-
1561
- return (mismatchKeys.length === 0 && mismatchValues.length === 0);
1562
- };
1563
-
1564
- ObjectContaining.prototype.jasmineToString = function() {
1565
- return '<jasmine.objectContaining(' + j$.pp(this.sample) + ')>';
1566
- };
1567
-
1568
- return ObjectContaining;
1569
- };
1570
-
1571
1550
  getJasmineRequireObj().pp = function(j$) {
1572
1551
 
1573
1552
  function PrettyPrinter() {
@@ -1667,13 +1646,15 @@ getJasmineRequireObj().pp = function(j$) {
1667
1646
  };
1668
1647
 
1669
1648
  StringPrettyPrinter.prototype.emitObject = function(obj) {
1649
+ var constructorName = obj.constructor ? j$.fnNameFor(obj.constructor) : 'null';
1650
+ this.append(constructorName);
1651
+
1670
1652
  if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
1671
- this.append('Object');
1672
1653
  return;
1673
1654
  }
1674
1655
 
1675
1656
  var self = this;
1676
- this.append('{ ');
1657
+ this.append('({ ');
1677
1658
  var first = true;
1678
1659
 
1679
1660
  this.iterateObject(obj, function(property, isGetter) {
@@ -1692,7 +1673,7 @@ getJasmineRequireObj().pp = function(j$) {
1692
1673
  }
1693
1674
  });
1694
1675
 
1695
- this.append(' }');
1676
+ this.append(' })');
1696
1677
  };
1697
1678
 
1698
1679
  StringPrettyPrinter.prototype.append = function(value) {
@@ -1742,7 +1723,8 @@ getJasmineRequireObj().QueueRunner = function(j$) {
1742
1723
  for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) {
1743
1724
  var queueableFn = queueableFns[iterativeIndex];
1744
1725
  if (queueableFn.fn.length > 0) {
1745
- return attemptAsync(queueableFn);
1726
+ attemptAsync(queueableFn);
1727
+ return;
1746
1728
  } else {
1747
1729
  attemptSync(queueableFn);
1748
1730
  }
@@ -1857,6 +1839,10 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
1857
1839
  throw new Error('spyOn could not find an object to spy upon for ' + methodName + '()');
1858
1840
  }
1859
1841
 
1842
+ if (j$.util.isUndefined(methodName)) {
1843
+ throw new Error('No method name supplied');
1844
+ }
1845
+
1860
1846
  if (j$.util.isUndefined(obj[methodName])) {
1861
1847
  throw new Error(methodName + '() method does not exist');
1862
1848
  }
@@ -1963,6 +1949,7 @@ getJasmineRequireObj().Suite = function() {
1963
1949
  this.clearStack = attrs.clearStack || function(fn) {fn();};
1964
1950
  this.expectationFactory = attrs.expectationFactory;
1965
1951
  this.expectationResultFactory = attrs.expectationResultFactory;
1952
+ this.runnablesExplictlySetGetter = attrs.runnablesExplictlySetGetter || function() {};
1966
1953
 
1967
1954
  this.beforeFns = [];
1968
1955
  this.afterFns = [];
@@ -2074,14 +2061,8 @@ getJasmineRequireObj().Suite = function() {
2074
2061
  };
2075
2062
 
2076
2063
  Suite.prototype.isExecutable = function() {
2077
- var foundActive = false;
2078
- for(var i = 0; i < this.children.length; i++) {
2079
- if(this.children[i].isExecutable()) {
2080
- foundActive = true;
2081
- break;
2082
- }
2083
- }
2084
- return foundActive;
2064
+ var runnablesExplicitlySet = this.runnablesExplictlySetGetter();
2065
+ return !runnablesExplicitlySet && hasExecutableChild(this.children);
2085
2066
  };
2086
2067
 
2087
2068
  Suite.prototype.sharedUserContext = function() {
@@ -2134,6 +2115,17 @@ getJasmineRequireObj().Suite = function() {
2134
2115
  return !args[0];
2135
2116
  }
2136
2117
 
2118
+ function hasExecutableChild(children) {
2119
+ var foundActive = false;
2120
+ for (var i = 0; i < children.length; i++) {
2121
+ if (children[i].isExecutable()) {
2122
+ foundActive = true;
2123
+ break;
2124
+ }
2125
+ }
2126
+ return foundActive;
2127
+ }
2128
+
2137
2129
  function clone(obj) {
2138
2130
  var clonedObj = {};
2139
2131
  for (var prop in obj) {
@@ -2175,6 +2167,131 @@ getJasmineRequireObj().Timer = function() {
2175
2167
  return Timer;
2176
2168
  };
2177
2169
 
2170
+ getJasmineRequireObj().Any = function() {
2171
+
2172
+ function Any(expectedObject) {
2173
+ this.expectedObject = expectedObject;
2174
+ }
2175
+
2176
+ Any.prototype.asymmetricMatch = function(other) {
2177
+ if (this.expectedObject == String) {
2178
+ return typeof other == 'string' || other instanceof String;
2179
+ }
2180
+
2181
+ if (this.expectedObject == Number) {
2182
+ return typeof other == 'number' || other instanceof Number;
2183
+ }
2184
+
2185
+ if (this.expectedObject == Function) {
2186
+ return typeof other == 'function' || other instanceof Function;
2187
+ }
2188
+
2189
+ if (this.expectedObject == Object) {
2190
+ return typeof other == 'object';
2191
+ }
2192
+
2193
+ if (this.expectedObject == Boolean) {
2194
+ return typeof other == 'boolean';
2195
+ }
2196
+
2197
+ return other instanceof this.expectedObject;
2198
+ };
2199
+
2200
+ Any.prototype.jasmineToString = function() {
2201
+ return '<jasmine.any(' + this.expectedObject + ')>';
2202
+ };
2203
+
2204
+ return Any;
2205
+ };
2206
+
2207
+ getJasmineRequireObj().Anything = function(j$) {
2208
+
2209
+ function Anything() {}
2210
+
2211
+ Anything.prototype.asymmetricMatch = function(other) {
2212
+ return !j$.util.isUndefined(other) && other !== null;
2213
+ };
2214
+
2215
+ Anything.prototype.jasmineToString = function() {
2216
+ return '<jasmine.anything>';
2217
+ };
2218
+
2219
+ return Anything;
2220
+ };
2221
+
2222
+ getJasmineRequireObj().ArrayContaining = function(j$) {
2223
+ function ArrayContaining(sample) {
2224
+ this.sample = sample;
2225
+ }
2226
+
2227
+ ArrayContaining.prototype.asymmetricMatch = function(other) {
2228
+ var className = Object.prototype.toString.call(this.sample);
2229
+ if (className !== '[object Array]') { throw new Error('You must provide an array to arrayContaining, not \'' + this.sample + '\'.'); }
2230
+
2231
+ for (var i = 0; i < this.sample.length; i++) {
2232
+ var item = this.sample[i];
2233
+ if (!j$.matchersUtil.contains(other, item)) {
2234
+ return false;
2235
+ }
2236
+ }
2237
+
2238
+ return true;
2239
+ };
2240
+
2241
+ ArrayContaining.prototype.jasmineToString = function () {
2242
+ return '<jasmine.arrayContaining(' + jasmine.pp(this.sample) +')>';
2243
+ };
2244
+
2245
+ return ArrayContaining;
2246
+ };
2247
+
2248
+ getJasmineRequireObj().ObjectContaining = function(j$) {
2249
+
2250
+ function ObjectContaining(sample) {
2251
+ this.sample = sample;
2252
+ }
2253
+
2254
+ ObjectContaining.prototype.asymmetricMatch = function(other) {
2255
+ if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); }
2256
+
2257
+ for (var property in this.sample) {
2258
+ if (!Object.prototype.hasOwnProperty.call(other, property) ||
2259
+ !j$.matchersUtil.equals(this.sample[property], other[property])) {
2260
+ return false;
2261
+ }
2262
+ }
2263
+
2264
+ return true;
2265
+ };
2266
+
2267
+ ObjectContaining.prototype.jasmineToString = function() {
2268
+ return '<jasmine.objectContaining(' + j$.pp(this.sample) + ')>';
2269
+ };
2270
+
2271
+ return ObjectContaining;
2272
+ };
2273
+
2274
+ getJasmineRequireObj().StringMatching = function(j$) {
2275
+
2276
+ function StringMatching(expected) {
2277
+ if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
2278
+ throw new Error('Expected is not a String or a RegExp');
2279
+ }
2280
+
2281
+ this.regexp = new RegExp(expected);
2282
+ }
2283
+
2284
+ StringMatching.prototype.asymmetricMatch = function(other) {
2285
+ return this.regexp.test(other);
2286
+ };
2287
+
2288
+ StringMatching.prototype.jasmineToString = function() {
2289
+ return '<jasmine.stringMatching(' + this.regexp + ')>';
2290
+ };
2291
+
2292
+ return StringMatching;
2293
+ };
2294
+
2178
2295
  getJasmineRequireObj().matchersUtil = function(j$) {
2179
2296
  // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter?
2180
2297
 
@@ -2228,11 +2345,37 @@ getJasmineRequireObj().matchersUtil = function(j$) {
2228
2345
  }
2229
2346
  };
2230
2347
 
2348
+ function isAsymmetric(obj) {
2349
+ return obj && j$.isA_('Function', obj.asymmetricMatch);
2350
+ }
2351
+
2352
+ function asymmetricMatch(a, b) {
2353
+ var asymmetricA = isAsymmetric(a),
2354
+ asymmetricB = isAsymmetric(b);
2355
+
2356
+ if (asymmetricA && asymmetricB) {
2357
+ return undefined;
2358
+ }
2359
+
2360
+ if (asymmetricA) {
2361
+ return a.asymmetricMatch(b);
2362
+ }
2363
+
2364
+ if (asymmetricB) {
2365
+ return b.asymmetricMatch(a);
2366
+ }
2367
+ }
2368
+
2231
2369
  // Equality function lovingly adapted from isEqual in
2232
2370
  // [Underscore](http://underscorejs.org)
2233
2371
  function eq(a, b, aStack, bStack, customTesters) {
2234
2372
  var result = true;
2235
2373
 
2374
+ var asymmetricResult = asymmetricMatch(a, b);
2375
+ if (!j$.util.isUndefined(asymmetricResult)) {
2376
+ return asymmetricResult;
2377
+ }
2378
+
2236
2379
  for (var i = 0; i < customTesters.length; i++) {
2237
2380
  var customTesterResult = customTesters[i](a, b);
2238
2381
  if (!j$.util.isUndefined(customTesterResult)) {
@@ -2240,27 +2383,6 @@ getJasmineRequireObj().matchersUtil = function(j$) {
2240
2383
  }
2241
2384
  }
2242
2385
 
2243
- if (a instanceof j$.Any) {
2244
- result = a.jasmineMatches(b);
2245
- if (result) {
2246
- return true;
2247
- }
2248
- }
2249
-
2250
- if (b instanceof j$.Any) {
2251
- result = b.jasmineMatches(a);
2252
- if (result) {
2253
- return true;
2254
- }
2255
- }
2256
-
2257
- if (b instanceof j$.ObjectContaining) {
2258
- result = b.jasmineMatches(a);
2259
- if (result) {
2260
- return true;
2261
- }
2262
- }
2263
-
2264
2386
  if (a instanceof Error && b instanceof Error) {
2265
2387
  return a.message == b.message;
2266
2388
  }
@@ -2296,6 +2418,29 @@ getJasmineRequireObj().matchersUtil = function(j$) {
2296
2418
  a.ignoreCase == b.ignoreCase;
2297
2419
  }
2298
2420
  if (typeof a != 'object' || typeof b != 'object') { return false; }
2421
+
2422
+ var aIsDomNode = j$.isDomNode(a);
2423
+ var bIsDomNode = j$.isDomNode(b);
2424
+ if (aIsDomNode && bIsDomNode) {
2425
+ // At first try to use DOM3 method isEqualNode
2426
+ if (a.isEqualNode) {
2427
+ return a.isEqualNode(b);
2428
+ }
2429
+ // IE8 doesn't support isEqualNode, try to use outerHTML && innerText
2430
+ var aIsElement = a instanceof Element;
2431
+ var bIsElement = b instanceof Element;
2432
+ if (aIsElement && bIsElement) {
2433
+ return a.outerHTML == b.outerHTML;
2434
+ }
2435
+ if (aIsElement || bIsElement) {
2436
+ return false;
2437
+ }
2438
+ return a.innerText == b.innerText && a.textContent == b.textContent;
2439
+ }
2440
+ if (aIsDomNode || bIsDomNode) {
2441
+ return false;
2442
+ }
2443
+
2299
2444
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
2300
2445
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
2301
2446
  var length = aStack.length;
@@ -2309,17 +2454,12 @@ getJasmineRequireObj().matchersUtil = function(j$) {
2309
2454
  bStack.push(b);
2310
2455
  var size = 0;
2311
2456
  // Recursively compare objects and arrays.
2312
- if (className == '[object Array]') {
2313
- // Compare array lengths to determine if a deep comparison is necessary.
2314
- size = a.length;
2315
- result = size == b.length;
2316
- if (result) {
2317
- // Deep compare the contents, ignoring non-numeric properties.
2318
- while (size--) {
2319
- if (!(result = eq(a[size], b[size], aStack, bStack, customTesters))) { break; }
2320
- }
2321
- }
2322
- } else {
2457
+ // Compare array lengths to determine if a deep comparison is necessary.
2458
+ if (className == '[object Array]' && a.length !== b.length) {
2459
+ result = false;
2460
+ }
2461
+
2462
+ if (result) {
2323
2463
  // Objects with different constructors are not equivalent, but `Object`s
2324
2464
  // from different frames are.
2325
2465
  var aCtor = a.constructor, bCtor = b.constructor;
@@ -2351,7 +2491,7 @@ getJasmineRequireObj().matchersUtil = function(j$) {
2351
2491
  return result;
2352
2492
 
2353
2493
  function has(obj, key) {
2354
- return obj.hasOwnProperty(key);
2494
+ return Object.prototype.hasOwnProperty.call(obj, key);
2355
2495
  }
2356
2496
 
2357
2497
  function isFunction(obj) {
@@ -2620,11 +2760,15 @@ getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
2620
2760
  return toHaveBeenCalledWith;
2621
2761
  };
2622
2762
 
2623
- getJasmineRequireObj().toMatch = function() {
2763
+ getJasmineRequireObj().toMatch = function(j$) {
2624
2764
 
2625
2765
  function toMatch() {
2626
2766
  return {
2627
2767
  compare: function(actual, expected) {
2768
+ if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
2769
+ throw new Error('Expected is not a String or a RegExp');
2770
+ }
2771
+
2628
2772
  var regexp = new RegExp(expected);
2629
2773
 
2630
2774
  return {
@@ -2717,7 +2861,7 @@ getJasmineRequireObj().toThrowError = function(j$) {
2717
2861
  }
2718
2862
 
2719
2863
  if (errorMatcher.hasNoSpecifics()) {
2720
- pass.message = 'Expected function not to throw an Error, but it threw ' + fnNameFor(thrown) + '.';
2864
+ pass.message = 'Expected function not to throw an Error, but it threw ' + j$.fnNameFor(thrown) + '.';
2721
2865
  return pass;
2722
2866
  }
2723
2867
 
@@ -2771,9 +2915,9 @@ getJasmineRequireObj().toThrowError = function(j$) {
2771
2915
  }
2772
2916
 
2773
2917
  return {
2774
- errorTypeDescription: errorType ? fnNameFor(errorType) : 'an exception',
2918
+ errorTypeDescription: errorType ? j$.fnNameFor(errorType) : 'an exception',
2775
2919
  thrownDescription: function(thrown) {
2776
- var thrownName = errorType ? fnNameFor(thrown.constructor) : 'an exception',
2920
+ var thrownName = errorType ? j$.fnNameFor(thrown.constructor) : 'an exception',
2777
2921
  thrownMessage = '';
2778
2922
 
2779
2923
  if (expected) {
@@ -2801,10 +2945,6 @@ getJasmineRequireObj().toThrowError = function(j$) {
2801
2945
  };
2802
2946
  }
2803
2947
 
2804
- function fnNameFor(func) {
2805
- return func.name || func.toString().match(/^\s*function\s*(\w*)\s*\(/)[1];
2806
- }
2807
-
2808
2948
  function isStringOrRegExp(potential) {
2809
2949
  return potential instanceof RegExp || (typeof potential == 'string');
2810
2950
  }
@@ -2837,32 +2977,32 @@ getJasmineRequireObj().interface = function(jasmine, env) {
2837
2977
  return env.fdescribe(description, specDefinitions);
2838
2978
  },
2839
2979
 
2840
- it: function(desc, func) {
2841
- return env.it(desc, func);
2980
+ it: function() {
2981
+ return env.it.apply(env, arguments);
2842
2982
  },
2843
2983
 
2844
- xit: function(desc, func) {
2845
- return env.xit(desc, func);
2984
+ xit: function() {
2985
+ return env.xit.apply(env, arguments);
2846
2986
  },
2847
2987
 
2848
- fit: function(desc, func) {
2849
- return env.fit(desc, func);
2988
+ fit: function() {
2989
+ return env.fit.apply(env, arguments);
2850
2990
  },
2851
2991
 
2852
- beforeEach: function(beforeEachFunction) {
2853
- return env.beforeEach(beforeEachFunction);
2992
+ beforeEach: function() {
2993
+ return env.beforeEach.apply(env, arguments);
2854
2994
  },
2855
2995
 
2856
- afterEach: function(afterEachFunction) {
2857
- return env.afterEach(afterEachFunction);
2996
+ afterEach: function() {
2997
+ return env.afterEach.apply(env, arguments);
2858
2998
  },
2859
2999
 
2860
- beforeAll: function(beforeAllFunction) {
2861
- return env.beforeAll(beforeAllFunction);
3000
+ beforeAll: function() {
3001
+ return env.beforeAll.apply(env, arguments);
2862
3002
  },
2863
3003
 
2864
- afterAll: function(afterAllFunction) {
2865
- return env.afterAll(afterAllFunction);
3004
+ afterAll: function() {
3005
+ return env.afterAll.apply(env, arguments);
2866
3006
  },
2867
3007
 
2868
3008
  expect: function(actual) {
@@ -2870,7 +3010,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
2870
3010
  },
2871
3011
 
2872
3012
  pending: function() {
2873
- return env.pending();
3013
+ return env.pending.apply(env, arguments);
2874
3014
  },
2875
3015
 
2876
3016
  fail: function() {
@@ -2904,5 +3044,5 @@ getJasmineRequireObj().interface = function(jasmine, env) {
2904
3044
  };
2905
3045
 
2906
3046
  getJasmineRequireObj().version = function() {
2907
- return '2.1.3';
3047
+ return '2.2.0';
2908
3048
  };