Skip to content

Commit d952268

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

File tree

4 files changed

+162
-4
lines changed

4 files changed

+162
-4
lines changed

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: 109 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,67 @@ 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], [3]}) 1`] = `
2433+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2434+
2435+
Expected value to equal:
2436+
<green>Set {[1], [2], [3]}</>
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>- 3,</>
2453+
<green>- ],</>
2454+
<dim> }</>"
2455+
`;
2456+
2457+
exports[`.toEqual() {pass: false} expect(Set {{"a": 1}, {"b": 2}}).not.toEqual(Set {{"b": 2}, {"a": 1}}) 1`] = `
2458+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2459+
2460+
Expected value to not equal:
2461+
<green>Set {{\\"b\\": 2}, {\\"a\\": 1}}</>
2462+
Received:
2463+
<red>Set {{\\"a\\": 1}, {\\"b\\": 2}}</>"
2464+
`;
2465+
23572466
exports[`.toEqual() {pass: false} expect(Set {}).not.toEqual(Set {}) 1`] = `
23582467
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
23592468

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,12 +247,14 @@ 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]])],
250251
[Immutable.Set([1, 2]), Immutable.Set()],
251252
[Immutable.Set([1, 2]), Immutable.Set([1, 2, 3])],
252253
[Immutable.OrderedSet([1, 2]), Immutable.OrderedSet([2, 1])],
253254
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one']])],
254255
[new Map([['a', 0]]), new Map([['b', 0]])],
255256
[new Map([['v', 1]]), new Map([['v', 2]])],
257+
[new Map([[['v'], 1]]), new Map([[['v'], 2]])],
256258
[Immutable.Map({a: 0}), Immutable.Map({b: 0})],
257259
[Immutable.Map({v: 1}), Immutable.Map({v: 2})],
258260
[
@@ -304,6 +306,9 @@ describe('.toEqual()', () => {
304306
[new Set(), new Set()],
305307
[new Set([1, 2]), new Set([1, 2])],
306308
[new Set([1, 2]), new Set([2, 1])],
309+
[new Set([[1], [2]]), new Set([[2], [1]])],
310+
[new Set([[1], [2], [3], [3]]), new Set([[3], [3], [2], [1]])],
311+
[new Set([{a: 1}, {b: 2}]), new Set([{b: 2}, {a: 1}])],
307312
[Immutable.Set(), Immutable.Set()],
308313
[Immutable.Set([1, 2]), Immutable.Set([1, 2])],
309314
[Immutable.Set([1, 2]), Immutable.Set([2, 1])],
@@ -312,6 +317,22 @@ describe('.toEqual()', () => {
312317
[new Map(), new Map()],
313318
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one'], [2, 'two']])],
314319
[new Map([[1, 'one'], [2, 'two']]), new Map([[2, 'two'], [1, 'one']])],
320+
[
321+
new Map([[[1], 'one'], [[2], 'two'], [[3], 'three'], [[3], 'four']]),
322+
new Map([[[3], 'three'], [[3], 'four'], [[2], 'two'], [[1], 'one']]),
323+
],
324+
[
325+
new Map([[[1], 'one'], [[2], 'two']]),
326+
new Map([[[2], 'two'], [[1], 'one']]),
327+
],
328+
[
329+
new Map([[{a: 1}, 'one'], [{b: 2}, 'two']]),
330+
new Map([[{b: 2}, 'two'], [{a: 1}, 'one']]),
331+
],
332+
[
333+
new Map([[1, ['one']], [2, ['two']]]),
334+
new Map([[2, ['two']], [1, ['one']]]),
335+
],
315336
[Immutable.Map(), Immutable.Map()],
316337
[
317338
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)