Skip to content

Commit 0f73b9c

Browse files
authored
Merge pull request #25 from kwonoj/refactor-interface
refactor(testscheduler): rename getMarbles into getMessages
2 parents 43632e7 + 4e04e9f commit 0f73b9c

File tree

2 files changed

+68
-5
lines changed

2 files changed

+68
-5
lines changed

src/index.ts

+67-4
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,87 @@ import { TestScheduler } from './scheduler/TestScheduler';
99

1010
//workaround TS4029 by explicitly import types and avoid unused import error
1111
(() => Observable.toString())();
12-
(() => SubscriptionLog.toString())();
1312
(() => ColdObservable.toString())();
1413
(() => HotObservable.toString())();
1514

16-
const rxSandbox = {
15+
export type RxSandboxInstance = {
16+
/**
17+
* Creates a hot observable using marble diagram DSL, or TestMessage.
18+
*/
19+
hot: typeof TestScheduler.prototype.createHotObservable;
20+
/**
21+
* Creates a cold obsrevable using marbld diagram DSL, or TestMessage.
22+
*/
23+
cold: typeof TestScheduler.prototype.createColdObservable;
24+
/**
25+
* Flush out currently scheduled observables, fill values returned by `getMarbles`.
26+
*/
27+
flush: typeof TestScheduler.prototype.flush;
28+
/**
29+
* Get array of observable value's metadata TestMessage<T> from observable
30+
* created via `hot` or `cold`. Returned array will be filled once scheduler flushes
31+
* scheduled actions, either via explicit `flush` or implicit `autoFlush`.
32+
*/
33+
getMessages: typeof TestScheduler.prototype.getMessages;
34+
/**
35+
* Utility function to generate `expected` values via marble diagram.
36+
*/
37+
e: <T = string>(
38+
marble: string,
39+
value?: { [key: string]: T } | null,
40+
error?: any
41+
) => Readonly<Array<TestMessage<T | Array<TestMessage<T>>>>>;
42+
/**
43+
* Utility function to generate `expected` subscriptions via marble diagram.
44+
*/
45+
s: (marble: string) => SubscriptionLog;
46+
};
47+
48+
export interface RxSandbox {
49+
/**
50+
* Creates new instance of test scheduler for testing observables.
51+
*
52+
* @param {boolean} [autoFlush] Flush scheduler automatically when `getMarbles` is being called. False by default.
53+
* @param {number} [frameTimeFactor] Custom frametime factor for virtual time frame. 1 by default.
54+
*
55+
* @return {RxSandboxInstance} instance of test scheduler interfaces.
56+
*/
57+
create(autoFlush?: boolean, frameTimeFactor?: number): RxSandboxInstance;
58+
/**
59+
* Utility assertion method to assert marble based observable test messages.
60+
* By default return values of sandbox functions are plain object works with
61+
* any testing framework or assertion library, while this assertion provides
62+
* better visualization against observable test messages.
63+
*
64+
*/
65+
marbleAssert(): {
66+
to: {
67+
equal: () => void;
68+
};
69+
};
70+
}
71+
72+
const rxSandbox: RxSandbox = {
1773
create: (autoFlush: boolean = false, frameTimeFactor: number = 1) => {
1874
const scheduler = new TestScheduler(autoFlush, frameTimeFactor);
1975

2076
return {
2177
hot: scheduler.createHotObservable.bind(scheduler) as typeof scheduler.createHotObservable,
2278
cold: scheduler.createColdObservable.bind(scheduler) as typeof scheduler.createColdObservable,
2379
flush: scheduler.flush.bind(scheduler) as typeof scheduler.flush,
24-
getMarbles: scheduler.getMarbles.bind(scheduler) as typeof scheduler.getMarbles,
80+
getMessages: scheduler.getMessages.bind(scheduler) as typeof scheduler.getMessages,
2581
e: <T = string>(marble: string, value?: { [key: string]: T } | null, error?: any) =>
2682
parseObservableMarble(marble, value, error, true, frameTimeFactor),
2783
s: (marble: string) => parseSubscriptionMarble(marble, frameTimeFactor)
2884
};
29-
}
85+
},
86+
marbleAssert: () => ({
87+
to: {
88+
equal: () => {
89+
throw new Error('not implemented');
90+
}
91+
}
92+
})
3093
};
3194

3295
export { rxSandbox, TestMessage };

src/scheduler/TestScheduler.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class TestScheduler extends VirtualTimeScheduler {
3030
this.flushed = true;
3131
}
3232

33-
public getMarbles<T = string>(observable: Observable<T>, unsubscriptionMarbles: string | null = null) {
33+
public getMessages<T = string>(observable: Observable<T>, unsubscriptionMarbles: string | null = null) {
3434
const { unsubscribedFrame } = parseSubscriptionMarble(unsubscriptionMarbles);
3535
const observableMetadata: Array<TestMessage<T | Array<TestMessage<T>>>> = [];
3636
const pushMetadata = (notification: Notification<T | Array<TestMessage<T>>>) =>

0 commit comments

Comments
 (0)