Merge branch 'main' into 3.99
This commit is contained in:
@@ -72,12 +72,7 @@ getJasmineRequireObj().DiffBuilder = function (j$) {
|
||||
};
|
||||
|
||||
function dereferencePath(objectPath, actual, expected, pp) {
|
||||
var i, asymmetricResult
|
||||
|
||||
for (i = 0; i < objectPath.components.length; i++) {
|
||||
actual = actual[objectPath.components[i]];
|
||||
expected = expected[objectPath.components[i]];
|
||||
|
||||
function handleAsymmetricExpected() {
|
||||
if (j$.isAsymmetricEqualityTester_(expected) && j$.isFunction_(expected.valuesForDiff_)) {
|
||||
var asymmetricResult = expected.valuesForDiff_(actual, pp);
|
||||
expected = asymmetricResult.self;
|
||||
@@ -85,6 +80,15 @@ getJasmineRequireObj().DiffBuilder = function (j$) {
|
||||
}
|
||||
}
|
||||
|
||||
var i;
|
||||
handleAsymmetricExpected();
|
||||
|
||||
for (i = 0; i < objectPath.components.length; i++) {
|
||||
actual = actual[objectPath.components[i]];
|
||||
expected = expected[objectPath.components[i]];
|
||||
handleAsymmetricExpected();
|
||||
}
|
||||
|
||||
return {actual: actual, expected: expected};
|
||||
}
|
||||
|
||||
|
||||
26
src/core/matchers/async/toBePending.js
Normal file
26
src/core/matchers/async/toBePending.js
Normal file
@@ -0,0 +1,26 @@
|
||||
/* eslint-disable compat/compat */
|
||||
getJasmineRequireObj().toBePending = function(j$) {
|
||||
/**
|
||||
* Expect a promise to be pending, i.e. the promise is neither resolved nor rejected.
|
||||
* @function
|
||||
* @async
|
||||
* @name async-matchers#toBePending
|
||||
* @since 3.6
|
||||
* @example
|
||||
* await expectAsync(aPromise).toBePending();
|
||||
*/
|
||||
return function toBePending() {
|
||||
return {
|
||||
compare: function(actual) {
|
||||
if (!j$.isPromiseLike(actual)) {
|
||||
throw new Error('Expected toBePending to be called on a promise.');
|
||||
}
|
||||
var want = {};
|
||||
return Promise.race([actual, Promise.resolve(want)]).then(
|
||||
function(got) { return {pass: want === got}; },
|
||||
function() { return {pass: false}; }
|
||||
);
|
||||
}
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -3,7 +3,6 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
|
||||
* _Note:_ Do not construct this directly. Jasmine will construct one and
|
||||
* pass it to matchers and asymmetric equality testers.
|
||||
* @name MatchersUtil
|
||||
* @since 2.0.0
|
||||
* @classdesc Utilities for use in implementing matchers
|
||||
* @constructor
|
||||
*/
|
||||
@@ -15,6 +14,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
|
||||
* taking into account the current set of custom value formatters.
|
||||
* @function
|
||||
* @name MatchersUtil#pp
|
||||
* @since 3.6.0
|
||||
* @param {*} value The value to pretty-print
|
||||
* @return {string} The pretty-printed value
|
||||
*/
|
||||
@@ -26,6 +26,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
|
||||
* logic as {@link MatchersUtil#equals}.
|
||||
* @function
|
||||
* @name MatchersUtil#contains
|
||||
* @since 2.0.0
|
||||
* @param {*} haystack The collection to search
|
||||
* @param {*} needle The value to search for
|
||||
* @param [customTesters] An array of custom equality testers. Deprecated.
|
||||
@@ -125,6 +126,7 @@ getJasmineRequireObj().MatchersUtil = function(j$) {
|
||||
* Determines whether two values are deeply equal to each other.
|
||||
* @function
|
||||
* @name MatchersUtil#equals
|
||||
* @since 2.0.0
|
||||
* @param {*} a The first value to compare
|
||||
* @param {*} b The second value to compare
|
||||
* @param [customTesters] An array of custom equality testers. Deprecated.
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) {
|
||||
var availableMatchers = [
|
||||
'toBePending',
|
||||
'toBeResolved',
|
||||
'toBeRejected',
|
||||
'toBeResolvedTo',
|
||||
|
||||
@@ -20,8 +20,10 @@ getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
|
||||
'toBeUndefined',
|
||||
'toContain',
|
||||
'toEqual',
|
||||
'toHaveSize',
|
||||
'toHaveBeenCalled',
|
||||
'toHaveBeenCalledBefore',
|
||||
'toHaveBeenCalledOnceWith',
|
||||
'toHaveBeenCalledTimes',
|
||||
'toHaveBeenCalledWith',
|
||||
'toHaveClass',
|
||||
|
||||
69
src/core/matchers/toHaveBeenCalledOnceWith.js
Normal file
69
src/core/matchers/toHaveBeenCalledOnceWith.js
Normal file
@@ -0,0 +1,69 @@
|
||||
getJasmineRequireObj().toHaveBeenCalledOnceWith = function (j$) {
|
||||
|
||||
var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledOnceWith>', 'expect(<spyObj>).toHaveBeenCalledOnceWith(...arguments)');
|
||||
|
||||
/**
|
||||
* {@link expect} the actual (a {@link Spy}) to have been called exactly once, and exactly with the particular arguments.
|
||||
* @function
|
||||
* @name matchers#toHaveBeenCalledOnceWith
|
||||
* @since 3.6.0
|
||||
* @param {...Object} - The arguments to look for
|
||||
* @example
|
||||
* expect(mySpy).toHaveBeenCalledOnceWith('foo', 'bar', 2);
|
||||
*/
|
||||
function toHaveBeenCalledOnceWith(util) {
|
||||
return {
|
||||
compare: function () {
|
||||
var args = Array.prototype.slice.call(arguments, 0),
|
||||
actual = args[0],
|
||||
expectedArgs = args.slice(1);
|
||||
|
||||
if (!j$.isSpy(actual)) {
|
||||
throw new Error(getErrorMsg('Expected a spy, but got ' + util.pp(actual) + '.'));
|
||||
}
|
||||
|
||||
var prettyPrintedCalls = actual.calls.allArgs().map(function (argsForCall) {
|
||||
return ' ' + util.pp(argsForCall);
|
||||
});
|
||||
|
||||
if (actual.calls.count() === 1 && util.contains(actual.calls.allArgs(), expectedArgs)) {
|
||||
return {
|
||||
pass: true,
|
||||
message: 'Expected spy ' + actual.and.identity + ' to have been called 0 times, multiple times, or once, but with arguments different from:\n'
|
||||
+ ' ' + util.pp(expectedArgs) + '\n'
|
||||
+ 'But the actual call was:\n'
|
||||
+ prettyPrintedCalls.join(',\n') + '.\n\n'
|
||||
};
|
||||
}
|
||||
|
||||
function getDiffs() {
|
||||
return actual.calls.allArgs().map(function (argsForCall, callIx) {
|
||||
var diffBuilder = new j$.DiffBuilder();
|
||||
util.equals(argsForCall, expectedArgs, diffBuilder);
|
||||
return diffBuilder.getMessage();
|
||||
});
|
||||
}
|
||||
|
||||
function butString() {
|
||||
switch (actual.calls.count()) {
|
||||
case 0:
|
||||
return 'But it was never called.\n\n';
|
||||
case 1:
|
||||
return 'But the actual call was:\n' + prettyPrintedCalls.join(',\n') + '.\n' + getDiffs().join('\n') + '\n\n';
|
||||
default:
|
||||
return 'But the actual calls were:\n' + prettyPrintedCalls.join(',\n') + '.\n\n';
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
pass: false,
|
||||
message: 'Expected spy ' + actual.and.identity + ' to have been called only once, and with given args:\n'
|
||||
+ ' ' + util.pp(expectedArgs) + '\n'
|
||||
+ butString()
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return toHaveBeenCalledOnceWith;
|
||||
};
|
||||
42
src/core/matchers/toHaveSize.js
Normal file
42
src/core/matchers/toHaveSize.js
Normal file
@@ -0,0 +1,42 @@
|
||||
getJasmineRequireObj().toHaveSize = function(j$) {
|
||||
/**
|
||||
* {@link expect} the actual size to be equal to the expected, using array-like length or object keys size.
|
||||
* @function
|
||||
* @name matchers#toHaveSize
|
||||
* @since 3.6.0
|
||||
* @param {Object} expected - Expected size
|
||||
* @example
|
||||
* array = [1,2];
|
||||
* expect(array).toHaveSize(2);
|
||||
*/
|
||||
function toHaveSize() {
|
||||
return {
|
||||
compare: function(actual, expected) {
|
||||
var result = {
|
||||
pass: false
|
||||
};
|
||||
|
||||
if (j$.isA_('WeakSet', actual) || j$.isWeakMap(actual) || j$.isDataView(actual)) {
|
||||
throw new Error('Cannot get size of ' + actual + '.');
|
||||
}
|
||||
|
||||
if (j$.isSet(actual) || j$.isMap(actual)) {
|
||||
result.pass = actual.size === expected;
|
||||
} else if (isLength(actual.length)) {
|
||||
result.pass = actual.length === expected;
|
||||
} else {
|
||||
result.pass = Object.keys(actual).length === expected;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line compat/compat
|
||||
function isLength(value) {
|
||||
return (typeof value == 'number') && value > -1 && value % 1 === 0 && value <= MAX_SAFE_INTEGER;
|
||||
}
|
||||
|
||||
return toHaveSize;
|
||||
};
|
||||
Reference in New Issue
Block a user