Files
jasmine/src/core/matchers/toThrowMatching.js
2022-06-09 20:00:23 -07:00

82 lines
2.1 KiB
JavaScript

getJasmineRequireObj().toThrowMatching = function(j$) {
const usageError = j$.formatErrorMsg(
'<toThrowMatching>',
'expect(function() {<expectation>}).toThrowMatching(<Predicate>)'
);
/**
* {@link expect} a function to `throw` something matching a predicate.
* @function
* @name matchers#toThrowMatching
* @since 3.0.0
* @param {Function} predicate - A function that takes the thrown exception as its parameter and returns true if it matches.
* @example
* expect(function() { throw new Error('nope'); }).toThrowMatching(function(thrown) { return thrown.message === 'nope'; });
*/
function toThrowMatching(matchersUtil) {
return {
compare: function(actual, predicate) {
if (typeof actual !== 'function') {
throw new Error(usageError('Actual is not a Function'));
}
if (typeof predicate !== 'function') {
throw new Error(usageError('Predicate is not a Function'));
}
let thrown;
try {
actual();
return fail('Expected function to throw an exception.');
} catch (e) {
thrown = e;
}
if (predicate(thrown)) {
return pass(
'Expected function not to throw an exception matching a predicate.'
);
} else {
return fail(function() {
return (
'Expected function to throw an exception matching a predicate, ' +
'but it threw ' +
thrownDescription(thrown) +
'.'
);
});
}
}
};
function thrownDescription(thrown) {
if (thrown && thrown.constructor) {
return (
j$.fnNameFor(thrown.constructor) +
' with message ' +
matchersUtil.pp(thrown.message)
);
} else {
return matchersUtil.pp(thrown);
}
}
}
function pass(message) {
return {
pass: true,
message: message
};
}
function fail(message) {
return {
pass: false,
message: message
};
}
return toThrowMatching;
};