Skip to content

Commit bcaa146

Browse files
dubzzzpedrottimark
authored andcommitted
Fix asymmetric equal for Number (#7948)
* Fix asymmetric equal for Number * Update CHANGELOG * Handle the case of a being a new Number * Use Object.is for Number equality * Add unit tests related to issues/7941 * Add extra units for equality * Remove unnecessary comment in eq
1 parent 51817fd commit bcaa146

File tree

4 files changed

+62
-3
lines changed

4 files changed

+62
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
- `[jest-cli]` Refactor `-o` and `--coverage` combined ([#7611](https://github.com/facebook/jest/pull/7611))
1616
- `[expect]` Fix custom async matcher stack trace ([#7652](https://github.com/facebook/jest/pull/7652))
1717
- `[expect]` Fix `toStrictEqual` not considering arrays with objects having undefined values correctly ([#7938](https://github.com/facebook/jest/pull/7938))
18+
- `[expect]` Fix non-symmetric equal for Number ([#7948](https://github.com/facebook/jest/pull/7948))
1819
- `[jest-changed-files]` Improve default file selection for Mercurial repos ([#7880](https://github.com/facebook/jest/pull/7880))
1920
- `[jest-validate]` Fix validating async functions ([#7894](https://github.com/facebook/jest/issues/7894))
2021
- `[jest-circus]` Fix bug with test.only ([#7888](https://github.com/facebook/jest/pull/7888))

packages/expect/src/__tests__/__snapshots__/matchers.test.js.snap

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1818,6 +1818,13 @@ Expected: <green>\\"abc\\"</>
18181818
Received: <red>\\"abc\\"</>"
18191819
`;
18201820

1821+
exports[`.toEqual() {pass: false} expect("abc").not.toEqual({"0": "a", "1": "b", "2": "c"}) 1`] = `
1822+
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
1823+
1824+
Expected: <green>{\\"0\\": \\"a\\", \\"1\\": \\"b\\", \\"2\\": \\"c\\"}</>
1825+
Received: <red>\\"abc\\"</>"
1826+
`;
1827+
18211828
exports[`.toEqual() {pass: false} expect("abcd").not.toEqual(StringContaining "bc") 1`] = `
18221829
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
18231830

@@ -1931,6 +1938,13 @@ Expected: <green>Any<Function></>
19311938
Received: <red>[Function anonymous]</>"
19321939
`;
19331940

1941+
exports[`.toEqual() {pass: false} expect({"0": "a", "1": "b", "2": "c"}).not.toEqual("abc") 1`] = `
1942+
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
1943+
1944+
Expected: <green>\\"abc\\"</>
1945+
Received: <red>{\\"0\\": \\"a\\", \\"1\\": \\"b\\", \\"2\\": \\"c\\"}</>"
1946+
`;
1947+
19341948
exports[`.toEqual() {pass: false} expect({"a": 1, "b": [Function b], "c": true}).not.toEqual({"a": 1, "b": Any<Function>, "c": Anything}) 1`] = `
19351949
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
19361950

@@ -2006,13 +2020,34 @@ Expected: <green>{}</>
20062020
Received: <red>{}</>"
20072021
`;
20082022

2023+
exports[`.toEqual() {pass: false} expect({}).not.toEqual(0) 1`] = `
2024+
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
2025+
2026+
Expected: <green>0</>
2027+
Received: <red>{}</>"
2028+
`;
2029+
2030+
exports[`.toEqual() {pass: false} expect(0).not.toEqual({}) 1`] = `
2031+
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
2032+
2033+
Expected: <green>{}</>
2034+
Received: <red>0</>"
2035+
`;
2036+
20092037
exports[`.toEqual() {pass: false} expect(0).toEqual(-0) 1`] = `
20102038
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
20112039

20122040
Expected: <green>-0</>
20132041
Received: <red>0</>"
20142042
`;
20152043

2044+
exports[`.toEqual() {pass: false} expect(0).toEqual(5e-324) 1`] = `
2045+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2046+
2047+
Expected: <green>5e-324</>
2048+
Received: <red>0</>"
2049+
`;
2050+
20162051
exports[`.toEqual() {pass: false} expect(1).not.toEqual(1) 1`] = `
20172052
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
20182053

@@ -2034,6 +2069,13 @@ Expected: <green>ArrayContaining [1, 2]</>
20342069
Received: <red>1</>"
20352070
`;
20362071

2072+
exports[`.toEqual() {pass: false} expect(5e-324).toEqual(0) 1`] = `
2073+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2074+
2075+
Expected: <green>0</>
2076+
Received: <red>5e-324</>"
2077+
`;
2078+
20372079
exports[`.toEqual() {pass: false} expect(Immutable.List [1, 2]).not.toEqual(Immutable.List [1, 2]) 1`] = `
20382080
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
20392081

@@ -2394,6 +2436,13 @@ Expected: <green>Map {2 => [\\"two\\"], 1 => [\\"one\\"]}</>
23942436
Received: <red>Map {1 => [\\"one\\"], 2 => [\\"two\\"]}</>"
23952437
`;
23962438

2439+
exports[`.toEqual() {pass: false} expect(NaN).not.toEqual(NaN) 1`] = `
2440+
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
2441+
2442+
Expected: <green>NaN</>
2443+
Received: <red>NaN</>"
2444+
`;
2445+
23972446
exports[`.toEqual() {pass: false} expect(Set {[1], [2], [3], [3]}).not.toEqual(Set {[3], [3], [2], [1]}) 1`] = `
23982447
"<dim>expect(</><red>received</><dim>).</>not<dim>.toEqual(</><green>expected</><dim>)</>
23992448

packages/expect/src/__tests__/matchers.test.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,8 @@ describe('.toEqual()', () => {
344344
[true, false],
345345
[1, 2],
346346
[0, -0],
347+
[0, Number.MIN_VALUE], // issues/7941
348+
[Number.MIN_VALUE, 0],
347349
[{a: 5}, {b: 6}],
348350
['banana', 'apple'],
349351
[null, undefined],
@@ -426,7 +428,16 @@ describe('.toEqual()', () => {
426428
[
427429
[true, true],
428430
[1, 1],
431+
[NaN, NaN],
432+
// eslint-disable-next-line no-new-wrappers
433+
[0, new Number(0)],
434+
// eslint-disable-next-line no-new-wrappers
435+
[new Number(0), 0],
429436
['abc', 'abc'],
437+
// eslint-disable-next-line no-new-wrappers
438+
[new String('abc'), 'abc'],
439+
// eslint-disable-next-line no-new-wrappers
440+
['abc', new String('abc')],
430441
[[1], [1]],
431442
[[1, 2], [1, 2]],
432443
[Immutable.List([1]), Immutable.List([1])],

packages/expect/src/jasmineUtils.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,9 +106,7 @@ function eq(
106106
// $FlowFixMe – Flow sees `a` as a number
107107
return a == String(b);
108108
case '[object Number]':
109-
// `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
110-
// other numeric values.
111-
return a != +a ? b != +b : a === 0 ? 1 / a == 1 / b : a == +b;
109+
return Object.is(Number(a), Number(b));
112110
case '[object Date]':
113111
case '[object Boolean]':
114112
// Coerce dates and booleans to numeric primitive values. Dates are compared by their

0 commit comments

Comments
 (0)