Skip to content

Commit 3822439

Browse files
committed
feat(marbleassert): implement marbleAssert
1 parent dc0adc9 commit 3822439

File tree

3 files changed

+37
-19
lines changed

3 files changed

+37
-19
lines changed

src/ambient.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
declare module 'jest-matcher-utils';
2+
declare module 'jest-matchers/*';

src/assert/marbleAssert.ts

+33-18
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,32 @@
11
import { matcherHint, printExpected, printReceived } from 'jest-matcher-utils';
2-
//tslint:disable-next-line:no-require-imports
3-
import isEqualWith = require('lodash.isequalwith');
2+
import { toEqual } from 'jest-matchers/build/matchers';
43
import { SubscriptionLog } from 'rxjs/testing/SubscriptionLog';
54
import { TestMessage } from '../message/TestMessage';
65
import { constructObservableMarble } from './constructObservableMarble';
76
import { constructSubscriptionMarble } from './constructSubscriptionMarble';
87

9-
const observableMarbleAssert = (source: Array<TestMessage>) => (expected: Array<TestMessage>) => {
8+
const toEqulAssert = toEqual.bind({ expand: false });
9+
10+
const observableMarbleAssert = <T = string>(source: Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>) => (
11+
expected: Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>
12+
) => {
1013
if (!Array.isArray(expected)) {
1114
throw new Error('Expected value is not array');
1215
}
1316

1417
const sourceMarble = constructObservableMarble(source);
1518
const expectedMarble = constructObservableMarble(expected);
1619

17-
if (!isEqualWith(sourceMarble, expectedMarble)) {
18-
throw new Error('unmatch');
20+
const asserted = toEqulAssert(source, expected);
21+
22+
if (!asserted.pass) {
23+
const description = `
24+
${printReceived(`Source: ${sourceMarble}`)}
25+
${printExpected(`Expected: ${expectedMarble}`)}
26+
27+
${asserted.message()}
28+
`;
29+
throw new Error(description);
1930
}
2031
};
2132

@@ -27,25 +38,29 @@ const subscriptionMarbleAssert = (source: SubscriptionLog) => (expected: Subscri
2738
const sourceMarble = constructSubscriptionMarble(source);
2839
const expectedMarble = constructSubscriptionMarble(expected);
2940

30-
if (
31-
sourceMarble.marbleString !== expectedMarble.marbleString ||
32-
sourceMarble.frameString !== expectedMarble.frameString
33-
) {
34-
const description = `${matcherHint(' to equal ', JSON.stringify(source), JSON.stringify(expected))}
41+
const asserted = toEqulAssert(sourceMarble, expectedMarble);
42+
43+
if (!asserted.pass) {
44+
const description = `
45+
${matcherHint(' to equal ', JSON.stringify(source), JSON.stringify(expected))}
3546
36-
${printReceived(`Source: ${sourceMarble.marbleString}`)}
37-
${printReceived(` ${sourceMarble.frameString}`)}
38-
${printExpected(`Expected: ${expectedMarble.marbleString}`)}
39-
${printExpected(` ${expectedMarble.frameString}`)}
47+
${printReceived(`Source: ${sourceMarble.marbleString}`)}
48+
${printReceived(` ${sourceMarble.frameString}`)}
49+
${printExpected(`Expected: ${expectedMarble.marbleString}`)}
50+
${printExpected(` ${expectedMarble.frameString}`)}
4051
`;
4152

4253
throw new Error(description);
4354
}
4455
};
4556

46-
function marbleAssert(source: SubscriptionLog): { to: { equal(expected: SubscriptionLog): void } };
47-
function marbleAssert(source: Array<TestMessage>): { to: { equal(expected: Array<TestMessage>): void } };
48-
function marbleAssert(source: SubscriptionLog | Array<TestMessage>): { to: { equal(expected: object): void } } {
57+
function marbleAssert<T = void>(source: SubscriptionLog): { to: { equal(expected: SubscriptionLog): void } };
58+
function marbleAssert<T = string>(
59+
source: Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>
60+
): { to: { equal(expected: Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>): void } };
61+
function marbleAssert<T = string>(
62+
source: SubscriptionLog | Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>
63+
): { to: { equal(expected: object): void } } {
4964
const isSourceArray = Array.isArray(source);
5065
const isSourceSubscription = source instanceof SubscriptionLog;
5166

@@ -57,7 +72,7 @@ function marbleAssert(source: SubscriptionLog | Array<TestMessage>): { to: { equ
5772
to: {
5873
equal: isSourceSubscription
5974
? subscriptionMarbleAssert(source as SubscriptionLog)
60-
: observableMarbleAssert(source as Array<TestMessage>)
75+
: observableMarbleAssert(source as any)
6176
}
6277
};
6378
}

src/index.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ export interface RxSandbox {
6565
*
6666
*/
6767
marbleAssert(source: SubscriptionLog): { to: { equal(expected: SubscriptionLog): void } };
68-
marbleAssert(source: Array<TestMessage>): { to: { equal(expected: Array<TestMessage>): void } };
68+
marbleAssert<T = string>(
69+
source: Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>
70+
): { to: { equal(expected: Array<TestMessage<T>> | Readonly<Array<TestMessage<T>>>): void } };
6971
}
7072

7173
const rxSandbox: RxSandbox = {

0 commit comments

Comments
 (0)