@matter/testing 0.17.7-alpha.0-20260724-baac832f7 → 0.17.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/mocks/time.d.ts +10 -3
- package/dist/cjs/mocks/time.d.ts.map +1 -1
- package/dist/cjs/mocks/time.js +45 -18
- package/dist/cjs/mocks/time.js.map +1 -1
- package/dist/esm/mocks/time.d.ts +10 -3
- package/dist/esm/mocks/time.d.ts.map +1 -1
- package/dist/esm/mocks/time.js +45 -18
- package/dist/esm/mocks/time.js.map +1 -1
- package/package.json +3 -3
- package/src/mocks/time.ts +52 -19
- package/test/mocks/MockTimeTest.ts +99 -0
package/dist/cjs/mocks/time.d.ts
CHANGED
|
@@ -18,10 +18,17 @@ declare class MockTimer {
|
|
|
18
18
|
#private;
|
|
19
19
|
name: string;
|
|
20
20
|
systemId: number;
|
|
21
|
-
|
|
22
|
-
isPeriodic: boolean;
|
|
21
|
+
utility: boolean;
|
|
22
|
+
readonly isPeriodic: boolean;
|
|
23
23
|
isRunning: boolean;
|
|
24
|
-
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback);
|
|
24
|
+
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback, isPeriodic?: boolean);
|
|
25
|
+
/**
|
|
26
|
+
* The timer's interval.
|
|
27
|
+
*
|
|
28
|
+
* As with the production implementation, changes have no effect until the timer restarts.
|
|
29
|
+
*/
|
|
30
|
+
set interval(interval: number);
|
|
31
|
+
get interval(): number;
|
|
25
32
|
start(): this;
|
|
26
33
|
stop(): this;
|
|
27
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/mocks/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,qBAAa,gBAAiB,SAAQ,KAAK;IACvC,WAAW,qBAAC;IAEZ,YAAY,OAAO,EAAE,MAAM,EAQ1B;IAED,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,aAAa,GAAG,MAAM,GAAG,CAAC;AAE/B,KAAK,YAAY,GAAG,OAAO,QAAQ,CAAC;AACpC,MAAM,WAAW,QAAS,SAAQ,YAAY;CAAG;
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/mocks/time.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/mocks/time.js
CHANGED
|
@@ -44,6 +44,7 @@ class TestTimeoutError extends Error {
|
|
|
44
44
|
file;
|
|
45
45
|
}
|
|
46
46
|
const macrotaskDependents = /* @__PURE__ */ new Set();
|
|
47
|
+
const timerNames = /* @__PURE__ */ new WeakMap();
|
|
47
48
|
const registry = {
|
|
48
49
|
timers: /* @__PURE__ */ new Set(),
|
|
49
50
|
register(_timer) {
|
|
@@ -54,18 +55,23 @@ const registry = {
|
|
|
54
55
|
class MockTimer {
|
|
55
56
|
name = "Test";
|
|
56
57
|
systemId = 0;
|
|
57
|
-
|
|
58
|
-
isPeriodic
|
|
58
|
+
utility = false;
|
|
59
|
+
isPeriodic;
|
|
59
60
|
#mockTime;
|
|
60
|
-
#
|
|
61
|
+
#interval = 0;
|
|
62
|
+
#armedInterval = 0;
|
|
61
63
|
isRunning = false;
|
|
62
64
|
#callback;
|
|
63
|
-
constructor(mockTime, name, duration, callback) {
|
|
65
|
+
constructor(mockTime, name, duration, callback, isPeriodic = false) {
|
|
64
66
|
this.name = name;
|
|
67
|
+
this.isPeriodic = isPeriodic;
|
|
65
68
|
this.#mockTime = mockTime;
|
|
66
|
-
this
|
|
67
|
-
if (
|
|
68
|
-
this.#callback =
|
|
69
|
+
this.interval = duration;
|
|
70
|
+
if (isPeriodic) {
|
|
71
|
+
this.#callback = async () => {
|
|
72
|
+
this.#mockTime.callbackAtTime(this.#mockTime.nowMs + this.#armedInterval, this.#callback);
|
|
73
|
+
await callback();
|
|
74
|
+
};
|
|
69
75
|
} else {
|
|
70
76
|
this.#callback = () => {
|
|
71
77
|
this.#close();
|
|
@@ -73,9 +79,30 @@ class MockTimer {
|
|
|
73
79
|
};
|
|
74
80
|
}
|
|
75
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* The timer's interval.
|
|
84
|
+
*
|
|
85
|
+
* As with the production implementation, changes have no effect until the timer restarts.
|
|
86
|
+
*/
|
|
87
|
+
set interval(interval) {
|
|
88
|
+
if (interval < 0 || interval > 2147483647) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`Invalid intervalMs: ${interval}. The value must be between 0 and 32-bit maximum value (2147483647)`
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
this.#interval = interval;
|
|
94
|
+
}
|
|
95
|
+
get interval() {
|
|
96
|
+
return this.#interval;
|
|
97
|
+
}
|
|
76
98
|
start() {
|
|
99
|
+
if (this.isRunning) {
|
|
100
|
+
this.stop();
|
|
101
|
+
}
|
|
77
102
|
registry.register(this);
|
|
78
|
-
this.#
|
|
103
|
+
timerNames.set(this.#callback, `${this.name}(${this.#interval}${this.isPeriodic ? ",periodic" : ""})`);
|
|
104
|
+
this.#armedInterval = this.#interval;
|
|
105
|
+
this.#mockTime.callbackAtTime(this.#mockTime.nowMs + this.#armedInterval, this.#callback);
|
|
79
106
|
this.isRunning = true;
|
|
80
107
|
return this;
|
|
81
108
|
}
|
|
@@ -89,15 +116,6 @@ class MockTimer {
|
|
|
89
116
|
this.isRunning = false;
|
|
90
117
|
}
|
|
91
118
|
}
|
|
92
|
-
class MockInterval extends MockTimer {
|
|
93
|
-
constructor(mockTime, name, duration, callback) {
|
|
94
|
-
const intervalCallback = async () => {
|
|
95
|
-
mockTime.callbackAtTime(mockTime.nowMs + duration, intervalCallback);
|
|
96
|
-
await callback();
|
|
97
|
-
};
|
|
98
|
-
super(mockTime, name, duration, intervalCallback);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
119
|
function isAsync(fn) {
|
|
102
120
|
return fn.constructor.name === "AsyncFunction";
|
|
103
121
|
}
|
|
@@ -195,7 +213,7 @@ const MockTime = {
|
|
|
195
213
|
return new MockTimer(this, name, duration, callback);
|
|
196
214
|
},
|
|
197
215
|
getPeriodicTimer(name, interval, callback) {
|
|
198
|
-
return new
|
|
216
|
+
return new MockTimer(this, name, interval, callback, true);
|
|
199
217
|
},
|
|
200
218
|
/**
|
|
201
219
|
* Time compatible sleep.
|
|
@@ -289,11 +307,20 @@ const MockTime = {
|
|
|
289
307
|
*/
|
|
290
308
|
async advance(ms) {
|
|
291
309
|
const newTimeMs = nowMs + ms;
|
|
310
|
+
let previousAtMs;
|
|
311
|
+
let iterationsAtSameTime = 0;
|
|
292
312
|
while (callbacks.length) {
|
|
293
313
|
const { atMs, callback } = callbacks[0];
|
|
294
314
|
if (atMs > newTimeMs) break;
|
|
295
315
|
callbacks.shift();
|
|
296
316
|
nowMs = atMs;
|
|
317
|
+
iterationsAtSameTime = atMs === previousAtMs ? iterationsAtSameTime + 1 : 0;
|
|
318
|
+
previousAtMs = atMs;
|
|
319
|
+
if (iterationsAtSameTime > 1e4) {
|
|
320
|
+
throw new TestTimeoutError(
|
|
321
|
+
`Timer ${timerNames.get(callback) ?? "(unknown)"} rearms without advancing mock time`
|
|
322
|
+
);
|
|
323
|
+
}
|
|
297
324
|
await callback();
|
|
298
325
|
}
|
|
299
326
|
nowMs = newTimeMs;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mocks/time.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,kBAAqB;AANrB;AAAA;AAAA;AAAA;AAAA;AAQO,MAAM,yBAAyB,MAAM;AAAA,EACxC;AAAA,EAEA,YAAY,SAAiB;AACzB,UAAM,iBAAiB,OAAO,EAAE;AAEhC,QAAI;AACA,WAAK,cAAc,aAAa,sBAAsB;AAAA,IAC1D,SAAS,GAAG;AACR,WAAK,cAAc,mCAAoC,EAAY,OAAO;AAAA,IAC9E;AAAA,EACJ;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ;AAOA,MAAM,sBAAsB,oBAAI,IAAsB;AAEtD,MAAM,WAAW;AAAA,EACb,QAAQ,oBAAI,IAAe;AAAA,EAC3B,SAAS,QAAmB;AAAA,EAAC;AAAA,EAC7B,WAAW,QAAmB;AAAA,EAAC;AACnC;AAGA,MAAM,UAAU;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["isAsync"]
|
|
6
6
|
}
|
package/dist/esm/mocks/time.d.ts
CHANGED
|
@@ -18,10 +18,17 @@ declare class MockTimer {
|
|
|
18
18
|
#private;
|
|
19
19
|
name: string;
|
|
20
20
|
systemId: number;
|
|
21
|
-
|
|
22
|
-
isPeriodic: boolean;
|
|
21
|
+
utility: boolean;
|
|
22
|
+
readonly isPeriodic: boolean;
|
|
23
23
|
isRunning: boolean;
|
|
24
|
-
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback);
|
|
24
|
+
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback, isPeriodic?: boolean);
|
|
25
|
+
/**
|
|
26
|
+
* The timer's interval.
|
|
27
|
+
*
|
|
28
|
+
* As with the production implementation, changes have no effect until the timer restarts.
|
|
29
|
+
*/
|
|
30
|
+
set interval(interval: number);
|
|
31
|
+
get interval(): number;
|
|
25
32
|
start(): this;
|
|
26
33
|
stop(): this;
|
|
27
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/mocks/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,qBAAa,gBAAiB,SAAQ,KAAK;IACvC,WAAW,qBAAC;IAEZ,YAAY,OAAO,EAAE,MAAM,EAQ1B;IAED,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,aAAa,GAAG,MAAM,GAAG,CAAC;AAE/B,KAAK,YAAY,GAAG,OAAO,QAAQ,CAAC;AACpC,MAAM,WAAW,QAAS,SAAQ,YAAY;CAAG;
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/mocks/time.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/mocks/time.js
CHANGED
|
@@ -19,6 +19,7 @@ class TestTimeoutError extends Error {
|
|
|
19
19
|
file;
|
|
20
20
|
}
|
|
21
21
|
const macrotaskDependents = /* @__PURE__ */ new Set();
|
|
22
|
+
const timerNames = /* @__PURE__ */ new WeakMap();
|
|
22
23
|
const registry = {
|
|
23
24
|
timers: /* @__PURE__ */ new Set(),
|
|
24
25
|
register(_timer) {
|
|
@@ -29,18 +30,23 @@ const registry = {
|
|
|
29
30
|
class MockTimer {
|
|
30
31
|
name = "Test";
|
|
31
32
|
systemId = 0;
|
|
32
|
-
|
|
33
|
-
isPeriodic
|
|
33
|
+
utility = false;
|
|
34
|
+
isPeriodic;
|
|
34
35
|
#mockTime;
|
|
35
|
-
#
|
|
36
|
+
#interval = 0;
|
|
37
|
+
#armedInterval = 0;
|
|
36
38
|
isRunning = false;
|
|
37
39
|
#callback;
|
|
38
|
-
constructor(mockTime, name, duration, callback) {
|
|
40
|
+
constructor(mockTime, name, duration, callback, isPeriodic = false) {
|
|
39
41
|
this.name = name;
|
|
42
|
+
this.isPeriodic = isPeriodic;
|
|
40
43
|
this.#mockTime = mockTime;
|
|
41
|
-
this
|
|
42
|
-
if (
|
|
43
|
-
this.#callback =
|
|
44
|
+
this.interval = duration;
|
|
45
|
+
if (isPeriodic) {
|
|
46
|
+
this.#callback = async () => {
|
|
47
|
+
this.#mockTime.callbackAtTime(this.#mockTime.nowMs + this.#armedInterval, this.#callback);
|
|
48
|
+
await callback();
|
|
49
|
+
};
|
|
44
50
|
} else {
|
|
45
51
|
this.#callback = () => {
|
|
46
52
|
this.#close();
|
|
@@ -48,9 +54,30 @@ class MockTimer {
|
|
|
48
54
|
};
|
|
49
55
|
}
|
|
50
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* The timer's interval.
|
|
59
|
+
*
|
|
60
|
+
* As with the production implementation, changes have no effect until the timer restarts.
|
|
61
|
+
*/
|
|
62
|
+
set interval(interval) {
|
|
63
|
+
if (interval < 0 || interval > 2147483647) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
`Invalid intervalMs: ${interval}. The value must be between 0 and 32-bit maximum value (2147483647)`
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
this.#interval = interval;
|
|
69
|
+
}
|
|
70
|
+
get interval() {
|
|
71
|
+
return this.#interval;
|
|
72
|
+
}
|
|
51
73
|
start() {
|
|
74
|
+
if (this.isRunning) {
|
|
75
|
+
this.stop();
|
|
76
|
+
}
|
|
52
77
|
registry.register(this);
|
|
53
|
-
this.#
|
|
78
|
+
timerNames.set(this.#callback, `${this.name}(${this.#interval}${this.isPeriodic ? ",periodic" : ""})`);
|
|
79
|
+
this.#armedInterval = this.#interval;
|
|
80
|
+
this.#mockTime.callbackAtTime(this.#mockTime.nowMs + this.#armedInterval, this.#callback);
|
|
54
81
|
this.isRunning = true;
|
|
55
82
|
return this;
|
|
56
83
|
}
|
|
@@ -64,15 +91,6 @@ class MockTimer {
|
|
|
64
91
|
this.isRunning = false;
|
|
65
92
|
}
|
|
66
93
|
}
|
|
67
|
-
class MockInterval extends MockTimer {
|
|
68
|
-
constructor(mockTime, name, duration, callback) {
|
|
69
|
-
const intervalCallback = async () => {
|
|
70
|
-
mockTime.callbackAtTime(mockTime.nowMs + duration, intervalCallback);
|
|
71
|
-
await callback();
|
|
72
|
-
};
|
|
73
|
-
super(mockTime, name, duration, intervalCallback);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
94
|
function isAsync(fn) {
|
|
77
95
|
return fn.constructor.name === "AsyncFunction";
|
|
78
96
|
}
|
|
@@ -170,7 +188,7 @@ const MockTime = {
|
|
|
170
188
|
return new MockTimer(this, name, duration, callback);
|
|
171
189
|
},
|
|
172
190
|
getPeriodicTimer(name, interval, callback) {
|
|
173
|
-
return new
|
|
191
|
+
return new MockTimer(this, name, interval, callback, true);
|
|
174
192
|
},
|
|
175
193
|
/**
|
|
176
194
|
* Time compatible sleep.
|
|
@@ -264,11 +282,20 @@ const MockTime = {
|
|
|
264
282
|
*/
|
|
265
283
|
async advance(ms) {
|
|
266
284
|
const newTimeMs = nowMs + ms;
|
|
285
|
+
let previousAtMs;
|
|
286
|
+
let iterationsAtSameTime = 0;
|
|
267
287
|
while (callbacks.length) {
|
|
268
288
|
const { atMs, callback } = callbacks[0];
|
|
269
289
|
if (atMs > newTimeMs) break;
|
|
270
290
|
callbacks.shift();
|
|
271
291
|
nowMs = atMs;
|
|
292
|
+
iterationsAtSameTime = atMs === previousAtMs ? iterationsAtSameTime + 1 : 0;
|
|
293
|
+
previousAtMs = atMs;
|
|
294
|
+
if (iterationsAtSameTime > 1e4) {
|
|
295
|
+
throw new TestTimeoutError(
|
|
296
|
+
`Timer ${timerNames.get(callback) ?? "(unknown)"} rearms without advancing mock time`
|
|
297
|
+
);
|
|
298
|
+
}
|
|
272
299
|
await callback();
|
|
273
300
|
}
|
|
274
301
|
nowMs = newTimeMs;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mocks/time.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,YAAY;AAEd,MAAM,yBAAyB,MAAM;AAAA,EACxC;AAAA,EAEA,YAAY,SAAiB;AACzB,UAAM,iBAAiB,OAAO,EAAE;AAEhC,QAAI;AACA,WAAK,cAAc,aAAa,sBAAsB;AAAA,IAC1D,SAAS,GAAG;AACR,WAAK,cAAc,mCAAoC,EAAY,OAAO;AAAA,IAC9E;AAAA,EACJ;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AACJ;AAOA,MAAM,sBAAsB,oBAAI,IAAsB;AAEtD,MAAM,WAAW;AAAA,EACb,QAAQ,oBAAI,IAAe;AAAA,EAC3B,SAAS,QAAmB;AAAA,EAAC;AAAA,EAC7B,WAAW,QAAmB;AAAA,EAAC;AACnC;AAGA,MAAM,UAAU;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["isAsync"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/testing",
|
|
3
|
-
"version": "0.17.7
|
|
3
|
+
"version": "0.17.7",
|
|
4
4
|
"description": "Test harness for running JavaScript and Matter certification tests",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -50,12 +50,12 @@
|
|
|
50
50
|
"esbuild": "^0.28.1",
|
|
51
51
|
"express": "^5.2.1",
|
|
52
52
|
"mocha": "^11.7.6",
|
|
53
|
-
"playwright": "^1.
|
|
53
|
+
"playwright": "^1.62.0",
|
|
54
54
|
"trace-unhandled": "^2.0.1",
|
|
55
55
|
"wtfnode": "^0.10.1",
|
|
56
56
|
"xml2js": "^0.6.2",
|
|
57
57
|
"yaml": "^2.9.0",
|
|
58
|
-
"yargs": "^18.
|
|
58
|
+
"yargs": "^18.1.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"typescript": "~6.0.3",
|
package/src/mocks/time.ts
CHANGED
|
@@ -31,6 +31,8 @@ export interface MockTime extends MockTimeLike {}
|
|
|
31
31
|
|
|
32
32
|
const macrotaskDependents = new Set<Promise<unknown>>();
|
|
33
33
|
|
|
34
|
+
const timerNames = new WeakMap<TimerCallback, string>();
|
|
35
|
+
|
|
34
36
|
const registry = {
|
|
35
37
|
timers: new Set<MockTimer>(),
|
|
36
38
|
register(_timer: MockTimer) {},
|
|
@@ -41,23 +43,28 @@ const registry = {
|
|
|
41
43
|
class MockTimer {
|
|
42
44
|
name = "Test";
|
|
43
45
|
systemId = 0;
|
|
44
|
-
|
|
45
|
-
isPeriodic
|
|
46
|
+
utility = false;
|
|
47
|
+
readonly isPeriodic: boolean;
|
|
46
48
|
|
|
47
49
|
#mockTime: MockTime;
|
|
48
|
-
#
|
|
50
|
+
#interval = 0;
|
|
51
|
+
#armedInterval = 0;
|
|
49
52
|
|
|
50
53
|
isRunning = false;
|
|
51
54
|
readonly #callback: TimerCallback;
|
|
52
55
|
|
|
53
|
-
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback) {
|
|
56
|
+
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback, isPeriodic = false) {
|
|
54
57
|
this.name = name;
|
|
58
|
+
this.isPeriodic = isPeriodic;
|
|
55
59
|
|
|
56
60
|
this.#mockTime = mockTime;
|
|
57
|
-
this
|
|
61
|
+
this.interval = duration;
|
|
58
62
|
|
|
59
|
-
if (
|
|
60
|
-
this.#callback =
|
|
63
|
+
if (isPeriodic) {
|
|
64
|
+
this.#callback = async () => {
|
|
65
|
+
this.#mockTime.callbackAtTime(this.#mockTime.nowMs + this.#armedInterval, this.#callback);
|
|
66
|
+
await callback();
|
|
67
|
+
};
|
|
61
68
|
} else {
|
|
62
69
|
this.#callback = () => {
|
|
63
70
|
this.#close();
|
|
@@ -66,9 +73,32 @@ class MockTimer {
|
|
|
66
73
|
}
|
|
67
74
|
}
|
|
68
75
|
|
|
76
|
+
/**
|
|
77
|
+
* The timer's interval.
|
|
78
|
+
*
|
|
79
|
+
* As with the production implementation, changes have no effect until the timer restarts.
|
|
80
|
+
*/
|
|
81
|
+
set interval(interval: number) {
|
|
82
|
+
if (interval < 0 || interval > 2147483647) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
`Invalid intervalMs: ${interval}. The value must be between 0 and 32-bit maximum value (2147483647)`,
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
this.#interval = interval;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
get interval() {
|
|
91
|
+
return this.#interval;
|
|
92
|
+
}
|
|
93
|
+
|
|
69
94
|
start() {
|
|
95
|
+
if (this.isRunning) {
|
|
96
|
+
this.stop();
|
|
97
|
+
}
|
|
70
98
|
registry.register(this);
|
|
71
|
-
this.#
|
|
99
|
+
timerNames.set(this.#callback, `${this.name}(${this.#interval}${this.isPeriodic ? ",periodic" : ""})`);
|
|
100
|
+
this.#armedInterval = this.#interval;
|
|
101
|
+
this.#mockTime.callbackAtTime(this.#mockTime.nowMs + this.#armedInterval, this.#callback);
|
|
72
102
|
this.isRunning = true;
|
|
73
103
|
return this;
|
|
74
104
|
}
|
|
@@ -85,16 +115,6 @@ class MockTimer {
|
|
|
85
115
|
}
|
|
86
116
|
}
|
|
87
117
|
|
|
88
|
-
class MockInterval extends MockTimer {
|
|
89
|
-
constructor(mockTime: MockTime, name: string, duration: number, callback: TimerCallback) {
|
|
90
|
-
const intervalCallback = async () => {
|
|
91
|
-
mockTime.callbackAtTime(mockTime.nowMs + duration, intervalCallback);
|
|
92
|
-
await callback();
|
|
93
|
-
};
|
|
94
|
-
super(mockTime, name, duration, intervalCallback);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
118
|
type InterceptResult<T> =
|
|
99
119
|
T extends Promise<T>
|
|
100
120
|
? { resolve: Awaited<T>; reject?: undefined } | { resolve?: undefined; reject: {} }
|
|
@@ -233,7 +253,7 @@ export const MockTime = {
|
|
|
233
253
|
},
|
|
234
254
|
|
|
235
255
|
getPeriodicTimer(name: string, interval: number, callback: TimerCallback): MockTimer {
|
|
236
|
-
return new
|
|
256
|
+
return new MockTimer(this, name, interval, callback, true);
|
|
237
257
|
},
|
|
238
258
|
|
|
239
259
|
/**
|
|
@@ -357,11 +377,24 @@ export const MockTime = {
|
|
|
357
377
|
async advance(ms: number) {
|
|
358
378
|
const newTimeMs = nowMs + ms;
|
|
359
379
|
|
|
380
|
+
let previousAtMs: number | undefined;
|
|
381
|
+
let iterationsAtSameTime = 0;
|
|
360
382
|
while (callbacks.length) {
|
|
361
383
|
const { atMs, callback } = callbacks[0];
|
|
362
384
|
if (atMs > newTimeMs) break;
|
|
363
385
|
callbacks.shift();
|
|
364
386
|
nowMs = atMs;
|
|
387
|
+
|
|
388
|
+
// A timer that rearms at the current time never lets the mock clock advance, so without this guard the
|
|
389
|
+
// loop spins indefinitely
|
|
390
|
+
iterationsAtSameTime = atMs === previousAtMs ? iterationsAtSameTime + 1 : 0;
|
|
391
|
+
previousAtMs = atMs;
|
|
392
|
+
if (iterationsAtSameTime > 10000) {
|
|
393
|
+
throw new TestTimeoutError(
|
|
394
|
+
`Timer ${timerNames.get(callback) ?? "(unknown)"} rearms without advancing mock time`,
|
|
395
|
+
);
|
|
396
|
+
}
|
|
397
|
+
|
|
365
398
|
await callback();
|
|
366
399
|
}
|
|
367
400
|
|
|
@@ -75,7 +75,106 @@ describe("MockTime", () => {
|
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
+
describe("interval", () => {
|
|
79
|
+
it("reports the construction duration", () => {
|
|
80
|
+
expect(MockTime.getTimer("Test", 30, () => {}).interval).equal(30);
|
|
81
|
+
expect(MockTime.getPeriodicTimer("Test periodic", 30, () => {}).interval).equal(30);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("controls the fire time of a subsequent start", async () => {
|
|
85
|
+
let firedTime;
|
|
86
|
+
|
|
87
|
+
const timer = MockTime.getTimer("Test", 30, () => (firedTime = MockTime.nowMs));
|
|
88
|
+
timer.start();
|
|
89
|
+
timer.stop();
|
|
90
|
+
|
|
91
|
+
timer.interval = 100;
|
|
92
|
+
timer.start();
|
|
93
|
+
|
|
94
|
+
await MockTime.advance(50);
|
|
95
|
+
expect(firedTime).equal(undefined);
|
|
96
|
+
|
|
97
|
+
await MockTime.advance(50);
|
|
98
|
+
expect(firedTime).equal(FAKE_TIME + 100);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("does not affect a running timer until it restarts", async () => {
|
|
102
|
+
const firedTimes = new Array<number>();
|
|
103
|
+
|
|
104
|
+
const timer = MockTime.getTimer("Test", 30, () => firedTimes.push(MockTime.nowMs));
|
|
105
|
+
timer.start();
|
|
106
|
+
timer.interval = 100;
|
|
107
|
+
|
|
108
|
+
await MockTime.advance(30);
|
|
109
|
+
expect(firedTimes).deep.equal([FAKE_TIME + 30]);
|
|
110
|
+
|
|
111
|
+
timer.start();
|
|
112
|
+
|
|
113
|
+
await MockTime.advance(100);
|
|
114
|
+
expect(firedTimes).deep.equal([FAKE_TIME + 30, FAKE_TIME + 130]);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("controls the period of a periodic timer from the next start", async () => {
|
|
118
|
+
const firedTimes = new Array<number>();
|
|
119
|
+
|
|
120
|
+
const timer = MockTime.getPeriodicTimer("Test periodic", 30, () => firedTimes.push(MockTime.nowMs));
|
|
121
|
+
timer.start();
|
|
122
|
+
timer.interval = 50;
|
|
123
|
+
|
|
124
|
+
// The armed period continues to apply while running
|
|
125
|
+
await MockTime.advance(60);
|
|
126
|
+
expect(firedTimes).deep.equal([FAKE_TIME + 30, FAKE_TIME + 60]);
|
|
127
|
+
|
|
128
|
+
timer.stop();
|
|
129
|
+
timer.start();
|
|
130
|
+
|
|
131
|
+
await MockTime.advance(100);
|
|
132
|
+
expect(firedTimes).deep.equal([FAKE_TIME + 30, FAKE_TIME + 60, FAKE_TIME + 110, FAKE_TIME + 160]);
|
|
133
|
+
|
|
134
|
+
timer.stop();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("rejects out-of-range values", () => {
|
|
138
|
+
const timer = MockTime.getTimer("Test", 30, () => {});
|
|
139
|
+
|
|
140
|
+
expect(() => (timer.interval = -1)).throws("must be between");
|
|
141
|
+
expect(() => (timer.interval = 2_147_483_648)).throws("must be between");
|
|
142
|
+
expect(() => MockTime.getTimer("Test", -1, () => {})).throws("must be between");
|
|
143
|
+
expect(() => MockTime.getPeriodicTimer("Test periodic", 2_147_483_648, () => {})).throws("must be between");
|
|
144
|
+
|
|
145
|
+
expect(timer.interval).equal(30);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
describe("advance", () => {
|
|
150
|
+
it("rejects a timer that rearms without advancing time", async () => {
|
|
151
|
+
MockTime.getPeriodicTimer("Spinner", 0, () => {}).start();
|
|
152
|
+
|
|
153
|
+
await expect(MockTime.advance(1)).rejectedWith("Spinner");
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
describe("isPeriodic", () => {
|
|
158
|
+
it("distinguishes one-shot from periodic timers", () => {
|
|
159
|
+
expect(MockTime.getTimer("Test", 30, () => {}).isPeriodic).equal(false);
|
|
160
|
+
expect(MockTime.getPeriodicTimer("Test periodic", 30, () => {}).isPeriodic).equal(true);
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
78
164
|
describe("getTimer", () => {
|
|
165
|
+
it("restarts rather than double-arming when started while running", async () => {
|
|
166
|
+
const firedTimes = new Array<number>();
|
|
167
|
+
|
|
168
|
+
const timer = MockTime.getTimer("Test", 30, () => firedTimes.push(MockTime.nowMs));
|
|
169
|
+
timer.start();
|
|
170
|
+
|
|
171
|
+
await MockTime.advance(10);
|
|
172
|
+
timer.start();
|
|
173
|
+
|
|
174
|
+
await MockTime.advance(100);
|
|
175
|
+
expect(firedTimes).deep.equal([FAKE_TIME + 40]);
|
|
176
|
+
});
|
|
177
|
+
|
|
79
178
|
it("returns a timer that will call a callback in the future", async () => {
|
|
80
179
|
let firedTime;
|
|
81
180
|
|