mirror of
				https://github.com/zadam/trilium.git
				synced 2025-11-04 05:28:59 +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';
 | 
						|
};
 |