Skip to content

Commit 8e161ac

Browse files
author
Robin Pokorny
committed
Ignore order on unordered Immutable.js structures
1 parent 3942361 commit 8e161ac

4 files changed

Lines changed: 320 additions & 3 deletions

File tree

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

Lines changed: 235 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,6 +2247,241 @@ Difference:
22472247
Comparing two different types of values. Expected <green>array</> but received <red>number</>."
22482248
`;
22492249

2250+
exports[`.toEqual() {pass: false} expect(Immutable.List [1, 2]).not.toEqual(Immutable.List [1, 2]) 1`] = `
2251+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2252+
2253+
Expected value to not equal:
2254+
<green>Immutable.List [1, 2]</>
2255+
Received:
2256+
<red>Immutable.List [1, 2]</>"
2257+
`;
2258+
2259+
exports[`.toEqual() {pass: false} expect(Immutable.List [1, 2]).toEqual(Immutable.List [2, 1]) 1`] = `
2260+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2261+
2262+
Expected value to equal:
2263+
<green>Immutable.List [2, 1]</>
2264+
Received:
2265+
<red>Immutable.List [1, 2]</>
2266+
2267+
Difference:
2268+
2269+
<green>- Expected</>
2270+
<red>+ Received</>
2271+
2272+
<dim> Immutable.List [</>
2273+
<red>+ 1,</>
2274+
<dim> 2,</>
2275+
<green>- 1,</>
2276+
<dim> ]</>"
2277+
`;
2278+
2279+
exports[`.toEqual() {pass: false} expect(Immutable.List [1]).not.toEqual(Immutable.List [1]) 1`] = `
2280+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2281+
2282+
Expected value to not equal:
2283+
<green>Immutable.List [1]</>
2284+
Received:
2285+
<red>Immutable.List [1]</>"
2286+
`;
2287+
2288+
exports[`.toEqual() {pass: false} expect(Immutable.List [1]).toEqual(Immutable.List [2]) 1`] = `
2289+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2290+
2291+
Expected value to equal:
2292+
<green>Immutable.List [2]</>
2293+
Received:
2294+
<red>Immutable.List [1]</>
2295+
2296+
Difference:
2297+
2298+
<green>- Expected</>
2299+
<red>+ Received</>
2300+
2301+
<dim> Immutable.List [</>
2302+
<green>- 2,</>
2303+
<red>+ 1,</>
2304+
<dim> ]</>"
2305+
`;
2306+
2307+
exports[`.toEqual() {pass: false} expect(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}).not.toEqual(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}) 1`] = `
2308+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2309+
2310+
Expected value to not equal:
2311+
<green>Immutable.Map {\\"1\\": Immutable.Map {\\"2\\": {\\"a\\": 99}}}</>
2312+
Received:
2313+
<red>Immutable.Map {\\"1\\": Immutable.Map {\\"2\\": {\\"a\\": 99}}}</>"
2314+
`;
2315+
2316+
exports[`.toEqual() {pass: false} expect(Immutable.Map {"1": Immutable.Map {"2": {"a": 99}}}).toEqual(Immutable.Map {"1": Immutable.Map {"2": {"a": 11}}}) 1`] = `
2317+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2318+
2319+
Expected value to equal:
2320+
<green>Immutable.Map {\\"1\\": Immutable.Map {\\"2\\": {\\"a\\": 11}}}</>
2321+
Received:
2322+
<red>Immutable.Map {\\"1\\": Immutable.Map {\\"2\\": {\\"a\\": 99}}}</>
2323+
2324+
Difference:
2325+
2326+
<green>- Expected</>
2327+
<red>+ Received</>
2328+
2329+
<dim> Immutable.Map {</>
2330+
<dim> \\"1\\": Immutable.Map {</>
2331+
<dim> \\"2\\": Object {</>
2332+
<green>- \\"a\\": 11,</>
2333+
<red>+ \\"a\\": 99,</>
2334+
<dim> },</>
2335+
<dim> },</>
2336+
<dim> }</>"
2337+
`;
2338+
2339+
exports[`.toEqual() {pass: false} expect(Immutable.Map {"a": 0}).toEqual(Immutable.Map {"b": 0}) 1`] = `
2340+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2341+
2342+
Expected value to equal:
2343+
<green>Immutable.Map {\\"b\\": 0}</>
2344+
Received:
2345+
<red>Immutable.Map {\\"a\\": 0}</>
2346+
2347+
Difference:
2348+
2349+
<green>- Expected</>
2350+
<red>+ Received</>
2351+
2352+
<dim> Immutable.Map {</>
2353+
<green>- \\"b\\": 0,</>
2354+
<red>+ \\"a\\": 0,</>
2355+
<dim> }</>"
2356+
`;
2357+
2358+
exports[`.toEqual() {pass: false} expect(Immutable.Map {"v": 1}).toEqual(Immutable.Map {"v": 2}) 1`] = `
2359+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2360+
2361+
Expected value to equal:
2362+
<green>Immutable.Map {\\"v\\": 2}</>
2363+
Received:
2364+
<red>Immutable.Map {\\"v\\": 1}</>
2365+
2366+
Difference:
2367+
2368+
<green>- Expected</>
2369+
<red>+ Received</>
2370+
2371+
<dim> Immutable.Map {</>
2372+
<green>- \\"v\\": 2,</>
2373+
<red>+ \\"v\\": 1,</>
2374+
<dim> }</>"
2375+
`;
2376+
2377+
exports[`.toEqual() {pass: false} expect(Immutable.Map {}).not.toEqual(Immutable.Map {}) 1`] = `
2378+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2379+
2380+
Expected value to not equal:
2381+
<green>Immutable.Map {}</>
2382+
Received:
2383+
<red>Immutable.Map {}</>"
2384+
`;
2385+
2386+
exports[`.toEqual() {pass: false} expect(Immutable.Map {1: "one", 2: "two"}).not.toEqual(Immutable.Map {1: "one", 2: "two"}) 1`] = `
2387+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2388+
2389+
Expected value to not equal:
2390+
<green>Immutable.Map {1: \\"one\\", 2: \\"two\\"}</>
2391+
Received:
2392+
<red>Immutable.Map {1: \\"one\\", 2: \\"two\\"}</>"
2393+
`;
2394+
2395+
exports[`.toEqual() {pass: false} expect(Immutable.Map {1: "one", 2: "two"}).not.toEqual(Immutable.Map {2: "two", 1: "one"}) 1`] = `
2396+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2397+
2398+
Expected value to not equal:
2399+
<green>Immutable.Map {2: \\"two\\", 1: \\"one\\"}</>
2400+
Received:
2401+
<red>Immutable.Map {1: \\"one\\", 2: \\"two\\"}</>"
2402+
`;
2403+
2404+
exports[`.toEqual() {pass: false} expect(Immutable.OrderedMap {1: "one", 2: "two"}).not.toEqual(Immutable.OrderedMap {1: "one", 2: "two"}) 1`] = `
2405+
"<dim>expect(</><red>received</><dim>).not.toEqual(</><green>expected</><dim>)</>
2406+
2407+
Expected value to not equal:
2408+
<green>Immutable.OrderedMap {1: \\"one\\", 2: \\"two\\"}</>
2409+
Received:
2410+
<red>Immutable.OrderedMap {1: \\"one\\", 2: \\"two\\"}</>"
2411+
`;
2412+
2413+
exports[`.toEqual() {pass: false} expect(Immutable.OrderedMap {1: "one", 2: "two"}).toEqual(Immutable.OrderedMap {2: "two", 1: "one"}) 1`] = `
2414+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2415+
2416+
Expected value to equal:
2417+
<green>Immutable.OrderedMap {2: \\"two\\", 1: \\"one\\"}</>
2418+
Received:
2419+
<red>Immutable.OrderedMap {1: \\"one\\", 2: \\"two\\"}</>
2420+
2421+
Difference:
2422+
2423+
<green>- Expected</>
2424+
<red>+ Received</>
2425+
2426+
<dim> Immutable.OrderedMap {</>
2427+
<red>+ 1: \\"one\\",</>
2428+
<dim> 2: \\"two\\",</>
2429+
<green>- 1: \\"one\\",</>
2430+
<dim> }</>"
2431+
`;
2432+
2433+
exports[`.toEqual() {pass: false} expect(Immutable.OrderedSet []).not.toEqual(Immutable.OrderedSet []) 1`] = `"maybeKeyed is not defined"`;
2434+
2435+
exports[`.toEqual() {pass: false} expect(Immutable.OrderedSet [1, 2]).not.toEqual(Immutable.OrderedSet [1, 2]) 1`] = `"maybeKeyed is not defined"`;
2436+
2437+
exports[`.toEqual() {pass: false} expect(Immutable.OrderedSet [1, 2]).toEqual(Immutable.OrderedSet [2, 1]) 1`] = `"maybeKeyed is not defined"`;
2438+
2439+
exports[`.toEqual() {pass: false} expect(Immutable.Set []).not.toEqual(Immutable.Set []) 1`] = `"maybeKeyed is not defined"`;
2440+
2441+
exports[`.toEqual() {pass: false} expect(Immutable.Set [1, 2]).not.toEqual(Immutable.Set [1, 2]) 1`] = `"maybeKeyed is not defined"`;
2442+
2443+
exports[`.toEqual() {pass: false} expect(Immutable.Set [1, 2]).not.toEqual(Immutable.Set [2, 1]) 1`] = `"maybeKeyed is not defined"`;
2444+
2445+
exports[`.toEqual() {pass: false} expect(Immutable.Set [1, 2]).toEqual(Immutable.Set []) 1`] = `
2446+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2447+
2448+
Expected value to equal:
2449+
<green>Immutable.Set []</>
2450+
Received:
2451+
<red>Immutable.Set [1, 2]</>
2452+
2453+
Difference:
2454+
2455+
<green>- Expected</>
2456+
<red>+ Received</>
2457+
2458+
<green>- Immutable.Set []</>
2459+
<red>+ Immutable.Set [</>
2460+
<red>+ 1,</>
2461+
<red>+ 2,</>
2462+
<red>+ ]</>"
2463+
`;
2464+
2465+
exports[`.toEqual() {pass: false} expect(Immutable.Set [1, 2]).toEqual(Immutable.Set [1, 2, 3]) 1`] = `
2466+
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
2467+
2468+
Expected value to equal:
2469+
<green>Immutable.Set [1, 2, 3]</>
2470+
Received:
2471+
<red>Immutable.Set [1, 2]</>
2472+
2473+
Difference:
2474+
2475+
<green>- Expected</>
2476+
<red>+ Received</>
2477+
2478+
<dim> Immutable.Set [</>
2479+
<dim> 1,</>
2480+
<dim> 2,</>
2481+
<green>- 3,</>
2482+
<dim> ]</>"
2483+
`;
2484+
22502485
exports[`.toEqual() {pass: false} expect(Map {"a" => 0}).toEqual(Map {"b" => 0}) 1`] = `
22512486
"<dim>expect(</><red>received</><dim>).toEqual(</><green>expected</><dim>)</>
22522487

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
const {stringify} = require('jest-matcher-utils');
1010
const jestExpect = require('../');
11+
const Immutable = require('immutable');
1112

1213
it('should throw if passed two arguments', () => {
1314
expect(() => jestExpect('foo', 'bar')).toThrow(
@@ -200,12 +201,31 @@ describe('.toEqual()', () => {
200201
[null, undefined],
201202
[[1], [2]],
202203
[[1, 2], [2, 1]],
204+
[Immutable.List([1]), Immutable.List([2])],
205+
[Immutable.List([1, 2]), Immutable.List([2, 1])],
203206
[new Map(), new Set()],
204207
[new Set([1, 2]), new Set()],
205208
[new Set([1, 2]), new Set([1, 2, 3])],
209+
[Immutable.Set([1, 2]), Immutable.Set()],
210+
[Immutable.Set([1, 2]), Immutable.Set([1, 2, 3])],
211+
[Immutable.OrderedSet([1, 2]), Immutable.OrderedSet([2, 1])],
206212
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one']])],
207213
[new Map([['a', 0]]), new Map([['b', 0]])],
208214
[new Map([['v', 1]]), new Map([['v', 2]])],
215+
[Immutable.Map({a: 0}), Immutable.Map({b: 0})],
216+
[Immutable.Map({v: 1}), Immutable.Map({v: 2})],
217+
[
218+
Immutable.OrderedMap()
219+
.set(1, 'one')
220+
.set(2, 'two'),
221+
Immutable.OrderedMap()
222+
.set(2, 'two')
223+
.set(1, 'one'),
224+
],
225+
[
226+
Immutable.Map({1: Immutable.Map({2: {a: 99}})}),
227+
Immutable.Map({1: Immutable.Map({2: {a: 11}})}),
228+
],
209229
[{a: 1, b: 2}, jestExpect.objectContaining({a: 2})],
210230
[false, jestExpect.objectContaining({a: 2})],
211231
[[1, 3], jestExpect.arrayContaining([1, 2])],
@@ -236,14 +256,50 @@ describe('.toEqual()', () => {
236256
['abc', 'abc'],
237257
[[1], [1]],
238258
[[1, 2], [1, 2]],
259+
[Immutable.List([1]), Immutable.List([1])],
260+
[Immutable.List([1, 2]), Immutable.List([1, 2])],
239261
[{}, {}],
240262
[{a: 99}, {a: 99}],
241263
[new Set(), new Set()],
242264
[new Set([1, 2]), new Set([1, 2])],
243265
[new Set([1, 2]), new Set([2, 1])],
266+
[Immutable.Set(), Immutable.Set()],
267+
[Immutable.Set([1, 2]), Immutable.Set([1, 2])],
268+
[Immutable.Set([1, 2]), Immutable.Set([2, 1])],
269+
[Immutable.OrderedSet(), Immutable.OrderedSet()],
270+
[Immutable.OrderedSet([1, 2]), Immutable.OrderedSet([1, 2])],
244271
[new Map(), new Map()],
245272
[new Map([[1, 'one'], [2, 'two']]), new Map([[1, 'one'], [2, 'two']])],
246273
[new Map([[1, 'one'], [2, 'two']]), new Map([[2, 'two'], [1, 'one']])],
274+
[Immutable.Map(), Immutable.Map()],
275+
[
276+
Immutable.Map()
277+
.set(1, 'one')
278+
.set(2, 'two'),
279+
Immutable.Map()
280+
.set(1, 'one')
281+
.set(2, 'two'),
282+
],
283+
[
284+
Immutable.Map()
285+
.set(1, 'one')
286+
.set(2, 'two'),
287+
Immutable.Map()
288+
.set(2, 'two')
289+
.set(1, 'one'),
290+
],
291+
[
292+
Immutable.OrderedMap()
293+
.set(1, 'one')
294+
.set(2, 'two'),
295+
Immutable.OrderedMap()
296+
.set(1, 'one')
297+
.set(2, 'two'),
298+
],
299+
[
300+
Immutable.Map({1: Immutable.Map({2: {a: 99}})}),
301+
Immutable.Map({1: Immutable.Map({2: {a: 99}})}),
302+
],
247303
[{a: 1, b: 2}, jestExpect.objectContaining({a: 1})],
248304
[[1, 2, 3], jestExpect.arrayContaining([2, 3])],
249305
['abcd', jestExpect.stringContaining('bc')],

packages/expect/src/jasmine_utils.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,24 @@ export function hasProperty(obj: Object | null, property: string) {
275275

276276
return hasProperty(getPrototype(obj), property);
277277
}
278+
279+
// SENTINEL constants are from https://github.com/facebook/immutable-js
280+
const IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';
281+
const IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@';
282+
const IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';
283+
284+
export function isImmutableUnorderedKeyed(maybeKeyed: any) {
285+
return !!(
286+
maybeKeyed &&
287+
maybeKeyed[IS_KEYED_SENTINEL] &&
288+
!maybeKeyed[IS_ORDERED_SENTINEL]
289+
);
290+
}
291+
292+
export function isImmutableUnorderedSet(maybeSet: any) {
293+
return !!(
294+
maybeSet &&
295+
maybeSet[IS_SET_SENTINEL] &&
296+
!maybeSet[IS_ORDERED_SENTINEL]
297+
);
298+
}

packages/expect/src/utils.js

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
* @flow
88
*/
99

10-
import {equals, isA} from './jasmine_utils';
10+
import {
11+
equals,
12+
isA,
13+
isImmutableUnorderedKeyed,
14+
isImmutableUnorderedSet,
15+
} from './jasmine_utils';
1116

1217
type GetPath = {
1318
hasEndProp?: boolean,
@@ -119,7 +124,7 @@ export const iterableEquality = (a: any, b: any) => {
119124
if (a.size !== undefined) {
120125
if (a.size !== b.size) {
121126
return false;
122-
} else if (isA('Set', a)) {
127+
} else if (isA('Set', a) || isImmutableUnorderedSet(a)) {
123128
let allFound = true;
124129
for (const aValue of a) {
125130
if (!b.has(aValue)) {
@@ -130,7 +135,7 @@ export const iterableEquality = (a: any, b: any) => {
130135
if (allFound) {
131136
return true;
132137
}
133-
} else if (isA('Map', a)) {
138+
} else if (isA('Map', a) || isImmutableUnorderedKeyed(a)) {
134139
let allFound = true;
135140
for (const aEntry of a) {
136141
if (

0 commit comments

Comments
 (0)