-
Notifications
You must be signed in to change notification settings - Fork 6
/
mock-time-source.ts
107 lines (85 loc) · 2.66 KB
/
mock-time-source.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
import xs, {Stream} from 'xstream';
import * as assert from 'assert';
import * as combineErrors from 'combine-errors';
import {makeScheduler} from './scheduler';
import {makeDelay} from './delay';
import {makeDebounce} from './debounce';
import {makePeriodic} from './periodic';
import {makeThrottle} from './throttle';
import {makeDiagram} from './diagram';
import {makeAssertEqual} from './assert-equal';
import {makeAnimationFrames} from './animation-frames';
import {makeThrottleAnimation} from './throttle-animation';
import {makeRecord} from './record';
import {runVirtually} from './run-virtually';
import {MockTimeSource} from './time-source';
function raiseError (err) {
if (err) {
throw err;
}
}
function finish (asserts, done) {
const pendingAsserts = asserts.filter(assert => assert.state === 'pending');
if (pendingAsserts.length > 0) {
pendingAsserts.forEach(assert => assert.finish());
}
const failedAsserts = asserts.filter(assert => assert.state === 'failed');
const success = failedAsserts.length === 0;
if (success) {
done();
} else {
const errors = failedAsserts.map(assert => assert.error);
const error = combineErrors(errors);
done(error);
}
}
function mockTimeSource ({interval = 20} = {}): any {
let time = 0;
let maxTime = null;
let asserts = [];
let done;
const scheduler = makeScheduler();
function addAssert (assert) {
asserts.push(assert);
}
function currentTime () {
return time;
}
function setTime (newTime) {
time = newTime;
}
function setMaxTime (newTime) {
maxTime = Math.max(newTime, maxTime);
}
const timeSource = {
diagram: makeDiagram(scheduler.add, currentTime, interval, setMaxTime),
record: makeRecord(scheduler.add, currentTime, interval),
assertEqual: makeAssertEqual(() => timeSource, scheduler.add, currentTime, interval, addAssert),
delay: makeDelay(scheduler.add, currentTime),
debounce: makeDebounce(scheduler.add, currentTime),
periodic: makePeriodic(scheduler.add, currentTime),
throttle: makeThrottle(scheduler.add, currentTime),
animationFrames: () => timeSource.periodic(16).map(frame),
throttleAnimation: makeThrottleAnimation(() => timeSource, scheduler.add, currentTime),
run (doneCallback = raiseError, timeToRunTo = null) {
done = doneCallback;
if (!timeToRunTo) {
timeToRunTo = maxTime;
}
runVirtually(scheduler, () => finish(asserts, done), currentTime, setTime, timeToRunTo)
},
_scheduler: scheduler.add,
_time: currentTime
}
return timeSource;
}
function frame (i) {
return {
time: i * 16,
delta: 16,
normalizedDelta: 1
}
}
export {
mockTimeSource
}