Skip to content

Commit a90eb92

Browse files
Add toIncludeAllMembersInOrder.
1 parent ecb6fc1 commit a90eb92

File tree

4 files changed

+180
-0
lines changed

4 files changed

+180
-0
lines changed

src/matchers/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export { toHaveBeenCalledOnce } from './toHaveBeenCalledOnce';
5454
export { toHaveBeenCalledOnceWith } from './toHaveBeenCalledOnceWith';
5555
export { toInclude } from './toInclude';
5656
export { toIncludeAllMembers } from './toIncludeAllMembers';
57+
export { toIncludeAllMembersInOrder } from './toIncludeAllMembersInOrder';
5758
export { toIncludeAllPartialMembers } from './toIncludeAllPartialMembers';
5859
export { toIncludeAnyMembers } from './toIncludeAnyMembers';
5960
export { toIncludeMultiple } from './toIncludeMultiple';
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { contains } from '../utils';
2+
3+
export function toIncludeAllMembersInOrder(actual, expected) {
4+
const { printReceived, printExpected, matcherHint } = this.utils;
5+
const options = {
6+
isNot: this.isNot,
7+
promise: this.promise,
8+
};
9+
10+
// First, check contents.
11+
const passMessage =
12+
matcherHint('.not.toIncludeAllMembers') +
13+
'\n\n' +
14+
'Expected list to not have all of the following members:\n' +
15+
` ${printExpected(expected)}\n` +
16+
'Received:\n' +
17+
` ${printReceived(actual)}`;
18+
19+
const failMessage =
20+
matcherHint('.toIncludeAllMembers') +
21+
'\n\n' +
22+
'Expected list to have all of the following members:\n' +
23+
` ${printExpected(expected)}\n` +
24+
'Received:\n' +
25+
` ${printReceived(actual)}`;
26+
27+
let pass =
28+
Array.isArray(actual) && Array.isArray(expected) && expected.every(val => contains(this.equals, actual, val));
29+
30+
if (!pass) return { pass, message: () => (pass ? passMessage : failMessage) };
31+
32+
// Check if actual has additional items beyond expected.
33+
let differingElementIdxs = [];
34+
// Check if actual has additional items beyond expected.
35+
if (actual.length > expected.length) {
36+
differingElementIdxs = [expected.length];
37+
} else {
38+
// Second, check order. At this point, they must have the same length, so we
39+
// can go element by element and fail at the first elements that don't
40+
// match.
41+
42+
differingElementIdxs = expected
43+
.map((element, idx) => {
44+
return this.equals(element, actual[idx]) ? false : idx;
45+
})
46+
.filter(idx => idx !== false);
47+
}
48+
49+
pass = differingElementIdxs.length === 0;
50+
51+
const message = pass
52+
? () =>
53+
// eslint-disable-next-line prefer-template
54+
this.utils.matcherHint('toIncludeAllMembersInOrder', undefined, undefined, options) +
55+
'\n\n' +
56+
`Expected: not ${this.utils.printExpected(expected)}\n` +
57+
`Received: ${this.utils.printReceived(actual)}`
58+
: () => {
59+
const firstDifferingElementIdx = differingElementIdxs[0];
60+
const firstDifferingElementInActual = actual[firstDifferingElementIdx];
61+
const firstDifferingElementInExpected = expected[firstDifferingElementIdx];
62+
63+
return (
64+
// eslint-disable-next-line prefer-template
65+
this.utils.matcherHint('toIncludeAllMembersInOrder', undefined, undefined, options) +
66+
'\n\n' +
67+
`First differing element (index ${firstDifferingElementIdx}):\n\n` +
68+
`Expected: ${this.utils.printExpected(firstDifferingElementInExpected)}\n` +
69+
`Received: ${this.utils.printReceived(firstDifferingElementInActual)}`
70+
);
71+
};
72+
73+
return { actual, message, pass };
74+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// Jest Snapshot v1, https://goo.gl/fbAQLP
2+
3+
exports[`.toIncludeAllMembersInOrder fails when array values do not contain all the members of the set 1`] = `
4+
"<dim>expect(</intensity><red>received</color><dim>).</intensity>toIncludeAllMembersInOrder<dim>(</intensity><green>expected</color><dim>)</intensity>
5+
6+
First differing element (index 2):
7+
8+
Expected: <green>undefined</color>
9+
Received: <red>3</color>"
10+
`;
11+
12+
exports[`.toIncludeAllMembersInOrder fails when array values do not have the same order as the expected array 1`] = `
13+
"<dim>expect(</intensity><red>received</color><dim>).</intensity>toIncludeAllMembersInOrder<dim>(</intensity><green>expected</color><dim>)</intensity>
14+
15+
First differing element (index 0):
16+
17+
Expected: <green>2</color>
18+
Received: <red>1</color>"
19+
`;
20+
21+
exports[`.toIncludeAllMembersInOrder fails when array values do not have the same order as the expected array 2`] = `
22+
"<dim>expect(</intensity><red>received</color><dim>).</intensity>toIncludeAllMembersInOrder<dim>(</intensity><green>expected</color><dim>)</intensity>
23+
24+
First differing element (index 2):
25+
26+
Expected: <green>undefined</color>
27+
Received: <red>2</color>"
28+
`;
29+
30+
exports[`.toIncludeAllMembersInOrder fails when array values do not have the same order as the expected array 3`] = `
31+
"<dim>expect(</intensity><red>received</color><dim>).</intensity>toIncludeAllMembersInOrder<dim>(</intensity><green>expected</color><dim>)</intensity>
32+
33+
First differing element (index 0):
34+
35+
Expected: <green>{"baz": "qux"}</color>
36+
Received: <red>{"foo": "bar"}</color>"
37+
`;
38+
39+
exports[`.toIncludeAllMembersInOrder fails when expected object is not an array 1`] = `
40+
"<dim>expect(</intensity><red>received</color><dim>).toIncludeAllMembers(</intensity><green>expected</color><dim>)</intensity>
41+
42+
Expected list to have all of the following members:
43+
<green>2</color>
44+
Received:
45+
<red>[1, 2, 3]</color>"
46+
`;
47+
48+
exports[`.toIncludeAllMembersInOrder fails when given object is not an array 1`] = `
49+
"<dim>expect(</intensity><red>received</color><dim>).toIncludeAllMembers(</intensity><green>expected</color><dim>)</intensity>
50+
51+
Expected list to have all of the following members:
52+
<green>[1, 2, 3]</color>
53+
Received:
54+
<red>2</color>"
55+
`;
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import * as matcher from 'src/matchers/toIncludeAllMembersInOrder';
2+
3+
expect.extend(matcher);
4+
5+
describe('.toIncludeAllMembersInOrder', () => {
6+
const array1 = [1, 2, 3];
7+
const array2 = [1, 2, 2];
8+
9+
test('passes when array values match in order the expected array', () => {
10+
expect(array1).toIncludeAllMembersInOrder([1, 2, 3]);
11+
expect([{ foo: 'bar' }, { baz: 'qux' }]).toIncludeAllMembersInOrder([{ foo: 'bar' }, { baz: 'qux' }]);
12+
});
13+
14+
test('fails when array values do not have the same order as the expected array', () => {
15+
expect(() => expect(array1).toIncludeAllMembersInOrder([2, 1, 3])).toThrowErrorMatchingSnapshot();
16+
expect(() => expect(array2).toIncludeAllMembersInOrder([2, 1])).toThrowErrorMatchingSnapshot();
17+
expect(() =>
18+
expect([{ foo: 'bar' }, { baz: 'qux' }]).toIncludeAllMembersInOrder([{ baz: 'qux' }, { foo: 'bar' }]),
19+
).toThrowErrorMatchingSnapshot();
20+
});
21+
22+
test('fails when array values do not contain all the members of the set', () => {
23+
expect(() => expect([1, 2, 3]).toIncludeAllMembersInOrder([1, 2])).toThrowErrorMatchingSnapshot();
24+
});
25+
26+
test('fails when given object is not an array', () => {
27+
expect(() => expect(2).toIncludeAllMembersInOrder([1, 2, 3])).toThrowErrorMatchingSnapshot();
28+
});
29+
30+
test('fails when expected object is not an array', () => {
31+
expect(() => expect(array1).toIncludeAllMembersInOrder(2)).toThrowErrorMatchingSnapshot();
32+
});
33+
});
34+
35+
describe('.not.toIncludeAllMembersInOrder', () => {
36+
const array1 = [1, 2, 3];
37+
38+
test('passes when array values does not contain any members of the set', () => {
39+
expect(array1).not.toIncludeAllMembersInOrder([4, 5, 6]);
40+
expect([{ foo: 'bar' }, { baz: 'qux' }]).not.toIncludeAllMembersInOrder([{ hello: 'world' }]);
41+
});
42+
43+
test('passes when given object is not an array', () => {
44+
expect(4).not.toIncludeAllMembersInOrder([4, 5, 6]);
45+
});
46+
47+
test('passes when array values matches the members of the set', () => {
48+
expect(array1).not.toIncludeAllMembersInOrder([2, 1, 3]);
49+
});
50+
});

0 commit comments

Comments
 (0)