From 90b9083c455c86a9949d3d2c46c966ee9da074d8 Mon Sep 17 00:00:00 2001 From: Mark Pedrotti Date: Tue, 12 Feb 2019 14:03:51 -0500 Subject: [PATCH 1/3] expect: Improve report when matcher fails, part 8 --- .../__snapshots__/matchers.test.js.snap | 175 +++++++++++------- packages/expect/src/matchers.js | 62 +++++-- 2 files changed, 155 insertions(+), 82 deletions(-) diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index 1ab89d930b1b..df573dfc4a9f 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: < 5e-3 +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: < 5e-3 +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: < 5e-3 +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 < 5e-3 +Received difference: 1e-3" `; 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 < 5e-3 +Received difference: 4.999999999999893e-3" `; 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 < 5e-3 +Received difference: 4.0000000000000036e-3" `; 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 < 5e-3 +Received difference: 9.999999999998899e-4" `; 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 < 5e-3 +Received difference: 4.0000000000000036e-3" `; 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 < 5e-6 +Received difference: 4e-6" `; 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 < 5e-4 +Received difference: 1e-4" `; 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 < 5e-1 +Received difference: 1e-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: < 5e-3 +Received difference: 1e-2" `; 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: < 5e-3 +Received difference: 2.2999999999999998e-1" `; 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: < 5e-3 +Received difference: 5.000099999999952e-3" `; exports[`.toBeDefined(), .toBeUndefined() '"a"' is defined 1`] = ` diff --git a/packages/expect/src/matchers.js b/packages/expect/src/matchers.js index 844d6fc1b986..e3e8ca8f5ef1 100644 --- a/packages/expect/src/matchers.js +++ b/packages/expect/src/matchers.js @@ -87,25 +87,59 @@ 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 < ${EXPECTED_COLOR( + expectedDiff.toExponential(), + )}\n` + + `Received difference: ${RECEIVED_COLOR( + receivedDiff.toExponential(), + )}`) + : () => + matcherHint('toBeCloseTo', undefined, undefined, options) + + '\n\n' + + `Expected: ${printExpected(expected)}\n` + + `Received: ${printReceived(received)}\n` + + '\n' + + `Expected precision: ${printExpected(precision)}\n` + + `Expected difference: < ${EXPECTED_COLOR( + expectedDiff.toExponential(), + )}\n` + + `Received difference: ${RECEIVED_COLOR( + receivedDiff.toExponential(), + )}`; return {message, pass}; }, From d5789dec7baf987bf9827a213950c65fb6d00f54 Mon Sep 17 00:00:00 2001 From: Mark Pedrotti Date: Tue, 12 Feb 2019 14:21:43 -0500 Subject: [PATCH 2/3] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24f72e8ba875..7fcfa10e2a5d 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 From 52dffd016da642350b71f72911957cdd330f0f89 Mon Sep 17 00:00:00 2001 From: Mark Pedrotti Date: Tue, 12 Feb 2019 15:38:43 -0500 Subject: [PATCH 3/3] Ordinary conversion makes it easier to compare differences --- .../__snapshots__/matchers.test.js.snap | 50 +++++++++---------- packages/expect/src/matchers.js | 16 ++---- 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index df573dfc4a9f..fa555849d062 100644 --- a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap +++ b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap @@ -395,7 +395,7 @@ Expected: -1.23 Received: -Infinity Expected precision: 2 -Expected difference: < 5e-3 +Expected difference: < 0.005 Received difference: Infinity" `; @@ -406,7 +406,7 @@ Expected: -Infinity Received: Infinity Expected precision: 2 -Expected difference: < 5e-3 +Expected difference: < 0.005 Received difference: Infinity" `; @@ -417,7 +417,7 @@ Expected: 1.23 Received: Infinity Expected precision: 2 -Expected difference: < 5e-3 +Expected difference: < 0.005 Received difference: Infinity" `; @@ -442,8 +442,8 @@ Expected: not 0.001 Received: 0 Expected precision: 2 -Expected difference: not < 5e-3 -Received difference: 1e-3" +Expected difference: not < 0.005 +Received difference: 0.001" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.225) 1`] = ` @@ -453,8 +453,8 @@ Expected: not 1.225 Received: 1.23 Expected precision: 2 -Expected difference: not < 5e-3 -Received difference: 4.999999999999893e-3" +Expected difference: not < 0.005 +Received difference: 0.004999999999999893" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.226) 1`] = ` @@ -464,8 +464,8 @@ Expected: not 1.226 Received: 1.23 Expected precision: 2 -Expected difference: not < 5e-3 -Received difference: 4.0000000000000036e-3" +Expected difference: not < 0.005 +Received difference: 0.0040000000000000036" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.229) 1`] = ` @@ -475,8 +475,8 @@ Expected: not 1.229 Received: 1.23 Expected precision: 2 -Expected difference: not < 5e-3 -Received difference: 9.999999999998899e-4" +Expected difference: not < 0.005 +Received difference: 0.0009999999999998899" `; exports[`.toBeCloseTo() {pass: true} expect(1.23)toBeCloseTo( 1.234) 1`] = ` @@ -486,8 +486,8 @@ Expected: not 1.234 Received: 1.23 Expected precision: 2 -Expected difference: not < 5e-3 -Received difference: 4.0000000000000036e-3" +Expected difference: not < 0.005 +Received difference: 0.0040000000000000036" `; exports[`.toBeCloseTo() {pass: true} expect(Infinity)toBeCloseTo( Infinity) 1`] = ` @@ -504,8 +504,8 @@ Expected: not 0.000004 Received: 0 Expected precision: 5 -Expected difference: not < 5e-6 -Received difference: 4e-6" +Expected difference: not < 0.000005 +Received difference: 0.000004" `; exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.0001, 3] 1`] = ` @@ -515,8 +515,8 @@ Expected: not 0.0001 Received: 0 Expected precision: 3 -Expected difference: not < 5e-4 -Received difference: 1e-4" +Expected difference: not < 0.0005 +Received difference: 0.0001" `; exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.1, 0] 1`] = ` @@ -526,8 +526,8 @@ Expected: not 0.1 Received: 0 Expected precision: 0 -Expected difference: not < 5e-1 -Received difference: 1e-1" +Expected difference: not < 0.5 +Received difference: 0.1" `; exports[`.toBeCloseTo() throws: [0, 0.01] 1`] = ` @@ -537,8 +537,8 @@ Expected: 0.01 Received: 0 Expected precision: 2 -Expected difference: < 5e-3 -Received difference: 1e-2" +Expected difference: < 0.005 +Received difference: 0.01" `; exports[`.toBeCloseTo() throws: [1, 1.23] 1`] = ` @@ -548,8 +548,8 @@ Expected: 1.23 Received: 1 Expected precision: 2 -Expected difference: < 5e-3 -Received difference: 2.2999999999999998e-1" +Expected difference: < 0.005 +Received difference: 0.22999999999999998" `; exports[`.toBeCloseTo() throws: [1.23, 1.2249999] 1`] = ` @@ -559,8 +559,8 @@ Expected: 1.2249999 Received: 1.23 Expected precision: 2 -Expected difference: < 5e-3 -Received difference: 5.000099999999952e-3" +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 e3e8ca8f5ef1..bc093152ca15 100644 --- a/packages/expect/src/matchers.js +++ b/packages/expect/src/matchers.js @@ -121,12 +121,8 @@ const matchers: MatchersObject = { : `Received: ${printReceived(received)}\n` + '\n' + `Expected precision: ${printExpected(precision)}\n` + - `Expected difference: not < ${EXPECTED_COLOR( - expectedDiff.toExponential(), - )}\n` + - `Received difference: ${RECEIVED_COLOR( - receivedDiff.toExponential(), - )}`) + `Expected difference: not < ${printExpected(expectedDiff)}\n` + + `Received difference: ${printReceived(receivedDiff)}`) : () => matcherHint('toBeCloseTo', undefined, undefined, options) + '\n\n' + @@ -134,12 +130,8 @@ const matchers: MatchersObject = { `Received: ${printReceived(received)}\n` + '\n' + `Expected precision: ${printExpected(precision)}\n` + - `Expected difference: < ${EXPECTED_COLOR( - expectedDiff.toExponential(), - )}\n` + - `Received difference: ${RECEIVED_COLOR( - receivedDiff.toExponential(), - )}`; + `Expected difference: < ${printExpected(expectedDiff)}\n` + + `Received difference: ${printReceived(receivedDiff)}`; return {message, pass}; },