From 624ac56606e0989c1a2202a02e652cf76df68ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Dias=20Conde=20Azevedo?= Date: Sun, 2 Dec 2018 00:35:42 +0000 Subject: [PATCH] Enhancement/expect-to-be-close-to-with-infinity (#7444) * toBeCloseTo works properly when comparing with Infinity * CHANGELOG update * Linter issue solved * Apply suggestions from code review Co-Authored-By: joao-conde * Update matchers.js * Update CHANGELOG * Fixed bug, leftover of old comment * Removed unecessary self-explanatory comments * Updated CHANGELOG * Snapshot updates --- CHANGELOG.md | 1 + .../__snapshots__/matchers.test.js.snap | 40 +++++++++++++++++++ .../expect/src/__tests__/matchers.test.js | 22 ++++++++++ packages/expect/src/matchers.js | 8 +++- 4 files changed, 70 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64b83d253735..622c61c3e303 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ - `[jest-config]` Add `dependencyExtractor` option to use a custom module to extract dependencies from files ([#7313](https://github.com/facebook/jest/pull/7313), [#7349](https://github.com/facebook/jest/pull/7349), [#7350](https://github.com/facebook/jest/pull/7350)) - `[jest-haste-map]` Accept a `getCacheKey` method in `hasteImplModulePath` modules to reset the cache when the logic changes ([#7350](https://github.com/facebook/jest/pull/7350)) - `[jest-config]` Add `haste.computeSha1` option to compute the sha-1 of the files in the haste map ([#7345](https://github.com/facebook/jest/pull/7345)) +- `[expect]` `expect(Infinity).toBeCloseTo(Infinity)` Treats `Infinity` as equal in toBeCloseTo matcher ([#7405](https://github.com/facebook/jest/pull/7405)) ### Fixes diff --git a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap index 6e9c035453aa..ad52eb43b2e1 100644 --- a/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap +++ b/packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap @@ -368,6 +368,38 @@ Expected: false Received: true" `; +exports[`.toBeCloseTo() {pass: false} expect(-Infinity)toBeCloseTo( -1.23) 1`] = ` +"expect(received).toBeCloseTo(expected) + +Precision: 2-digit +Expected: -1.23 +Received: -Infinity" +`; + +exports[`.toBeCloseTo() {pass: false} expect(Infinity)toBeCloseTo( -Infinity) 1`] = ` +"expect(received).toBeCloseTo(expected) + +Precision: 2-digit +Expected: -Infinity +Received: Infinity" +`; + +exports[`.toBeCloseTo() {pass: false} expect(Infinity)toBeCloseTo( 1.23) 1`] = ` +"expect(received).toBeCloseTo(expected) + +Precision: 2-digit +Expected: 1.23 +Received: Infinity" +`; + +exports[`.toBeCloseTo() {pass: true} expect(-Infinity)toBeCloseTo( -Infinity) 1`] = ` +"expect(received).not.toBeCloseTo(expected) + +Precision: 2-digit +Expected: -Infinity +Received: -Infinity" +`; + exports[`.toBeCloseTo() {pass: true} expect(0)toBeCloseTo( 0) 1`] = ` "expect(received).not.toBeCloseTo(expected) @@ -416,6 +448,14 @@ Expected: 1.234 Received: 1.23" `; +exports[`.toBeCloseTo() {pass: true} expect(Infinity)toBeCloseTo( Infinity) 1`] = ` +"expect(received).not.toBeCloseTo(expected) + +Precision: 2-digit +Expected: Infinity +Received: Infinity" +`; + exports[`.toBeCloseTo() accepts an optional precision argument: [0, 0.000004, 5] 1`] = ` "expect(received).not.toBeCloseTo(expected, precision) diff --git a/packages/expect/src/__tests__/matchers.test.js b/packages/expect/src/__tests__/matchers.test.js index 83662ae03c41..6fa7323a1198 100644 --- a/packages/expect/src/__tests__/matchers.test.js +++ b/packages/expect/src/__tests__/matchers.test.js @@ -894,6 +894,28 @@ describe('.toBeCloseTo()', () => { }); }); + [[Infinity, Infinity], [-Infinity, -Infinity]].forEach(([n1, n2]) => { + it(`{pass: true} expect(${n1})toBeCloseTo( ${n2})`, () => { + jestExpect(n1).toBeCloseTo(n2); + + expect(() => + jestExpect(n1).not.toBeCloseTo(n2), + ).toThrowErrorMatchingSnapshot(); + }); + }); + + [[Infinity, -Infinity], [Infinity, 1.23], [-Infinity, -1.23]].forEach( + ([n1, n2]) => { + it(`{pass: false} expect(${n1})toBeCloseTo( ${n2})`, () => { + jestExpect(n1).not.toBeCloseTo(n2); + + expect(() => + jestExpect(n1).toBeCloseTo(n2), + ).toThrowErrorMatchingSnapshot(); + }); + }, + ); + [[0, 0.1, 0], [0, 0.0001, 3], [0, 0.000004, 5]].forEach(([n1, n2, p]) => { it(`accepts an optional precision argument: [${n1}, ${n2}, ${p}]`, () => { jestExpect(n1).toBeCloseTo(n2, p); diff --git a/packages/expect/src/matchers.js b/packages/expect/src/matchers.js index 13e516e48267..a7f987a9a85c 100644 --- a/packages/expect/src/matchers.js +++ b/packages/expect/src/matchers.js @@ -87,7 +87,13 @@ const matchers: MatchersObject = { toBeCloseTo(actual: number, expected: number, precision?: number = 2) { const secondArgument = arguments.length === 3 ? 'precision' : null; ensureNumbers(actual, expected, '.toBeCloseTo'); - const pass = Math.abs(expected - actual) < Math.pow(10, -precision) / 2; + + let pass = false; + + 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; + const message = () => matcherHint('.toBeCloseTo', undefined, undefined, { isNot: this.isNot,