From 505065457952d8eb34bbce6ce1753e1065ede1c1 Mon Sep 17 00:00:00 2001 From: Mark Pedrotti Date: Wed, 13 Feb 2019 09:23:26 -0500 Subject: [PATCH] expect: Improve report when matcher fails, part 8 (#7876) --- CHANGELOG.md | 1 + .../__snapshots__/matchers.test.js.snap | 175 +++++++++++------- packages/expect/src/matchers.js | 54 ++++-- 3 files changed, 148 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 075bb36680ac..5c70ac4f9656 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Features - `[expect]`: Improve report when matcher fails, part 7 ([#7866](https://github.com/facebook/jest/pull/7866)) +- `[expect]`: Improve report when matcher fails, part 8 ([#7876](https://github.com/facebook/jest/pull/7876)) ### Fixes diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index 1ab89d930b1b..fa555849d062 100644 --- a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap +++ b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap @@ -389,139 +389,178 @@ Received: true" `; exports[`.toBeCloseTo() {pass: false} expect(-Infinity)toBeCloseTo( -1.23) 1`] = ` -"expect(received).toBeCloseTo(expected) +"expect(received).toBeCloseTo(expected) -Precision: 2-digit -Expected: -1.23 -Received: -Infinity" +Expected: -1.23 +Received: -Infinity + +Expected precision: 2 +Expected difference: < 0.005 +Received difference: Infinity" `; exports[`.toBeCloseTo() {pass: false} expect(Infinity)toBeCloseTo( -Infinity) 1`] = ` -"expect(received).toBeCloseTo(expected) +"expect(received).toBeCloseTo(expected) + +Expected: -Infinity +Received: Infinity -Precision: 2-digit -Expected: -Infinity -Received: Infinity" +Expected precision: 2 +Expected difference: < 0.005 +Received difference: Infinity" `; exports[`.toBeCloseTo() {pass: false} expect(Infinity)toBeCloseTo( 1.23) 1`] = ` -"expect(received).toBeCloseTo(expected) +"expect(received).toBeCloseTo(expected) + +Expected: 1.23 +Received: Infinity -Precision: 2-digit -Expected: 1.23 -Received: Infinity" +Expected precision: 2 +Expected difference: < 0.005 +Received difference: Infinity" `; exports[`.toBeCloseTo() {pass: true} expect(-Infinity)toBeCloseTo( -Infinity) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) -Precision: 2-digit -Expected: -Infinity -Received: -Infinity" +Expected: not -Infinity +" `; exports[`.toBeCloseTo() {pass: true} expect(0)toBeCloseTo( 0) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) -Precision: 2-digit -Expected: 0 -Received: 0" +Expected: not 0 +" `; exports[`.toBeCloseTo() {pass: true} expect(0)toBeCloseTo( 0.001) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) -Precision: 2-digit -Expected: 0.001 -Received: 0" +Expected: not 0.001 +Received: 0 + +Expected precision: 2 +Expected difference: not < 0.005 +Received difference: 0.001" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.225) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) + +Expected: not 1.225 +Received: 1.23 -Precision: 2-digit -Expected: 1.225 -Received: 1.23" +Expected precision: 2 +Expected difference: not < 0.005 +Received difference: 0.004999999999999893" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.226) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) -Precision: 2-digit -Expected: 1.226 -Received: 1.23" +Expected: not 1.226 +Received: 1.23 + +Expected precision: 2 +Expected difference: not < 0.005 +Received difference: 0.0040000000000000036" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.229) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) + +Expected: not 1.229 +Received: 1.23 -Precision: 2-digit -Expected: 1.229 -Received: 1.23" +Expected precision: 2 +Expected difference: not < 0.005 +Received difference: 0.0009999999999998899" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.234) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) -Precision: 2-digit -Expected: 1.234 -Received: 1.23" +Expected: not 1.234 +Received: 1.23 + +Expected precision: 2 +Expected difference: not < 0.005 +Received difference: 0.0040000000000000036" `; exports[`.toBeCloseTo() {pass: true} expect(Infinity)toBeCloseTo( Infinity) 1`] = ` -"expect(received).not.toBeCloseTo(expected) +"expect(received).not.toBeCloseTo(expected) -Precision: 2-digit -Expected: Infinity -Received: Infinity" +Expected: not Infinity +" `; exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.000004, 5] 1`] = ` -"expect(received).not.toBeCloseTo(expected, precision) +"expect(received).not.toBeCloseTo(expected, precision) -Precision: 5-digit -Expected: 0.000004 -Received: 0" +Expected: not 0.000004 +Received: 0 + +Expected precision: 5 +Expected difference: not < 0.000005 +Received difference: 0.000004" `; exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.0001, 3] 1`] = ` -"expect(received).not.toBeCloseTo(expected, precision) +"expect(received).not.toBeCloseTo(expected, precision) + +Expected: not 0.0001 +Received: 0 -Precision: 3-digit -Expected: 0.0001 -Received: 0" +Expected precision: 3 +Expected difference: not < 0.0005 +Received difference: 0.0001" `; exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.1, 0] 1`] = ` -"expect(received).not.toBeCloseTo(expected, precision) +"expect(received).not.toBeCloseTo(expected, precision) -Precision: 0-digit -Expected: 0.1 -Received: 0" +Expected: not 0.1 +Received: 0 + +Expected precision: 0 +Expected difference: not < 0.5 +Received difference: 0.1" `; exports[`.toBeCloseTo() throws: [0, 0.01] 1`] = ` -"expect(received).toBeCloseTo(expected) +"expect(received).toBeCloseTo(expected) + +Expected: 0.01 +Received: 0 -Precision: 2-digit -Expected: 0.01 -Received: 0" +Expected precision: 2 +Expected difference: < 0.005 +Received difference: 0.01" `; exports[`.toBeCloseTo() throws: [1, 1.23] 1`] = ` -"expect(received).toBeCloseTo(expected) +"expect(received).toBeCloseTo(expected) -Precision: 2-digit -Expected: 1.23 -Received: 1" +Expected: 1.23 +Received: 1 + +Expected precision: 2 +Expected difference: < 0.005 +Received difference: 0.22999999999999998" `; exports[`.toBeCloseTo() throws: [1.23, 1.2249999] 1`] = ` -"expect(received).toBeCloseTo(expected) +"expect(received).toBeCloseTo(expected) + +Expected: 1.2249999 +Received: 1.23 -Precision: 2-digit -Expected: 1.2249999 -Received: 1.23" +Expected precision: 2 +Expected difference: < 0.005 +Received difference: 0.005000099999999952" `; exports[`.toBeDefined(), .toBeUndefined() '"a"' is defined 1`] = ` diff --git a/packages/expect/src/matchers.js b/packages/expect/src/matchers.js index 844d6fc1b986..bc093152ca15 100644 --- a/packages/expect/src/matchers.js +++ b/packages/expect/src/matchers.js @@ -87,25 +87,51 @@ const matchers: MatchersObject = { return {actual: received, expected, message, name: 'toBe', pass}; }, - toBeCloseTo(actual: number, expected: number, precision?: number = 2) { + toBeCloseTo(received: number, expected: number, precision?: number = 2) { const secondArgument = arguments.length === 3 ? 'precision' : null; - ensureNumbers(actual, expected, '.toBeCloseTo'); + const isNot = this.isNot; + const options = { + isNot, + promise: this.promise, + secondArgument, + }; + ensureNumbers(received, expected, '.toBeCloseTo'); let pass = false; + let expectedDiff = 0; + let receivedDiff = 0; - if (actual == Infinity && expected == Infinity) pass = true; - else if (actual == -Infinity && expected == -Infinity) pass = true; - else pass = Math.abs(expected - actual) < Math.pow(10, -precision) / 2; + if (received === Infinity && expected === Infinity) { + pass = true; // Infinity - Infinity is NaN + } else if (received === -Infinity && expected === -Infinity) { + pass = true; // -Infinity - -Infinity is NaN + } else { + expectedDiff = Math.pow(10, -precision) / 2; + receivedDiff = Math.abs(expected - received); + pass = receivedDiff < expectedDiff; + } - const message = () => - matcherHint('.toBeCloseTo', undefined, undefined, { - isNot: this.isNot, - secondArgument, - }) + - '\n\n' + - `Precision: ${printExpected(precision)}-digit\n` + - `Expected: ${printExpected(expected)}\n` + - `Received: ${printReceived(actual)}`; + const message = pass + ? () => + matcherHint('toBeCloseTo', undefined, undefined, options) + + '\n\n' + + `Expected: not ${printExpected(expected)}\n` + + (receivedDiff === 0 + ? '' + : `Received: ${printReceived(received)}\n` + + '\n' + + `Expected precision: ${printExpected(precision)}\n` + + `Expected difference: not < ${printExpected(expectedDiff)}\n` + + `Received difference: ${printReceived(receivedDiff)}`) + : () => + matcherHint('toBeCloseTo', undefined, undefined, options) + + '\n\n' + + `Expected: ${printExpected(expected)}\n` + + `Received: ${printReceived(received)}\n` + + '\n' + + `Expected precision: ${printExpected(precision)}\n` + + `Expected difference: < ${printExpected(expectedDiff)}\n` + + `Received difference: ${printReceived(receivedDiff)}`; return {message, pass}; },