Skip to content

Commit 46358b2

Browse files
committed
Fix for #6138: Deep compare set values and map keys
1 parent 4ca03cd commit 46358b2

4 files changed

Lines changed: 188 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@
150150
configuration ([#5976](https://github.com/facebook/jest/pull/5976))
151151
* `[website]` Fix website docs
152152
([#5853](https://github.com/facebook/jest/pull/5853))
153+
* `[expect]` Fix isEqual Set and Map to compare object values and keys
154+
regardless of order ([#6150](https://github.com/facebook/jest/pull/6150))
153155

154156
### Chore & Maintenance
155157

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

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,6 +2295,54 @@ Difference:
22952295
<dim> }</>"
22962296
`;
22972297

2298+
exports[`.toEqual() {pass: false} expect(Map {["v"] => 1}).toEqual(Map {["v"] => 2}) 1`] = `
2299+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2300+
2301+
Expected value to equal:
2302+
<green>Map {[\\"v\\"] => 2}</>
2303+
Received:
2304+
<red>Map {[\\"v\\"] => 1}</>
2305+
2306+
Difference:
2307+
2308+
<green>- Expected</>
2309+
<red>+ Received</>
2310+
2311+
<dim> Map {</>
2312+
<dim> Array [</>
2313+
<dim> \\"v\\",</>
2314+
<green>- ] => 2,</>
2315+
<red>+ ] => 1,</>
2316+
<dim> }</>"
2317+
`;
2318+
2319+
exports[`.toEqual() {pass: false} expect(Map {[1] => "one", [2] => "two", [3] => "three", [3] => "four"}).not.toEqual(Map {[3] => "three", [3] => "four", [2] => "two", [1] => "one"}) 1`] = `
2320+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2321+
2322+
Expected value to not equal:
2323+
<green>Map {[3] => \\"three\\", [3] => \\"four\\", [2] => \\"two\\", [1] => \\"one\\"}</>
2324+
Received:
2325+
<red>Map {[1] => \\"one\\", [2] => \\"two\\", [3] => \\"three\\", [3] => \\"four\\"}</>"
2326+
`;
2327+
2328+
exports[`.toEqual() {pass: false} expect(Map {[1] => "one", [2] => "two"}).not.toEqual(Map {[2] => "two", [1] => "one"}) 1`] = `
2329+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2330+
2331+
Expected value to not equal:
2332+
<green>Map {[2] => \\"two\\", [1] => \\"one\\"}</>
2333+
Received:
2334+
<red>Map {[1] => \\"one\\", [2] => \\"two\\"}</>"
2335+
`;
2336+
2337+
exports[`.toEqual() {pass: false} expect(Map {{"a": 1} => "one", {"b": 2} => "two"}).not.toEqual(Map {{"b": 2} => "two", {"a": 1} => "one"}) 1`] = `
2338+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2339+
2340+
Expected value to not equal:
2341+
<green>Map {{\\"b\\": 2} => \\"two\\", {\\"a\\": 1} => \\"one\\"}</>
2342+
Received:
2343+
<red>Map {{\\"a\\": 1} => \\"one\\", {\\"b\\": 2} => \\"two\\"}</>"
2344+
`;
2345+
22982346
exports[`.toEqual() {pass: false} expect(Map {}).not.toEqual(Map {}) 1`] = `
22992347
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
23002348

@@ -2354,6 +2402,92 @@ Difference:
23542402
<dim> }</>"
23552403
`;
23562404

2405+
exports[`.toEqual() {pass: false} expect(Map {1 => ["one"], 2 => ["two"]}).not.toEqual(Map {2 => ["two"], 1 => ["one"]}) 1`] = `
2406+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2407+
2408+
Expected value to not equal:
2409+
<green>Map {2 => [\\"two\\"], 1 => [\\"one\\"]}</>
2410+
Received:
2411+
<red>Map {1 => [\\"one\\"], 2 => [\\"two\\"]}</>"
2412+
`;
2413+
2414+
exports[`.toEqual() {pass: false} expect(Set {[1], [2], [3], [3]}).not.toEqual(Set {[3], [3], [2], [1]}) 1`] = `
2415+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2416+
2417+
Expected value to not equal:
2418+
<green>Set {[3], [3], [2], [1]}</>
2419+
Received:
2420+
<red>Set {[1], [2], [3], [3]}</>"
2421+
`;
2422+
2423+
exports[`.toEqual() {pass: false} expect(Set {[1], [2]}).not.toEqual(Set {[2], [1]}) 1`] = `
2424+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2425+
2426+
Expected value to not equal:
2427+
<green>Set {[2], [1]}</>
2428+
Received:
2429+
<red>Set {[1], [2]}</>"
2430+
`;
2431+
2432+
exports[`.toEqual() {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [2]}) 1`] = `
2433+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2434+
2435+
Expected value to equal:
2436+
<green>Set {[1], [2], [2]}</>
2437+
Received:
2438+
<red>Set {[1], [2]}</>
2439+
2440+
Difference:
2441+
2442+
<green>- Expected</>
2443+
<red>+ Received</>
2444+
2445+
<yellow>@@ -3,9 +3,6 @@</>
2446+
<dim> 1,</>
2447+
<dim> ],</>
2448+
<dim> Array [</>
2449+
<dim> 2,</>
2450+
<dim> ],</>
2451+
<green>- Array [</>
2452+
<green>- 2,</>
2453+
<green>- ],</>
2454+
<dim> }</>"
2455+
`;
2456+
2457+
exports[`.toEqual() {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [3]}) 1`] = `
2458+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2459+
2460+
Expected value to equal:
2461+
<green>Set {[1], [2], [3]}</>
2462+
Received:
2463+
<red>Set {[1], [2]}</>
2464+
2465+
Difference:
2466+
2467+
<green>- Expected</>
2468+
<red>+ Received</>
2469+
2470+
<yellow>@@ -3,9 +3,6 @@</>
2471+
<dim> 1,</>
2472+
<dim> ],</>
2473+
<dim> Array [</>
2474+
<dim> 2,</>
2475+
<dim> ],</>
2476+
<green>- Array [</>
2477+
<green>- 3,</>
2478+
<green>- ],</>
2479+
<dim> }</>"
2480+
`;
2481+
2482+
exports[`.toEqual() {pass: false} expect(Set {{"a": 1}, {"b": 2}}).not.toEqual(Set {{"b": 2}, {"a": 1}}) 1`] = `
2483+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2484+
2485+
Expected value to not equal:
2486+
<green>Set {{\\"b\\": 2}, {\\"a\\": 1}}</>
2487+
Received:
2488+
<red>Set {{\\"a\\": 1}, {\\"b\\": 2}}</>"
2489+
`;
2490+
23572491
exports[`.toEqual() {pass: false} expect(Set {}).not.toEqual(Set {}) 1`] = `
23582492
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
23592493

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,15 @@ describe('.toEqual()', () => {
247247
[new Map(), new Set()],
248248
[new Set([1, 2]), new Set()],
249249
[new Set([1, 2]), new Set([1, 2, 3])],
250+
[new Set([[1], [2]]), new Set([[1], [2], [3]])],
251+
[new Set([[1], [2]]), new Set([[1], [2], [2]])],
250252
[Immutable.Set([1, 2]), Immutable.Set()],
251253
[Immutable.Set([1, 2]), Immutable.Set([1, 2, 3])],
252254
[Immutable.OrderedSet([1, 2]), Immutable.OrderedSet([2, 1])],
253255
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one']])],
254256
[new Map([['a', 0]]), new Map([['b', 0]])],
255257
[new Map([['v', 1]]), new Map([['v', 2]])],
258+
[new Map([[['v'], 1]]), new Map([[['v'], 2]])],
256259
[Immutable.Map({a: 0}), Immutable.Map({b: 0})],
257260
[Immutable.Map({v: 1}), Immutable.Map({v: 2})],
258261
[
@@ -304,6 +307,9 @@ describe('.toEqual()', () => {
304307
[new Set(), new Set()],
305308
[new Set([1, 2]), new Set([1, 2])],
306309
[new Set([1, 2]), new Set([2, 1])],
310+
[new Set([[1], [2]]), new Set([[2], [1]])],
311+
[new Set([[1], [2], [3], [3]]), new Set([[3], [3], [2], [1]])],
312+
[new Set([{a: 1}, {b: 2}]), new Set([{b: 2}, {a: 1}])],
307313
[Immutable.Set(), Immutable.Set()],
308314
[Immutable.Set([1, 2]), Immutable.Set([1, 2])],
309315
[Immutable.Set([1, 2]), Immutable.Set([2, 1])],
@@ -312,6 +318,22 @@ describe('.toEqual()', () => {
312318
[new Map(), new Map()],
313319
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one'], [2, 'two']])],
314320
[new Map([[1, 'one'], [2, 'two']]), new Map([[2, 'two'], [1, 'one']])],
321+
[
322+
new Map([[[1], 'one'], [[2], 'two'], [[3], 'three'], [[3], 'four']]),
323+
new Map([[[3], 'three'], [[3], 'four'], [[2], 'two'], [[1], 'one']]),
324+
],
325+
[
326+
new Map([[[1], 'one'], [[2], 'two']]),
327+
new Map([[[2], 'two'], [[1], 'one']]),
328+
],
329+
[
330+
new Map([[{a: 1}, 'one'], [{b: 2}, 'two']]),
331+
new Map([[{b: 2}, 'two'], [{a: 1}, 'one']]),
332+
],
333+
[
334+
new Map([[1, ['one']], [2, ['two']]]),
335+
new Map([[2, ['two']], [1, ['one']]]),
336+
],
315337
[Immutable.Map(), Immutable.Map()],
316338
[
317339
Immutable.Map()

packages/expect/src/utils.js

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,18 @@ export const iterableEquality = (a: any, b: any) => {
128128
let allFound = true;
129129
for (const aValue of a) {
130130
if (!b.has(aValue)) {
131-
allFound = false;
132-
break;
131+
let has = false;
132+
for (const bValue of b) {
133+
const isEqual = equals(aValue, bValue, [iterableEquality]);
134+
if (isEqual === true) {
135+
has = true;
136+
}
137+
}
138+
139+
if (has === false) {
140+
allFound = false;
141+
break;
142+
}
133143
}
134144
}
135145
if (allFound) {
@@ -142,8 +152,24 @@ export const iterableEquality = (a: any, b: any) => {
142152
!b.has(aEntry[0]) ||
143153
!equals(aEntry[1], b.get(aEntry[0]), [iterableEquality])
144154
) {
145-
allFound = false;
146-
break;
155+
let has = false;
156+
for (const bEntry of b) {
157+
const matchedKey = equals(aEntry[0], bEntry[0], [iterableEquality]);
158+
159+
let matchedValue = false;
160+
if (matchedKey === true) {
161+
matchedValue = equals(aEntry[1], bEntry[1], [iterableEquality]);
162+
}
163+
164+
if (matchedValue === true) {
165+
has = true;
166+
}
167+
}
168+
169+
if (has === false) {
170+
allFound = false;
171+
break;
172+
}
147173
}
148174
}
149175
if (allFound) {

0 commit comments

Comments
 (0)