Skip to content

Commit 95c1e53

Browse files
chrisblossomcpojer
authored andcommitted
Fix for #6138: Deep compare set values and map keys (#6150)
1 parent e84f154 commit 95c1e53

4 files changed

Lines changed: 271 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,8 @@
160160
configuration ([#5976](https://github.com/facebook/jest/pull/5976))
161161
* `[website]` Fix website docs
162162
([#5853](https://github.com/facebook/jest/pull/5853))
163+
* `[expect]` Fix isEqual Set and Map to compare object values and keys
164+
regardless of order ([#6150](https://github.com/facebook/jest/pull/6150))
163165
* `[pretty-format]` [**BREAKING**] Remove undefined props from React elements
164166
([#6162](https://github.com/facebook/jest/pull/6162))
165167

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

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,6 +2295,88 @@ 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 {[1] => Map {[1] => "one"}, [2] => Map {[2] => "two"}}).not.toEqual(Map {[2] => Map {[2] => "two"}, [1] => Map {[1] => "one"}}) 1`] = `
2338+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2339+
2340+
Expected value to not equal:
2341+
<green>Map {[2] => Map {[2] => \\"two\\"}, [1] => Map {[1] => \\"one\\"}}</>
2342+
Received:
2343+
<red>Map {[1] => Map {[1] => \\"one\\"}, [2] => Map {[2] => \\"two\\"}}</>"
2344+
`;
2345+
2346+
exports[`.toEqual() {pass: false} expect(Map {[1] => Map {[1] => "one"}}).toEqual(Map {[1] => Map {[1] => "two"}}) 1`] = `
2347+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2348+
2349+
Expected value to equal:
2350+
<green>Map {[1] => Map {[1] => \\"two\\"}}</>
2351+
Received:
2352+
<red>Map {[1] => Map {[1] => \\"one\\"}}</>
2353+
2354+
Difference:
2355+
2356+
<green>- Expected</>
2357+
<red>+ Received</>
2358+
2359+
<yellow>@@ -2,8 +2,8 @@</>
2360+
<dim> Array [</>
2361+
<dim> 1,</>
2362+
<dim> ] => Map {</>
2363+
<dim> Array [</>
2364+
<dim> 1,</>
2365+
<green>- ] => \\"two\\",</>
2366+
<red>+ ] => \\"one\\",</>
2367+
<dim> },</>
2368+
<dim> }</>"
2369+
`;
2370+
2371+
exports[`.toEqual() {pass: false} expect(Map {{"a": 1} => "one", {"b": 2} => "two"}).not.toEqual(Map {{"b": 2} => "two", {"a": 1} => "one"}) 1`] = `
2372+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2373+
2374+
Expected value to not equal:
2375+
<green>Map {{\\"b\\": 2} => \\"two\\", {\\"a\\": 1} => \\"one\\"}</>
2376+
Received:
2377+
<red>Map {{\\"a\\": 1} => \\"one\\", {\\"b\\": 2} => \\"two\\"}</>"
2378+
`;
2379+
22982380
exports[`.toEqual() {pass: false} expect(Map {}).not.toEqual(Map {}) 1`] = `
22992381
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
23002382

@@ -2354,6 +2436,92 @@ Difference:
23542436
<dim> }</>"
23552437
`;
23562438

2439+
exports[`.toEqual() {pass: false} expect(Map {1 => ["one"], 2 => ["two"]}).not.toEqual(Map {2 => ["two"], 1 => ["one"]}) 1`] = `
2440+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2441+
2442+
Expected value to not equal:
2443+
<green>Map {2 => [\\"two\\"], 1 => [\\"one\\"]}</>
2444+
Received:
2445+
<red>Map {1 => [\\"one\\"], 2 => [\\"two\\"]}</>"
2446+
`;
2447+
2448+
exports[`.toEqual() {pass: false} expect(Set {[1], [2], [3], [3]}).not.toEqual(Set {[3], [3], [2], [1]}) 1`] = `
2449+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2450+
2451+
Expected value to not equal:
2452+
<green>Set {[3], [3], [2], [1]}</>
2453+
Received:
2454+
<red>Set {[1], [2], [3], [3]}</>"
2455+
`;
2456+
2457+
exports[`.toEqual() {pass: false} expect(Set {[1], [2]}).not.toEqual(Set {[2], [1]}) 1`] = `
2458+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2459+
2460+
Expected value to not equal:
2461+
<green>Set {[2], [1]}</>
2462+
Received:
2463+
<red>Set {[1], [2]}</>"
2464+
`;
2465+
2466+
exports[`.toEqual() {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [2]}) 1`] = `
2467+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2468+
2469+
Expected value to equal:
2470+
<green>Set {[1], [2], [2]}</>
2471+
Received:
2472+
<red>Set {[1], [2]}</>
2473+
2474+
Difference:
2475+
2476+
<green>- Expected</>
2477+
<red>+ Received</>
2478+
2479+
<yellow>@@ -3,9 +3,6 @@</>
2480+
<dim> 1,</>
2481+
<dim> ],</>
2482+
<dim> Array [</>
2483+
<dim> 2,</>
2484+
<dim> ],</>
2485+
<green>- Array [</>
2486+
<green>- 2,</>
2487+
<green>- ],</>
2488+
<dim> }</>"
2489+
`;
2490+
2491+
exports[`.toEqual() {pass: false} expect(Set {[1], [2]}).toEqual(Set {[1], [2], [3]}) 1`] = `
2492+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2493+
2494+
Expected value to equal:
2495+
<green>Set {[1], [2], [3]}</>
2496+
Received:
2497+
<red>Set {[1], [2]}</>
2498+
2499+
Difference:
2500+
2501+
<green>- Expected</>
2502+
<red>+ Received</>
2503+
2504+
<yellow>@@ -3,9 +3,6 @@</>
2505+
<dim> 1,</>
2506+
<dim> ],</>
2507+
<dim> Array [</>
2508+
<dim> 2,</>
2509+
<dim> ],</>
2510+
<green>- Array [</>
2511+
<green>- 3,</>
2512+
<green>- ],</>
2513+
<dim> }</>"
2514+
`;
2515+
2516+
exports[`.toEqual() {pass: false} expect(Set {{"a": 1}, {"b": 2}}).not.toEqual(Set {{"b": 2}, {"a": 1}}) 1`] = `
2517+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2518+
2519+
Expected value to not equal:
2520+
<green>Set {{\\"b\\": 2}, {\\"a\\": 1}}</>
2521+
Received:
2522+
<red>Set {{\\"a\\": 1}, {\\"b\\": 2}}</>"
2523+
`;
2524+
23572525
exports[`.toEqual() {pass: false} expect(Set {}).not.toEqual(Set {}) 1`] = `
23582526
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
23592527

@@ -2421,6 +2589,39 @@ Difference:
24212589
<dim> }</>"
24222590
`;
24232591

2592+
exports[`.toEqual() {pass: false} expect(Set {Set {[1]}, Set {[2]}}).not.toEqual(Set {Set {[2]}, Set {[1]}}) 1`] = `
2593+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2594+
2595+
Expected value to not equal:
2596+
<green>Set {Set {[2]}, Set {[1]}}</>
2597+
Received:
2598+
<red>Set {Set {[1]}, Set {[2]}}</>"
2599+
`;
2600+
2601+
exports[`.toEqual() {pass: false} expect(Set {Set {1}, Set {2}}).toEqual(Set {Set {1}, Set {3}}) 1`] = `
2602+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2603+
2604+
Expected value to equal:
2605+
<green>Set {Set {1}, Set {3}}</>
2606+
Received:
2607+
<red>Set {Set {1}, Set {2}}</>
2608+
2609+
Difference:
2610+
2611+
<green>- Expected</>
2612+
<red>+ Received</>
2613+
2614+
<dim> Set {</>
2615+
<dim> Set {</>
2616+
<dim> 1,</>
2617+
<dim> },</>
2618+
<dim> Set {</>
2619+
<green>- 3,</>
2620+
<red>+ 2,</>
2621+
<dim> },</>
2622+
<dim> }</>"
2623+
`;
2624+
24242625
exports[`.toEqual() {pass: false} expect(false).toEqual(ObjectContaining {"a": 2}) 1`] = `
24252626
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
24262627

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,23 @@ 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]])],
252+
[
253+
new Set([new Set([1]), new Set([2])]),
254+
new Set([new Set([1]), new Set([3])]),
255+
],
250256
[Immutable.Set([1, 2]), Immutable.Set()],
251257
[Immutable.Set([1, 2]), Immutable.Set([1, 2, 3])],
252258
[Immutable.OrderedSet([1, 2]), Immutable.OrderedSet([2, 1])],
253259
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one']])],
254260
[new Map([['a', 0]]), new Map([['b', 0]])],
255261
[new Map([['v', 1]]), new Map([['v', 2]])],
262+
[new Map([[['v'], 1]]), new Map([[['v'], 2]])],
263+
[
264+
new Map([[[1], new Map([[[1], 'one']])]]),
265+
new Map([[[1], new Map([[[1], 'two']])]]),
266+
],
256267
[Immutable.Map({a: 0}), Immutable.Map({b: 0})],
257268
[Immutable.Map({v: 1}), Immutable.Map({v: 2})],
258269
[
@@ -304,6 +315,13 @@ describe('.toEqual()', () => {
304315
[new Set(), new Set()],
305316
[new Set([1, 2]), new Set([1, 2])],
306317
[new Set([1, 2]), new Set([2, 1])],
318+
[new Set([[1], [2]]), new Set([[2], [1]])],
319+
[
320+
new Set([new Set([[1]]), new Set([[2]])]),
321+
new Set([new Set([[2]]), new Set([[1]])]),
322+
],
323+
[new Set([[1], [2], [3], [3]]), new Set([[3], [3], [2], [1]])],
324+
[new Set([{a: 1}, {b: 2}]), new Set([{b: 2}, {a: 1}])],
307325
[Immutable.Set(), Immutable.Set()],
308326
[Immutable.Set([1, 2]), Immutable.Set([1, 2])],
309327
[Immutable.Set([1, 2]), Immutable.Set([2, 1])],
@@ -312,6 +330,26 @@ describe('.toEqual()', () => {
312330
[new Map(), new Map()],
313331
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one'], [2, 'two']])],
314332
[new Map([[1, 'one'], [2, 'two']]), new Map([[2, 'two'], [1, 'one']])],
333+
[
334+
new Map([[[1], 'one'], [[2], 'two'], [[3], 'three'], [[3], 'four']]),
335+
new Map([[[3], 'three'], [[3], 'four'], [[2], 'two'], [[1], 'one']]),
336+
],
337+
[
338+
new Map([[[1], new Map([[[1], 'one']])], [[2], new Map([[[2], 'two']])]]),
339+
new Map([[[2], new Map([[[2], 'two']])], [[1], new Map([[[1], 'one']])]]),
340+
],
341+
[
342+
new Map([[[1], 'one'], [[2], 'two']]),
343+
new Map([[[2], 'two'], [[1], 'one']]),
344+
],
345+
[
346+
new Map([[{a: 1}, 'one'], [{b: 2}, 'two']]),
347+
new Map([[{b: 2}, 'two'], [{a: 1}, 'one']]),
348+
],
349+
[
350+
new Map([[1, ['one']], [2, ['two']]]),
351+
new Map([[2, ['two']], [1, ['one']]]),
352+
],
315353
[Immutable.Map(), Immutable.Map()],
316354
[
317355
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)