mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 03:29:02 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			5002 lines
		
	
	
		
			138 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			5002 lines
		
	
	
		
			138 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 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] : '<anonymous>';
 | |
|   };
 | |
| 
 | |
|   /**
 | |
|    * 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, '<')
 | |
|       .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 '<jasmine.any(' + j$.fnNameFor(this.expectedObject) + ')>';
 | |
|   };
 | |
| 
 | |
|   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 '<jasmine.anything>';
 | |
|   };
 | |
| 
 | |
|   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 '<jasmine.arrayContaining(' + jasmine.pp(this.sample) +')>';
 | |
|   };
 | |
| 
 | |
|   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 '<jasmine.objectContaining(' + j$.pp(this.sample) + ')>';
 | |
|   };
 | |
| 
 | |
|   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 '<jasmine.stringMatching(' + this.regexp + ')>';
 | |
|   };
 | |
| 
 | |
|   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('<toHaveBeenCalled>', 'expect(<spyObj>).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('<toHaveBeenCalledBefore>', 'expect(<spyObj>).toHaveBeenCalledBefore(<spyObj>)');
 | |
| 
 | |
|   /**
 | |
|    * {@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('<toHaveBeenCalledTimes>', 'expect(<spyObj>).toHaveBeenCalledTimes(<Number>)');
 | |
| 
 | |
|   /**
 | |
|    * {@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('<toHaveBeenCalledWith>', 'expect(<spyObj>).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('<toMatch>', 'expect(<expectation>).toMatch(<string> || <regexp>)');
 | |
| 
 | |
|   /**
 | |
|    * {@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('<toThrow>', 'expect(function() {<expectation>}).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('<toThrowError>', 'expect(function() {<expectation>}).toThrowError(<ErrorConstructor>, <message>)');
 | |
| 
 | |
|   /**
 | |
|    * {@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('<global>');
 | |
|       } 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('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>');
 | |
|       } 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('<getter>');
 | |
|       } 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>', 'spyOn(<object>, <methodName>)');
 | |
| 
 | |
|   function SpyRegistry(options) {
 | |
|     options = options || {};
 | |
|     var currentSpies = options.currentSpies || function() { return []; };
 | |
| 
 | |
|     this.allowRespy = function(allow){
 | |
|       this.respy = allow;
 | |
|     };
 | |
| 
 | |
|     this.spyOn = function(obj, methodName) {
 | |
| 
 | |
|       if (j$.util.isUndefined(obj) || obj === null) {
 | |
|         throw new Error(getErrorMsg('could not find an object to spy upon for ' + methodName + '()'));
 | |
|       }
 | |
| 
 | |
|       if (j$.util.isUndefined(methodName) || methodName === null) {
 | |
|         throw new Error(getErrorMsg('No method name supplied'));
 | |
|       }
 | |
| 
 | |
|       if (j$.util.isUndefined(obj[methodName])) {
 | |
|         throw new Error(getErrorMsg(methodName + '() method does not exist'));
 | |
|       }
 | |
| 
 | |
|       if (obj[methodName] && j$.isSpy(obj[methodName])  ) {
 | |
|         if ( !!this.respy ){
 | |
|           return obj[methodName];
 | |
|         }else {
 | |
|           throw new Error(getErrorMsg(methodName + ' has already been spied upon'));
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       var descriptor;
 | |
|       try {
 | |
|         descriptor = Object.getOwnPropertyDescriptor(obj, methodName);
 | |
|       } catch(e) {
 | |
|         // IE 8 doesn't support `definePropery` on non-DOM nodes
 | |
|       }
 | |
| 
 | |
|       if (descriptor && !(descriptor.writable || descriptor.set)) {
 | |
|         throw new Error(getErrorMsg(methodName + ' is not declared writable or has no setter'));
 | |
|       }
 | |
| 
 | |
|       var originalMethod = obj[methodName],
 | |
|         spiedMethod = j$.createSpy(methodName, originalMethod),
 | |
|         restoreStrategy;
 | |
| 
 | |
|       if (Object.prototype.hasOwnProperty.call(obj, methodName)) {
 | |
|         restoreStrategy = function() {
 | |
|           obj[methodName] = originalMethod;
 | |
|         };
 | |
|       } else {
 | |
|         restoreStrategy = function() {
 | |
|           if (!delete obj[methodName]) {
 | |
|             obj[methodName] = originalMethod;
 | |
|           }
 | |
|         };
 | |
|       }
 | |
| 
 | |
|       currentSpies().push({
 | |
|         restoreObjectToOriginalState: restoreStrategy
 | |
|       });
 | |
| 
 | |
|       obj[methodName] = spiedMethod;
 | |
| 
 | |
|       return spiedMethod;
 | |
|     };
 | |
| 
 | |
|     this.spyOnProperty = function (obj, propertyName, accessType) {
 | |
|       accessType = accessType || 'get';
 | |
| 
 | |
|       if (j$.util.isUndefined(obj)) {
 | |
|         throw new Error('spyOn could not find an object to spy upon for ' + propertyName + '');
 | |
|       }
 | |
| 
 | |
|       if (j$.util.isUndefined(propertyName)) {
 | |
|         throw new Error('No property name supplied');
 | |
|       }
 | |
| 
 | |
|       var descriptor;
 | |
|       try {
 | |
|         descriptor = j$.util.getPropertyDescriptor(obj, propertyName);
 | |
|       } catch(e) {
 | |
|         // IE 8 doesn't support `definePropery` on non-DOM nodes
 | |
|       }
 | |
| 
 | |
|       if (!descriptor) {
 | |
|         throw new Error(propertyName + ' property does not exist');
 | |
|       }
 | |
| 
 | |
|       if (!descriptor.configurable) {
 | |
|         throw new Error(propertyName + ' is not declared configurable');
 | |
|       }
 | |
| 
 | |
|       if(!descriptor[accessType]) {
 | |
|         throw new Error('Property ' + propertyName + ' does not have access type ' + accessType);
 | |
|       }
 | |
| 
 | |
|       if (j$.isSpy(descriptor[accessType])) {
 | |
|         //TODO?: should this return the current spy? Downside: may cause user confusion about spy state
 | |
|         throw new Error(propertyName + ' has already been spied upon');
 | |
|       }
 | |
| 
 | |
|       var originalDescriptor = j$.util.clone(descriptor),
 | |
|         spy = j$.createSpy(propertyName, descriptor[accessType]),
 | |
|         restoreStrategy;
 | |
| 
 | |
|       if (Object.prototype.hasOwnProperty.call(obj, propertyName)) {
 | |
|         restoreStrategy = function() {
 | |
|           Object.defineProperty(obj, propertyName, originalDescriptor);
 | |
|         };
 | |
|       } else {
 | |
|         restoreStrategy = function() {
 | |
|           delete obj[propertyName];
 | |
|         };
 | |
|       }
 | |
| 
 | |
|       currentSpies().push({
 | |
|         restoreObjectToOriginalState: restoreStrategy
 | |
|       });
 | |
| 
 | |
|       descriptor[accessType] = spy;
 | |
| 
 | |
|       Object.defineProperty(obj, propertyName, descriptor);
 | |
| 
 | |
|       return spy;
 | |
|     };
 | |
| 
 | |
|     this.clearSpies = function() {
 | |
|       var spies = currentSpies();
 | |
|       for (var i = spies.length - 1; i >= 0; i--) {
 | |
|         var spyEntry = spies[i];
 | |
|         spyEntry.restoreObjectToOriginalState();
 | |
|       }
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   return SpyRegistry;
 | |
| };
 | |
| 
 | |
| getJasmineRequireObj().SpyStrategy = function(j$) {
 | |
| 
 | |
|   /**
 | |
|    * @namespace Spy#and
 | |
|    */
 | |
|   function SpyStrategy(options) {
 | |
|     options = options || {};
 | |
| 
 | |
|     var identity = options.name || 'unknown',
 | |
|         originalFn = options.fn || function() {},
 | |
|         getSpy = options.getSpy || function() {},
 | |
|         plan = function() {};
 | |
| 
 | |
|     /**
 | |
|      * Return the identifying information for the spy.
 | |
|      * @name Spy#and#identity
 | |
|      * @function
 | |
|      * @returns {String}
 | |
|      */
 | |
|     this.identity = function() {
 | |
|       return identity;
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Execute the current spy strategy.
 | |
|      * @name Spy#and#exec
 | |
|      * @function
 | |
|      */
 | |
|     this.exec = function() {
 | |
|       return plan.apply(this, arguments);
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Tell the spy to call through to the real implementation when invoked.
 | |
|      * @name Spy#and#callThrough
 | |
|      * @function
 | |
|      */
 | |
|     this.callThrough = function() {
 | |
|       plan = originalFn;
 | |
|       return getSpy();
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Tell the spy to return the value when invoked.
 | |
|      * @name Spy#and#returnValue
 | |
|      * @function
 | |
|      * @param {*} value The value to return.
 | |
|      */
 | |
|     this.returnValue = function(value) {
 | |
|       plan = function() {
 | |
|         return value;
 | |
|       };
 | |
|       return getSpy();
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Tell the spy to return one of the specified values (sequentially) each time the spy is invoked.
 | |
|      * @name Spy#and#returnValues
 | |
|      * @function
 | |
|      * @param {...*} values - Values to be returned on subsequent calls to the spy.
 | |
|      */
 | |
|     this.returnValues = function() {
 | |
|       var values = Array.prototype.slice.call(arguments);
 | |
|       plan = function () {
 | |
|         return values.shift();
 | |
|       };
 | |
|       return getSpy();
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Tell the spy to throw an error when invoked.
 | |
|      * @name Spy#and#throwError
 | |
|      * @function
 | |
|      * @param {Error|String} something Thing to throw
 | |
|      */
 | |
|     this.throwError = function(something) {
 | |
|       var error = (something instanceof Error) ? something : new Error(something);
 | |
|       plan = function() {
 | |
|         throw error;
 | |
|       };
 | |
|       return getSpy();
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Tell the spy to call a fake implementation when invoked.
 | |
|      * @name Spy#and#callFake
 | |
|      * @function
 | |
|      * @param {Function} fn The function to invoke with the passed parameters.
 | |
|      */
 | |
|     this.callFake = function(fn) {
 | |
|       if(!j$.isFunction_(fn)) {
 | |
|         throw new Error('Argument passed to callFake should be a function, got ' + fn);
 | |
|       }
 | |
|       plan = fn;
 | |
|       return getSpy();
 | |
|     };
 | |
| 
 | |
|     /**
 | |
|      * Tell the spy to do nothing when invoked. This is the default.
 | |
|      * @name Spy#and#stub
 | |
|      * @function
 | |
|      */
 | |
|     this.stub = function(fn) {
 | |
|       plan = function() {};
 | |
|       return getSpy();
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   return SpyStrategy;
 | |
| };
 | |
| 
 | |
| getJasmineRequireObj().Suite = function(j$) {
 | |
|   function Suite(attrs) {
 | |
|     this.env = attrs.env;
 | |
|     this.id = attrs.id;
 | |
|     this.parentSuite = attrs.parentSuite;
 | |
|     this.description = attrs.description;
 | |
|     this.expectationFactory = attrs.expectationFactory;
 | |
|     this.expectationResultFactory = attrs.expectationResultFactory;
 | |
|     this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
 | |
| 
 | |
|     this.beforeFns = [];
 | |
|     this.afterFns = [];
 | |
|     this.beforeAllFns = [];
 | |
|     this.afterAllFns = [];
 | |
| 
 | |
|     this.children = [];
 | |
| 
 | |
|     this.result = {
 | |
|       id: this.id,
 | |
|       description: this.description,
 | |
|       fullName: this.getFullName(),
 | |
|       failedExpectations: []
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   Suite.prototype.expect = function(actual) {
 | |
|     return this.expectationFactory(actual, this);
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.getFullName = function() {
 | |
|     var fullName = [];
 | |
|     for (var parentSuite = this; parentSuite; parentSuite = parentSuite.parentSuite) {
 | |
|       if (parentSuite.parentSuite) {
 | |
|         fullName.unshift(parentSuite.description);
 | |
|       }
 | |
|     }
 | |
|     return fullName.join(' ');
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.pend = function() {
 | |
|     this.markedPending = true;
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.beforeEach = function(fn) {
 | |
|     this.beforeFns.unshift(fn);
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.beforeAll = function(fn) {
 | |
|     this.beforeAllFns.push(fn);
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.afterEach = function(fn) {
 | |
|     this.afterFns.unshift(fn);
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.afterAll = function(fn) {
 | |
|     this.afterAllFns.unshift(fn);
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.addChild = function(child) {
 | |
|     this.children.push(child);
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.status = function() {
 | |
|     if (this.markedPending) {
 | |
|       return 'pending';
 | |
|     }
 | |
| 
 | |
|     if (this.result.failedExpectations.length > 0) {
 | |
|       return 'failed';
 | |
|     } else {
 | |
|       return 'finished';
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.isExecutable = function() {
 | |
|     return !this.markedPending;
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.canBeReentered = function() {
 | |
|     return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0;
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.getResult = function() {
 | |
|     this.result.status = this.status();
 | |
|     return this.result;
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.sharedUserContext = function() {
 | |
|     if (!this.sharedContext) {
 | |
|       this.sharedContext = this.parentSuite ? clone(this.parentSuite.sharedUserContext()) : {};
 | |
|     }
 | |
| 
 | |
|     return this.sharedContext;
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.clonedSharedUserContext = function() {
 | |
|     return clone(this.sharedUserContext());
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.onException = function() {
 | |
|     if (arguments[0] instanceof j$.errors.ExpectationFailed) {
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if(isAfterAll(this.children)) {
 | |
|       var data = {
 | |
|         matcherName: '',
 | |
|         passed: false,
 | |
|         expected: '',
 | |
|         actual: '',
 | |
|         error: arguments[0]
 | |
|       };
 | |
|       this.result.failedExpectations.push(this.expectationResultFactory(data));
 | |
|     } else {
 | |
|       for (var i = 0; i < this.children.length; i++) {
 | |
|         var child = this.children[i];
 | |
|         child.onException.apply(child, arguments);
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   Suite.prototype.addExpectationResult = function () {
 | |
|     if(isAfterAll(this.children) && isFailure(arguments)){
 | |
|       var data = arguments[1];
 | |
|       this.result.failedExpectations.push(this.expectationResultFactory(data));
 | |
|       if(this.throwOnExpectationFailure) {
 | |
|         throw new j$.errors.ExpectationFailed();
 | |
|       }
 | |
|     } else {
 | |
|       for (var i = 0; i < this.children.length; i++) {
 | |
|         var child = this.children[i];
 | |
|         try {
 | |
|           child.addExpectationResult.apply(child, arguments);
 | |
|         } catch(e) {
 | |
|           // keep going
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   function isAfterAll(children) {
 | |
|     return children && children[0].result.status;
 | |
|   }
 | |
| 
 | |
|   function isFailure(args) {
 | |
|     return !args[0];
 | |
|   }
 | |
| 
 | |
|   function clone(obj) {
 | |
|     var clonedObj = {};
 | |
|     for (var prop in obj) {
 | |
|       if (obj.hasOwnProperty(prop)) {
 | |
|         clonedObj[prop] = obj[prop];
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return clonedObj;
 | |
|   }
 | |
| 
 | |
|   return Suite;
 | |
| };
 | |
| 
 | |
| if (typeof window == void 0 && typeof exports == 'object') {
 | |
|   exports.Suite = jasmineRequire.Suite;
 | |
| }
 | |
| 
 | |
| getJasmineRequireObj().Timer = function() {
 | |
|   var defaultNow = (function(Date) {
 | |
|     return function() { return new Date().getTime(); };
 | |
|   })(Date);
 | |
| 
 | |
|   function Timer(options) {
 | |
|     options = options || {};
 | |
| 
 | |
|     var now = options.now || defaultNow,
 | |
|       startTime;
 | |
| 
 | |
|     this.start = function() {
 | |
|       startTime = now();
 | |
|     };
 | |
| 
 | |
|     this.elapsed = function() {
 | |
|       return now() - startTime;
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   return Timer;
 | |
| };
 | |
| 
 | |
| getJasmineRequireObj().TreeProcessor = function() {
 | |
|   function TreeProcessor(attrs) {
 | |
|     var tree = attrs.tree,
 | |
|         runnableIds = attrs.runnableIds,
 | |
|         queueRunnerFactory = attrs.queueRunnerFactory,
 | |
|         nodeStart = attrs.nodeStart || function() {},
 | |
|         nodeComplete = attrs.nodeComplete || function() {},
 | |
|         orderChildren = attrs.orderChildren || function(node) { return node.children; },
 | |
|         stats = { valid: true },
 | |
|         processed = false,
 | |
|         defaultMin = Infinity,
 | |
|         defaultMax = 1 - Infinity;
 | |
| 
 | |
|     this.processTree = function() {
 | |
|       processNode(tree, false);
 | |
|       processed = true;
 | |
|       return stats;
 | |
|     };
 | |
| 
 | |
|     this.execute = function(done) {
 | |
|       if (!processed) {
 | |
|         this.processTree();
 | |
|       }
 | |
| 
 | |
|       if (!stats.valid) {
 | |
|         throw 'invalid order';
 | |
|       }
 | |
| 
 | |
|       var childFns = wrapChildren(tree, 0);
 | |
| 
 | |
|       queueRunnerFactory({
 | |
|         queueableFns: childFns,
 | |
|         userContext: tree.sharedUserContext(),
 | |
|         onException: function() {
 | |
|           tree.onException.apply(tree, arguments);
 | |
|         },
 | |
|         onComplete: done
 | |
|       });
 | |
|     };
 | |
| 
 | |
|     function runnableIndex(id) {
 | |
|       for (var i = 0; i < runnableIds.length; i++) {
 | |
|         if (runnableIds[i] === id) {
 | |
|           return i;
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function processNode(node, parentEnabled) {
 | |
|       var executableIndex = runnableIndex(node.id);
 | |
| 
 | |
|       if (executableIndex !== undefined) {
 | |
|         parentEnabled = true;
 | |
|       }
 | |
| 
 | |
|       parentEnabled = parentEnabled && node.isExecutable();
 | |
| 
 | |
|       if (!node.children) {
 | |
|         stats[node.id] = {
 | |
|           executable: parentEnabled && node.isExecutable(),
 | |
|           segments: [{
 | |
|             index: 0,
 | |
|             owner: node,
 | |
|             nodes: [node],
 | |
|             min: startingMin(executableIndex),
 | |
|             max: startingMax(executableIndex)
 | |
|           }]
 | |
|         };
 | |
|       } else {
 | |
|         var hasExecutableChild = false;
 | |
| 
 | |
|         var orderedChildren = orderChildren(node);
 | |
| 
 | |
|         for (var i = 0; i < orderedChildren.length; i++) {
 | |
|           var child = orderedChildren[i];
 | |
| 
 | |
|           processNode(child, parentEnabled);
 | |
| 
 | |
|           if (!stats.valid) {
 | |
|             return;
 | |
|           }
 | |
| 
 | |
|           var childStats = stats[child.id];
 | |
| 
 | |
|           hasExecutableChild = hasExecutableChild || childStats.executable;
 | |
|         }
 | |
| 
 | |
|         stats[node.id] = {
 | |
|           executable: hasExecutableChild
 | |
|         };
 | |
| 
 | |
|         segmentChildren(node, orderedChildren, stats[node.id], executableIndex);
 | |
| 
 | |
|         if (!node.canBeReentered() && stats[node.id].segments.length > 1) {
 | |
|           stats = { valid: false };
 | |
|         }
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function startingMin(executableIndex) {
 | |
|       return executableIndex === undefined ? defaultMin : executableIndex;
 | |
|     }
 | |
| 
 | |
|     function startingMax(executableIndex) {
 | |
|       return executableIndex === undefined ? defaultMax : executableIndex;
 | |
|     }
 | |
| 
 | |
|     function segmentChildren(node, orderedChildren, nodeStats, executableIndex) {
 | |
|       var currentSegment = { index: 0, owner: node, nodes: [], min: startingMin(executableIndex), max: startingMax(executableIndex) },
 | |
|           result = [currentSegment],
 | |
|           lastMax = defaultMax,
 | |
|           orderedChildSegments = orderChildSegments(orderedChildren);
 | |
| 
 | |
|       function isSegmentBoundary(minIndex) {
 | |
|         return lastMax !== defaultMax && minIndex !== defaultMin && lastMax < minIndex - 1;
 | |
|       }
 | |
| 
 | |
|       for (var i = 0; i < orderedChildSegments.length; i++) {
 | |
|         var childSegment = orderedChildSegments[i],
 | |
|           maxIndex = childSegment.max,
 | |
|           minIndex = childSegment.min;
 | |
| 
 | |
|         if (isSegmentBoundary(minIndex)) {
 | |
|           currentSegment = {index: result.length, owner: node, nodes: [], min: defaultMin, max: defaultMax};
 | |
|           result.push(currentSegment);
 | |
|         }
 | |
| 
 | |
|         currentSegment.nodes.push(childSegment);
 | |
|         currentSegment.min = Math.min(currentSegment.min, minIndex);
 | |
|         currentSegment.max = Math.max(currentSegment.max, maxIndex);
 | |
|         lastMax = maxIndex;
 | |
|       }
 | |
| 
 | |
|       nodeStats.segments = result;
 | |
|     }
 | |
| 
 | |
|     function orderChildSegments(children) {
 | |
|       var specifiedOrder = [],
 | |
|           unspecifiedOrder = [];
 | |
| 
 | |
|       for (var i = 0; i < children.length; i++) {
 | |
|         var child = children[i],
 | |
|             segments = stats[child.id].segments;
 | |
| 
 | |
|         for (var j = 0; j < segments.length; j++) {
 | |
|           var seg = segments[j];
 | |
| 
 | |
|           if (seg.min === defaultMin) {
 | |
|             unspecifiedOrder.push(seg);
 | |
|           } else {
 | |
|             specifiedOrder.push(seg);
 | |
|           }
 | |
|         }
 | |
|       }
 | |
| 
 | |
|       specifiedOrder.sort(function(a, b) {
 | |
|         return a.min - b.min;
 | |
|       });
 | |
| 
 | |
|       return specifiedOrder.concat(unspecifiedOrder);
 | |
|     }
 | |
| 
 | |
|     function executeNode(node, segmentNumber) {
 | |
|       if (node.children) {
 | |
|         return {
 | |
|           fn: function(done) {
 | |
|             nodeStart(node);
 | |
| 
 | |
|             queueRunnerFactory({
 | |
|               onComplete: function() {
 | |
|                 nodeComplete(node, node.getResult());
 | |
|                 done();
 | |
|               },
 | |
|               queueableFns: wrapChildren(node, segmentNumber),
 | |
|               userContext: node.sharedUserContext(),
 | |
|               onException: function() {
 | |
|                 node.onException.apply(node, arguments);
 | |
|               }
 | |
|             });
 | |
|           }
 | |
|         };
 | |
|       } else {
 | |
|         return {
 | |
|           fn: function(done) { node.execute(done, stats[node.id].executable); }
 | |
|         };
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     function wrapChildren(node, segmentNumber) {
 | |
|       var result = [],
 | |
|           segmentChildren = stats[node.id].segments[segmentNumber].nodes;
 | |
| 
 | |
|       for (var i = 0; i < segmentChildren.length; i++) {
 | |
|         result.push(executeNode(segmentChildren[i].owner, segmentChildren[i].index));
 | |
|       }
 | |
| 
 | |
|       if (!stats[node.id].executable) {
 | |
|         return result;
 | |
|       }
 | |
| 
 | |
|       return node.beforeAllFns.concat(result).concat(node.afterAllFns);
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return TreeProcessor;
 | |
| };
 | |
| 
 | |
| getJasmineRequireObj().version = function() {
 | |
|   return '2.6.4';
 | |
| };
 | 
