diff --git a/packages/splitjs/README.md b/packages/splitjs/README.md
index 75a5ecc69..692a4a3a9 100644
--- a/packages/splitjs/README.md
+++ b/packages/splitjs/README.md
@@ -17,7 +17,7 @@
- **Tiny:** Weights 2kb gzipped.
- **Fast:** No overhead or attached window event listeners, uses pure CSS for resizing.
- **Unopinionated:** Plays nicely with `float`, `flex` and other layouts.
-- **Compatible:** Works great in IE9, and _even loads in IE8_ with polyfills. Early Firefox/Chrome/Safari/Opera supported too.
+- **Compatible:** Works great in IE9, early Firefox/Chrome/Safari/Opera supported too.
## Table of Contents
@@ -535,14 +535,6 @@ This library uses [CSS calc()](https://developer.mozilla.org/en-US/docs/Web/CSS/
| :-------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------- |
| 22+ ✔ | 6+ ✔ | 9+ ✔ | 15+ ✔ | 6.2+ ✔ | Sponsored ✔ |
-Gracefully falls back in IE 8 and below to only setting the initial widths/heights and not allowing dragging. IE 8 requires polyfills for `Array.isArray()`, `Array.forEach`, `Array.map`, `Array.filter`, `Object.keys()` and `getComputedStyle`. This script from [Polyfill.io](https://polyfill.io/) includes all of these, adding 1.91 kb to the gzipped size.
-
-This is **ONLY NEEDED** if you are supporting **IE8:**
-
-```html
-
-```
-
Cross-browser Testing Platform and Open Source <3 Provided by [Sauce Labs](https://saucelabs.com).
## Credits
diff --git a/packages/splitjs/package.json b/packages/splitjs/package.json
index 967e85fb7..e2a61e592 100644
--- a/packages/splitjs/package.json
+++ b/packages/splitjs/package.json
@@ -4,7 +4,7 @@
"description": "2kb unopinionated utility for resizeable split views",
"main": "dist/split.js",
"minified:main": "dist/split.min.js",
- "module": "dist/split.es.js",
+ "module": "dist/split.mjs",
"repository": "https://github.com/nathancahill/split",
"keywords": [
"css",
@@ -32,8 +32,7 @@
"Firefox >= 6",
"Opera >= 15",
"Safari >= 6.2",
- "IE >= 9",
- "IE 8"
+ "IE >= 9"
],
"collective": {
"type": "opencollective",
diff --git a/packages/splitjs/rollup.config.js b/packages/splitjs/rollup.config.js
index eefcb624d..4101267f1 100644
--- a/packages/splitjs/rollup.config.js
+++ b/packages/splitjs/rollup.config.js
@@ -1,5 +1,5 @@
-import buble from 'rollup-plugin-buble'
-import { uglify } from 'rollup-plugin-uglify'
+import buble from '@rollup/plugin-buble'
+import { terser } from 'rollup-plugin-terser'
const pkg = require('./package.json')
@@ -31,13 +31,6 @@ export default [
sourcemap: true,
file: pkg['minified:main'],
},
- plugins: [
- buble(),
- uglify({
- output: {
- comments: /^!/,
- },
- }),
- ],
+ plugins: [buble(), terser()],
},
]
diff --git a/packages/splitjs/test/SpecRunner.html b/packages/splitjs/test/SpecRunner.html
index 48f8b0c77..0f9dabe69 100644
--- a/packages/splitjs/test/SpecRunner.html
+++ b/packages/splitjs/test/SpecRunner.html
@@ -2,14 +2,14 @@
- Jasmine Spec Runner v2.6.4
+ Jasmine Spec Runner v3.5.0
-
-
+
+
-
-
-
+
+
+
diff --git a/packages/splitjs/test/ie8/SpecRunner.html b/packages/splitjs/test/ie8/SpecRunner.html
deleted file mode 100644
index 69c3b35e8..000000000
--- a/packages/splitjs/test/ie8/SpecRunner.html
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
-
- Jasmine Spec Runner v2.6.4
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/splitjs/test/ie8/browserstack.json b/packages/splitjs/test/ie8/browserstack.json
deleted file mode 100644
index cf372734c..000000000
--- a/packages/splitjs/test/ie8/browserstack.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "exit_with_fail": true,
- "test_framework": "jasmine2",
- "test_path": "test/ie8/SpecRunner.html",
- "browsers": [
- {
- "browser": "ie",
- "browser_version": "8",
- "os": "Windows",
- "os_version": "7"
- }
- ]
-}
diff --git a/packages/splitjs/test/ie8/polyfills.js b/packages/splitjs/test/ie8/polyfills.js
deleted file mode 100644
index cec61c1e9..000000000
--- a/packages/splitjs/test/ie8/polyfills.js
+++ /dev/null
@@ -1,342 +0,0 @@
-/* Polyfill service v3.18.1
- * For detailed credits and licence information see https://github.com/financial-times/polyfill-service.
- *
- * UA detected: firefox/53.0.0
- * Features requested: Array.isArray,Array.prototype.filter,Array.prototype.forEach,Array.prototype.map,Object.keys,getComputedStyle
- *
- * - Object.defineProperty, License: CC0 (required by "Array.isArray")
- * - Array.isArray, License: CC0
- * - Array.prototype.filter, License: CC0
- * - Array.prototype.forEach, License: CC0
- * - Array.prototype.map, License: CC0
- * - Object.keys, License: CC0
- * - Window, License: CC0 (required by "getComputedStyle")
- * - getComputedStyle, License: CC0 */
-
-(function(undefined) {
-
-// Object.defineProperty
-(function (nativeDefineProperty) {
-
- var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
- var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
- var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
-
- Object.defineProperty = function defineProperty(object, property, descriptor) {
-
- // Where native support exists, assume it
- if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
- return nativeDefineProperty(object, property, descriptor);
- }
-
- if (object === null || !(object instanceof Object || typeof object === 'object')) {
- throw new TypeError('Object.defineProperty called on non-object');
- }
-
- if (!(descriptor instanceof Object)) {
- throw new TypeError('Property description must be an object');
- }
-
- var propertyString = String(property);
- var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
- var getterType = 'get' in descriptor && typeof descriptor.get;
- var setterType = 'set' in descriptor && typeof descriptor.set;
-
- // handle descriptor.get
- if (getterType) {
- if (getterType !== 'function') {
- throw new TypeError('Getter must be a function');
- }
- if (!supportsAccessors) {
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
- }
- if (hasValueOrWritable) {
- throw new TypeError(ERR_VALUE_ACCESSORS);
- }
- object.__defineGetter__(propertyString, descriptor.get);
- } else {
- object[propertyString] = descriptor.value;
- }
-
- // handle descriptor.set
- if (setterType) {
- if (setterType !== 'function') {
- throw new TypeError('Setter must be a function');
- }
- if (!supportsAccessors) {
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
- }
- if (hasValueOrWritable) {
- throw new TypeError(ERR_VALUE_ACCESSORS);
- }
- object.__defineSetter__(propertyString, descriptor.set);
- }
-
- // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
- if ('value' in descriptor) {
- object[propertyString] = descriptor.value;
- }
-
- return object;
- };
-}(Object.defineProperty));
-
-// Array.isArray
-(function (toString) {
- Object.defineProperty(Array, 'isArray', {
- configurable: true,
- value: function isArray(object) {
- return toString.call(object) === '[object Array]';
- },
- writable: true
- });
-}(Object.prototype.toString));
-
-// Array.prototype.filter
-Array.prototype.filter = function filter(callback) {
- if (this === undefined || this === null) {
- throw new TypeError(this + ' is not an object');
- }
-
- if (!(callback instanceof Function)) {
- throw new TypeError(callback + ' is not a function');
- }
-
- var
- object = Object(this),
- scope = arguments[1],
- arraylike = object instanceof String ? object.split('') : object,
- length = Math.max(Math.min(arraylike.length, 9007199254740991), 0) || 0,
- index = -1,
- result = [],
- element;
-
- while (++index < length) {
- element = arraylike[index];
-
- if (index in arraylike && callback.call(scope, element, index, object)) {
- result.push(element);
- }
- }
-
- return result;
-};
-
-// Array.prototype.forEach
-Array.prototype.forEach = function forEach(callback) {
- if (this === undefined || this === null) {
- throw new TypeError(this + ' is not an object');
- }
-
- if (!(callback instanceof Function)) {
- throw new TypeError(callback + ' is not a function');
- }
-
- var
- object = Object(this),
- scope = arguments[1],
- arraylike = object instanceof String ? object.split('') : object,
- length = Math.max(Math.min(arraylike.length, 9007199254740991), 0) || 0,
- index = -1;
-
- while (++index < length) {
- if (index in arraylike) {
- callback.call(scope, arraylike[index], index, object);
- }
- }
-};
-
-// Array.prototype.map
-Array.prototype.map = function map(callback) {
- if (this === undefined || this === null) {
- throw new TypeError(this + ' is not an object');
- }
-
- if (!(callback instanceof Function)) {
- throw new TypeError(callback + ' is not a function');
- }
-
- var
- object = Object(this),
- scope = arguments[1],
- arraylike = object instanceof String ? object.split('') : object,
- length = Math.max(Math.min(arraylike.length, 9007199254740991), 0) || 0,
- index = -1,
- result = [];
-
- while (++index < length) {
- if (index in arraylike) {
- result[index] = callback.call(scope, arraylike[index], index, object);
- }
- }
-
- return result;
-};
-
-// Object.keys
-Object.keys = (function() {
- 'use strict';
- var hasOwnProperty = Object.prototype.hasOwnProperty,
- hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
- dontEnums = [
- 'toString',
- 'toLocaleString',
- 'valueOf',
- 'hasOwnProperty',
- 'isPrototypeOf',
- 'propertyIsEnumerable',
- 'constructor'
- ],
- dontEnumsLength = dontEnums.length;
-
- return function(obj) {
- if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
- throw new TypeError('Object.keys called on non-object');
- }
-
- var result = [], prop, i;
-
- for (prop in obj) {
- if (hasOwnProperty.call(obj, prop)) {
- result.push(prop);
- }
- }
-
- if (hasDontEnumBug) {
- for (i = 0; i < dontEnumsLength; i++) {
- if (hasOwnProperty.call(obj, dontEnums[i])) {
- result.push(dontEnums[i]);
- }
- }
- }
- return result;
- };
-}());
-
-// Window
-(function(global) {
- if (global.constructor) {
- global.Window = global.constructor;
- } else {
- (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
- }
-}(this));
-
-// getComputedStyle
-(function (global) {
- function getComputedStylePixel(element, property, fontSize) {
- var
- // Internet Explorer sometimes struggles to read currentStyle until the element's document is accessed.
- value = element.document && element.currentStyle[property].match(/([\d\.]+)(%|cm|em|in|mm|pc|pt|)/) || [0, 0, ''],
- size = value[1],
- suffix = value[2],
- rootSize;
-
- fontSize = !fontSize ? fontSize : /%|em/.test(suffix) && element.parentElement ? getComputedStylePixel(element.parentElement, 'fontSize', null) : 16;
- rootSize = property == 'fontSize' ? fontSize : /width/i.test(property) ? element.clientWidth : element.clientHeight;
-
- return suffix == '%' ? size / 100 * rootSize :
- suffix == 'cm' ? size * 0.3937 * 96 :
- suffix == 'em' ? size * fontSize :
- suffix == 'in' ? size * 96 :
- suffix == 'mm' ? size * 0.3937 * 96 / 10 :
- suffix == 'pc' ? size * 12 * 96 / 72 :
- suffix == 'pt' ? size * 96 / 72 :
- size;
- }
-
- function setShortStyleProperty(style, property) {
- var
- borderSuffix = property == 'border' ? 'Width' : '',
- t = property + 'Top' + borderSuffix,
- r = property + 'Right' + borderSuffix,
- b = property + 'Bottom' + borderSuffix,
- l = property + 'Left' + borderSuffix;
-
- style[property] = (style[t] == style[r] && style[t] == style[b] && style[t] == style[l] ? [ style[t] ] :
- style[t] == style[b] && style[l] == style[r] ? [ style[t], style[r] ] :
- style[l] == style[r] ? [ style[t], style[r], style[b] ] :
- [ style[t], style[r], style[b], style[l] ]).join(' ');
- }
-
- //
- function CSSStyleDeclaration(element) {
- var
- style = this,
- currentStyle = element.currentStyle,
- fontSize = getComputedStylePixel(element, 'fontSize'),
- unCamelCase = function (match) {
- return '-' + match.toLowerCase();
- },
- property;
-
- for (property in currentStyle) {
- Array.prototype.push.call(style, property == 'styleFloat' ? 'float' : property.replace(/[A-Z]/, unCamelCase));
-
- if (property == 'width') {
- style[property] = element.offsetWidth + 'px';
- } else if (property == 'height') {
- style[property] = element.offsetHeight + 'px';
- } else if (property == 'styleFloat') {
- style.float = currentStyle[property];
- } else if (/margin.|padding.|border.+W/.test(property) && style[property] != 'auto') {
- style[property] = Math.round(getComputedStylePixel(element, property, fontSize)) + 'px';
- } else if (/^outline/.test(property)) {
- // errors on checking outline
- try {
- style[property] = currentStyle[property];
- } catch (error) {
- style.outlineColor = currentStyle.color;
- style.outlineStyle = style.outlineStyle || 'none';
- style.outlineWidth = style.outlineWidth || '0px';
- style.outline = [style.outlineColor, style.outlineWidth, style.outlineStyle].join(' ');
- }
- } else {
- style[property] = currentStyle[property];
- }
- }
-
- setShortStyleProperty(style, 'margin');
- setShortStyleProperty(style, 'padding');
- setShortStyleProperty(style, 'border');
-
- style.fontSize = Math.round(fontSize) + 'px';
- }
-
- CSSStyleDeclaration.prototype = {
- constructor: CSSStyleDeclaration,
- // .getPropertyPriority
- getPropertyPriority: function () {
- throw new Error('NotSupportedError: DOM Exception 9');
- },
- // .getPropertyValue
- getPropertyValue: function (property) {
- return this[property.replace(/-\w/g, function (match) {
- return match[1].toUpperCase();
- })];
- },
- // .item
- item: function (index) {
- return this[index];
- },
- // .removeProperty
- removeProperty: function () {
- throw new Error('NoModificationAllowedError: DOM Exception 7');
- },
- // .setProperty
- setProperty: function () {
- throw new Error('NoModificationAllowedError: DOM Exception 7');
- },
- // .getPropertyCSSValue
- getPropertyCSSValue: function () {
- throw new Error('NotSupportedError: DOM Exception 9');
- }
- };
-
- // .getComputedStyle
- global.getComputedStyle = function getComputedStyle(element) {
- return new CSSStyleDeclaration(element);
- };
-}(this));
-})
-.call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
diff --git a/packages/splitjs/test/ie8/split.spec.js b/packages/splitjs/test/ie8/split.spec.js
deleted file mode 100644
index 9d3214999..000000000
--- a/packages/splitjs/test/ie8/split.spec.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/* eslint-env jasmine */
-/* global Split */
-/* eslint-disable no-var, func-names, prefer-arrow-callback, object-shorthand, prefer-template */
-
-describe('Split', function() {
- beforeEach(function() {
- document.body.style.width = '800px'
- document.body.style.height = '600px'
-
- this.a = document.createElement('div')
- this.b = document.createElement('div')
- this.c = document.createElement('div')
-
- this.a.id = 'a'
- this.b.id = 'b'
- this.c.id = 'c'
-
- document.body.appendChild(this.a)
- document.body.appendChild(this.b)
- document.body.appendChild(this.c)
- })
-
- afterEach(function() {
- document.body.removeChild(this.a)
- document.body.removeChild(this.b)
- document.body.removeChild(this.c)
- })
-
- it('splits in two when given two elements', function() {
- Split(['#a', '#b'])
-
- expect(this.a.style.width).toBe('50%')
- expect(this.b.style.width).toBe('50%')
- })
-
- it('splits in three when given three elements', function() {
- Split(['#a', '#b', '#c'])
-
- expect(this.a.style.width).toBe('33.33%')
- expect(this.b.style.width).toBe('33.33%')
- expect(this.c.style.width).toBe('33.33%')
- })
-
- it('splits vertically when direction is vertical', function() {
- Split(['#a', '#b'], {
- direction: 'vertical',
- })
-
- expect(this.a.style.height).toBe('50%')
- expect(this.b.style.height).toBe('50%')
- })
-
- it('splits in percentages when given sizes', function() {
- Split(['#a', '#b'], {
- sizes: [25, 75],
- })
-
- expect(this.a.style.width).toBe('25%')
- expect(this.b.style.width).toBe('75%')
- })
-
- it('splits in percentages when given sizes', function() {
- Split(['#a', '#b'], {
- sizes: [25, 75],
- })
-
- expect(this.a.style.width).toBe('25%')
- expect(this.b.style.width).toBe('75%')
- })
-
- it('accounts for gutter size', function() {
- Split(['#a', '#b'], {
- gutterSize: 20,
- })
-
- expect(this.a.style.width).toBe('50%')
- expect(this.b.style.width).toBe('50%')
- })
-
- it('accounts for gutter size with more than two elements', function() {
- Split(['#a', '#b', '#c'], {
- gutterSize: 20,
- })
-
- expect(this.a.style.width).toBe('33.33%')
- expect(this.b.style.width).toBe('33.33%')
- expect(this.c.style.width).toBe('33.33%')
- })
-
- it('accounts for gutter size when direction is vertical', function() {
- Split(['#a', '#b'], {
- direction: 'vertical',
- gutterSize: 20,
- })
-
- expect(this.a.style.height).toBe('50%')
- expect(this.b.style.height).toBe('50%')
- })
-
- it('accounts for gutter size with more than two elements when direction is vertical', function() {
- Split(['#a', '#b', '#c'], {
- direction: 'vertical',
- gutterSize: 20,
- })
-
- expect(this.a.style.height).toBe('33.33%')
- expect(this.b.style.height).toBe('33.33%')
- expect(this.c.style.height).toBe('33.33%')
- })
-
- it('set size directly when given css values', function() {
- Split(['#a', '#b'], {
- sizes: ['150px', '640px'],
- })
-
- expect(this.a.style.width).toBe('150px')
- expect(this.b.style.width).toBe('640px')
- })
-
- it('adjusts sizes using setSizes', function() {
- var split = Split(['#a', '#b'])
-
- split.setSizes([70, 30])
-
- expect(this.a.style.width).toBe('70%')
- expect(this.b.style.width).toBe('30%')
- })
-
- it('sets element styles using the elementStyle function', function() {
- Split(['#a', '#b'], {
- elementStyle: function(dimension, size) {
- return {
- width: size + '%',
- }
- },
- })
-
- expect(this.a.style.width).toBe('50%')
- expect(this.b.style.width).toBe('50%')
- })
-})
diff --git a/packages/splitjs/test/lib/jasmine-2.6.4/console.js b/packages/splitjs/test/lib/jasmine-2.6.4/console.js
deleted file mode 100644
index 38ad952de..000000000
--- a/packages/splitjs/test/lib/jasmine-2.6.4/console.js
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
-Copyright (c) 2008-2017 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-function getJasmineRequireObj() {
- if (typeof module !== 'undefined' && module.exports) {
- return exports;
- } else {
- window.jasmineRequire = window.jasmineRequire || {};
- return window.jasmineRequire;
- }
-}
-
-getJasmineRequireObj().console = function(jRequire, j$) {
- j$.ConsoleReporter = jRequire.ConsoleReporter();
-};
-
-getJasmineRequireObj().ConsoleReporter = function() {
-
- var noopTimer = {
- start: function(){},
- elapsed: function(){ return 0; }
- };
-
- function ConsoleReporter(options) {
- var print = options.print,
- showColors = options.showColors || false,
- onComplete = options.onComplete || function() {},
- timer = options.timer || noopTimer,
- specCount,
- failureCount,
- failedSpecs = [],
- pendingCount,
- ansi = {
- green: '\x1B[32m',
- red: '\x1B[31m',
- yellow: '\x1B[33m',
- none: '\x1B[0m'
- },
- failedSuites = [];
-
- print('ConsoleReporter is deprecated and will be removed in a future version.');
-
- this.jasmineStarted = function() {
- specCount = 0;
- failureCount = 0;
- pendingCount = 0;
- print('Started');
- printNewline();
- timer.start();
- };
-
- this.jasmineDone = function() {
- printNewline();
- for (var i = 0; i < failedSpecs.length; i++) {
- specFailureDetails(failedSpecs[i]);
- }
-
- if(specCount > 0) {
- printNewline();
-
- var specCounts = specCount + ' ' + plural('spec', specCount) + ', ' +
- failureCount + ' ' + plural('failure', failureCount);
-
- if (pendingCount) {
- specCounts += ', ' + pendingCount + ' pending ' + plural('spec', pendingCount);
- }
-
- print(specCounts);
- } else {
- print('No specs found');
- }
-
- printNewline();
- var seconds = timer.elapsed() / 1000;
- print('Finished in ' + seconds + ' ' + plural('second', seconds));
- printNewline();
-
- for(i = 0; i < failedSuites.length; i++) {
- suiteFailureDetails(failedSuites[i]);
- }
-
- onComplete(failureCount === 0);
- };
-
- this.specDone = function(result) {
- specCount++;
-
- if (result.status == 'pending') {
- pendingCount++;
- print(colored('yellow', '*'));
- return;
- }
-
- if (result.status == 'passed') {
- print(colored('green', '.'));
- return;
- }
-
- if (result.status == 'failed') {
- failureCount++;
- failedSpecs.push(result);
- print(colored('red', 'F'));
- }
- };
-
- this.suiteDone = function(result) {
- if (result.failedExpectations && result.failedExpectations.length > 0) {
- failureCount++;
- failedSuites.push(result);
- }
- };
-
- return this;
-
- function printNewline() {
- print('\n');
- }
-
- function colored(color, str) {
- return showColors ? (ansi[color] + str + ansi.none) : str;
- }
-
- function plural(str, count) {
- return count == 1 ? str : str + 's';
- }
-
- function repeat(thing, times) {
- var arr = [];
- for (var i = 0; i < times; i++) {
- arr.push(thing);
- }
- return arr;
- }
-
- function indent(str, spaces) {
- var lines = (str || '').split('\n');
- var newArr = [];
- for (var i = 0; i < lines.length; i++) {
- newArr.push(repeat(' ', spaces).join('') + lines[i]);
- }
- return newArr.join('\n');
- }
-
- function specFailureDetails(result) {
- printNewline();
- print(result.fullName);
-
- for (var i = 0; i < result.failedExpectations.length; i++) {
- var failedExpectation = result.failedExpectations[i];
- printNewline();
- print(indent(failedExpectation.message, 2));
- print(indent(failedExpectation.stack, 2));
- }
-
- printNewline();
- }
-
- function suiteFailureDetails(result) {
- for (var i = 0; i < result.failedExpectations.length; i++) {
- printNewline();
- print(colored('red', 'An error was thrown in an afterAll'));
- printNewline();
- print(colored('red', 'AfterAll ' + result.failedExpectations[i].message));
-
- }
- printNewline();
- }
- }
-
- return ConsoleReporter;
-};
diff --git a/packages/splitjs/test/lib/jasmine-2.6.4/jasmine-html.js b/packages/splitjs/test/lib/jasmine-2.6.4/jasmine-html.js
deleted file mode 100644
index 90407cc01..000000000
--- a/packages/splitjs/test/lib/jasmine-2.6.4/jasmine-html.js
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
-Copyright (c) 2008-2017 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-jasmineRequire.html = function(j$) {
- j$.ResultsNode = jasmineRequire.ResultsNode();
- j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
- j$.QueryString = jasmineRequire.QueryString();
- j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
-};
-
-jasmineRequire.HtmlReporter = function(j$) {
-
- var noopTimer = {
- start: function() {},
- elapsed: function() { return 0; }
- };
-
- function HtmlReporter(options) {
- var env = options.env || {},
- getContainer = options.getContainer,
- createElement = options.createElement,
- createTextNode = options.createTextNode,
- onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {},
- onThrowExpectationsClick = options.onThrowExpectationsClick || function() {},
- onRandomClick = options.onRandomClick || function() {},
- addToExistingQueryString = options.addToExistingQueryString || defaultQueryString,
- filterSpecs = options.filterSpecs,
- timer = options.timer || noopTimer,
- results = [],
- specsExecuted = 0,
- failureCount = 0,
- pendingSpecCount = 0,
- htmlReporterMain,
- symbols,
- failedSuites = [];
-
- this.initialize = function() {
- clearPrior();
- htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'},
- createDom('div', {className: 'jasmine-banner'},
- createDom('a', {className: 'jasmine-title', href: 'http://jasmine.github.io/', target: '_blank'}),
- createDom('span', {className: 'jasmine-version'}, j$.version)
- ),
- createDom('ul', {className: 'jasmine-symbol-summary'}),
- createDom('div', {className: 'jasmine-alert'}),
- createDom('div', {className: 'jasmine-results'},
- createDom('div', {className: 'jasmine-failures'})
- )
- );
- getContainer().appendChild(htmlReporterMain);
- };
-
- var totalSpecsDefined;
- this.jasmineStarted = function(options) {
- totalSpecsDefined = options.totalSpecsDefined || 0;
- timer.start();
- };
-
- var summary = createDom('div', {className: 'jasmine-summary'});
-
- var topResults = new j$.ResultsNode({}, '', null),
- currentParent = topResults;
-
- this.suiteStarted = function(result) {
- currentParent.addChild(result, 'suite');
- currentParent = currentParent.last();
- };
-
- this.suiteDone = function(result) {
- if (result.status == 'failed') {
- failedSuites.push(result);
- }
-
- if (currentParent == topResults) {
- return;
- }
-
- currentParent = currentParent.parent;
- };
-
- this.specStarted = function(result) {
- currentParent.addChild(result, 'spec');
- };
-
- var failures = [];
- this.specDone = function(result) {
- if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') {
- console.error('Spec \'' + result.fullName + '\' has no expectations.');
- }
-
- if (result.status != 'disabled') {
- specsExecuted++;
- }
-
- if (!symbols){
- symbols = find('.jasmine-symbol-summary');
- }
-
- symbols.appendChild(createDom('li', {
- className: noExpectations(result) ? 'jasmine-empty' : 'jasmine-' + result.status,
- id: 'spec_' + result.id,
- title: result.fullName
- }
- ));
-
- if (result.status == 'failed') {
- failureCount++;
-
- var failure =
- createDom('div', {className: 'jasmine-spec-detail jasmine-failed'},
- createDom('div', {className: 'jasmine-description'},
- createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName)
- ),
- createDom('div', {className: 'jasmine-messages'})
- );
- var messages = failure.childNodes[1];
-
- for (var i = 0; i < result.failedExpectations.length; i++) {
- var expectation = result.failedExpectations[i];
- messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message));
- messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack));
- }
-
- failures.push(failure);
- }
-
- if (result.status == 'pending') {
- pendingSpecCount++;
- }
- };
-
- this.jasmineDone = function(doneResult) {
- var banner = find('.jasmine-banner');
- var alert = find('.jasmine-alert');
- var order = doneResult && doneResult.order;
- alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
-
- banner.appendChild(
- createDom('div', { className: 'jasmine-run-options' },
- createDom('span', { className: 'jasmine-trigger' }, 'Options'),
- createDom('div', { className: 'jasmine-payload' },
- createDom('div', { className: 'jasmine-exceptions' },
- createDom('input', {
- className: 'jasmine-raise',
- id: 'jasmine-raise-exceptions',
- type: 'checkbox'
- }),
- createDom('label', { className: 'jasmine-label', 'for': 'jasmine-raise-exceptions' }, 'raise exceptions')),
- createDom('div', { className: 'jasmine-throw-failures' },
- createDom('input', {
- className: 'jasmine-throw',
- id: 'jasmine-throw-failures',
- type: 'checkbox'
- }),
- createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')),
- createDom('div', { className: 'jasmine-random-order' },
- createDom('input', {
- className: 'jasmine-random',
- id: 'jasmine-random-order',
- type: 'checkbox'
- }),
- createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order'))
- )
- ));
-
- var raiseCheckbox = find('#jasmine-raise-exceptions');
-
- raiseCheckbox.checked = !env.catchingExceptions();
- raiseCheckbox.onclick = onRaiseExceptionsClick;
-
- var throwCheckbox = find('#jasmine-throw-failures');
- throwCheckbox.checked = env.throwingExpectationFailures();
- throwCheckbox.onclick = onThrowExpectationsClick;
-
- var randomCheckbox = find('#jasmine-random-order');
- randomCheckbox.checked = env.randomTests();
- randomCheckbox.onclick = onRandomClick;
-
- var optionsMenu = find('.jasmine-run-options'),
- optionsTrigger = optionsMenu.querySelector('.jasmine-trigger'),
- optionsPayload = optionsMenu.querySelector('.jasmine-payload'),
- isOpen = /\bjasmine-open\b/;
-
- optionsTrigger.onclick = function() {
- if (isOpen.test(optionsPayload.className)) {
- optionsPayload.className = optionsPayload.className.replace(isOpen, '');
- } else {
- optionsPayload.className += ' jasmine-open';
- }
- };
-
- if (specsExecuted < totalSpecsDefined) {
- var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all';
- var skippedLink = order && order.random ? '?random=true' : '?';
- alert.appendChild(
- createDom('span', {className: 'jasmine-bar jasmine-skipped'},
- createDom('a', {href: skippedLink, title: 'Run all specs'}, skippedMessage)
- )
- );
- }
- var statusBarMessage = '';
- var statusBarClassName = 'jasmine-bar ';
-
- if (totalSpecsDefined > 0) {
- statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount);
- if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); }
- statusBarClassName += (failureCount > 0) ? 'jasmine-failed' : 'jasmine-passed';
- } else {
- statusBarClassName += 'jasmine-skipped';
- statusBarMessage += 'No specs found';
- }
-
- var seedBar;
- if (order && order.random) {
- seedBar = createDom('span', {className: 'jasmine-seed-bar'},
- ', randomized with seed ',
- createDom('a', {title: 'randomized with seed ' + order.seed, href: seedHref(order.seed)}, order.seed)
- );
- }
-
- alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage, seedBar));
-
- var errorBarClassName = 'jasmine-bar jasmine-errored';
- var errorBarMessagePrefix = 'AfterAll ';
-
- for(var i = 0; i < failedSuites.length; i++) {
- var failedSuite = failedSuites[i];
- for(var j = 0; j < failedSuite.failedExpectations.length; j++) {
- alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failedSuite.failedExpectations[j].message));
- }
- }
-
- var globalFailures = (doneResult && doneResult.failedExpectations) || [];
- for(i = 0; i < globalFailures.length; i++) {
- var failure = globalFailures[i];
- alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failure.message));
- }
-
- var results = find('.jasmine-results');
- results.appendChild(summary);
-
- summaryList(topResults, summary);
-
- function summaryList(resultsTree, domParent) {
- var specListNode;
- for (var i = 0; i < resultsTree.children.length; i++) {
- var resultNode = resultsTree.children[i];
- if (filterSpecs && !hasActiveSpec(resultNode)) {
- continue;
- }
- if (resultNode.type == 'suite') {
- var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id},
- createDom('li', {className: 'jasmine-suite-detail'},
- createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description)
- )
- );
-
- summaryList(resultNode, suiteListNode);
- domParent.appendChild(suiteListNode);
- }
- if (resultNode.type == 'spec') {
- if (domParent.getAttribute('class') != 'jasmine-specs') {
- specListNode = createDom('ul', {className: 'jasmine-specs'});
- domParent.appendChild(specListNode);
- }
- var specDescription = resultNode.result.description;
- if(noExpectations(resultNode.result)) {
- specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
- }
- if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') {
- specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason;
- }
- specListNode.appendChild(
- createDom('li', {
- className: 'jasmine-' + resultNode.result.status,
- id: 'spec-' + resultNode.result.id
- },
- createDom('a', {href: specHref(resultNode.result)}, specDescription)
- )
- );
- }
- }
- }
-
- if (failures.length) {
- alert.appendChild(
- createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-spec-list'},
- createDom('span', {}, 'Spec List | '),
- createDom('a', {className: 'jasmine-failures-menu', href: '#'}, 'Failures')));
- alert.appendChild(
- createDom('span', {className: 'jasmine-menu jasmine-bar jasmine-failure-list'},
- createDom('a', {className: 'jasmine-spec-list-menu', href: '#'}, 'Spec List'),
- createDom('span', {}, ' | Failures ')));
-
- find('.jasmine-failures-menu').onclick = function() {
- setMenuModeTo('jasmine-failure-list');
- };
- find('.jasmine-spec-list-menu').onclick = function() {
- setMenuModeTo('jasmine-spec-list');
- };
-
- setMenuModeTo('jasmine-failure-list');
-
- var failureNode = find('.jasmine-failures');
- for (i = 0; i < failures.length; i++) {
- failureNode.appendChild(failures[i]);
- }
- }
- };
-
- return this;
-
- function find(selector) {
- return getContainer().querySelector('.jasmine_html-reporter ' + selector);
- }
-
- function clearPrior() {
- // return the reporter
- var oldReporter = find('');
-
- if(oldReporter) {
- getContainer().removeChild(oldReporter);
- }
- }
-
- function createDom(type, attrs, childrenVarArgs) {
- var el = createElement(type);
-
- for (var i = 2; i < arguments.length; i++) {
- var child = arguments[i];
-
- if (typeof child === 'string') {
- el.appendChild(createTextNode(child));
- } else {
- if (child) {
- el.appendChild(child);
- }
- }
- }
-
- for (var attr in attrs) {
- if (attr == 'className') {
- el[attr] = attrs[attr];
- } else {
- el.setAttribute(attr, attrs[attr]);
- }
- }
-
- return el;
- }
-
- function pluralize(singular, count) {
- var word = (count == 1 ? singular : singular + 's');
-
- return '' + count + ' ' + word;
- }
-
- function specHref(result) {
- return addToExistingQueryString('spec', result.fullName);
- }
-
- function seedHref(seed) {
- return addToExistingQueryString('seed', seed);
- }
-
- function defaultQueryString(key, value) {
- return '?' + key + '=' + value;
- }
-
- function setMenuModeTo(mode) {
- htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode);
- }
-
- function noExpectations(result) {
- return (result.failedExpectations.length + result.passedExpectations.length) === 0 &&
- result.status === 'passed';
- }
-
- function hasActiveSpec(resultNode) {
- if (resultNode.type == 'spec' && resultNode.result.status != 'disabled') {
- return true;
- }
-
- if (resultNode.type == 'suite') {
- for (var i = 0, j = resultNode.children.length; i < j; i++) {
- if (hasActiveSpec(resultNode.children[i])) {
- return true;
- }
- }
- }
- }
- }
-
- return HtmlReporter;
-};
-
-jasmineRequire.HtmlSpecFilter = function() {
- function HtmlSpecFilter(options) {
- var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
- var filterPattern = new RegExp(filterString);
-
- this.matches = function(specName) {
- return filterPattern.test(specName);
- };
- }
-
- return HtmlSpecFilter;
-};
-
-jasmineRequire.ResultsNode = function() {
- function ResultsNode(result, type, parent) {
- this.result = result;
- this.type = type;
- this.parent = parent;
-
- this.children = [];
-
- this.addChild = function(result, type) {
- this.children.push(new ResultsNode(result, type, this));
- };
-
- this.last = function() {
- return this.children[this.children.length - 1];
- };
- }
-
- return ResultsNode;
-};
-
-jasmineRequire.QueryString = function() {
- function QueryString(options) {
-
- this.navigateWithNewParam = function(key, value) {
- options.getWindowLocation().search = this.fullStringWithNewParam(key, value);
- };
-
- this.fullStringWithNewParam = function(key, value) {
- var paramMap = queryStringToParamMap();
- paramMap[key] = value;
- return toQueryString(paramMap);
- };
-
- this.getParam = function(key) {
- return queryStringToParamMap()[key];
- };
-
- return this;
-
- function toQueryString(paramMap) {
- var qStrPairs = [];
- for (var prop in paramMap) {
- qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop]));
- }
- return '?' + qStrPairs.join('&');
- }
-
- function queryStringToParamMap() {
- var paramStr = options.getWindowLocation().search.substring(1),
- params = [],
- paramMap = {};
-
- if (paramStr.length > 0) {
- params = paramStr.split('&');
- for (var i = 0; i < params.length; i++) {
- var p = params[i].split('=');
- var value = decodeURIComponent(p[1]);
- if (value === 'true' || value === 'false') {
- value = JSON.parse(value);
- }
- paramMap[decodeURIComponent(p[0])] = value;
- }
- }
-
- return paramMap;
- }
-
- }
-
- return QueryString;
-};
diff --git a/packages/splitjs/test/lib/jasmine-2.6.4/jasmine.js b/packages/splitjs/test/lib/jasmine-2.6.4/jasmine.js
deleted file mode 100644
index 829016017..000000000
--- a/packages/splitjs/test/lib/jasmine-2.6.4/jasmine.js
+++ /dev/null
@@ -1,5001 +0,0 @@
-/*
-Copyright (c) 2008-2017 Pivotal Labs
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-*/
-var getJasmineRequireObj = (function (jasmineGlobal) {
- var jasmineRequire;
-
- if (typeof module !== 'undefined' && module.exports && typeof exports !== 'undefined') {
- if (typeof global !== 'undefined') {
- jasmineGlobal = global;
- } else {
- jasmineGlobal = {};
- }
- jasmineRequire = exports;
- } else {
- if (typeof window !== 'undefined' && typeof window.toString === 'function' && window.toString() === '[object GjsGlobal]') {
- jasmineGlobal = window;
- }
- jasmineRequire = jasmineGlobal.jasmineRequire = jasmineGlobal.jasmineRequire || {};
- }
-
- function getJasmineRequire() {
- return jasmineRequire;
- }
-
- getJasmineRequire().core = function(jRequire) {
- var j$ = {};
-
- jRequire.base(j$, jasmineGlobal);
- j$.util = jRequire.util();
- j$.errors = jRequire.errors();
- j$.formatErrorMsg = jRequire.formatErrorMsg();
- j$.Any = jRequire.Any(j$);
- j$.Anything = jRequire.Anything(j$);
- j$.CallTracker = jRequire.CallTracker(j$);
- j$.MockDate = jRequire.MockDate();
- j$.getClearStack = jRequire.clearStack(j$);
- j$.Clock = jRequire.Clock();
- j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler();
- j$.Env = jRequire.Env(j$);
- j$.ExceptionFormatter = jRequire.ExceptionFormatter();
- j$.Expectation = jRequire.Expectation();
- j$.buildExpectationResult = jRequire.buildExpectationResult();
- j$.JsApiReporter = jRequire.JsApiReporter();
- j$.matchersUtil = jRequire.matchersUtil(j$);
- j$.ObjectContaining = jRequire.ObjectContaining(j$);
- j$.ArrayContaining = jRequire.ArrayContaining(j$);
- j$.pp = jRequire.pp(j$);
- j$.QueueRunner = jRequire.QueueRunner(j$);
- j$.ReportDispatcher = jRequire.ReportDispatcher();
- j$.Spec = jRequire.Spec(j$);
- j$.Spy = jRequire.Spy(j$);
- j$.SpyRegistry = jRequire.SpyRegistry(j$);
- j$.SpyStrategy = jRequire.SpyStrategy(j$);
- j$.StringMatching = jRequire.StringMatching(j$);
- j$.Suite = jRequire.Suite(j$);
- j$.Timer = jRequire.Timer();
- j$.TreeProcessor = jRequire.TreeProcessor();
- j$.version = jRequire.version();
- j$.Order = jRequire.Order();
- j$.DiffBuilder = jRequire.DiffBuilder(j$);
- j$.NullDiffBuilder = jRequire.NullDiffBuilder(j$);
- j$.ObjectPath = jRequire.ObjectPath(j$);
- j$.GlobalErrors = jRequire.GlobalErrors(j$);
-
- j$.matchers = jRequire.requireMatchers(jRequire, j$);
-
- return j$;
- };
-
- return getJasmineRequire;
-})(this);
-
-getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
- var availableMatchers = [
- 'toBe',
- 'toBeCloseTo',
- 'toBeDefined',
- 'toBeFalsy',
- 'toBeGreaterThan',
- 'toBeGreaterThanOrEqual',
- 'toBeLessThan',
- 'toBeLessThanOrEqual',
- 'toBeNaN',
- 'toBeNegativeInfinity',
- 'toBeNull',
- 'toBePositiveInfinity',
- 'toBeTruthy',
- 'toBeUndefined',
- 'toContain',
- 'toEqual',
- 'toHaveBeenCalled',
- 'toHaveBeenCalledBefore',
- 'toHaveBeenCalledTimes',
- 'toHaveBeenCalledWith',
- 'toMatch',
- 'toThrow',
- 'toThrowError'
- ],
- matchers = {};
-
- for (var i = 0; i < availableMatchers.length; i++) {
- var name = availableMatchers[i];
- matchers[name] = jRequire[name](j$);
- }
-
- return matchers;
-};
-
-getJasmineRequireObj().base = function(j$, jasmineGlobal) {
- j$.unimplementedMethod_ = function() {
- throw new Error('unimplemented method');
- };
-
- /**
- * Maximum object depth the pretty printer will print to.
- * Set this to a lower value to speed up pretty printing if you have large objects.
- * @name jasmine.MAX_PRETTY_PRINT_DEPTH
- */
- j$.MAX_PRETTY_PRINT_DEPTH = 40;
- /**
- * Maximum number of array elements to display when pretty printing objects.
- * Elements past this number will be ellipised.
- * @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH
- */
- j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 100;
- /**
- * Default number of milliseconds Jasmine will wait for an asynchronous spec to complete.
- * @name jasmine.DEFAULT_TIMEOUT_INTERVAL
- */
- j$.DEFAULT_TIMEOUT_INTERVAL = 5000;
-
- j$.getGlobal = function() {
- return jasmineGlobal;
- };
-
- /**
- * Get the currently booted Jasmine Environment.
- *
- * @name jasmine.getEnv
- * @function
- * @return {Env}
- */
- j$.getEnv = function(options) {
- var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options);
- //jasmine. singletons in here (setTimeout blah blah).
- return env;
- };
-
- j$.isArray_ = function(value) {
- return j$.isA_('Array', value);
- };
-
- j$.isObject_ = function(value) {
- return !j$.util.isUndefined(value) && value !== null && j$.isA_('Object', value);
- };
-
- j$.isString_ = function(value) {
- return j$.isA_('String', value);
- };
-
- j$.isNumber_ = function(value) {
- return j$.isA_('Number', value);
- };
-
- j$.isFunction_ = function(value) {
- return j$.isA_('Function', value);
- };
-
- j$.isA_ = function(typeName, value) {
- return j$.getType_(value) === '[object ' + typeName + ']';
- };
-
- j$.getType_ = function(value) {
- return Object.prototype.toString.apply(value);
- };
-
- j$.isDomNode = function(obj) {
- return obj.nodeType > 0;
- };
-
- j$.fnNameFor = function(func) {
- if (func.name) {
- return func.name;
- }
-
- var matches = func.toString().match(/^\s*function\s*(\w*)\s*\(/);
- return matches ? matches[1] : '';
- };
-
- /**
- * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
- * that will succeed if the actual value being compared is an instance of the specified class/constructor.
- * @name jasmine.any
- * @function
- * @param {Constructor} clazz - The constructor to check against.
- */
- j$.any = function(clazz) {
- return new j$.Any(clazz);
- };
-
- /**
- * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
- * that will succeed if the actual value being compared is not `null` and not `undefined`.
- * @name jasmine.anything
- * @function
- */
- j$.anything = function() {
- return new j$.Anything();
- };
-
- /**
- * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
- * that will succeed if the actual value being compared contains at least the keys and values.
- * @name jasmine.objectContaining
- * @function
- * @param {Object} sample - The subset of properties that _must_ be in the actual.
- */
- j$.objectContaining = function(sample) {
- return new j$.ObjectContaining(sample);
- };
-
- /**
- * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
- * that will succeed if the actual value is a `String` that matches the `RegExp` or `String`.
- * @name jasmine.stringMatching
- * @function
- * @param {RegExp|String} expected
- */
- j$.stringMatching = function(expected) {
- return new j$.StringMatching(expected);
- };
-
- /**
- * Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
- * that will succeed if the actual value is an `Array` that contains at least the elements in the sample.
- * @name jasmine.arrayContaining
- * @function
- * @param {Array} sample
- */
- j$.arrayContaining = function(sample) {
- return new j$.ArrayContaining(sample);
- };
-
- /**
- * Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it.
- * @name jasmine.createSpy
- * @function
- * @param {String} [name] - Name to give the spy. This will be displayed in failure messages.
- * @param {Function} [originalFn] - Function to act as the real implementation.
- * @return {Spy}
- */
- j$.createSpy = function(name, originalFn) {
- return j$.Spy(name, originalFn);
- };
-
- j$.isSpy = function(putativeSpy) {
- if (!putativeSpy) {
- return false;
- }
- return putativeSpy.and instanceof j$.SpyStrategy &&
- putativeSpy.calls instanceof j$.CallTracker;
- };
-
- /**
- * Create an object with multiple {@link Spy}s as its members.
- * @name jasmine.createSpyObj
- * @function
- * @param {String} [baseName] - Base name for the spies in the object.
- * @param {String[]|Object} methodNames - Array of method names to create spies for, or Object whose keys will be method names and values the {@link Spy#and#returnValue|returnValue}.
- * @return {Object}
- */
- j$.createSpyObj = function(baseName, methodNames) {
- var baseNameIsCollection = j$.isObject_(baseName) || j$.isArray_(baseName);
-
- if (baseNameIsCollection && j$.util.isUndefined(methodNames)) {
- methodNames = baseName;
- baseName = 'unknown';
- }
-
- var obj = {};
- var spiesWereSet = false;
-
- if (j$.isArray_(methodNames)) {
- for (var i = 0; i < methodNames.length; i++) {
- obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]);
- spiesWereSet = true;
- }
- } else if (j$.isObject_(methodNames)) {
- for (var key in methodNames) {
- if (methodNames.hasOwnProperty(key)) {
- obj[key] = j$.createSpy(baseName + '.' + key);
- obj[key].and.returnValue(methodNames[key]);
- spiesWereSet = true;
- }
- }
- }
-
- if (!spiesWereSet) {
- throw 'createSpyObj requires a non-empty array or object of method names to create spies for';
- }
-
- return obj;
- };
-};
-
-getJasmineRequireObj().util = function() {
-
- var util = {};
-
- util.inherit = function(childClass, parentClass) {
- var Subclass = function() {
- };
- Subclass.prototype = parentClass.prototype;
- childClass.prototype = new Subclass();
- };
-
- util.htmlEscape = function(str) {
- if (!str) {
- return str;
- }
- return str.replace(/&/g, '&')
- .replace(//g, '>');
- };
-
- util.argsToArray = function(args) {
- var arrayOfArgs = [];
- for (var i = 0; i < args.length; i++) {
- arrayOfArgs.push(args[i]);
- }
- return arrayOfArgs;
- };
-
- util.isUndefined = function(obj) {
- return obj === void 0;
- };
-
- util.arrayContains = function(array, search) {
- var i = array.length;
- while (i--) {
- if (array[i] === search) {
- return true;
- }
- }
- return false;
- };
-
- util.clone = function(obj) {
- if (Object.prototype.toString.apply(obj) === '[object Array]') {
- return obj.slice();
- }
-
- var cloned = {};
- for (var prop in obj) {
- if (obj.hasOwnProperty(prop)) {
- cloned[prop] = obj[prop];
- }
- }
-
- return cloned;
- };
-
- util.getPropertyDescriptor = function(obj, methodName) {
- var descriptor,
- proto = obj;
-
- do {
- descriptor = Object.getOwnPropertyDescriptor(proto, methodName);
- proto = Object.getPrototypeOf(proto);
- } while (!descriptor && proto);
-
- return descriptor;
- };
-
- util.objectDifference = function(obj, toRemove) {
- var diff = {};
-
- for (var key in obj) {
- if (util.has(obj, key) && !util.has(toRemove, key)) {
- diff[key] = obj[key];
- }
- }
-
- return diff;
- };
-
- util.has = function(obj, key) {
- return Object.prototype.hasOwnProperty.call(obj, key);
- };
-
- return util;
-};
-
-getJasmineRequireObj().Spec = function(j$) {
- function Spec(attrs) {
- this.expectationFactory = attrs.expectationFactory;
- this.resultCallback = attrs.resultCallback || function() {};
- this.id = attrs.id;
- this.description = attrs.description || '';
- this.queueableFn = attrs.queueableFn;
- this.beforeAndAfterFns = attrs.beforeAndAfterFns || function() { return {befores: [], afters: []}; };
- this.userContext = attrs.userContext || function() { return {}; };
- this.onStart = attrs.onStart || function() {};
- this.getSpecName = attrs.getSpecName || function() { return ''; };
- this.expectationResultFactory = attrs.expectationResultFactory || function() { };
- this.queueRunnerFactory = attrs.queueRunnerFactory || function() {};
- this.catchingExceptions = attrs.catchingExceptions || function() { return true; };
- this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
-
- if (!this.queueableFn.fn) {
- this.pend();
- }
-
- this.result = {
- id: this.id,
- description: this.description,
- fullName: this.getFullName(),
- failedExpectations: [],
- passedExpectations: [],
- pendingReason: ''
- };
- }
-
- Spec.prototype.addExpectationResult = function(passed, data, isError) {
- var expectationResult = this.expectationResultFactory(data);
- if (passed) {
- this.result.passedExpectations.push(expectationResult);
- } else {
- this.result.failedExpectations.push(expectationResult);
-
- if (this.throwOnExpectationFailure && !isError) {
- throw new j$.errors.ExpectationFailed();
- }
- }
- };
-
- Spec.prototype.expect = function(actual) {
- return this.expectationFactory(actual, this);
- };
-
- Spec.prototype.execute = function(onComplete, enabled) {
- var self = this;
-
- this.onStart(this);
-
- if (!this.isExecutable() || this.markedPending || enabled === false) {
- complete(enabled);
- return;
- }
-
- var fns = this.beforeAndAfterFns();
- var allFns = fns.befores.concat(this.queueableFn).concat(fns.afters);
-
- this.queueRunnerFactory({
- queueableFns: allFns,
- onException: function() { self.onException.apply(self, arguments); },
- onComplete: complete,
- userContext: this.userContext()
- });
-
- function complete(enabledAgain) {
- self.result.status = self.status(enabledAgain);
- self.resultCallback(self.result);
-
- if (onComplete) {
- onComplete();
- }
- }
- };
-
- Spec.prototype.onException = function onException(e) {
- if (Spec.isPendingSpecException(e)) {
- this.pend(extractCustomPendingMessage(e));
- return;
- }
-
- if (e instanceof j$.errors.ExpectationFailed) {
- return;
- }
-
- this.addExpectationResult(false, {
- matcherName: '',
- passed: false,
- expected: '',
- actual: '',
- error: e
- }, true);
- };
-
- Spec.prototype.disable = function() {
- this.disabled = true;
- };
-
- Spec.prototype.pend = function(message) {
- this.markedPending = true;
- if (message) {
- this.result.pendingReason = message;
- }
- };
-
- Spec.prototype.getResult = function() {
- this.result.status = this.status();
- return this.result;
- };
-
- Spec.prototype.status = function(enabled) {
- if (this.disabled || enabled === false) {
- return 'disabled';
- }
-
- if (this.markedPending) {
- return 'pending';
- }
-
- if (this.result.failedExpectations.length > 0) {
- return 'failed';
- } else {
- return 'passed';
- }
- };
-
- Spec.prototype.isExecutable = function() {
- return !this.disabled;
- };
-
- Spec.prototype.getFullName = function() {
- return this.getSpecName(this);
- };
-
- var extractCustomPendingMessage = function(e) {
- var fullMessage = e.toString(),
- boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage),
- boilerplateEnd = boilerplateStart + Spec.pendingSpecExceptionMessage.length;
-
- return fullMessage.substr(boilerplateEnd);
- };
-
- Spec.pendingSpecExceptionMessage = '=> marked Pending';
-
- Spec.isPendingSpecException = function(e) {
- return !!(e && e.toString && e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1);
- };
-
- return Spec;
-};
-
-if (typeof window == void 0 && typeof exports == 'object') {
- exports.Spec = jasmineRequire.Spec;
-}
-
-/*jshint bitwise: false*/
-
-getJasmineRequireObj().Order = function() {
- function Order(options) {
- this.random = 'random' in options ? options.random : true;
- var seed = this.seed = options.seed || generateSeed();
- this.sort = this.random ? randomOrder : naturalOrder;
-
- function naturalOrder(items) {
- return items;
- }
-
- function randomOrder(items) {
- var copy = items.slice();
- copy.sort(function(a, b) {
- return jenkinsHash(seed + a.id) - jenkinsHash(seed + b.id);
- });
- return copy;
- }
-
- function generateSeed() {
- return String(Math.random()).slice(-5);
- }
-
- // Bob Jenkins One-at-a-Time Hash algorithm is a non-cryptographic hash function
- // used to get a different output when the key changes slighly.
- // We use your return to sort the children randomly in a consistent way when
- // used in conjunction with a seed
-
- function jenkinsHash(key) {
- var hash, i;
- for(hash = i = 0; i < key.length; ++i) {
- hash += key.charCodeAt(i);
- hash += (hash << 10);
- hash ^= (hash >> 6);
- }
- hash += (hash << 3);
- hash ^= (hash >> 11);
- hash += (hash << 15);
- return hash;
- }
-
- }
-
- return Order;
-};
-
-getJasmineRequireObj().Env = function(j$) {
- /**
- * _Note:_ Do not construct this directly, Jasmine will make one during booting.
- * @name Env
- * @classdesc The Jasmine environment
- * @constructor
- */
- function Env(options) {
- options = options || {};
-
- var self = this;
- var global = options.global || j$.getGlobal();
-
- var totalSpecsDefined = 0;
-
- var catchExceptions = true;
-
- var realSetTimeout = j$.getGlobal().setTimeout;
- var realClearTimeout = j$.getGlobal().clearTimeout;
- var clearStack = j$.getClearStack(j$.getGlobal());
- this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global));
-
- var runnableResources = {};
-
- var currentSpec = null;
- var currentlyExecutingSuites = [];
- var currentDeclarationSuite = null;
- var throwOnExpectationFailure = false;
- var random = false;
- var seed = null;
-
- var currentSuite = function() {
- return currentlyExecutingSuites[currentlyExecutingSuites.length - 1];
- };
-
- var currentRunnable = function() {
- return currentSpec || currentSuite();
- };
-
- var reporter = new j$.ReportDispatcher([
- 'jasmineStarted',
- 'jasmineDone',
- 'suiteStarted',
- 'suiteDone',
- 'specStarted',
- 'specDone'
- ]);
-
- var globalErrors = new j$.GlobalErrors();
-
- this.specFilter = function() {
- return true;
- };
-
- this.addCustomEqualityTester = function(tester) {
- if(!currentRunnable()) {
- throw new Error('Custom Equalities must be added in a before function or a spec');
- }
- runnableResources[currentRunnable().id].customEqualityTesters.push(tester);
- };
-
- this.addMatchers = function(matchersToAdd) {
- if(!currentRunnable()) {
- throw new Error('Matchers must be added in a before function or a spec');
- }
- var customMatchers = runnableResources[currentRunnable().id].customMatchers;
- for (var matcherName in matchersToAdd) {
- customMatchers[matcherName] = matchersToAdd[matcherName];
- }
- };
-
- j$.Expectation.addCoreMatchers(j$.matchers);
-
- var nextSpecId = 0;
- var getNextSpecId = function() {
- return 'spec' + nextSpecId++;
- };
-
- var nextSuiteId = 0;
- var getNextSuiteId = function() {
- return 'suite' + nextSuiteId++;
- };
-
- var expectationFactory = function(actual, spec) {
- return j$.Expectation.Factory({
- util: j$.matchersUtil,
- customEqualityTesters: runnableResources[spec.id].customEqualityTesters,
- customMatchers: runnableResources[spec.id].customMatchers,
- actual: actual,
- addExpectationResult: addExpectationResult
- });
-
- function addExpectationResult(passed, result) {
- return spec.addExpectationResult(passed, result);
- }
- };
-
- var defaultResourcesForRunnable = function(id, parentRunnableId) {
- var resources = {spies: [], customEqualityTesters: [], customMatchers: {}};
-
- if(runnableResources[parentRunnableId]){
- resources.customEqualityTesters = j$.util.clone(runnableResources[parentRunnableId].customEqualityTesters);
- resources.customMatchers = j$.util.clone(runnableResources[parentRunnableId].customMatchers);
- }
-
- runnableResources[id] = resources;
- };
-
- var clearResourcesForRunnable = function(id) {
- spyRegistry.clearSpies();
- delete runnableResources[id];
- };
-
- var beforeAndAfterFns = function(suite) {
- return function() {
- var befores = [],
- afters = [];
-
- while(suite) {
- befores = befores.concat(suite.beforeFns);
- afters = afters.concat(suite.afterFns);
-
- suite = suite.parentSuite;
- }
-
- return {
- befores: befores.reverse(),
- afters: afters
- };
- };
- };
-
- var getSpecName = function(spec, suite) {
- var fullName = [spec.description],
- suiteFullName = suite.getFullName();
-
- if (suiteFullName !== '') {
- fullName.unshift(suiteFullName);
- }
- return fullName.join(' ');
- };
-
- // TODO: we may just be able to pass in the fn instead of wrapping here
- var buildExpectationResult = j$.buildExpectationResult,
- exceptionFormatter = new j$.ExceptionFormatter(),
- expectationResultFactory = function(attrs) {
- attrs.messageFormatter = exceptionFormatter.message;
- attrs.stackFormatter = exceptionFormatter.stack;
-
- return buildExpectationResult(attrs);
- };
-
- // TODO: fix this naming, and here's where the value comes in
- this.catchExceptions = function(value) {
- catchExceptions = !!value;
- return catchExceptions;
- };
-
- this.catchingExceptions = function() {
- return catchExceptions;
- };
-
- var maximumSpecCallbackDepth = 20;
- var currentSpecCallbackDepth = 0;
-
- var catchException = function(e) {
- return j$.Spec.isPendingSpecException(e) || catchExceptions;
- };
-
- this.throwOnExpectationFailure = function(value) {
- throwOnExpectationFailure = !!value;
- };
-
- this.throwingExpectationFailures = function() {
- return throwOnExpectationFailure;
- };
-
- this.randomizeTests = function(value) {
- random = !!value;
- };
-
- this.randomTests = function() {
- return random;
- };
-
- this.seed = function(value) {
- if (value) {
- seed = value;
- }
- return seed;
- };
-
- var queueRunnerFactory = function(options) {
- options.catchException = catchException;
- options.clearStack = options.clearStack || clearStack;
- options.timeout = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout};
- options.fail = self.fail;
- options.globalErrors = globalErrors;
-
- new j$.QueueRunner(options).execute();
- };
-
- var topSuite = new j$.Suite({
- env: this,
- id: getNextSuiteId(),
- description: 'Jasmine__TopLevel__Suite',
- expectationFactory: expectationFactory,
- expectationResultFactory: expectationResultFactory
- });
- defaultResourcesForRunnable(topSuite.id);
- currentDeclarationSuite = topSuite;
-
- this.topSuite = function() {
- return topSuite;
- };
-
- this.execute = function(runnablesToRun) {
- if(!runnablesToRun) {
- if (focusedRunnables.length) {
- runnablesToRun = focusedRunnables;
- } else {
- runnablesToRun = [topSuite.id];
- }
- }
-
- var order = new j$.Order({
- random: random,
- seed: seed
- });
-
- var processor = new j$.TreeProcessor({
- tree: topSuite,
- runnableIds: runnablesToRun,
- queueRunnerFactory: queueRunnerFactory,
- nodeStart: function(suite) {
- currentlyExecutingSuites.push(suite);
- defaultResourcesForRunnable(suite.id, suite.parentSuite.id);
- reporter.suiteStarted(suite.result);
- },
- nodeComplete: function(suite, result) {
- if (suite !== currentSuite()) {
- throw new Error('Tried to complete the wrong suite');
- }
-
- if (!suite.markedPending) {
- clearResourcesForRunnable(suite.id);
- }
- currentlyExecutingSuites.pop();
- reporter.suiteDone(result);
- },
- orderChildren: function(node) {
- return order.sort(node.children);
- }
- });
-
- if(!processor.processTree().valid) {
- throw new Error('Invalid order: would cause a beforeAll or afterAll to be run multiple times');
- }
-
- reporter.jasmineStarted({
- totalSpecsDefined: totalSpecsDefined
- });
-
- currentlyExecutingSuites.push(topSuite);
-
- globalErrors.install();
- processor.execute(function() {
- clearResourcesForRunnable(topSuite.id);
- currentlyExecutingSuites.pop();
- globalErrors.uninstall();
-
- reporter.jasmineDone({
- order: order,
- failedExpectations: topSuite.result.failedExpectations
- });
- });
- };
-
- /**
- * Add a custom reporter to the Jasmine environment.
- * @name Env#addReporter
- * @function
- * @see custom_reporter
- */
- this.addReporter = function(reporterToAdd) {
- reporter.addReporter(reporterToAdd);
- };
-
- this.provideFallbackReporter = function(reporterToAdd) {
- reporter.provideFallbackReporter(reporterToAdd);
- };
-
- this.clearReporters = function() {
- reporter.clearReporters();
- };
-
- var spyRegistry = new j$.SpyRegistry({currentSpies: function() {
- if(!currentRunnable()) {
- throw new Error('Spies must be created in a before function or a spec');
- }
- return runnableResources[currentRunnable().id].spies;
- }});
-
- this.allowRespy = function(allow){
- spyRegistry.allowRespy(allow);
- };
-
- this.spyOn = function() {
- return spyRegistry.spyOn.apply(spyRegistry, arguments);
- };
-
- this.spyOnProperty = function() {
- return spyRegistry.spyOnProperty.apply(spyRegistry, arguments);
- };
-
- var ensureIsFunction = function(fn, caller) {
- if (!j$.isFunction_(fn)) {
- throw new Error(caller + ' expects a function argument; received ' + j$.getType_(fn));
- }
- };
-
- var suiteFactory = function(description) {
- var suite = new j$.Suite({
- env: self,
- id: getNextSuiteId(),
- description: description,
- parentSuite: currentDeclarationSuite,
- expectationFactory: expectationFactory,
- expectationResultFactory: expectationResultFactory,
- throwOnExpectationFailure: throwOnExpectationFailure
- });
-
- return suite;
- };
-
- this.describe = function(description, specDefinitions) {
- ensureIsFunction(specDefinitions, 'describe');
- var suite = suiteFactory(description);
- if (specDefinitions.length > 0) {
- throw new Error('describe does not expect any arguments');
- }
- if (currentDeclarationSuite.markedPending) {
- suite.pend();
- }
- addSpecsToSuite(suite, specDefinitions);
- return suite;
- };
-
- this.xdescribe = function(description, specDefinitions) {
- ensureIsFunction(specDefinitions, 'xdescribe');
- var suite = suiteFactory(description);
- suite.pend();
- addSpecsToSuite(suite, specDefinitions);
- return suite;
- };
-
- var focusedRunnables = [];
-
- this.fdescribe = function(description, specDefinitions) {
- ensureIsFunction(specDefinitions, 'fdescribe');
- var suite = suiteFactory(description);
- suite.isFocused = true;
-
- focusedRunnables.push(suite.id);
- unfocusAncestor();
- addSpecsToSuite(suite, specDefinitions);
-
- return suite;
- };
-
- function addSpecsToSuite(suite, specDefinitions) {
- var parentSuite = currentDeclarationSuite;
- parentSuite.addChild(suite);
- currentDeclarationSuite = suite;
-
- var declarationError = null;
- try {
- specDefinitions.call(suite);
- } catch (e) {
- declarationError = e;
- }
-
- if (declarationError) {
- self.it('encountered a declaration exception', function() {
- throw declarationError;
- });
- }
-
- currentDeclarationSuite = parentSuite;
- }
-
- function findFocusedAncestor(suite) {
- while (suite) {
- if (suite.isFocused) {
- return suite.id;
- }
- suite = suite.parentSuite;
- }
-
- return null;
- }
-
- function unfocusAncestor() {
- var focusedAncestor = findFocusedAncestor(currentDeclarationSuite);
- if (focusedAncestor) {
- for (var i = 0; i < focusedRunnables.length; i++) {
- if (focusedRunnables[i] === focusedAncestor) {
- focusedRunnables.splice(i, 1);
- break;
- }
- }
- }
- }
-
- var specFactory = function(description, fn, suite, timeout) {
- totalSpecsDefined++;
- var spec = new j$.Spec({
- id: getNextSpecId(),
- beforeAndAfterFns: beforeAndAfterFns(suite),
- expectationFactory: expectationFactory,
- resultCallback: specResultCallback,
- getSpecName: function(spec) {
- return getSpecName(spec, suite);
- },
- onStart: specStarted,
- description: description,
- expectationResultFactory: expectationResultFactory,
- queueRunnerFactory: queueRunnerFactory,
- userContext: function() { return suite.clonedSharedUserContext(); },
- queueableFn: {
- fn: fn,
- timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
- },
- throwOnExpectationFailure: throwOnExpectationFailure
- });
-
- if (!self.specFilter(spec)) {
- spec.disable();
- }
-
- return spec;
-
- function specResultCallback(result) {
- clearResourcesForRunnable(spec.id);
- currentSpec = null;
- reporter.specDone(result);
- }
-
- function specStarted(spec) {
- currentSpec = spec;
- defaultResourcesForRunnable(spec.id, suite.id);
- reporter.specStarted(spec.result);
- }
- };
-
- this.it = function(description, fn, timeout) {
- // it() sometimes doesn't have a fn argument, so only check the type if
- // it's given.
- if (arguments.length > 1 && typeof fn !== 'undefined') {
- ensureIsFunction(fn, 'it');
- }
- var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
- if (currentDeclarationSuite.markedPending) {
- spec.pend();
- }
- currentDeclarationSuite.addChild(spec);
- return spec;
- };
-
- this.xit = function(description, fn, timeout) {
- // xit(), like it(), doesn't always have a fn argument, so only check the
- // type when needed.
- if (arguments.length > 1 && typeof fn !== 'undefined') {
- ensureIsFunction(fn, 'xit');
- }
- var spec = this.it.apply(this, arguments);
- spec.pend('Temporarily disabled with xit');
- return spec;
- };
-
- this.fit = function(description, fn, timeout){
- ensureIsFunction(fn, 'fit');
- var spec = specFactory(description, fn, currentDeclarationSuite, timeout);
- currentDeclarationSuite.addChild(spec);
- focusedRunnables.push(spec.id);
- unfocusAncestor();
- return spec;
- };
-
- this.expect = function(actual) {
- if (!currentRunnable()) {
- throw new Error('\'expect\' was used when there was no current spec, this could be because an asynchronous test timed out');
- }
-
- return currentRunnable().expect(actual);
- };
-
- this.beforeEach = function(beforeEachFunction, timeout) {
- ensureIsFunction(beforeEachFunction, 'beforeEach');
- currentDeclarationSuite.beforeEach({
- fn: beforeEachFunction,
- timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
- });
- };
-
- this.beforeAll = function(beforeAllFunction, timeout) {
- ensureIsFunction(beforeAllFunction, 'beforeAll');
- currentDeclarationSuite.beforeAll({
- fn: beforeAllFunction,
- timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
- });
- };
-
- this.afterEach = function(afterEachFunction, timeout) {
- ensureIsFunction(afterEachFunction, 'afterEach');
- currentDeclarationSuite.afterEach({
- fn: afterEachFunction,
- timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
- });
- };
-
- this.afterAll = function(afterAllFunction, timeout) {
- ensureIsFunction(afterAllFunction, 'afterAll');
- currentDeclarationSuite.afterAll({
- fn: afterAllFunction,
- timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
- });
- };
-
- this.pending = function(message) {
- var fullMessage = j$.Spec.pendingSpecExceptionMessage;
- if(message) {
- fullMessage += message;
- }
- throw fullMessage;
- };
-
- this.fail = function(error) {
- if (!currentRunnable()) {
- throw new Error('\'fail\' was used when there was no current spec, this could be because an asynchronous test timed out');
- }
-
- var message = 'Failed';
- if (error) {
- message += ': ';
- if (error.message) {
- message += error.message;
- } else if (jasmine.isString_(error)) {
- message += error;
- } else {
- // pretty print all kind of objects. This includes arrays.
- message += jasmine.pp(error);
- }
- }
-
- currentRunnable().addExpectationResult(false, {
- matcherName: '',
- passed: false,
- expected: '',
- actual: '',
- message: message,
- error: error && error.message ? error : null
- });
- };
- }
-
- return Env;
-};
-
-getJasmineRequireObj().JsApiReporter = function() {
-
- var noopTimer = {
- start: function(){},
- elapsed: function(){ return 0; }
- };
-
- /**
- * _Note:_ Do not construct this directly, use the global `jsApiReporter` to retrieve the instantiated object.
- *
- * @name jsApiReporter
- * @classdesc Reporter added by default in `boot.js` to record results for retrieval in javascript code.
- * @class
- */
- function JsApiReporter(options) {
- var timer = options.timer || noopTimer,
- status = 'loaded';
-
- this.started = false;
- this.finished = false;
- this.runDetails = {};
-
- this.jasmineStarted = function() {
- this.started = true;
- status = 'started';
- timer.start();
- };
-
- var executionTime;
-
- this.jasmineDone = function(runDetails) {
- this.finished = true;
- this.runDetails = runDetails;
- executionTime = timer.elapsed();
- status = 'done';
- };
-
- /**
- * Get the current status for the Jasmine environment.
- * @name jsApiReporter#status
- * @function
- * @return {String} - One of `loaded`, `started`, or `done`
- */
- this.status = function() {
- return status;
- };
-
- var suites = [],
- suites_hash = {};
-
- this.suiteStarted = function(result) {
- suites_hash[result.id] = result;
- };
-
- this.suiteDone = function(result) {
- storeSuite(result);
- };
-
- /**
- * Get the results for a set of suites.
- *
- * Retrievable in slices for easier serialization.
- * @name jsApiReporter#suiteResults
- * @function
- * @param {Number} index - The position in the suites list to start from.
- * @param {Number} length - Maximum number of suite results to return.
- * @return {Object[]}
- */
- this.suiteResults = function(index, length) {
- return suites.slice(index, index + length);
- };
-
- function storeSuite(result) {
- suites.push(result);
- suites_hash[result.id] = result;
- }
-
- /**
- * Get all of the suites in a single object, with their `id` as the key.
- * @name jsApiReporter#suites
- * @function
- * @return {Object}
- */
- this.suites = function() {
- return suites_hash;
- };
-
- var specs = [];
-
- this.specDone = function(result) {
- specs.push(result);
- };
-
- /**
- * Get the results for a set of specs.
- *
- * Retrievable in slices for easier serialization.
- * @name jsApiReporter#specResults
- * @function
- * @param {Number} index - The position in the specs list to start from.
- * @param {Number} length - Maximum number of specs results to return.
- * @return {Object[]}
- */
- this.specResults = function(index, length) {
- return specs.slice(index, index + length);
- };
-
- /**
- * Get all spec results.
- * @name jsApiReporter#specs
- * @function
- * @return {Object[]}
- */
- this.specs = function() {
- return specs;
- };
-
- /**
- * Get the number of milliseconds it took for the full Jasmine suite to run.
- * @name jsApiReporter#executionTime
- * @function
- * @return {Number}
- */
- this.executionTime = function() {
- return executionTime;
- };
-
- }
-
- return JsApiReporter;
-};
-
-getJasmineRequireObj().Any = function(j$) {
-
- function Any(expectedObject) {
- if (typeof expectedObject === 'undefined') {
- throw new TypeError(
- 'jasmine.any() expects to be passed a constructor function. ' +
- 'Please pass one or use jasmine.anything() to match any object.'
- );
- }
- this.expectedObject = expectedObject;
- }
-
- Any.prototype.asymmetricMatch = function(other) {
- if (this.expectedObject == String) {
- return typeof other == 'string' || other instanceof String;
- }
-
- if (this.expectedObject == Number) {
- return typeof other == 'number' || other instanceof Number;
- }
-
- if (this.expectedObject == Function) {
- return typeof other == 'function' || other instanceof Function;
- }
-
- if (this.expectedObject == Object) {
- return typeof other == 'object';
- }
-
- if (this.expectedObject == Boolean) {
- return typeof other == 'boolean';
- }
-
- return other instanceof this.expectedObject;
- };
-
- Any.prototype.jasmineToString = function() {
- return '';
- };
-
- return Any;
-};
-
-getJasmineRequireObj().Anything = function(j$) {
-
- function Anything() {}
-
- Anything.prototype.asymmetricMatch = function(other) {
- return !j$.util.isUndefined(other) && other !== null;
- };
-
- Anything.prototype.jasmineToString = function() {
- return '';
- };
-
- return Anything;
-};
-
-getJasmineRequireObj().ArrayContaining = function(j$) {
- function ArrayContaining(sample) {
- this.sample = sample;
- }
-
- ArrayContaining.prototype.asymmetricMatch = function(other, customTesters) {
- var className = Object.prototype.toString.call(this.sample);
- if (className !== '[object Array]') { throw new Error('You must provide an array to arrayContaining, not \'' + this.sample + '\'.'); }
-
- for (var i = 0; i < this.sample.length; i++) {
- var item = this.sample[i];
- if (!j$.matchersUtil.contains(other, item, customTesters)) {
- return false;
- }
- }
-
- return true;
- };
-
- ArrayContaining.prototype.jasmineToString = function () {
- return '';
- };
-
- return ArrayContaining;
-};
-
-getJasmineRequireObj().ObjectContaining = function(j$) {
-
- function ObjectContaining(sample) {
- this.sample = sample;
- }
-
- function getPrototype(obj) {
- if (Object.getPrototypeOf) {
- return Object.getPrototypeOf(obj);
- }
-
- if (obj.constructor.prototype == obj) {
- return null;
- }
-
- return obj.constructor.prototype;
- }
-
- function hasProperty(obj, property) {
- if (!obj) {
- return false;
- }
-
- if (Object.prototype.hasOwnProperty.call(obj, property)) {
- return true;
- }
-
- return hasProperty(getPrototype(obj), property);
- }
-
- ObjectContaining.prototype.asymmetricMatch = function(other, customTesters) {
- if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); }
-
- for (var property in this.sample) {
- if (!hasProperty(other, property) ||
- !j$.matchersUtil.equals(this.sample[property], other[property], customTesters)) {
- return false;
- }
- }
-
- return true;
- };
-
- ObjectContaining.prototype.jasmineToString = function() {
- return '';
- };
-
- return ObjectContaining;
-};
-
-getJasmineRequireObj().StringMatching = function(j$) {
-
- function StringMatching(expected) {
- if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
- throw new Error('Expected is not a String or a RegExp');
- }
-
- this.regexp = new RegExp(expected);
- }
-
- StringMatching.prototype.asymmetricMatch = function(other) {
- return this.regexp.test(other);
- };
-
- StringMatching.prototype.jasmineToString = function() {
- return '';
- };
-
- return StringMatching;
-};
-
-getJasmineRequireObj().CallTracker = function(j$) {
-
- /**
- * @namespace Spy#calls
- */
- function CallTracker() {
- var calls = [];
- var opts = {};
-
- function argCloner(context) {
- var clonedArgs = [];
- var argsAsArray = j$.util.argsToArray(context.args);
- for(var i = 0; i < argsAsArray.length; i++) {
- if(Object.prototype.toString.apply(argsAsArray[i]).match(/^\[object/)) {
- clonedArgs.push(j$.util.clone(argsAsArray[i]));
- } else {
- clonedArgs.push(argsAsArray[i]);
- }
- }
- context.args = clonedArgs;
- }
-
- this.track = function(context) {
- if(opts.cloneArgs) {
- argCloner(context);
- }
- calls.push(context);
- };
-
- /**
- * Check whether this spy has been invoked.
- * @name Spy#calls#any
- * @function
- * @return {Boolean}
- */
- this.any = function() {
- return !!calls.length;
- };
-
- /**
- * Get the number of invocations of this spy.
- * @name Spy#calls#count
- * @function
- * @return {Integer}
- */
- this.count = function() {
- return calls.length;
- };
-
- /**
- * Get the arguments that were passed to a specific invocation of this spy.
- * @name Spy#calls#argsFor
- * @function
- * @param {Integer} index The 0-based invocation index.
- * @return {Array}
- */
- this.argsFor = function(index) {
- var call = calls[index];
- return call ? call.args : [];
- };
-
- /**
- * Get the raw calls array for this spy.
- * @name Spy#calls#all
- * @function
- * @return {Spy.callData[]}
- */
- this.all = function() {
- return calls;
- };
-
- /**
- * Get all of the arguments for each invocation of this spy in the order they were received.
- * @name Spy#calls#allArgs
- * @function
- * @return {Array}
- */
- this.allArgs = function() {
- var callArgs = [];
- for(var i = 0; i < calls.length; i++){
- callArgs.push(calls[i].args);
- }
-
- return callArgs;
- };
-
- /**
- * Get the first invocation of this spy.
- * @name Spy#calls#first
- * @function
- * @return {ObjecSpy.callData}
- */
- this.first = function() {
- return calls[0];
- };
-
- /**
- * Get the most recent invocation of this spy.
- * @name Spy#calls#mostRecent
- * @function
- * @return {ObjecSpy.callData}
- */
- this.mostRecent = function() {
- return calls[calls.length - 1];
- };
-
- /**
- * Reset this spy as if it has never been called.
- * @name Spy#calls#reset
- * @function
- */
- this.reset = function() {
- calls = [];
- };
-
- /**
- * Set this spy to do a shallow clone of arguments passed to each invocation.
- * @name Spy#calls#saveArgumentsByValue
- * @function
- */
- this.saveArgumentsByValue = function() {
- opts.cloneArgs = true;
- };
-
- }
-
- return CallTracker;
-};
-
-getJasmineRequireObj().clearStack = function(j$) {
- var maxInlineCallCount = 10;
-
- function messageChannelImpl(global, setTimeout) {
- var channel = new global.MessageChannel(),
- head = {},
- tail = head;
-
- var taskRunning = false;
- channel.port1.onmessage = function() {
- head = head.next;
- var task = head.task;
- delete head.task;
-
- if (taskRunning) {
- global.setTimeout(task, 0);
- } else {
- try {
- taskRunning = true;
- task();
- } finally {
- taskRunning = false;
- }
- }
- };
-
- var currentCallCount = 0;
- return function clearStack(fn) {
- currentCallCount++;
-
- if (currentCallCount < maxInlineCallCount) {
- tail = tail.next = { task: fn };
- channel.port2.postMessage(0);
- } else {
- currentCallCount = 0;
- setTimeout(fn);
- }
- };
- }
-
- function getClearStack(global) {
- var currentCallCount = 0;
- var realSetTimeout = global.setTimeout;
- var setTimeoutImpl = function clearStack(fn) {
- Function.prototype.apply.apply(realSetTimeout, [global, [fn, 0]]);
- };
-
- if (j$.isFunction_(global.setImmediate)) {
- var realSetImmediate = global.setImmediate;
- return function(fn) {
- currentCallCount++;
-
- if (currentCallCount < maxInlineCallCount) {
- realSetImmediate(fn);
- } else {
- currentCallCount = 0;
-
- setTimeoutImpl(fn);
- }
- };
- } else if (!j$.util.isUndefined(global.MessageChannel)) {
- return messageChannelImpl(global, setTimeoutImpl);
- } else {
- return setTimeoutImpl;
- }
- }
-
- return getClearStack;
-};
-
-getJasmineRequireObj().Clock = function() {
- /**
- * _Note:_ Do not construct this directly, Jasmine will make one during booting. You can get the current clock with {@link jasmine.clock}.
- * @class Clock
- * @classdesc Jasmine's mock clock is used when testing time dependent code.
- */
- function Clock(global, delayedFunctionSchedulerFactory, mockDate) {
- var self = this,
- realTimingFunctions = {
- setTimeout: global.setTimeout,
- clearTimeout: global.clearTimeout,
- setInterval: global.setInterval,
- clearInterval: global.clearInterval
- },
- fakeTimingFunctions = {
- setTimeout: setTimeout,
- clearTimeout: clearTimeout,
- setInterval: setInterval,
- clearInterval: clearInterval
- },
- installed = false,
- delayedFunctionScheduler,
- timer;
-
-
- /**
- * Install the mock clock over the built-in methods.
- * @name Clock#install
- * @function
- * @return {Clock}
- */
- self.install = function() {
- if(!originalTimingFunctionsIntact()) {
- throw new Error('Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?');
- }
- replace(global, fakeTimingFunctions);
- timer = fakeTimingFunctions;
- delayedFunctionScheduler = delayedFunctionSchedulerFactory();
- installed = true;
-
- return self;
- };
-
- /**
- * Uninstall the mock clock, returning the built-in methods to their places.
- * @name Clock#uninstall
- * @function
- */
- self.uninstall = function() {
- delayedFunctionScheduler = null;
- mockDate.uninstall();
- replace(global, realTimingFunctions);
-
- timer = realTimingFunctions;
- installed = false;
- };
-
- /**
- * Execute a function with a mocked Clock
- *
- * The clock will be {@link Clock#install|install}ed before the function is called and {@link Clock#uninstall|uninstall}ed in a `finally` after the function completes.
- * @name Clock#withMock
- * @function
- * @param {closure} Function The function to be called.
- */
- self.withMock = function(closure) {
- this.install();
- try {
- closure();
- } finally {
- this.uninstall();
- }
- };
-
- /**
- * Instruct the installed Clock to also mock the date returned by `new Date()`
- * @name Clock#mockDate
- * @function
- * @param {Date} [initialDate=now] The `Date` to provide.
- */
- self.mockDate = function(initialDate) {
- mockDate.install(initialDate);
- };
-
- self.setTimeout = function(fn, delay, params) {
- if (legacyIE()) {
- if (arguments.length > 2) {
- throw new Error('IE < 9 cannot support extra params to setTimeout without a polyfill');
- }
- return timer.setTimeout(fn, delay);
- }
- return Function.prototype.apply.apply(timer.setTimeout, [global, arguments]);
- };
-
- self.setInterval = function(fn, delay, params) {
- if (legacyIE()) {
- if (arguments.length > 2) {
- throw new Error('IE < 9 cannot support extra params to setInterval without a polyfill');
- }
- return timer.setInterval(fn, delay);
- }
- return Function.prototype.apply.apply(timer.setInterval, [global, arguments]);
- };
-
- self.clearTimeout = function(id) {
- return Function.prototype.call.apply(timer.clearTimeout, [global, id]);
- };
-
- self.clearInterval = function(id) {
- return Function.prototype.call.apply(timer.clearInterval, [global, id]);
- };
-
- /**
- * Tick the Clock forward, running any enqueued timeouts along the way
- * @name Clock#tick
- * @function
- * @param {int} millis The number of milliseconds to tick.
- */
- self.tick = function(millis) {
- if (installed) {
- delayedFunctionScheduler.tick(millis, function(millis) { mockDate.tick(millis); });
- } else {
- throw new Error('Mock clock is not installed, use jasmine.clock().install()');
- }
- };
-
- return self;
-
- function originalTimingFunctionsIntact() {
- return global.setTimeout === realTimingFunctions.setTimeout &&
- global.clearTimeout === realTimingFunctions.clearTimeout &&
- global.setInterval === realTimingFunctions.setInterval &&
- global.clearInterval === realTimingFunctions.clearInterval;
- }
-
- function legacyIE() {
- //if these methods are polyfilled, apply will be present
- return !(realTimingFunctions.setTimeout || realTimingFunctions.setInterval).apply;
- }
-
- function replace(dest, source) {
- for (var prop in source) {
- dest[prop] = source[prop];
- }
- }
-
- function setTimeout(fn, delay) {
- return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2));
- }
-
- function clearTimeout(id) {
- return delayedFunctionScheduler.removeFunctionWithId(id);
- }
-
- function setInterval(fn, interval) {
- return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true);
- }
-
- function clearInterval(id) {
- return delayedFunctionScheduler.removeFunctionWithId(id);
- }
-
- function argSlice(argsObj, n) {
- return Array.prototype.slice.call(argsObj, n);
- }
- }
-
- return Clock;
-};
-
-getJasmineRequireObj().DelayedFunctionScheduler = function() {
- function DelayedFunctionScheduler() {
- var self = this;
- var scheduledLookup = [];
- var scheduledFunctions = {};
- var currentTime = 0;
- var delayedFnCount = 0;
-
- self.tick = function(millis, tickDate) {
- millis = millis || 0;
- var endTime = currentTime + millis;
-
- runScheduledFunctions(endTime, tickDate);
- currentTime = endTime;
- };
-
- self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) {
- var f;
- if (typeof(funcToCall) === 'string') {
- /* jshint evil: true */
- f = function() { return eval(funcToCall); };
- /* jshint evil: false */
- } else {
- f = funcToCall;
- }
-
- millis = millis || 0;
- timeoutKey = timeoutKey || ++delayedFnCount;
- runAtMillis = runAtMillis || (currentTime + millis);
-
- var funcToSchedule = {
- runAtMillis: runAtMillis,
- funcToCall: f,
- recurring: recurring,
- params: params,
- timeoutKey: timeoutKey,
- millis: millis
- };
-
- if (runAtMillis in scheduledFunctions) {
- scheduledFunctions[runAtMillis].push(funcToSchedule);
- } else {
- scheduledFunctions[runAtMillis] = [funcToSchedule];
- scheduledLookup.push(runAtMillis);
- scheduledLookup.sort(function (a, b) {
- return a - b;
- });
- }
-
- return timeoutKey;
- };
-
- self.removeFunctionWithId = function(timeoutKey) {
- for (var runAtMillis in scheduledFunctions) {
- var funcs = scheduledFunctions[runAtMillis];
- var i = indexOfFirstToPass(funcs, function (func) {
- return func.timeoutKey === timeoutKey;
- });
-
- if (i > -1) {
- if (funcs.length === 1) {
- delete scheduledFunctions[runAtMillis];
- deleteFromLookup(runAtMillis);
- } else {
- funcs.splice(i, 1);
- }
-
- // intervals get rescheduled when executed, so there's never more
- // than a single scheduled function with a given timeoutKey
- break;
- }
- }
- };
-
- return self;
-
- function indexOfFirstToPass(array, testFn) {
- var index = -1;
-
- for (var i = 0; i < array.length; ++i) {
- if (testFn(array[i])) {
- index = i;
- break;
- }
- }
-
- return index;
- }
-
- function deleteFromLookup(key) {
- var value = Number(key);
- var i = indexOfFirstToPass(scheduledLookup, function (millis) {
- return millis === value;
- });
-
- if (i > -1) {
- scheduledLookup.splice(i, 1);
- }
- }
-
- function reschedule(scheduledFn) {
- self.scheduleFunction(scheduledFn.funcToCall,
- scheduledFn.millis,
- scheduledFn.params,
- true,
- scheduledFn.timeoutKey,
- scheduledFn.runAtMillis + scheduledFn.millis);
- }
-
- function forEachFunction(funcsToRun, callback) {
- for (var i = 0; i < funcsToRun.length; ++i) {
- callback(funcsToRun[i]);
- }
- }
-
- function runScheduledFunctions(endTime, tickDate) {
- tickDate = tickDate || function() {};
- if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
- tickDate(endTime - currentTime);
- return;
- }
-
- do {
- var newCurrentTime = scheduledLookup.shift();
- tickDate(newCurrentTime - currentTime);
-
- currentTime = newCurrentTime;
-
- var funcsToRun = scheduledFunctions[currentTime];
- delete scheduledFunctions[currentTime];
-
- forEachFunction(funcsToRun, function(funcToRun) {
- if (funcToRun.recurring) {
- reschedule(funcToRun);
- }
- });
-
- forEachFunction(funcsToRun, function(funcToRun) {
- funcToRun.funcToCall.apply(null, funcToRun.params || []);
- });
- } while (scheduledLookup.length > 0 &&
- // checking first if we're out of time prevents setTimeout(0)
- // scheduled in a funcToRun from forcing an extra iteration
- currentTime !== endTime &&
- scheduledLookup[0] <= endTime);
-
- // ran out of functions to call, but still time left on the clock
- if (currentTime !== endTime) {
- tickDate(endTime - currentTime);
- }
- }
- }
-
- return DelayedFunctionScheduler;
-};
-
-getJasmineRequireObj().errors = function() {
- function ExpectationFailed() {}
-
- ExpectationFailed.prototype = new Error();
- ExpectationFailed.prototype.constructor = ExpectationFailed;
-
- return {
- ExpectationFailed: ExpectationFailed
- };
-};
-getJasmineRequireObj().ExceptionFormatter = function() {
- function ExceptionFormatter() {
- this.message = function(error) {
- var message = '';
-
- if (error.name && error.message) {
- message += error.name + ': ' + error.message;
- } else {
- message += error.toString() + ' thrown';
- }
-
- if (error.fileName || error.sourceURL) {
- message += ' in ' + (error.fileName || error.sourceURL);
- }
-
- if (error.line || error.lineNumber) {
- message += ' (line ' + (error.line || error.lineNumber) + ')';
- }
-
- return message;
- };
-
- this.stack = function(error) {
- return error ? error.stack : null;
- };
- }
-
- return ExceptionFormatter;
-};
-
-getJasmineRequireObj().Expectation = function() {
-
- /**
- * Matchers that come with Jasmine out of the box.
- * @namespace matchers
- */
- function Expectation(options) {
- this.util = options.util || { buildFailureMessage: function() {} };
- this.customEqualityTesters = options.customEqualityTesters || [];
- this.actual = options.actual;
- this.addExpectationResult = options.addExpectationResult || function(){};
- this.isNot = options.isNot;
-
- var customMatchers = options.customMatchers || {};
- for (var matcherName in customMatchers) {
- this[matcherName] = Expectation.prototype.wrapCompare(matcherName, customMatchers[matcherName]);
- }
- }
-
- Expectation.prototype.wrapCompare = function(name, matcherFactory) {
- return function() {
- var args = Array.prototype.slice.call(arguments, 0),
- expected = args.slice(0),
- message = '';
-
- args.unshift(this.actual);
-
- var matcher = matcherFactory(this.util, this.customEqualityTesters),
- matcherCompare = matcher.compare;
-
- function defaultNegativeCompare() {
- var result = matcher.compare.apply(null, args);
- result.pass = !result.pass;
- return result;
- }
-
- if (this.isNot) {
- matcherCompare = matcher.negativeCompare || defaultNegativeCompare;
- }
-
- var result = matcherCompare.apply(null, args);
-
- if (!result.pass) {
- if (!result.message) {
- args.unshift(this.isNot);
- args.unshift(name);
- message = this.util.buildFailureMessage.apply(null, args);
- } else {
- if (Object.prototype.toString.apply(result.message) === '[object Function]') {
- message = result.message();
- } else {
- message = result.message;
- }
- }
- }
-
- if (expected.length == 1) {
- expected = expected[0];
- }
-
- // TODO: how many of these params are needed?
- this.addExpectationResult(
- result.pass,
- {
- matcherName: name,
- passed: result.pass,
- message: message,
- error: result.error,
- actual: this.actual,
- expected: expected // TODO: this may need to be arrayified/sliced
- }
- );
- };
- };
-
- Expectation.addCoreMatchers = function(matchers) {
- var prototype = Expectation.prototype;
- for (var matcherName in matchers) {
- var matcher = matchers[matcherName];
- prototype[matcherName] = prototype.wrapCompare(matcherName, matcher);
- }
- };
-
- Expectation.Factory = function(options) {
- options = options || {};
-
- var expect = new Expectation(options);
-
- // TODO: this would be nice as its own Object - NegativeExpectation
- // TODO: copy instead of mutate options
- options.isNot = true;
- expect.not = new Expectation(options);
-
- return expect;
- };
-
- return Expectation;
-};
-
-//TODO: expectation result may make more sense as a presentation of an expectation.
-getJasmineRequireObj().buildExpectationResult = function() {
- function buildExpectationResult(options) {
- var messageFormatter = options.messageFormatter || function() {},
- stackFormatter = options.stackFormatter || function() {};
-
- var result = {
- matcherName: options.matcherName,
- message: message(),
- stack: stack(),
- passed: options.passed
- };
-
- if(!result.passed) {
- result.expected = options.expected;
- result.actual = options.actual;
- }
-
- return result;
-
- function message() {
- if (options.passed) {
- return 'Passed.';
- } else if (options.message) {
- return options.message;
- } else if (options.error) {
- return messageFormatter(options.error);
- }
- return '';
- }
-
- function stack() {
- if (options.passed) {
- return '';
- }
-
- var error = options.error;
- if (!error) {
- try {
- throw new Error(message());
- } catch (e) {
- error = e;
- }
- }
- return stackFormatter(error);
- }
- }
-
- return buildExpectationResult;
-};
-
-getJasmineRequireObj().formatErrorMsg = function() {
- function generateErrorMsg(domain, usage) {
- var usageDefinition = usage ? '\nUsage: ' + usage : '';
-
- return function errorMsg(msg) {
- return domain + ' : ' + msg + usageDefinition;
- };
- }
-
- return generateErrorMsg;
-};
-
-getJasmineRequireObj().GlobalErrors = function(j$) {
- function GlobalErrors(global) {
- var handlers = [];
- global = global || j$.getGlobal();
-
- var onerror = function onerror() {
- var handler = handlers[handlers.length - 1];
-
- if (handler) {
- handler.apply(null, Array.prototype.slice.call(arguments, 0));
- } else {
- throw arguments[0];
- }
- };
-
- this.uninstall = function noop() {};
-
- this.install = function install() {
- if (global.process && global.process.listeners && j$.isFunction_(global.process.on)) {
- var originalHandlers = global.process.listeners('uncaughtException');
- global.process.removeAllListeners('uncaughtException');
- global.process.on('uncaughtException', onerror);
-
- this.uninstall = function uninstall() {
- global.process.removeListener('uncaughtException', onerror);
- for (var i = 0; i < originalHandlers.length; i++) {
- global.process.on('uncaughtException', originalHandlers[i]);
- }
- };
- } else {
- var originalHandler = global.onerror;
- global.onerror = onerror;
-
- this.uninstall = function uninstall() {
- global.onerror = originalHandler;
- };
- }
- };
-
- this.pushListener = function pushListener(listener) {
- handlers.push(listener);
- };
-
- this.popListener = function popListener() {
- handlers.pop();
- };
- }
-
- return GlobalErrors;
-};
-
-getJasmineRequireObj().DiffBuilder = function(j$) {
- return function DiffBuilder() {
- var path = new j$.ObjectPath(),
- mismatches = [];
-
- return {
- record: function (actual, expected, formatter) {
- formatter = formatter || defaultFormatter;
- mismatches.push(formatter(actual, expected, path));
- },
-
- getMessage: function () {
- return mismatches.join('\n');
- },
-
- withPath: function (pathComponent, block) {
- var oldPath = path;
- path = path.add(pathComponent);
- block();
- path = oldPath;
- }
- };
-
- function defaultFormatter (actual, expected, path) {
- return 'Expected ' +
- path + (path.depth() ? ' = ' : '') +
- j$.pp(actual) +
- ' to equal ' +
- j$.pp(expected) +
- '.';
- }
- };
-};
-
-getJasmineRequireObj().matchersUtil = function(j$) {
- // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter?
-
- return {
- equals: equals,
-
- contains: function(haystack, needle, customTesters) {
- customTesters = customTesters || [];
-
- if ((Object.prototype.toString.apply(haystack) === '[object Set]')) {
- return haystack.has(needle);
- }
-
- if ((Object.prototype.toString.apply(haystack) === '[object Array]') ||
- (!!haystack && !haystack.indexOf))
- {
- for (var i = 0; i < haystack.length; i++) {
- if (equals(haystack[i], needle, customTesters)) {
- return true;
- }
- }
- return false;
- }
-
- return !!haystack && haystack.indexOf(needle) >= 0;
- },
-
- buildFailureMessage: function() {
- var args = Array.prototype.slice.call(arguments, 0),
- matcherName = args[0],
- isNot = args[1],
- actual = args[2],
- expected = args.slice(3),
- englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); });
-
- var message = 'Expected ' +
- j$.pp(actual) +
- (isNot ? ' not ' : ' ') +
- englishyPredicate;
-
- if (expected.length > 0) {
- for (var i = 0; i < expected.length; i++) {
- if (i > 0) {
- message += ',';
- }
- message += ' ' + j$.pp(expected[i]);
- }
- }
-
- return message + '.';
- }
- };
-
- function isAsymmetric(obj) {
- return obj && j$.isA_('Function', obj.asymmetricMatch);
- }
-
- function asymmetricMatch(a, b, customTesters, diffBuilder) {
- var asymmetricA = isAsymmetric(a),
- asymmetricB = isAsymmetric(b),
- result;
-
- if (asymmetricA && asymmetricB) {
- return undefined;
- }
-
- if (asymmetricA) {
- result = a.asymmetricMatch(b, customTesters);
- diffBuilder.record(a, b);
- return result;
- }
-
- if (asymmetricB) {
- result = b.asymmetricMatch(a, customTesters);
- diffBuilder.record(a, b);
- return result;
- }
- }
-
- function equals(a, b, customTesters, diffBuilder) {
- customTesters = customTesters || [];
- diffBuilder = diffBuilder || j$.NullDiffBuilder();
-
- return eq(a, b, [], [], customTesters, diffBuilder);
- }
-
- // Equality function lovingly adapted from isEqual in
- // [Underscore](http://underscorejs.org)
- function eq(a, b, aStack, bStack, customTesters, diffBuilder) {
- var result = true, i;
-
- var asymmetricResult = asymmetricMatch(a, b, customTesters, diffBuilder);
- if (!j$.util.isUndefined(asymmetricResult)) {
- return asymmetricResult;
- }
-
- for (i = 0; i < customTesters.length; i++) {
- var customTesterResult = customTesters[i](a, b);
- if (!j$.util.isUndefined(customTesterResult)) {
- if (!customTesterResult) {
- diffBuilder.record(a, b);
- }
- return customTesterResult;
- }
- }
-
- if (a instanceof Error && b instanceof Error) {
- result = a.message == b.message;
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- }
-
- // Identical objects are equal. `0 === -0`, but they aren't identical.
- // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
- if (a === b) {
- result = a !== 0 || 1 / a == 1 / b;
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- }
- // A strict comparison is necessary because `null == undefined`.
- if (a === null || b === null) {
- result = a === b;
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- }
- var className = Object.prototype.toString.call(a);
- if (className != Object.prototype.toString.call(b)) {
- diffBuilder.record(a, b);
- return false;
- }
- switch (className) {
- // Strings, numbers, dates, and booleans are compared by value.
- case '[object String]':
- // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
- // equivalent to `new String("5")`.
- result = a == String(b);
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- case '[object Number]':
- // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
- // other numeric values.
- result = a != +a ? b != +b : (a === 0 ? 1 / a == 1 / b : a == +b);
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- case '[object Date]':
- case '[object Boolean]':
- // Coerce dates and booleans to numeric primitive values. Dates are compared by their
- // millisecond representations. Note that invalid dates with millisecond representations
- // of `NaN` are not equivalent.
- result = +a == +b;
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- // RegExps are compared by their source patterns and flags.
- case '[object RegExp]':
- return a.source == b.source &&
- a.global == b.global &&
- a.multiline == b.multiline &&
- a.ignoreCase == b.ignoreCase;
- }
- if (typeof a != 'object' || typeof b != 'object') {
- diffBuilder.record(a, b);
- return false;
- }
-
- var aIsDomNode = j$.isDomNode(a);
- var bIsDomNode = j$.isDomNode(b);
- if (aIsDomNode && bIsDomNode) {
- // At first try to use DOM3 method isEqualNode
- if (a.isEqualNode) {
- result = a.isEqualNode(b);
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- }
- // IE8 doesn't support isEqualNode, try to use outerHTML && innerText
- var aIsElement = a instanceof Element;
- var bIsElement = b instanceof Element;
- if (aIsElement && bIsElement) {
- result = a.outerHTML == b.outerHTML;
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- }
- if (aIsElement || bIsElement) {
- diffBuilder.record(a, b);
- return false;
- }
- result = a.innerText == b.innerText && a.textContent == b.textContent;
- if (!result) {
- diffBuilder.record(a, b);
- }
- return result;
- }
- if (aIsDomNode || bIsDomNode) {
- diffBuilder.record(a, b);
- return false;
- }
-
- // Assume equality for cyclic structures. The algorithm for detecting cyclic
- // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
- var length = aStack.length;
- while (length--) {
- // Linear search. Performance is inversely proportional to the number of
- // unique nested structures.
- if (aStack[length] == a) { return bStack[length] == b; }
- }
- // Add the first object to the stack of traversed objects.
- aStack.push(a);
- bStack.push(b);
- var size = 0;
- // Recursively compare objects and arrays.
- // Compare array lengths to determine if a deep comparison is necessary.
- if (className == '[object Array]') {
- size = a.length;
- if (size !== b.length) {
- diffBuilder.record(a, b);
- return false;
- }
-
- for (i = 0; i < size; i++) {
- diffBuilder.withPath(i, function() {
- result = eq(a[i], b[i], aStack, bStack, customTesters, diffBuilder) && result;
- });
- }
- if (!result) {
- return false;
- }
- } else if (className == '[object Set]') {
- if (a.size != b.size) {
- diffBuilder.record(a, b);
- return false;
- }
- var iterA = a.values(), iterB = b.values();
- var valA, valB;
- do {
- valA = iterA.next();
- valB = iterB.next();
- if (!eq(valA.value, valB.value, aStack, bStack, customTesters, j$.NullDiffBuilder())) {
- diffBuilder.record(a, b);
- return false;
- }
- } while (!valA.done && !valB.done);
- } else {
-
- // Objects with different constructors are not equivalent, but `Object`s
- // or `Array`s from different frames are.
- var aCtor = a.constructor, bCtor = b.constructor;
- if (aCtor !== bCtor &&
- isFunction(aCtor) && isFunction(bCtor) &&
- a instanceof aCtor && b instanceof bCtor &&
- !(aCtor instanceof aCtor && bCtor instanceof bCtor)) {
-
- diffBuilder.record(a, b, constructorsAreDifferentFormatter);
- return false;
- }
- }
-
- // Deep compare objects.
- var aKeys = keys(a, className == '[object Array]'), key;
- size = aKeys.length;
-
- // Ensure that both objects contain the same number of properties before comparing deep equality.
- if (keys(b, className == '[object Array]').length !== size) {
- diffBuilder.record(a, b, objectKeysAreDifferentFormatter);
- return false;
- }
-
- for (i = 0; i < size; i++) {
- key = aKeys[i];
- // Deep compare each member
- if (!j$.util.has(b, key)) {
- diffBuilder.record(a, b, objectKeysAreDifferentFormatter);
- result = false;
- continue;
- }
-
- diffBuilder.withPath(key, function() {
- if(!eq(a[key], b[key], aStack, bStack, customTesters, diffBuilder)) {
- result = false;
- }
- });
- }
-
- if (!result) {
- return false;
- }
-
- // Remove the first object from the stack of traversed objects.
- aStack.pop();
- bStack.pop();
-
- return result;
- }
-
- function keys(obj, isArray) {
- var allKeys = Object.keys ? Object.keys(obj) :
- (function(o) {
- var keys = [];
- for (var key in o) {
- if (j$.util.has(o, key)) {
- keys.push(key);
- }
- }
- return keys;
- })(obj);
-
- if (!isArray) {
- return allKeys;
- }
-
- if (allKeys.length === 0) {
- return allKeys;
- }
-
- var extraKeys = [];
- for (var i = 0; i < allKeys.length; i++) {
- if (!/^[0-9]+$/.test(allKeys[i])) {
- extraKeys.push(allKeys[i]);
- }
- }
-
- return extraKeys;
- }
-
- function has(obj, key) {
- return Object.prototype.hasOwnProperty.call(obj, key);
- }
-
- function isFunction(obj) {
- return typeof obj === 'function';
- }
-
- function objectKeysAreDifferentFormatter(actual, expected, path) {
- var missingProperties = j$.util.objectDifference(expected, actual),
- extraProperties = j$.util.objectDifference(actual, expected),
- missingPropertiesMessage = formatKeyValuePairs(missingProperties),
- extraPropertiesMessage = formatKeyValuePairs(extraProperties),
- messages = [];
-
- if (!path.depth()) {
- path = 'object';
- }
-
- if (missingPropertiesMessage.length) {
- messages.push('Expected ' + path + ' to have properties' + missingPropertiesMessage);
- }
-
- if (extraPropertiesMessage.length) {
- messages.push('Expected ' + path + ' not to have properties' + extraPropertiesMessage);
- }
-
- return messages.join('\n');
- }
-
- function constructorsAreDifferentFormatter(actual, expected, path) {
- if (!path.depth()) {
- path = 'object';
- }
-
- return 'Expected ' +
- path + ' to be a kind of ' +
- j$.fnNameFor(expected.constructor) +
- ', but was ' + j$.pp(actual) + '.';
- }
-
- function formatKeyValuePairs(obj) {
- var formatted = '';
- for (var key in obj) {
- formatted += '\n ' + key + ': ' + j$.pp(obj[key]);
- }
- return formatted;
- }
-};
-
-getJasmineRequireObj().NullDiffBuilder = function(j$) {
- return function() {
- return {
- withPath: function(_, block) {
- block();
- },
- record: function() {}
- };
- };
-};
-
-getJasmineRequireObj().ObjectPath = function(j$) {
- function ObjectPath(components) {
- this.components = components || [];
- }
-
- ObjectPath.prototype.toString = function() {
- if (this.components.length) {
- return '$' + map(this.components, formatPropertyAccess).join('');
- } else {
- return '';
- }
- };
-
- ObjectPath.prototype.add = function(component) {
- return new ObjectPath(this.components.concat([component]));
- };
-
- ObjectPath.prototype.depth = function() {
- return this.components.length;
- };
-
- function formatPropertyAccess(prop) {
- if (typeof prop === 'number') {
- return '[' + prop + ']';
- }
-
- if (isValidIdentifier(prop)) {
- return '.' + prop;
- }
-
- return '[\'' + prop + '\']';
- }
-
- function map(array, fn) {
- var results = [];
- for (var i = 0; i < array.length; i++) {
- results.push(fn(array[i]));
- }
- return results;
- }
-
- function isValidIdentifier(string) {
- return /^[A-Za-z\$_][A-Za-z0-9\$_]*$/.test(string);
- }
-
- return ObjectPath;
-};
-
-getJasmineRequireObj().toBe = function() {
- /**
- * {@link expect} the actual value to be `===` to the expected value.
- * @function
- * @name matchers#toBe
- * @param {Object} expected - The expected value to compare against.
- * @example
- * expect(thing).toBe(realThing);
- */
- function toBe() {
- return {
- compare: function(actual, expected) {
- return {
- pass: actual === expected
- };
- }
- };
- }
-
- return toBe;
-};
-
-getJasmineRequireObj().toBeCloseTo = function() {
- /**
- * {@link expect} the actual value to be within a specified precision of the expected value.
- * @function
- * @name matchers#toBeCloseTo
- * @param {Object} expected - The expected value to compare against.
- * @param {Number} [precision=2] - The number of decimal points to check.
- * @example
- * expect(number).toBeCloseTo(42.2, 3);
- */
- function toBeCloseTo() {
- return {
- compare: function(actual, expected, precision) {
- if (precision !== 0) {
- precision = precision || 2;
- }
-
- return {
- pass: Math.abs(expected - actual) < (Math.pow(10, -precision) / 2)
- };
- }
- };
- }
-
- return toBeCloseTo;
-};
-
-getJasmineRequireObj().toBeDefined = function() {
- /**
- * {@link expect} the actual value to be defined. (Not `undefined`)
- * @function
- * @name matchers#toBeDefined
- * @example
- * expect(result).toBeDefined();
- */
- function toBeDefined() {
- return {
- compare: function(actual) {
- return {
- pass: (void 0 !== actual)
- };
- }
- };
- }
-
- return toBeDefined;
-};
-
-getJasmineRequireObj().toBeFalsy = function() {
- /**
- * {@link expect} the actual value to be falsy
- * @function
- * @name matchers#toBeFalsy
- * @example
- * expect(result).toBeFalsy();
- */
- function toBeFalsy() {
- return {
- compare: function(actual) {
- return {
- pass: !!!actual
- };
- }
- };
- }
-
- return toBeFalsy;
-};
-
-getJasmineRequireObj().toBeGreaterThan = function() {
- /**
- * {@link expect} the actual value to be greater than the expected value.
- * @function
- * @name matchers#toBeGreaterThan
- * @param {Number} expected - The value to compare against.
- * @example
- * expect(result).toBeGreaterThan(3);
- */
- function toBeGreaterThan() {
- return {
- compare: function(actual, expected) {
- return {
- pass: actual > expected
- };
- }
- };
- }
-
- return toBeGreaterThan;
-};
-
-
-getJasmineRequireObj().toBeGreaterThanOrEqual = function() {
- /**
- * {@link expect} the actual value to be greater than or equal to the expected value.
- * @function
- * @name matchers#toBeGreaterThanOrEqual
- * @param {Number} expected - The expected value to compare against.
- * @example
- * expect(result).toBeGreaterThanOrEqual(25);
- */
- function toBeGreaterThanOrEqual() {
- return {
- compare: function(actual, expected) {
- return {
- pass: actual >= expected
- };
- }
- };
- }
-
- return toBeGreaterThanOrEqual;
-};
-
-getJasmineRequireObj().toBeLessThan = function() {
- /**
- * {@link expect} the actual value to be less than the expected value.
- * @function
- * @name matchers#toBeLessThan
- * @param {Number} expected - The expected value to compare against.
- * @example
- * expect(result).toBeLessThan(0);
- */
- function toBeLessThan() {
- return {
-
- compare: function(actual, expected) {
- return {
- pass: actual < expected
- };
- }
- };
- }
-
- return toBeLessThan;
-};
-
-getJasmineRequireObj().toBeLessThanOrEqual = function() {
- /**
- * {@link expect} the actual value to be less than or equal to the expected value.
- * @function
- * @name matchers#toBeLessThanOrEqual
- * @param {Number} expected - The expected value to compare against.
- * @example
- * expect(result).toBeLessThanOrEqual(123);
- */
- function toBeLessThanOrEqual() {
- return {
-
- compare: function(actual, expected) {
- return {
- pass: actual <= expected
- };
- }
- };
- }
-
- return toBeLessThanOrEqual;
-};
-
-getJasmineRequireObj().toBeNaN = function(j$) {
- /**
- * {@link expect} the actual value to be `NaN` (Not a Number).
- * @function
- * @name matchers#toBeNaN
- * @example
- * expect(thing).toBeNaN();
- */
- function toBeNaN() {
- return {
- compare: function(actual) {
- var result = {
- pass: (actual !== actual)
- };
-
- if (result.pass) {
- result.message = 'Expected actual not to be NaN.';
- } else {
- result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be NaN.'; };
- }
-
- return result;
- }
- };
- }
-
- return toBeNaN;
-};
-
-getJasmineRequireObj().toBeNegativeInfinity = function(j$) {
- /**
- * {@link expect} the actual value to be `-Infinity` (-infinity).
- * @function
- * @name matchers#toBeNegativeInfinity
- * @example
- * expect(thing).toBeNegativeInfinity();
- */
- function toBeNegativeInfinity() {
- return {
- compare: function(actual) {
- var result = {
- pass: (actual === Number.NEGATIVE_INFINITY)
- };
-
- if (result.pass) {
- result.message = 'Expected actual to be -Infinity.';
- } else {
- result.message = function() { return 'Expected ' + j$.pp(actual) + ' not to be -Infinity.'; };
- }
-
- return result;
- }
- };
- }
-
- return toBeNegativeInfinity;
-};
-
-getJasmineRequireObj().toBeNull = function() {
- /**
- * {@link expect} the actual value to be `null`.
- * @function
- * @name matchers#toBeNull
- * @example
- * expect(result).toBeNull();
- */
- function toBeNull() {
- return {
- compare: function(actual) {
- return {
- pass: actual === null
- };
- }
- };
- }
-
- return toBeNull;
-};
-
-getJasmineRequireObj().toBePositiveInfinity = function(j$) {
- /**
- * {@link expect} the actual value to be `Infinity` (infinity).
- * @function
- * @name matchers#toBePositiveInfinity
- * @example
- * expect(thing).toBePositiveInfinity();
- */
- function toBePositiveInfinity() {
- return {
- compare: function(actual) {
- var result = {
- pass: (actual === Number.POSITIVE_INFINITY)
- };
-
- if (result.pass) {
- result.message = 'Expected actual to be Infinity.';
- } else {
- result.message = function() { return 'Expected ' + j$.pp(actual) + ' not to be Infinity.'; };
- }
-
- return result;
- }
- };
- }
-
- return toBePositiveInfinity;
-};
-
-getJasmineRequireObj().toBeTruthy = function() {
- /**
- * {@link expect} the actual value to be truthy.
- * @function
- * @name matchers#toBeTruthy
- * @example
- * expect(thing).toBeTruthy();
- */
- function toBeTruthy() {
- return {
- compare: function(actual) {
- return {
- pass: !!actual
- };
- }
- };
- }
-
- return toBeTruthy;
-};
-
-getJasmineRequireObj().toBeUndefined = function() {
- /**
- * {@link expect} the actual value to be `undefined`.
- * @function
- * @name matchers#toBeUndefined
- * @example
- * expect(result).toBeUndefined():
- */
- function toBeUndefined() {
- return {
- compare: function(actual) {
- return {
- pass: void 0 === actual
- };
- }
- };
- }
-
- return toBeUndefined;
-};
-
-getJasmineRequireObj().toContain = function() {
- /**
- * {@link expect} the actual value to contain a specific value.
- * @function
- * @name matchers#toContain
- * @param {Object} expected - The value to look for.
- * @example
- * expect(array).toContain(anElement);
- * expect(string).toContain(substring);
- */
- function toContain(util, customEqualityTesters) {
- customEqualityTesters = customEqualityTesters || [];
-
- return {
- compare: function(actual, expected) {
-
- return {
- pass: util.contains(actual, expected, customEqualityTesters)
- };
- }
- };
- }
-
- return toContain;
-};
-
-getJasmineRequireObj().toEqual = function(j$) {
- /**
- * {@link expect} the actual value to be equal to the expected, using deep equality comparison.
- * @function
- * @name matchers#toEqual
- * @param {Object} expected - Expected value
- * @example
- * expect(bigObject).toEqual({"foo": ['bar', 'baz']});
- */
- function toEqual(util, customEqualityTesters) {
- customEqualityTesters = customEqualityTesters || [];
-
- return {
- compare: function(actual, expected) {
- var result = {
- pass: false
- },
- diffBuilder = j$.DiffBuilder();
-
- result.pass = util.equals(actual, expected, customEqualityTesters, diffBuilder);
-
- // TODO: only set error message if test fails
- result.message = diffBuilder.getMessage();
-
- return result;
- }
- };
- }
-
- return toEqual;
-};
-
-getJasmineRequireObj().toHaveBeenCalled = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalled()');
-
- /**
- * {@link expect} the actual (a {@link Spy}) to have been called.
- * @function
- * @name matchers#toHaveBeenCalled
- * @example
- * expect(mySpy).toHaveBeenCalled();
- * expect(mySpy).not.toHaveBeenCalled();
- */
- function toHaveBeenCalled() {
- return {
- compare: function(actual) {
- var result = {};
-
- if (!j$.isSpy(actual)) {
- throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.'));
- }
-
- if (arguments.length > 1) {
- throw new Error(getErrorMsg('Does not take arguments, use toHaveBeenCalledWith'));
- }
-
- result.pass = actual.calls.any();
-
- result.message = result.pass ?
- 'Expected spy ' + actual.and.identity() + ' not to have been called.' :
- 'Expected spy ' + actual.and.identity() + ' to have been called.';
-
- return result;
- }
- };
- }
-
- return toHaveBeenCalled;
-};
-
-getJasmineRequireObj().toHaveBeenCalledBefore = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalledBefore()');
-
- /**
- * {@link expect} the actual value (a {@link Spy}) to have been called before another {@link Spy}.
- * @function
- * @name matchers#toHaveBeenCalledBefore
- * @param {Spy} expected - {@link Spy} that should have been called after the `actual` {@link Spy}.
- * @example
- * expect(mySpy).toHaveBeenCalledBefore(otherSpy);
- */
- function toHaveBeenCalledBefore() {
- return {
- compare: function(firstSpy, latterSpy) {
- if (!j$.isSpy(firstSpy)) {
- throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(firstSpy) + '.'));
- }
- if (!j$.isSpy(latterSpy)) {
- throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(latterSpy) + '.'));
- }
-
- var result = { pass: false };
-
- if (!firstSpy.calls.count()) {
- result.message = 'Expected spy ' + firstSpy.and.identity() + ' to have been called.';
- return result;
- }
- if (!latterSpy.calls.count()) {
- result.message = 'Expected spy ' + latterSpy.and.identity() + ' to have been called.';
- return result;
- }
-
- var latest1stSpyCall = firstSpy.calls.mostRecent().invocationOrder;
- var first2ndSpyCall = latterSpy.calls.first().invocationOrder;
-
- result.pass = latest1stSpyCall < first2ndSpyCall;
-
- if (result.pass) {
- result.message = 'Expected spy ' + firstSpy.and.identity() + ' to not have been called before spy ' + latterSpy.and.identity() + ', but it was';
- } else {
- var first1stSpyCall = firstSpy.calls.first().invocationOrder;
- var latest2ndSpyCall = latterSpy.calls.mostRecent().invocationOrder;
-
- if(first1stSpyCall < first2ndSpyCall) {
- result.message = 'Expected latest call to spy ' + firstSpy.and.identity() + ' to have been called before first call to spy ' + latterSpy.and.identity() + ' (no interleaved calls)';
- } else if (latest2ndSpyCall > latest1stSpyCall) {
- result.message = 'Expected first call to spy ' + latterSpy.and.identity() + ' to have been called after latest call to spy ' + firstSpy.and.identity() + ' (no interleaved calls)';
- } else {
- result.message = 'Expected spy ' + firstSpy.and.identity() + ' to have been called before spy ' + latterSpy.and.identity();
- }
- }
-
- return result;
- }
- };
- }
-
- return toHaveBeenCalledBefore;
-};
-
-getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalledTimes()');
-
- /**
- * {@link expect} the actual (a {@link Spy}) to have been called the specified number of times.
- * @function
- * @name matchers#toHaveBeenCalledTimes
- * @param {Number} expected - The number of invocations to look for.
- * @example
- * expect(mySpy).toHaveBeenCalledTimes(3);
- */
- function toHaveBeenCalledTimes() {
- return {
- compare: function(actual, expected) {
- if (!j$.isSpy(actual)) {
- throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.'));
- }
-
- var args = Array.prototype.slice.call(arguments, 0),
- result = { pass: false };
-
- if (!j$.isNumber_(expected)){
- throw new Error(getErrorMsg('The expected times failed is a required argument and must be a number.'));
- }
-
- actual = args[0];
- var calls = actual.calls.count();
- var timesMessage = expected === 1 ? 'once' : expected + ' times';
- result.pass = calls === expected;
- result.message = result.pass ?
- 'Expected spy ' + actual.and.identity() + ' not to have been called ' + timesMessage + '. It was called ' + calls + ' times.' :
- 'Expected spy ' + actual.and.identity() + ' to have been called ' + timesMessage + '. It was called ' + calls + ' times.';
- return result;
- }
- };
- }
-
- return toHaveBeenCalledTimes;
-};
-
-getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect().toHaveBeenCalledWith(...arguments)');
-
- /**
- * {@link expect} the actual (a {@link Spy}) to have been called with particular arguments at least once.
- * @function
- * @name matchers#toHaveBeenCalledWith
- * @param {...Object} - The arguments to look for
- * @example
- * expect(mySpy).toHaveBeenCalledWith('foo', 'bar', 2);
- */
- function toHaveBeenCalledWith(util, customEqualityTesters) {
- return {
- compare: function() {
- var args = Array.prototype.slice.call(arguments, 0),
- actual = args[0],
- expectedArgs = args.slice(1),
- result = { pass: false };
-
- if (!j$.isSpy(actual)) {
- throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.'));
- }
-
- if (!actual.calls.any()) {
- result.message = function() { return 'Expected spy ' + actual.and.identity() + ' to have been called with ' + j$.pp(expectedArgs) + ' but it was never called.'; };
- return result;
- }
-
- if (util.contains(actual.calls.allArgs(), expectedArgs, customEqualityTesters)) {
- result.pass = true;
- result.message = function() { return 'Expected spy ' + actual.and.identity() + ' not to have been called with ' + j$.pp(expectedArgs) + ' but it was.'; };
- } else {
- result.message = function() { return 'Expected spy ' + actual.and.identity() + ' to have been called with ' + j$.pp(expectedArgs) + ' but actual calls were ' + j$.pp(actual.calls.allArgs()).replace(/^\[ | \]$/g, '') + '.'; };
- }
-
- return result;
- }
- };
- }
-
- return toHaveBeenCalledWith;
-};
-
-getJasmineRequireObj().toMatch = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect().toMatch( || )');
-
- /**
- * {@link expect} the actual value to match a regular expression
- * @function
- * @name matchers#toMatch
- * @param {RegExp|String} expected - Value to look for in the string.
- * @example
- * expect("my string").toMatch(/string$/);
- * expect("other string").toMatch("her");
- */
- function toMatch() {
- return {
- compare: function(actual, expected) {
- if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
- throw new Error(getErrorMsg('Expected is not a String or a RegExp'));
- }
-
- var regexp = new RegExp(expected);
-
- return {
- pass: regexp.test(actual)
- };
- }
- };
- }
-
- return toMatch;
-};
-
-getJasmineRequireObj().toThrow = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect(function() {}).toThrow()');
-
- /**
- * {@link expect} a function to `throw` something.
- * @function
- * @name matchers#toThrow
- * @param {Object} [expected] - Value that should be thrown. If not provided, simply the fact that something was thrown will be checked.
- * @example
- * expect(function() { return 'things'; }).toThrow('foo');
- * expect(function() { return 'stuff'; }).toThrow();
- */
- function toThrow(util) {
- return {
- compare: function(actual, expected) {
- var result = { pass: false },
- threw = false,
- thrown;
-
- if (typeof actual != 'function') {
- throw new Error(getErrorMsg('Actual is not a Function'));
- }
-
- try {
- actual();
- } catch (e) {
- threw = true;
- thrown = e;
- }
-
- if (!threw) {
- result.message = 'Expected function to throw an exception.';
- return result;
- }
-
- if (arguments.length == 1) {
- result.pass = true;
- result.message = function() { return 'Expected function not to throw, but it threw ' + j$.pp(thrown) + '.'; };
-
- return result;
- }
-
- if (util.equals(thrown, expected)) {
- result.pass = true;
- result.message = function() { return 'Expected function not to throw ' + j$.pp(expected) + '.'; };
- } else {
- result.message = function() { return 'Expected function to throw ' + j$.pp(expected) + ', but it threw ' + j$.pp(thrown) + '.'; };
- }
-
- return result;
- }
- };
- }
-
- return toThrow;
-};
-
-getJasmineRequireObj().toThrowError = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'expect(function() {}).toThrowError(, )');
-
- /**
- * {@link expect} a function to `throw` an `Error`.
- * @function
- * @name matchers#toThrowError
- * @param {Error} [expected] - `Error` constructor the object that was thrown needs to be an instance of. If not provided, `Error` will be used.
- * @param {RegExp|String} [message] - The message that should be set on the thrown `Error`
- * @example
- * expect(function() { return 'things'; }).toThrowError(MyCustomError, 'message');
- * expect(function() { return 'things'; }).toThrowError(MyCustomError, /bar/);
- * expect(function() { return 'stuff'; }).toThrowError(MyCustomError);
- * expect(function() { return 'other'; }).toThrowError(/foo/);
- * expect(function() { return 'other'; }).toThrowError();
- */
- function toThrowError () {
- return {
- compare: function(actual) {
- var threw = false,
- pass = {pass: true},
- fail = {pass: false},
- thrown;
-
- if (typeof actual != 'function') {
- throw new Error(getErrorMsg('Actual is not a Function'));
- }
-
- var errorMatcher = getMatcher.apply(null, arguments);
-
- try {
- actual();
- } catch (e) {
- threw = true;
- thrown = e;
- }
-
- if (!threw) {
- fail.message = 'Expected function to throw an Error.';
- return fail;
- }
-
- // Get Error constructor of thrown
- if (!isErrorObject(thrown)) {
- fail.message = function() { return 'Expected function to throw an Error, but it threw ' + j$.pp(thrown) + '.'; };
- return fail;
- }
-
- if (errorMatcher.hasNoSpecifics()) {
- pass.message = 'Expected function not to throw an Error, but it threw ' + j$.fnNameFor(thrown) + '.';
- return pass;
- }
-
- if (errorMatcher.matches(thrown)) {
- pass.message = function() {
- return 'Expected function not to throw ' + errorMatcher.errorTypeDescription + errorMatcher.messageDescription() + '.';
- };
- return pass;
- } else {
- fail.message = function() {
- return 'Expected function to throw ' + errorMatcher.errorTypeDescription + errorMatcher.messageDescription() +
- ', but it threw ' + errorMatcher.thrownDescription(thrown) + '.';
- };
- return fail;
- }
- }
- };
-
- function getMatcher() {
- var expected = null,
- errorType = null;
-
- if (arguments.length == 2) {
- expected = arguments[1];
- if (isAnErrorType(expected)) {
- errorType = expected;
- expected = null;
- }
- } else if (arguments.length > 2) {
- errorType = arguments[1];
- expected = arguments[2];
- if (!isAnErrorType(errorType)) {
- throw new Error(getErrorMsg('Expected error type is not an Error.'));
- }
- }
-
- if (expected && !isStringOrRegExp(expected)) {
- if (errorType) {
- throw new Error(getErrorMsg('Expected error message is not a string or RegExp.'));
- } else {
- throw new Error(getErrorMsg('Expected is not an Error, string, or RegExp.'));
- }
- }
-
- function messageMatch(message) {
- if (typeof expected == 'string') {
- return expected == message;
- } else {
- return expected.test(message);
- }
- }
-
- return {
- errorTypeDescription: errorType ? j$.fnNameFor(errorType) : 'an exception',
- thrownDescription: function(thrown) {
- var thrownName = errorType ? j$.fnNameFor(thrown.constructor) : 'an exception',
- thrownMessage = '';
-
- if (expected) {
- thrownMessage = ' with message ' + j$.pp(thrown.message);
- }
-
- return thrownName + thrownMessage;
- },
- messageDescription: function() {
- if (expected === null) {
- return '';
- } else if (expected instanceof RegExp) {
- return ' with a message matching ' + j$.pp(expected);
- } else {
- return ' with message ' + j$.pp(expected);
- }
- },
- hasNoSpecifics: function() {
- return expected === null && errorType === null;
- },
- matches: function(error) {
- return (errorType === null || error instanceof errorType) &&
- (expected === null || messageMatch(error.message));
- }
- };
- }
-
- function isStringOrRegExp(potential) {
- return potential instanceof RegExp || (typeof potential == 'string');
- }
-
- function isAnErrorType(type) {
- if (typeof type !== 'function') {
- return false;
- }
-
- var Surrogate = function() {};
- Surrogate.prototype = type.prototype;
- return isErrorObject(new Surrogate());
- }
-
- function isErrorObject(thrown) {
- if (thrown instanceof Error) {
- return true;
- }
- if (thrown && thrown.constructor && thrown.constructor.constructor &&
- (thrown instanceof (thrown.constructor.constructor('return this')()).Error)) {
- return true;
- }
- return false;
- }
- }
-
- return toThrowError;
-};
-
-getJasmineRequireObj().MockDate = function() {
- function MockDate(global) {
- var self = this;
- var currentTime = 0;
-
- if (!global || !global.Date) {
- self.install = function() {};
- self.tick = function() {};
- self.uninstall = function() {};
- return self;
- }
-
- var GlobalDate = global.Date;
-
- self.install = function(mockDate) {
- if (mockDate instanceof GlobalDate) {
- currentTime = mockDate.getTime();
- } else {
- currentTime = new GlobalDate().getTime();
- }
-
- global.Date = FakeDate;
- };
-
- self.tick = function(millis) {
- millis = millis || 0;
- currentTime = currentTime + millis;
- };
-
- self.uninstall = function() {
- currentTime = 0;
- global.Date = GlobalDate;
- };
-
- createDateProperties();
-
- return self;
-
- function FakeDate() {
- switch(arguments.length) {
- case 0:
- return new GlobalDate(currentTime);
- case 1:
- return new GlobalDate(arguments[0]);
- case 2:
- return new GlobalDate(arguments[0], arguments[1]);
- case 3:
- return new GlobalDate(arguments[0], arguments[1], arguments[2]);
- case 4:
- return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3]);
- case 5:
- return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3],
- arguments[4]);
- case 6:
- return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3],
- arguments[4], arguments[5]);
- default:
- return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3],
- arguments[4], arguments[5], arguments[6]);
- }
- }
-
- function createDateProperties() {
- FakeDate.prototype = GlobalDate.prototype;
-
- FakeDate.now = function() {
- if (GlobalDate.now) {
- return currentTime;
- } else {
- throw new Error('Browser does not support Date.now()');
- }
- };
-
- FakeDate.toSource = GlobalDate.toSource;
- FakeDate.toString = GlobalDate.toString;
- FakeDate.parse = GlobalDate.parse;
- FakeDate.UTC = GlobalDate.UTC;
- }
- }
-
- return MockDate;
-};
-
-getJasmineRequireObj().pp = function(j$) {
-
- function PrettyPrinter() {
- this.ppNestLevel_ = 0;
- this.seen = [];
- }
-
- function hasCustomToString(value) {
- // value.toString !== Object.prototype.toString if value has no custom toString but is from another context (e.g.
- // iframe, web worker)
- return value.toString !== Object.prototype.toString && (value.toString() !== Object.prototype.toString.call(value));
- }
-
- PrettyPrinter.prototype.format = function(value) {
- this.ppNestLevel_++;
- try {
- if (j$.util.isUndefined(value)) {
- this.emitScalar('undefined');
- } else if (value === null) {
- this.emitScalar('null');
- } else if (value === 0 && 1/value === -Infinity) {
- this.emitScalar('-0');
- } else if (value === j$.getGlobal()) {
- this.emitScalar('');
- } else if (value.jasmineToString) {
- this.emitScalar(value.jasmineToString());
- } else if (typeof value === 'string') {
- this.emitString(value);
- } else if (j$.isSpy(value)) {
- this.emitScalar('spy on ' + value.and.identity());
- } else if (value instanceof RegExp) {
- this.emitScalar(value.toString());
- } else if (typeof value === 'function') {
- this.emitScalar('Function');
- } else if (typeof value.nodeType === 'number') {
- this.emitScalar('HTMLNode');
- } else if (value instanceof Date) {
- this.emitScalar('Date(' + value + ')');
- } else if (value.toString && value.toString() == '[object Set]') {
- this.emitSet(value);
- } else if (value.toString && typeof value === 'object' && !j$.isArray_(value) && hasCustomToString(value)) {
- this.emitScalar(value.toString());
- } else if (j$.util.arrayContains(this.seen, value)) {
- this.emitScalar('');
- } else if (j$.isArray_(value) || j$.isA_('Object', value)) {
- this.seen.push(value);
- if (j$.isArray_(value)) {
- this.emitArray(value);
- } else {
- this.emitObject(value);
- }
- this.seen.pop();
- } else {
- this.emitScalar(value.toString());
- }
- } finally {
- this.ppNestLevel_--;
- }
- };
-
- PrettyPrinter.prototype.iterateObject = function(obj, fn) {
- for (var property in obj) {
- if (!Object.prototype.hasOwnProperty.call(obj, property)) { continue; }
- fn(property, obj.__lookupGetter__ ? (!j$.util.isUndefined(obj.__lookupGetter__(property)) &&
- obj.__lookupGetter__(property) !== null) : false);
- }
- };
-
- PrettyPrinter.prototype.emitArray = j$.unimplementedMethod_;
- PrettyPrinter.prototype.emitSet = j$.unimplementedMethod_;
- PrettyPrinter.prototype.emitObject = j$.unimplementedMethod_;
- PrettyPrinter.prototype.emitScalar = j$.unimplementedMethod_;
- PrettyPrinter.prototype.emitString = j$.unimplementedMethod_;
-
- function StringPrettyPrinter() {
- PrettyPrinter.call(this);
-
- this.string = '';
- }
-
- j$.util.inherit(StringPrettyPrinter, PrettyPrinter);
-
- StringPrettyPrinter.prototype.emitScalar = function(value) {
- this.append(value);
- };
-
- StringPrettyPrinter.prototype.emitString = function(value) {
- this.append('\'' + value + '\'');
- };
-
- StringPrettyPrinter.prototype.emitArray = function(array) {
- if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
- this.append('Array');
- return;
- }
- var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
- this.append('[ ');
- for (var i = 0; i < length; i++) {
- if (i > 0) {
- this.append(', ');
- }
- this.format(array[i]);
- }
- if(array.length > length){
- this.append(', ...');
- }
-
- var self = this;
- var first = array.length === 0;
- this.iterateObject(array, function(property, isGetter) {
- if (property.match(/^\d+$/)) {
- return;
- }
-
- if (first) {
- first = false;
- } else {
- self.append(', ');
- }
-
- self.formatProperty(array, property, isGetter);
- });
-
- this.append(' ]');
- };
-
- StringPrettyPrinter.prototype.emitSet = function(set) {
- if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
- this.append('Set');
- return;
- }
- this.append('Set( ');
- var size = Math.min(set.size, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH);
- var iter = set.values();
- for (var i = 0; i < size; i++) {
- if (i > 0) {
- this.append(', ');
- }
- this.format(iter.next().value);
- }
- if (set.size > size){
- this.append(', ...');
- }
- this.append(' )');
- };
-
- StringPrettyPrinter.prototype.emitObject = function(obj) {
- var ctor = obj.constructor,
- constructorName;
-
- constructorName = typeof ctor === 'function' && obj instanceof ctor ?
- j$.fnNameFor(obj.constructor) :
- 'null';
-
- this.append(constructorName);
-
- if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) {
- return;
- }
-
- var self = this;
- this.append('({ ');
- var first = true;
-
- this.iterateObject(obj, function(property, isGetter) {
- if (first) {
- first = false;
- } else {
- self.append(', ');
- }
-
- self.formatProperty(obj, property, isGetter);
- });
-
- this.append(' })');
- };
-
- StringPrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) {
- this.append(property);
- this.append(': ');
- if (isGetter) {
- this.append('');
- } else {
- this.format(obj[property]);
- }
- };
-
- StringPrettyPrinter.prototype.append = function(value) {
- this.string += value;
- };
-
- return function(value) {
- var stringPrettyPrinter = new StringPrettyPrinter();
- stringPrettyPrinter.format(value);
- return stringPrettyPrinter.string;
- };
-};
-
-getJasmineRequireObj().QueueRunner = function(j$) {
-
- function once(fn) {
- var called = false;
- return function() {
- if (!called) {
- called = true;
- fn();
- }
- return null;
- };
- }
-
- function QueueRunner(attrs) {
- this.queueableFns = attrs.queueableFns || [];
- this.onComplete = attrs.onComplete || function() {};
- this.clearStack = attrs.clearStack || function(fn) {fn();};
- this.onException = attrs.onException || function() {};
- this.catchException = attrs.catchException || function() { return true; };
- this.userContext = attrs.userContext || {};
- this.timeout = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout};
- this.fail = attrs.fail || function() {};
- this.globalErrors = attrs.globalErrors || { pushListener: function() {}, popListener: function() {} };
- }
-
- QueueRunner.prototype.execute = function() {
- var self = this;
- this.handleFinalError = function(error) {
- self.onException(error);
- };
- this.globalErrors.pushListener(this.handleFinalError);
- this.run(this.queueableFns, 0);
- };
-
- QueueRunner.prototype.run = function(queueableFns, recursiveIndex) {
- var length = queueableFns.length,
- self = this,
- iterativeIndex;
-
-
- for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) {
- var queueableFn = queueableFns[iterativeIndex];
- if (queueableFn.fn.length > 0) {
- attemptAsync(queueableFn);
- return;
- } else {
- attemptSync(queueableFn);
- }
- }
-
- this.clearStack(function() {
- self.globalErrors.popListener(self.handleFinalError);
- self.onComplete();
- });
-
- function attemptSync(queueableFn) {
- try {
- queueableFn.fn.call(self.userContext);
- } catch (e) {
- handleException(e, queueableFn);
- }
- }
-
- function attemptAsync(queueableFn) {
- var clearTimeout = function () {
- Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]);
- },
- completedSynchronously = true,
- setTimeout = function(delayedFn, delay) {
- return Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [delayedFn, delay]]);
- },
- handleError = function(error) {
- onException(error);
- next();
- },
- next = once(function () {
- clearTimeout(timeoutId);
- self.globalErrors.popListener(handleError);
- if (completedSynchronously) {
- setTimeout(function() {
- self.run(queueableFns, iterativeIndex + 1);
- });
- } else {
- self.run(queueableFns, iterativeIndex + 1);
- }
- }),
- timeoutId;
-
- next.fail = function() {
- self.fail.apply(null, arguments);
- next();
- };
-
- self.globalErrors.pushListener(handleError);
-
- if (queueableFn.timeout) {
- timeoutId = setTimeout(function() {
- var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
- onException(error);
- next();
- }, queueableFn.timeout());
- }
-
- try {
- queueableFn.fn.call(self.userContext, next);
- completedSynchronously = false;
- } catch (e) {
- handleException(e, queueableFn);
- next();
- }
- }
-
- function onException(e) {
- self.onException(e);
- }
-
- function handleException(e, queueableFn) {
- onException(e);
- if (!self.catchException(e)) {
- //TODO: set a var when we catch an exception and
- //use a finally block to close the loop in a nice way..
- throw e;
- }
- }
- };
-
- return QueueRunner;
-};
-
-getJasmineRequireObj().ReportDispatcher = function() {
- function ReportDispatcher(methods) {
-
- var dispatchedMethods = methods || [];
-
- for (var i = 0; i < dispatchedMethods.length; i++) {
- var method = dispatchedMethods[i];
- this[method] = (function(m) {
- return function() {
- dispatch(m, arguments);
- };
- }(method));
- }
-
- var reporters = [];
- var fallbackReporter = null;
-
- this.addReporter = function(reporter) {
- reporters.push(reporter);
- };
-
- this.provideFallbackReporter = function(reporter) {
- fallbackReporter = reporter;
- };
-
- this.clearReporters = function() {
- reporters = [];
- };
-
- return this;
-
- function dispatch(method, args) {
- if (reporters.length === 0 && fallbackReporter !== null) {
- reporters.push(fallbackReporter);
- }
- for (var i = 0; i < reporters.length; i++) {
- var reporter = reporters[i];
- if (reporter[method]) {
- reporter[method].apply(reporter, args);
- }
- }
- }
- }
-
- return ReportDispatcher;
-};
-
-
-getJasmineRequireObj().interface = function(jasmine, env) {
- var jasmineInterface = {
- /**
- * Create a group of specs (often called a suite).
- *
- * Calls to `describe` can be nested within other calls to compose your suite as a tree.
- * @name describe
- * @function
- * @global
- * @param {String} description Textual description of the group
- * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites a specs
- */
- describe: function(description, specDefinitions) {
- return env.describe(description, specDefinitions);
- },
-
- /**
- * A temporarily disabled [`describe`]{@link describe}
- *
- * Specs within an `xdescribe` will be marked pending and not executed
- * @name xdescribe
- * @function
- * @global
- * @param {String} description Textual description of the group
- * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites a specs
- */
- xdescribe: function(description, specDefinitions) {
- return env.xdescribe(description, specDefinitions);
- },
-
- /**
- * A focused [`describe`]{@link describe}
- *
- * If suites or specs are focused, only those that are focused will be executed
- * @see fit
- * @name fdescribe
- * @function
- * @global
- * @param {String} description Textual description of the group
- * @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites a specs
- */
- fdescribe: function(description, specDefinitions) {
- return env.fdescribe(description, specDefinitions);
- },
-
- /**
- * Define a single spec. A spec should contain one or more {@link expect|expectations} that test the state of the code.
- *
- * A spec whose expectations all succeed will be passing and a spec with any failures will fail.
- * @name it
- * @function
- * @global
- * @param {String} description Textual description of what this spec is checking
- * @param {Function} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`.
- * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
- */
- it: function() {
- return env.it.apply(env, arguments);
- },
-
- /**
- * A temporarily disabled [`it`]{@link it}
- *
- * The spec will report as `pending` and will not be executed.
- * @name xit
- * @function
- * @global
- * @param {String} description Textual description of what this spec is checking.
- * @param {Function} [testFunction] Function that contains the code of your test. Will not be executed.
- */
- xit: function() {
- return env.xit.apply(env, arguments);
- },
-
- /**
- * A focused [`it`]{@link it}
- *
- * If suites or specs are focused, only those that are focused will be executed.
- * @name fit
- * @function
- * @global
- * @param {String} description Textual description of what this spec is checking.
- * @param {Function} testFunction Function that contains the code of your test.
- * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
- */
- fit: function() {
- return env.fit.apply(env, arguments);
- },
-
- /**
- * Run some shared setup before each of the specs in the {@link describe} in which it is called.
- * @name beforeEach
- * @function
- * @global
- * @param {Function} [function] Function that contains the code to setup your specs.
- * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach.
- */
- beforeEach: function() {
- return env.beforeEach.apply(env, arguments);
- },
-
- /**
- * Run some shared teardown after each of the specs in the {@link describe} in which it is called.
- * @name afterEach
- * @function
- * @global
- * @param {Function} [function] Function that contains the code to teardown your specs.
- * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach.
- */
- afterEach: function() {
- return env.afterEach.apply(env, arguments);
- },
-
- /**
- * Run some shared setup once before all of the specs in the {@link describe} are run.
- *
- * _Note:_ Be careful, sharing the setup from a beforeAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
- * @name beforeAll
- * @function
- * @global
- * @param {Function} [function] Function that contains the code to setup your specs.
- * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll.
- */
- beforeAll: function() {
- return env.beforeAll.apply(env, arguments);
- },
-
- /**
- * Run some shared teardown once before all of the specs in the {@link describe} are run.
- *
- * _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
- * @name afterAll
- * @function
- * @global
- * @param {Function} [function] Function that contains the code to teardown your specs.
- * @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll.
- */
- afterAll: function() {
- return env.afterAll.apply(env, arguments);
- },
-
- /**
- * Create an expectation for a spec.
- * @name expect
- * @function
- * @global
- * @param {Object} actual - Actual computed value to test expectations against.
- * @return {matchers}
- */
- expect: function(actual) {
- return env.expect(actual);
- },
-
- /**
- * Mark a spec as pending, expectation results will be ignored.
- * @name pending
- * @function
- * @global
- * @param {String} [message] - Reason the spec is pending.
- */
- pending: function() {
- return env.pending.apply(env, arguments);
- },
-
- /**
- * Explicitly mark a spec as failed.
- * @name fail
- * @function
- * @global
- * @param {String|Error} [error] - Reason for the failure.
- */
- fail: function() {
- return env.fail.apply(env, arguments);
- },
-
- /**
- * Install a spy onto an existing object.
- * @name spyOn
- * @function
- * @global
- * @param {Object} obj - The object upon which to install the {@link Spy}.
- * @param {String} methodName - The name of the method to replace with a {@link Spy}.
- * @returns {Spy}
- */
- spyOn: function(obj, methodName) {
- return env.spyOn(obj, methodName);
- },
-
- /**
- * Install a spy on a property onto an existing object.
- * @name spyOnProperty
- * @function
- * @global
- * @param {Object} obj - The object upon which to install the {@link Spy}
- * @param {String} propertyName - The name of the property to replace with a {@link Spy}.
- * @param {String} [accessType=get] - The access type (get|set) of the property to {@link Spy} on.
- * @returns {Spy}
- */
- spyOnProperty: function(obj, methodName, accessType) {
- return env.spyOnProperty(obj, methodName, accessType);
- },
-
- jsApiReporter: new jasmine.JsApiReporter({
- timer: new jasmine.Timer()
- }),
-
- /**
- * @namespace jasmine
- */
- jasmine: jasmine
- };
-
- /**
- * Add a custom equality tester for the current scope of specs.
- *
- * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
- * @name jasmine.addCustomEqualityTester
- * @function
- * @param {Function} tester - A function which takes two arguments to compare and returns a `true` or `false` comparison result if it knows how to compare them, and `undefined` otherwise.
- * @see custom_equality
- */
- jasmine.addCustomEqualityTester = function(tester) {
- env.addCustomEqualityTester(tester);
- };
-
- /**
- * Add custom matchers for the current scope of specs.
- *
- * _Note:_ This is only callable from within a {@link beforeEach}, {@link it}, or {@link beforeAll}.
- * @name jasmine.addMatchers
- * @function
- * @param {Object} matchers - Keys from this object will be the new matcher names.
- * @see custom_matcher
- */
- jasmine.addMatchers = function(matchers) {
- return env.addMatchers(matchers);
- };
-
- /**
- * Get the currently booted mock {Clock} for this Jasmine environment.
- * @name jasmine.clock
- * @function
- * @returns {Clock}
- */
- jasmine.clock = function() {
- return env.clock;
- };
-
- return jasmineInterface;
-};
-
-getJasmineRequireObj().Spy = function (j$) {
-
- var nextOrder = (function() {
- var order = 0;
-
- return function() {
- return order++;
- };
- })();
-
- /**
- * _Note:_ Do not construct this directly, use {@link spyOn}, {@link spyOnProperty}, {@link jasmine.createSpy}, or {@link jasmine.createSpyObj}
- * @constructor
- * @name Spy
- */
- function Spy(name, originalFn) {
- var numArgs = (typeof originalFn === 'function' ? originalFn.length : 0),
- wrapper = makeFunc(numArgs, function () {
- return spy.apply(this, Array.prototype.slice.call(arguments));
- }),
- spyStrategy = new j$.SpyStrategy({
- name: name,
- fn: originalFn,
- getSpy: function () {
- return wrapper;
- }
- }),
- callTracker = new j$.CallTracker(),
- spy = function () {
- /**
- * @name Spy.callData
- * @property {object} object - `this` context for the invocation.
- * @property {number} invocationOrder - Order of the invocation.
- * @property {Array} args - The arguments passed for this invocation.
- */
- var callData = {
- object: this,
- invocationOrder: nextOrder(),
- args: Array.prototype.slice.apply(arguments)
- };
-
- callTracker.track(callData);
- var returnValue = spyStrategy.exec.apply(this, arguments);
- callData.returnValue = returnValue;
-
- return returnValue;
- };
-
- function makeFunc(length, fn) {
- switch (length) {
- case 1 : return function (a) { return fn.apply(this, arguments); };
- case 2 : return function (a,b) { return fn.apply(this, arguments); };
- case 3 : return function (a,b,c) { return fn.apply(this, arguments); };
- case 4 : return function (a,b,c,d) { return fn.apply(this, arguments); };
- case 5 : return function (a,b,c,d,e) { return fn.apply(this, arguments); };
- case 6 : return function (a,b,c,d,e,f) { return fn.apply(this, arguments); };
- case 7 : return function (a,b,c,d,e,f,g) { return fn.apply(this, arguments); };
- case 8 : return function (a,b,c,d,e,f,g,h) { return fn.apply(this, arguments); };
- case 9 : return function (a,b,c,d,e,f,g,h,i) { return fn.apply(this, arguments); };
- default : return function () { return fn.apply(this, arguments); };
- }
- }
-
- for (var prop in originalFn) {
- if (prop === 'and' || prop === 'calls') {
- throw new Error('Jasmine spies would overwrite the \'and\' and \'calls\' properties on the object being spied upon');
- }
-
- wrapper[prop] = originalFn[prop];
- }
-
- wrapper.and = spyStrategy;
- wrapper.calls = callTracker;
-
- return wrapper;
- }
-
- return Spy;
-};
-
-getJasmineRequireObj().SpyRegistry = function(j$) {
-
- var getErrorMsg = j$.formatErrorMsg('', 'spyOn(