210 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| Object.defineProperty(exports, '__esModule', {
 | |
|   value: true
 | |
| });
 | |
| exports.printReceivedConstructorNameNot = exports.printReceivedConstructorName = exports.printExpectedConstructorNameNot = exports.printExpectedConstructorName = exports.printDiffOrStringify = exports.printReceivedArrayContainExpectedItem = exports.printReceivedStringContainExpectedResult = exports.printReceivedStringContainExpectedSubstring = void 0;
 | |
| 
 | |
| var _jestGetType = _interopRequireWildcard(require('jest-get-type'));
 | |
| 
 | |
| var _jestMatcherUtils = require('jest-matcher-utils');
 | |
| 
 | |
| var _utils = require('./utils');
 | |
| 
 | |
| function _interopRequireWildcard(obj) {
 | |
|   if (obj && obj.__esModule) {
 | |
|     return obj;
 | |
|   } else {
 | |
|     var newObj = {};
 | |
|     if (obj != null) {
 | |
|       for (var key in obj) {
 | |
|         if (Object.prototype.hasOwnProperty.call(obj, key)) {
 | |
|           var desc =
 | |
|             Object.defineProperty && Object.getOwnPropertyDescriptor
 | |
|               ? Object.getOwnPropertyDescriptor(obj, key)
 | |
|               : {};
 | |
|           if (desc.get || desc.set) {
 | |
|             Object.defineProperty(newObj, key, desc);
 | |
|           } else {
 | |
|             newObj[key] = obj[key];
 | |
|           }
 | |
|         }
 | |
|       }
 | |
|     }
 | |
|     newObj.default = obj;
 | |
|     return newObj;
 | |
|   }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 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.
 | |
|  *
 | |
|  */
 | |
| // Format substring but do not enclose in double quote marks.
 | |
| // The replacement is compatible with pretty-format package.
 | |
| const printSubstring = val => val.replace(/"|\\/g, '\\$&');
 | |
| 
 | |
| const printReceivedStringContainExpectedSubstring = (received, start, length) =>
 | |
|   (0, _jestMatcherUtils.RECEIVED_COLOR)(
 | |
|     '"' +
 | |
|       printSubstring(received.slice(0, start)) +
 | |
|       (0, _jestMatcherUtils.INVERTED_COLOR)(
 | |
|         printSubstring(received.slice(start, start + length))
 | |
|       ) +
 | |
|       printSubstring(received.slice(start + length)) +
 | |
|       '"'
 | |
|   );
 | |
| 
 | |
| exports.printReceivedStringContainExpectedSubstring = printReceivedStringContainExpectedSubstring;
 | |
| 
 | |
| const printReceivedStringContainExpectedResult = (received, result) =>
 | |
|   result === null
 | |
|     ? (0, _jestMatcherUtils.printReceived)(received)
 | |
|     : printReceivedStringContainExpectedSubstring(
 | |
|         received,
 | |
|         result.index,
 | |
|         result[0].length
 | |
|       ); // The serialized array is compatible with pretty-format package min option.
 | |
| // However, items have default stringify depth (instead of depth - 1)
 | |
| // so expected item looks consistent by itself and enclosed in the array.
 | |
| 
 | |
| exports.printReceivedStringContainExpectedResult = printReceivedStringContainExpectedResult;
 | |
| 
 | |
| const printReceivedArrayContainExpectedItem = (received, index) =>
 | |
|   (0, _jestMatcherUtils.RECEIVED_COLOR)(
 | |
|     '[' +
 | |
|       received
 | |
|         .map((item, i) => {
 | |
|           const stringified = (0, _jestMatcherUtils.stringify)(item);
 | |
|           return i === index
 | |
|             ? (0, _jestMatcherUtils.INVERTED_COLOR)(stringified)
 | |
|             : stringified;
 | |
|         })
 | |
|         .join(', ') +
 | |
|       ']'
 | |
|   );
 | |
| 
 | |
| exports.printReceivedArrayContainExpectedItem = printReceivedArrayContainExpectedItem;
 | |
| 
 | |
| const shouldPrintDiff = (expected, received) => {
 | |
|   const expectedType = (0, _jestGetType.default)(expected);
 | |
|   const receivedType = (0, _jestGetType.default)(received);
 | |
| 
 | |
|   if (expectedType !== receivedType) {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   if ((0, _jestGetType.isPrimitive)(expected)) {
 | |
|     // Print diff only if both strings have more than one line.
 | |
|     return (
 | |
|       expectedType === 'string' && !(0, _utils.isOneline)(expected, received)
 | |
|     );
 | |
|   }
 | |
| 
 | |
|   if (
 | |
|     expectedType === 'date' ||
 | |
|     expectedType === 'function' ||
 | |
|     expectedType === 'regexp'
 | |
|   ) {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   if (expected instanceof Error && received instanceof Error) {
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   return true;
 | |
| };
 | |
| 
 | |
| const printDiffOrStringify = (
 | |
|   expected,
 | |
|   received,
 | |
|   expectedLabel,
 | |
|   receivedLabel,
 | |
|   expand
 | |
| ) => {
 | |
|   // Cannot use same serialization as shortcut to avoid diff,
 | |
|   // because stringify (that is, pretty-format with min option)
 | |
|   // omits constructor name for array or object, too bad so sad :(
 | |
|   const difference = shouldPrintDiff(expected, received)
 | |
|     ? (0, _jestMatcherUtils.diff)(expected, received, {
 | |
|         aAnnotation: expectedLabel,
 | |
|         bAnnotation: receivedLabel,
 | |
|         expand
 | |
|       }) // string | null
 | |
|     : null; // Cannot reuse value of stringify(received) in report string,
 | |
|   // because printReceived does inverse highlight space at end of line,
 | |
|   // but RECEIVED_COLOR does not (it refers to a plain chalk method).
 | |
| 
 | |
|   if (
 | |
|     typeof difference === 'string' &&
 | |
|     difference.includes('- ' + expectedLabel) &&
 | |
|     difference.includes('+ ' + receivedLabel)
 | |
|   ) {
 | |
|     return difference;
 | |
|   }
 | |
| 
 | |
|   const printLabel = (0, _jestMatcherUtils.getLabelPrinter)(
 | |
|     expectedLabel,
 | |
|     receivedLabel
 | |
|   );
 | |
|   return (
 | |
|     `${printLabel(expectedLabel)}${(0, _jestMatcherUtils.printExpected)(
 | |
|       expected
 | |
|     )}\n` +
 | |
|     `${printLabel(receivedLabel)}${
 | |
|       (0, _jestMatcherUtils.stringify)(expected) ===
 | |
|       (0, _jestMatcherUtils.stringify)(received)
 | |
|         ? 'serializes to the same string'
 | |
|         : (0, _jestMatcherUtils.printReceived)(received)
 | |
|     }`
 | |
|   );
 | |
| };
 | |
| 
 | |
| exports.printDiffOrStringify = printDiffOrStringify;
 | |
| 
 | |
| const printExpectedConstructorName = (label, expected) =>
 | |
|   printConstructorName(label, expected, false, true) + '\n';
 | |
| 
 | |
| exports.printExpectedConstructorName = printExpectedConstructorName;
 | |
| 
 | |
| const printExpectedConstructorNameNot = (label, expected) =>
 | |
|   printConstructorName(label, expected, true, true) + '\n';
 | |
| 
 | |
| exports.printExpectedConstructorNameNot = printExpectedConstructorNameNot;
 | |
| 
 | |
| const printReceivedConstructorName = (label, received) =>
 | |
|   printConstructorName(label, received, false, false) + '\n'; // Do not call function if received is equal to expected.
 | |
| 
 | |
| exports.printReceivedConstructorName = printReceivedConstructorName;
 | |
| 
 | |
| const printReceivedConstructorNameNot = (label, received, expected) =>
 | |
|   typeof expected.name === 'string' &&
 | |
|   expected.name.length !== 0 &&
 | |
|   typeof received.name === 'string' &&
 | |
|   received.name.length !== 0
 | |
|     ? printConstructorName(label, received, true, false) +
 | |
|       ` ${
 | |
|         Object.getPrototypeOf(received) === expected
 | |
|           ? 'extends'
 | |
|           : 'extends … extends'
 | |
|       } ${(0, _jestMatcherUtils.EXPECTED_COLOR)(expected.name)}` +
 | |
|       '\n'
 | |
|     : printConstructorName(label, received, false, false) + '\n';
 | |
| 
 | |
| exports.printReceivedConstructorNameNot = printReceivedConstructorNameNot;
 | |
| 
 | |
| const printConstructorName = (label, constructor, isNot, isExpected) =>
 | |
|   typeof constructor.name !== 'string'
 | |
|     ? `${label} name is not a string`
 | |
|     : constructor.name.length === 0
 | |
|     ? `${label} name is an empty string`
 | |
|     : `${label}: ${!isNot ? '' : isExpected ? 'not ' : '    '}${
 | |
|         isExpected
 | |
|           ? (0, _jestMatcherUtils.EXPECTED_COLOR)(constructor.name)
 | |
|           : (0, _jestMatcherUtils.RECEIVED_COLOR)(constructor.name)
 | |
|       }`;
 |