513 lines
16 KiB
JavaScript
513 lines
16 KiB
JavaScript
getJasmineRequireObj().base = function(j$, private$, jasmineGlobal) {
|
|
'use strict';
|
|
|
|
/**
|
|
* 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
|
|
* @default 8
|
|
* @since 1.3.0
|
|
*/
|
|
j$.MAX_PRETTY_PRINT_DEPTH = 8;
|
|
/**
|
|
* Maximum number of array elements to display when pretty printing objects.
|
|
* This will also limit the number of keys and values displayed for an object.
|
|
* Elements past this number will be ellipised.
|
|
* @name jasmine.MAX_PRETTY_PRINT_ARRAY_LENGTH
|
|
* @default 50
|
|
* @since 2.7.0
|
|
*/
|
|
j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 50;
|
|
/**
|
|
* Maximum number of characters to display when pretty printing objects.
|
|
* Characters past this number will be ellipised.
|
|
* @name jasmine.MAX_PRETTY_PRINT_CHARS
|
|
* @default 1000
|
|
* @since 2.9.0
|
|
*/
|
|
j$.MAX_PRETTY_PRINT_CHARS = 1000;
|
|
/**
|
|
* Default number of milliseconds Jasmine will wait for an asynchronous spec,
|
|
* before, or after function to complete. This can be overridden on a case by
|
|
* case basis by passing a time limit as the third argument to {@link it},
|
|
* {@link beforeEach}, {@link afterEach}, {@link beforeAll}, or
|
|
* {@link afterAll}. The value must be no greater than the largest number of
|
|
* milliseconds supported by setTimeout, which is usually 2147483647.
|
|
*
|
|
* While debugging tests, you may want to set this to a large number (or pass
|
|
* a large number to one of the functions mentioned above) so that Jasmine
|
|
* does not move on to after functions or the next spec while you're debugging.
|
|
* @name jasmine.DEFAULT_TIMEOUT_INTERVAL
|
|
* @default 5000
|
|
* @since 1.3.0
|
|
*/
|
|
let DEFAULT_TIMEOUT_INTERVAL = 5000;
|
|
Object.defineProperty(j$, 'DEFAULT_TIMEOUT_INTERVAL', {
|
|
get: function() {
|
|
return DEFAULT_TIMEOUT_INTERVAL;
|
|
},
|
|
set: function(newValue) {
|
|
private$.util.validateTimeout(
|
|
newValue,
|
|
'jasmine.DEFAULT_TIMEOUT_INTERVAL'
|
|
);
|
|
DEFAULT_TIMEOUT_INTERVAL = newValue;
|
|
}
|
|
});
|
|
|
|
j$.getGlobal = function() {
|
|
return jasmineGlobal;
|
|
};
|
|
|
|
/**
|
|
* Get the currently booted Jasmine Environment.
|
|
*
|
|
* @name jasmine.getEnv
|
|
* @since 1.3.0
|
|
* @function
|
|
* @return {Env}
|
|
*/
|
|
Object.defineProperty(j$, 'getEnv', {
|
|
enumerable: true,
|
|
value: function(options) {
|
|
const env = (private$.currentEnv_ =
|
|
private$.currentEnv_ || new private$.Env(options));
|
|
//jasmine. singletons in here (setTimeout blah blah).
|
|
return env;
|
|
}
|
|
});
|
|
|
|
private$.isObject = function(value) {
|
|
return (
|
|
value !== undefined && value !== null && private$.isA('Object', value)
|
|
);
|
|
};
|
|
|
|
private$.isString = function(value) {
|
|
return private$.isA('String', value);
|
|
};
|
|
|
|
private$.isNumber = function(value) {
|
|
return private$.isA('Number', value);
|
|
};
|
|
|
|
private$.isFunction = function(value) {
|
|
return private$.isA('Function', value);
|
|
};
|
|
|
|
private$.isAsyncFunction = function(value) {
|
|
return private$.isA('AsyncFunction', value);
|
|
};
|
|
|
|
private$.isGeneratorFunction = function(value) {
|
|
return private$.isA('GeneratorFunction', value);
|
|
};
|
|
|
|
private$.isTypedArray = function(value) {
|
|
return (
|
|
private$.isA('Float32Array', value) ||
|
|
private$.isA('Float64Array', value) ||
|
|
private$.isA('Int16Array', value) ||
|
|
private$.isA('Int32Array', value) ||
|
|
private$.isA('Int8Array', value) ||
|
|
private$.isA('Uint16Array', value) ||
|
|
private$.isA('Uint32Array', value) ||
|
|
private$.isA('Uint8Array', value) ||
|
|
private$.isA('Uint8ClampedArray', value)
|
|
);
|
|
};
|
|
|
|
private$.isA = function(typeName, value) {
|
|
return private$.getType(value) === '[object ' + typeName + ']';
|
|
};
|
|
|
|
private$.isError = function(value) {
|
|
if (!value) {
|
|
return false;
|
|
}
|
|
|
|
if (value instanceof Error) {
|
|
return true;
|
|
}
|
|
|
|
return typeof value.stack === 'string' && typeof value.message === 'string';
|
|
};
|
|
|
|
private$.isAsymmetricEqualityTester = function(obj) {
|
|
return obj ? private$.isA('Function', obj.asymmetricMatch) : false;
|
|
};
|
|
|
|
private$.getType = function(value) {
|
|
return Object.prototype.toString.apply(value);
|
|
};
|
|
|
|
private$.isDomNode = function(obj) {
|
|
// Node is a function, because constructors
|
|
return typeof jasmineGlobal.Node !== 'undefined'
|
|
? obj instanceof jasmineGlobal.Node
|
|
: obj !== null &&
|
|
typeof obj === 'object' &&
|
|
typeof obj.nodeType === 'number' &&
|
|
typeof obj.nodeName === 'string';
|
|
// return obj.nodeType > 0;
|
|
};
|
|
|
|
private$.isMap = function(obj) {
|
|
return (
|
|
obj !== null &&
|
|
typeof obj !== 'undefined' &&
|
|
obj.constructor === jasmineGlobal.Map
|
|
);
|
|
};
|
|
|
|
private$.isSet = function(obj) {
|
|
return (
|
|
obj !== null &&
|
|
typeof obj !== 'undefined' &&
|
|
obj.constructor === jasmineGlobal.Set
|
|
);
|
|
};
|
|
|
|
private$.isWeakMap = function(obj) {
|
|
return (
|
|
obj !== null &&
|
|
typeof obj !== 'undefined' &&
|
|
obj.constructor === jasmineGlobal.WeakMap
|
|
);
|
|
};
|
|
|
|
private$.isURL = function(obj) {
|
|
return (
|
|
obj !== null &&
|
|
typeof obj !== 'undefined' &&
|
|
obj.constructor === jasmineGlobal.URL
|
|
);
|
|
};
|
|
|
|
private$.isIterable = function(value) {
|
|
return value && !!value[Symbol.iterator];
|
|
};
|
|
|
|
private$.isDataView = function(obj) {
|
|
return (
|
|
obj !== null &&
|
|
typeof obj !== 'undefined' &&
|
|
obj.constructor === jasmineGlobal.DataView
|
|
);
|
|
};
|
|
|
|
private$.isPromise = function(obj) {
|
|
return !!obj && obj.constructor === jasmineGlobal.Promise;
|
|
};
|
|
|
|
private$.isPromiseLike = function(obj) {
|
|
return !!obj && private$.isFunction(obj.then);
|
|
};
|
|
|
|
private$.fnNameFor = function(func) {
|
|
if (func.name) {
|
|
return func.name;
|
|
}
|
|
|
|
const matches =
|
|
func.toString().match(/^\s*function\s*(\w+)\s*\(/) ||
|
|
func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/);
|
|
|
|
return matches ? matches[1] : '<anonymous>';
|
|
};
|
|
|
|
private$.isPending = function(promise) {
|
|
const sentinel = {};
|
|
return Promise.race([promise, Promise.resolve(sentinel)]).then(
|
|
function(result) {
|
|
return result === sentinel;
|
|
},
|
|
function() {
|
|
return false;
|
|
}
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared matches every provided equality tester.
|
|
* @name asymmetricEqualityTesters.allOf
|
|
* @emittedName jasmine.allOf
|
|
* @since 5.13.0
|
|
* @function
|
|
* @param {...*} arguments - The asymmetric equality checkers to compare.
|
|
*/
|
|
j$.allOf = function() {
|
|
return new j$.AllOf(...arguments);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared is an instance of the specified class/constructor.
|
|
* @name asymmetricEqualityTesters.any
|
|
* @emittedName jasmine.any
|
|
* @since 1.3.0
|
|
* @function
|
|
* @param {Constructor} clazz - The constructor to check against.
|
|
*/
|
|
j$.any = function(clazz) {
|
|
return new private$.Any(clazz);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared is not `null` and not `undefined`.
|
|
* @name asymmetricEqualityTesters.anything
|
|
* @emittedName jasmine.anything
|
|
* @since 2.2.0
|
|
* @function
|
|
*/
|
|
j$.anything = function() {
|
|
return new private$.Anything();
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared is `true` or anything truthy.
|
|
* @name asymmetricEqualityTesters.truthy
|
|
* @emittedName jasmine.truthy
|
|
* @since 3.1.0
|
|
* @function
|
|
*/
|
|
j$.truthy = function() {
|
|
return new private$.Truthy();
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared is `null`, `undefined`, `0`, `false` or anything
|
|
* falsy.
|
|
* @name asymmetricEqualityTesters.falsy
|
|
* @emittedName jasmine.falsy
|
|
* @since 3.1.0
|
|
* @function
|
|
*/
|
|
j$.falsy = function() {
|
|
return new private$.Falsy();
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared is empty.
|
|
* @name asymmetricEqualityTesters.empty
|
|
* @emittedName jasmine.empty
|
|
* @since 3.1.0
|
|
* @function
|
|
*/
|
|
j$.empty = function() {
|
|
return new private$.Empty();
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that passes if the actual value is
|
|
* the same as the sample as determined by the `===` operator.
|
|
* @name asymmetricEqualityTesters.is
|
|
* @emittedName jasmine.is
|
|
* @function
|
|
* @param {Object} sample - The value to compare the actual to.
|
|
*/
|
|
j$.is = function(sample) {
|
|
return new private$.Is(sample);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared is not empty.
|
|
* @name asymmetricEqualityTesters.notEmpty
|
|
* @emittedName jasmine.notEmpty
|
|
* @since 3.1.0
|
|
* @function
|
|
*/
|
|
j$.notEmpty = function() {
|
|
return new private$.NotEmpty();
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value being compared contains at least the specified keys and values.
|
|
* @name asymmetricEqualityTesters.objectContaining
|
|
* @emittedName jasmine.objectContaining
|
|
* @since 1.3.0
|
|
* @function
|
|
* @param {Object} sample - The subset of properties that _must_ be in the actual.
|
|
*/
|
|
j$.objectContaining = function(sample) {
|
|
return new private$.ObjectContaining(sample);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value is a `String` that matches the `RegExp` or `String`.
|
|
* @name asymmetricEqualityTesters.stringMatching
|
|
* @emittedName jasmine.stringMatching
|
|
* @since 2.2.0
|
|
* @function
|
|
* @param {RegExp|String} expected
|
|
*/
|
|
j$.stringMatching = function(expected) {
|
|
return new private$.StringMatching(expected);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value is a `String` that contains the specified `String`.
|
|
* @name asymmetricEqualityTesters.stringContaining
|
|
* @emittedName jasmine.stringContaining
|
|
* @since 3.10.0
|
|
* @function
|
|
* @param {String} expected
|
|
*/
|
|
j$.stringContaining = function(expected) {
|
|
return new private$.StringContaining(expected);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value is an `Array` that contains at least the elements in the sample.
|
|
* @name asymmetricEqualityTesters.arrayContaining
|
|
* @emittedName jasmine.arrayContaining
|
|
* @since 2.2.0
|
|
* @function
|
|
* @param {Array} sample
|
|
*/
|
|
j$.arrayContaining = function(sample) {
|
|
return new private$.ArrayContaining(sample);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if the actual
|
|
* value is an `Array` that contains all of the elements in the sample in
|
|
* any order.
|
|
* @name asymmetricEqualityTesters.arrayWithExactContents
|
|
* @emittedName jasmine.arrayWithExactContents
|
|
* @since 2.8.0
|
|
* @function
|
|
* @param {Array} sample
|
|
*/
|
|
j$.arrayWithExactContents = function(sample) {
|
|
return new private$.ArrayWithExactContents(sample);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if every
|
|
* key/value pair in the sample passes the deep equality comparison
|
|
* with at least one key/value pair in the actual value being compared
|
|
* @name asymmetricEqualityTesters.mapContaining
|
|
* @emittedName jasmine.mapContaining
|
|
* @since 3.5.0
|
|
* @function
|
|
* @param {Map} sample - The subset of items that _must_ be in the actual.
|
|
*/
|
|
j$.mapContaining = function(sample) {
|
|
return new private$.MapContaining(sample);
|
|
};
|
|
|
|
/**
|
|
* Get an {@link AsymmetricEqualityTester} that will succeed if every item
|
|
* in the sample passes the deep equality comparison
|
|
* with at least one item in the actual value being compared
|
|
* @name asymmetricEqualityTesters.setContaining
|
|
* @emittedName jasmine.setContaining
|
|
* @since 3.5.0
|
|
* @function
|
|
* @param {Set} sample - The subset of items that _must_ be in the actual.
|
|
*/
|
|
j$.setContaining = function(sample) {
|
|
return new private$.SetContaining(sample);
|
|
};
|
|
|
|
/**
|
|
* Determines whether the provided function is a Jasmine spy.
|
|
* @name jasmine.isSpy
|
|
* @since 2.0.0
|
|
* @function
|
|
* @param {Function} putativeSpy - The function to check.
|
|
* @return {Boolean}
|
|
*/
|
|
j$.isSpy = function(putativeSpy) {
|
|
if (!putativeSpy) {
|
|
return false;
|
|
}
|
|
return (
|
|
putativeSpy.and instanceof private$.SpyStrategy &&
|
|
putativeSpy.calls instanceof private$.CallTracker
|
|
);
|
|
};
|
|
|
|
/**
|
|
* Logs a message for use in debugging. If the spec fails, trace messages
|
|
* will be included in the {@link SpecDoneEvent|result} passed to the
|
|
* reporter's specDone method.
|
|
*
|
|
* This method should be called only when a spec (including any associated
|
|
* beforeEach or afterEach functions) is running.
|
|
* @function
|
|
* @name jasmine.debugLog
|
|
* @since 4.0.0
|
|
* @param {String} msg - The message to log
|
|
*/
|
|
j$.debugLog = function(msg) {
|
|
j$.getEnv().debugLog(msg);
|
|
};
|
|
|
|
/**
|
|
* Replaces Jasmine's global error handling with a spy. This prevents Jasmine
|
|
* from treating uncaught exceptions and unhandled promise rejections
|
|
* as spec failures and allows them to be inspected using the spy's
|
|
* {@link Spy#calls|calls property} and related matchers such as
|
|
* {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}.
|
|
*
|
|
* After installing the spy, spyOnGlobalErrorsAsync immediately calls its
|
|
* argument, which must be an async or promise-returning function. The spy
|
|
* will be passed as the first argument to that callback. Normal error
|
|
* handling will be restored when the promise returned from the callback is
|
|
* settled.
|
|
*
|
|
* When the JavaScript runtime reports an uncaught error or unhandled rejection,
|
|
* the spy will be called with a single parameter representing Jasmine's best
|
|
* effort at describing the error. This parameter may be of any type, because
|
|
* JavaScript allows anything to be thrown or used as the reason for a
|
|
* rejected promise, but Error instances and strings are most common.
|
|
*
|
|
* Note: The JavaScript runtime may deliver uncaught error events and unhandled
|
|
* rejection events asynchronously, especially in browsers. If the event
|
|
* occurs after the promise returned from the callback is settled, it won't
|
|
* be routed to the spy even if the underlying error occurred previously.
|
|
* It's up to you to ensure that all of the error/rejection events that you
|
|
* want to handle have occurred before you resolve the promise returned from
|
|
* the callback.
|
|
*
|
|
* You must ensure that the `it`/`beforeEach`/etc fn that called
|
|
* `spyOnGlobalErrorsAsync` does not signal completion until after the
|
|
* promise returned by `spyOnGlobalErrorsAsync` is resolved. Normally this is
|
|
* done by `await`ing the returned promise. Leaving the global error spy
|
|
* installed after the `it`/`beforeEach`/etc fn that installed it signals
|
|
* completion is likely to cause problems and is not supported.
|
|
* @name jasmine.spyOnGlobalErrorsAsync
|
|
* @function
|
|
* @async
|
|
* @param {AsyncFunction} fn - A function to run, during which the global error spy will be effective
|
|
* @example
|
|
* it('demonstrates global error spies', async function() {
|
|
* await jasmine.spyOnGlobalErrorsAsync(async function(globalErrorSpy) {
|
|
* setTimeout(function() {
|
|
* throw new Error('the expected error');
|
|
* });
|
|
* await new Promise(function(resolve) {
|
|
* setTimeout(resolve);
|
|
* });
|
|
* const expected = new Error('the expected error');
|
|
* expect(globalErrorSpy).toHaveBeenCalledWith(expected);
|
|
* });
|
|
* });
|
|
*/
|
|
j$.spyOnGlobalErrorsAsync = async function(fn) {
|
|
await jasmine.getEnv().spyOnGlobalErrorsAsync(fn);
|
|
};
|
|
};
|