forked from ReactiveX/rxjs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
timer-spec.ts
169 lines (143 loc) · 5.54 KB
/
timer-spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import { timer, NEVER, merge } from 'rxjs';
import { TestScheduler } from 'rxjs/testing';
import { mergeMap, take, concatWith } from 'rxjs/operators';
import { observableMatcher } from '../helpers/observableMatcher';
/** @test {timer} */
describe('timer', () => {
let rxTest: TestScheduler;
beforeEach(() => {
rxTest = new TestScheduler(observableMatcher);
});
it('should create an observable emitting periodically', () => {
rxTest.run(({ expectObservable }) => {
const e1 = timer(6, 2, rxTest).pipe(
take(4), // make it actually finite, so it can be rendered
concatWith(NEVER) // but pretend it's infinite by not completing
);
const expected = '------a-b-c-d-';
const values = {
a: 0,
b: 1,
c: 2,
d: 3,
};
expectObservable(e1).toBe(expected, values);
});
});
it('should schedule a value of 0 then complete', () => {
rxTest.run(({ expectObservable }) => {
const dueTime = 5; // -----|
const expected = ' -----(x|)';
const source = timer(dueTime, undefined, rxTest);
expectObservable(source).toBe(expected, { x: 0 });
});
});
it('should emit a single value immediately', () => {
rxTest.run(({ expectObservable }) => {
const dueTime = 0;
const expected = '(x|)';
const source = timer(dueTime, rxTest);
expectObservable(source).toBe(expected, { x: 0 });
});
});
it('should start after delay and periodically emit values', () => {
rxTest.run(({ expectObservable }) => {
const dueTime = 4; // ----|
const period = 2; // -|-|-|-|
const expected = ' ----a-b-c-d-(e|)';
const source = timer(dueTime, period, rxTest).pipe(take(5));
const values = { a: 0, b: 1, c: 2, d: 3, e: 4 };
expectObservable(source).toBe(expected, values);
});
});
it('should start immediately and periodically emit values', () => {
rxTest.run(({ expectObservable }) => {
const dueTime = 0; //|
const period = 3; // --|--|--|--|
const expected = ' a--b--c--d--(e|)';
const source = timer(dueTime, period, rxTest).pipe(take(5));
const values = { a: 0, b: 1, c: 2, d: 3, e: 4 };
expectObservable(source).toBe(expected, values);
});
});
it('should stop emitting values when subscription is done', () => {
rxTest.run(({ expectObservable }) => {
const dueTime = 0; //|
const period = 3; // --|--|--|--|
const expected = ' a--b--c--d--e';
const unsub = ' ^------------!';
const source = timer(dueTime, period, rxTest);
const values = { a: 0, b: 1, c: 2, d: 3, e: 4 };
expectObservable(source, unsub).toBe(expected, values);
});
});
it('should schedule a value at a specified Date', () => {
rxTest.run(({ expectObservable }) => {
const offset = 4; // ----|
const expected = ' ----(a|)';
const dueTime = new Date(rxTest.now() + offset);
const source = timer(dueTime, undefined, rxTest);
expectObservable(source).toBe(expected, { a: 0 });
});
});
it('should start after delay and periodically emit values', () => {
rxTest.run(({ expectObservable }) => {
const offset = 4; // ----|
const period = 2; // -|-|-|-|
const expected = ' ----a-b-c-d-(e|)';
const dueTime = new Date(rxTest.now() + offset);
const source = timer(dueTime, period, rxTest).pipe(take(5));
const values = { a: 0, b: 1, c: 2, d: 3, e: 4 };
expectObservable(source).toBe(expected, values);
});
});
it('should still target the same date if a date is provided even for the ' + 'second subscription', () => {
rxTest.run(({ cold, time, expectObservable }) => {
const offset = time('----| ');
const t1 = cold(' a| ');
const t2 = cold(' --a| ');
const expected = ' ----(aa|)';
const dueTime = new Date(rxTest.now() + offset);
const source = timer(dueTime, undefined, rxTest);
const testSource = merge(t1, t2).pipe(mergeMap(() => source));
expectObservable(testSource).toBe(expected, { a: 0 });
});
});
it('should accept Infinity as the first argument', () => {
rxTest.run(({ expectObservable }) => {
const source = timer(Infinity, undefined, rxTest);
const expected = '------';
expectObservable(source).toBe(expected);
});
});
it('should accept Infinity as the second argument', () => {
rxTest.run(({ expectObservable }) => {
rxTest.maxFrames = 20;
const source = timer(4, Infinity, rxTest);
const expected = '----a-';
expectObservable(source).toBe(expected, { a: 0 });
});
});
it('should accept negative numbers as the second argument, which should cause immediate completion', () => {
rxTest.run(({ expectObservable }) => {
const source = timer(4, -4, rxTest);
const expected = '----(a|)';
expectObservable(source).toBe(expected, { a: 0 });
});
});
it('should accept 0 as the second argument', () => {
rxTest.run(({ expectObservable }) => {
const source = timer(4, 0, rxTest).pipe(take(5));
const expected = '----(abcde|)';
expectObservable(source).toBe(expected, { a: 0, b: 1, c: 2, d: 3, e: 4 });
});
});
it('should emit after a delay of 0 for Date objects in the past', () => {
rxTest.run(({ expectObservable }) => {
const expected = '(a|)';
const threeSecondsInThePast = new Date(rxTest.now() - 3000);
const source = timer(threeSecondsInThePast, undefined, rxTest);
expectObservable(source).toBe(expected, { a: 0 });
});
});
});