You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
464 lines
13 KiB
464 lines
13 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { |
|
value: true |
|
}); |
|
exports.default = exports.createMatcher = void 0; |
|
|
|
var _jestMatcherUtils = require('jest-matcher-utils'); |
|
|
|
var _jestMessageUtil = require('jest-message-util'); |
|
|
|
var _print = require('./print'); |
|
|
|
var _utils = require('./utils'); |
|
|
|
/** |
|
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
* |
|
*/ |
|
|
|
/* eslint-disable local/ban-types-eventually */ |
|
const DID_NOT_THROW = 'Received function did not throw'; |
|
|
|
const getThrown = e => { |
|
const hasMessage = |
|
e !== null && e !== undefined && typeof e.message === 'string'; |
|
|
|
if (hasMessage && typeof e.name === 'string' && typeof e.stack === 'string') { |
|
return { |
|
hasMessage, |
|
isError: true, |
|
message: e.message, |
|
value: e |
|
}; |
|
} |
|
|
|
return { |
|
hasMessage, |
|
isError: false, |
|
message: hasMessage ? e.message : String(e), |
|
value: e |
|
}; |
|
}; |
|
|
|
const createMatcher = (matcherName, fromPromise) => |
|
function (received, expected) { |
|
const options = { |
|
isNot: this.isNot, |
|
promise: this.promise |
|
}; |
|
let thrown = null; |
|
|
|
if (fromPromise && (0, _utils.isError)(received)) { |
|
thrown = getThrown(received); |
|
} else { |
|
if (typeof received !== 'function') { |
|
if (!fromPromise) { |
|
const placeholder = expected === undefined ? '' : 'expected'; |
|
throw new Error( |
|
(0, _jestMatcherUtils.matcherErrorMessage)( |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
placeholder, |
|
options |
|
), |
|
`${(0, _jestMatcherUtils.RECEIVED_COLOR)( |
|
'received' |
|
)} value must be a function`, |
|
(0, _jestMatcherUtils.printWithType)( |
|
'Received', |
|
received, |
|
_jestMatcherUtils.printReceived |
|
) |
|
) |
|
); |
|
} |
|
} else { |
|
try { |
|
received(); |
|
} catch (e) { |
|
thrown = getThrown(e); |
|
} |
|
} |
|
} |
|
|
|
if (expected === undefined) { |
|
return toThrow(matcherName, options, thrown); |
|
} else if (typeof expected === 'function') { |
|
return toThrowExpectedClass(matcherName, options, thrown, expected); |
|
} else if (typeof expected === 'string') { |
|
return toThrowExpectedString(matcherName, options, thrown, expected); |
|
} else if (expected !== null && typeof expected.test === 'function') { |
|
return toThrowExpectedRegExp(matcherName, options, thrown, expected); |
|
} else if ( |
|
expected !== null && |
|
typeof expected.asymmetricMatch === 'function' |
|
) { |
|
return toThrowExpectedAsymmetric(matcherName, options, thrown, expected); |
|
} else if (expected !== null && typeof expected === 'object') { |
|
return toThrowExpectedObject(matcherName, options, thrown, expected); |
|
} else { |
|
throw new Error( |
|
(0, _jestMatcherUtils.matcherErrorMessage)( |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
), |
|
`${(0, _jestMatcherUtils.EXPECTED_COLOR)( |
|
'expected' |
|
)} value must be a string or regular expression or class or error`, |
|
(0, _jestMatcherUtils.printWithType)( |
|
'Expected', |
|
expected, |
|
_jestMatcherUtils.printExpected |
|
) |
|
) |
|
); |
|
} |
|
}; |
|
|
|
exports.createMatcher = createMatcher; |
|
const matchers = { |
|
toThrow: createMatcher('toThrow'), |
|
toThrowError: createMatcher('toThrowError') |
|
}; |
|
|
|
const toThrowExpectedRegExp = (matcherName, options, thrown, expected) => { |
|
const pass = thrown !== null && expected.test(thrown.message); |
|
const message = pass |
|
? () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected pattern: not ', expected) + |
|
(thrown !== null && thrown.hasMessage |
|
? formatReceived( |
|
'Received message: ', |
|
thrown, |
|
'message', |
|
expected |
|
) + formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value')) |
|
: () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected pattern: ', expected) + |
|
(thrown === null |
|
? '\n' + DID_NOT_THROW |
|
: thrown.hasMessage |
|
? formatReceived('Received message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value')); |
|
return { |
|
message, |
|
pass |
|
}; |
|
}; |
|
|
|
const toThrowExpectedAsymmetric = (matcherName, options, thrown, expected) => { |
|
const pass = thrown !== null && expected.asymmetricMatch(thrown.value); |
|
const message = pass |
|
? () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected asymmetric matcher: not ', expected) + |
|
'\n' + |
|
(thrown !== null && thrown.hasMessage |
|
? formatReceived('Received name: ', thrown, 'name') + |
|
formatReceived('Received message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Thrown value: ', thrown, 'value')) |
|
: () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected asymmetric matcher: ', expected) + |
|
'\n' + |
|
(thrown === null |
|
? DID_NOT_THROW |
|
: thrown.hasMessage |
|
? formatReceived('Received name: ', thrown, 'name') + |
|
formatReceived('Received message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Thrown value: ', thrown, 'value')); |
|
return { |
|
message, |
|
pass |
|
}; |
|
}; |
|
|
|
const toThrowExpectedObject = (matcherName, options, thrown, expected) => { |
|
const pass = thrown !== null && thrown.message === expected.message; |
|
const message = pass |
|
? () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected message: not ', expected.message) + |
|
(thrown !== null && thrown.hasMessage |
|
? formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value')) |
|
: () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
(thrown === null |
|
? formatExpected('Expected message: ', expected.message) + |
|
'\n' + |
|
DID_NOT_THROW |
|
: thrown.hasMessage |
|
? (0, _jestMatcherUtils.printDiffOrStringify)( |
|
expected.message, |
|
thrown.message, |
|
'Expected message', |
|
'Received message', |
|
true |
|
) + |
|
'\n' + |
|
formatStack(thrown) |
|
: formatExpected('Expected message: ', expected.message) + |
|
formatReceived('Received value: ', thrown, 'value')); |
|
return { |
|
message, |
|
pass |
|
}; |
|
}; |
|
|
|
const toThrowExpectedClass = (matcherName, options, thrown, expected) => { |
|
const pass = thrown !== null && thrown.value instanceof expected; |
|
const message = pass |
|
? () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
(0, _print.printExpectedConstructorNameNot)( |
|
'Expected constructor', |
|
expected |
|
) + |
|
(thrown !== null && |
|
thrown.value != null && |
|
typeof thrown.value.constructor === 'function' && |
|
thrown.value.constructor !== expected |
|
? (0, _print.printReceivedConstructorNameNot)( |
|
'Received constructor', |
|
thrown.value.constructor, |
|
expected |
|
) |
|
: '') + |
|
'\n' + |
|
(thrown !== null && thrown.hasMessage |
|
? formatReceived('Received message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value')) |
|
: () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
(0, _print.printExpectedConstructorName)( |
|
'Expected constructor', |
|
expected |
|
) + |
|
(thrown === null |
|
? '\n' + DID_NOT_THROW |
|
: (thrown.value != null && |
|
typeof thrown.value.constructor === 'function' |
|
? (0, _print.printReceivedConstructorName)( |
|
'Received constructor', |
|
thrown.value.constructor |
|
) |
|
: '') + |
|
'\n' + |
|
(thrown.hasMessage |
|
? formatReceived('Received message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value'))); |
|
return { |
|
message, |
|
pass |
|
}; |
|
}; |
|
|
|
const toThrowExpectedString = (matcherName, options, thrown, expected) => { |
|
const pass = thrown !== null && thrown.message.includes(expected); |
|
const message = pass |
|
? () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected substring: not ', expected) + |
|
(thrown !== null && thrown.hasMessage |
|
? formatReceived( |
|
'Received message: ', |
|
thrown, |
|
'message', |
|
expected |
|
) + formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value')) |
|
: () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
undefined, |
|
options |
|
) + |
|
'\n\n' + |
|
formatExpected('Expected substring: ', expected) + |
|
(thrown === null |
|
? '\n' + DID_NOT_THROW |
|
: thrown.hasMessage |
|
? formatReceived('Received message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Received value: ', thrown, 'value')); |
|
return { |
|
message, |
|
pass |
|
}; |
|
}; |
|
|
|
const toThrow = (matcherName, options, thrown) => { |
|
const pass = thrown !== null; |
|
const message = pass |
|
? () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
'', |
|
options |
|
) + |
|
'\n\n' + |
|
(thrown !== null && thrown.hasMessage |
|
? formatReceived('Error name: ', thrown, 'name') + |
|
formatReceived('Error message: ', thrown, 'message') + |
|
formatStack(thrown) |
|
: formatReceived('Thrown value: ', thrown, 'value')) |
|
: () => |
|
(0, _jestMatcherUtils.matcherHint)( |
|
matcherName, |
|
undefined, |
|
'', |
|
options |
|
) + |
|
'\n\n' + |
|
DID_NOT_THROW; |
|
return { |
|
message, |
|
pass |
|
}; |
|
}; |
|
|
|
const formatExpected = (label, expected) => |
|
label + (0, _jestMatcherUtils.printExpected)(expected) + '\n'; |
|
|
|
const formatReceived = (label, thrown, key, expected) => { |
|
if (thrown === null) { |
|
return ''; |
|
} |
|
|
|
if (key === 'message') { |
|
const message = thrown.message; |
|
|
|
if (typeof expected === 'string') { |
|
const index = message.indexOf(expected); |
|
|
|
if (index !== -1) { |
|
return ( |
|
label + |
|
(0, _print.printReceivedStringContainExpectedSubstring)( |
|
message, |
|
index, |
|
expected.length |
|
) + |
|
'\n' |
|
); |
|
} |
|
} else if (expected instanceof RegExp) { |
|
return ( |
|
label + |
|
(0, _print.printReceivedStringContainExpectedResult)( |
|
message, |
|
typeof expected.exec === 'function' ? expected.exec(message) : null |
|
) + |
|
'\n' |
|
); |
|
} |
|
|
|
return label + (0, _jestMatcherUtils.printReceived)(message) + '\n'; |
|
} |
|
|
|
if (key === 'name') { |
|
return thrown.isError |
|
? label + (0, _jestMatcherUtils.printReceived)(thrown.value.name) + '\n' |
|
: ''; |
|
} |
|
|
|
if (key === 'value') { |
|
return thrown.isError |
|
? '' |
|
: label + (0, _jestMatcherUtils.printReceived)(thrown.value) + '\n'; |
|
} |
|
|
|
return ''; |
|
}; |
|
|
|
const formatStack = thrown => |
|
thrown === null || !thrown.isError |
|
? '' |
|
: (0, _jestMessageUtil.formatStackTrace)( |
|
(0, _jestMessageUtil.separateMessageFromStack)(thrown.value.stack) |
|
.stack, |
|
{ |
|
rootDir: process.cwd(), |
|
testMatch: [] |
|
}, |
|
{ |
|
noStackTrace: false |
|
} |
|
); |
|
|
|
var _default = matchers; |
|
exports.default = _default;
|
|
|