@matter/testing 0.14.1-alpha.0-20250607-a93593303 → 0.15.0-alpha.0-20250612-ddd428561

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.
Files changed (68) hide show
  1. package/dist/cjs/cli.d.ts.map +1 -1
  2. package/dist/cjs/cli.js +10 -0
  3. package/dist/cjs/cli.js.map +1 -1
  4. package/dist/cjs/global-declarations.d.ts +9 -2
  5. package/dist/cjs/global-declarations.d.ts.map +1 -1
  6. package/dist/cjs/global-definitions.js +5 -1
  7. package/dist/cjs/global-definitions.js.map +1 -1
  8. package/dist/cjs/mocha.d.ts.map +1 -1
  9. package/dist/cjs/mocha.js +10 -6
  10. package/dist/cjs/mocha.js.map +1 -1
  11. package/dist/cjs/mocks/boot.d.ts +4 -1
  12. package/dist/cjs/mocks/boot.d.ts.map +1 -1
  13. package/dist/cjs/mocks/boot.js +5 -5
  14. package/dist/cjs/mocks/boot.js.map +1 -1
  15. package/dist/cjs/mocks/crypto.d.ts +27 -1
  16. package/dist/cjs/mocks/crypto.d.ts.map +1 -1
  17. package/dist/cjs/mocks/crypto.js +56 -43
  18. package/dist/cjs/mocks/crypto.js.map +1 -1
  19. package/dist/cjs/mocks/logging.d.ts +1 -1
  20. package/dist/cjs/mocks/logging.d.ts.map +1 -1
  21. package/dist/cjs/mocks/logging.js +5 -5
  22. package/dist/cjs/mocks/logging.js.map +1 -1
  23. package/dist/cjs/mocks/time.d.ts +16 -1
  24. package/dist/cjs/mocks/time.d.ts.map +1 -1
  25. package/dist/cjs/mocks/time.js +48 -9
  26. package/dist/cjs/mocks/time.js.map +2 -2
  27. package/dist/cjs/nodejs.d.ts.map +1 -1
  28. package/dist/cjs/nodejs.js +2 -0
  29. package/dist/cjs/nodejs.js.map +1 -1
  30. package/dist/esm/cli.d.ts.map +1 -1
  31. package/dist/esm/cli.js +11 -1
  32. package/dist/esm/cli.js.map +1 -1
  33. package/dist/esm/global-declarations.d.ts +9 -2
  34. package/dist/esm/global-declarations.d.ts.map +1 -1
  35. package/dist/esm/global-definitions.js +7 -3
  36. package/dist/esm/global-definitions.js.map +1 -1
  37. package/dist/esm/mocha.d.ts.map +1 -1
  38. package/dist/esm/mocha.js +10 -6
  39. package/dist/esm/mocha.js.map +1 -1
  40. package/dist/esm/mocks/boot.d.ts +4 -1
  41. package/dist/esm/mocks/boot.d.ts.map +1 -1
  42. package/dist/esm/mocks/boot.js +5 -5
  43. package/dist/esm/mocks/boot.js.map +1 -1
  44. package/dist/esm/mocks/crypto.d.ts +27 -1
  45. package/dist/esm/mocks/crypto.d.ts.map +1 -1
  46. package/dist/esm/mocks/crypto.js +56 -43
  47. package/dist/esm/mocks/crypto.js.map +1 -1
  48. package/dist/esm/mocks/logging.d.ts +1 -1
  49. package/dist/esm/mocks/logging.d.ts.map +1 -1
  50. package/dist/esm/mocks/logging.js +5 -5
  51. package/dist/esm/mocks/logging.js.map +1 -1
  52. package/dist/esm/mocks/time.d.ts +16 -1
  53. package/dist/esm/mocks/time.d.ts.map +1 -1
  54. package/dist/esm/mocks/time.js +48 -9
  55. package/dist/esm/mocks/time.js.map +2 -2
  56. package/dist/esm/nodejs.d.ts.map +1 -1
  57. package/dist/esm/nodejs.js +2 -0
  58. package/dist/esm/nodejs.js.map +1 -1
  59. package/package.json +4 -4
  60. package/src/cli.ts +13 -1
  61. package/src/global-declarations.ts +10 -2
  62. package/src/global-definitions.ts +10 -3
  63. package/src/mocha.ts +14 -9
  64. package/src/mocks/boot.ts +15 -5
  65. package/src/mocks/crypto.ts +95 -49
  66. package/src/mocks/logging.ts +4 -4
  67. package/src/mocks/time.ts +56 -11
  68. package/src/nodejs.ts +3 -0
package/src/mocks/time.ts CHANGED
@@ -83,30 +83,74 @@ function isAsync(fn: (...args: any) => any): fn is (...args: any) => Promise<any
83
83
  let callbacks = new Array<{ atMs: number; callback: TimerCallback }>();
84
84
  let nowMs = 0;
85
85
  let real = undefined as unknown;
86
- let enabled = true;
86
+ let enabled = false;
87
87
 
88
- // Must match matter.js Time interface
88
+ /**
89
+ * An arbitrary start for our mock timeline. Starting at zero causes problems with Matter dates that cannot encode back
90
+ * to the UNIX epoch
91
+ */
92
+ const epoch = new Date("2025-01-01 12:34:56Z");
93
+
94
+ // Must match matter.js Time interface (with extensions)
89
95
  export const MockTime = {
96
+ epoch,
97
+
90
98
  get activeImplementation(): unknown {
91
99
  return enabled ? this : (real ?? this);
92
100
  },
93
101
 
102
+ /**
103
+ * Revert to standard time implementation.
104
+ */
94
105
  disable() {
95
106
  enabled = false;
96
- reinstallTime?.();
107
+ installActiveImplementation?.();
97
108
  },
98
109
 
110
+ /**
111
+ * Enable time mocking. Reverts to disabled for each test file.
112
+ */
99
113
  enable() {
100
114
  enabled = true;
101
- reinstallTime?.();
115
+ installActiveImplementation?.();
102
116
  },
103
117
 
104
- reset(time = 0) {
118
+ /**
119
+ * Sets mock time to specific time and enable the mock.
120
+ */
121
+ reset(time: ConstructorParameters<typeof Date>[0] = epoch) {
105
122
  callbacks = [];
106
- nowMs = time;
123
+ nowMs = new Date(time).getTime();
124
+ MockTime.enable();
125
+ },
107
126
 
108
- // Ensure time reverts to correct implementation across suites
109
- this.enable();
127
+ /**
128
+ * Enable and reset if not already enabled.
129
+ */
130
+ init() {
131
+ if (!enabled) {
132
+ MockTime.enable();
133
+ }
134
+ },
135
+
136
+ atTime<T>(time: number | Date, actor: () => T): T {
137
+ const revertTo = nowMs;
138
+ let isAsync = false;
139
+ try {
140
+ nowMs = typeof time === "number" ? time : time.getTime();
141
+ const result = actor();
142
+ if (typeof (result as any)?.then === "function") {
143
+ isAsync = true;
144
+ return Promise.resolve(result).finally(() => {
145
+ nowMs = revertTo;
146
+ }) as T;
147
+ }
148
+ return result;
149
+ } finally {
150
+ if (!isAsync) {
151
+ nowMs = revertTo;
152
+ }
153
+ }
110
154
  },
111
155
 
112
156
  now(): Date {
@@ -305,7 +349,7 @@ export const MockTime = {
305
349
  },
306
350
  };
307
351
 
308
- let reinstallTime: undefined | (() => void);
352
+ let installActiveImplementation: undefined | (() => void);
309
353
 
310
354
  export function timeSetup(Time: {
311
355
  startup: { systemMs: number; processMs: number };
@@ -320,12 +364,13 @@ export function timeSetup(Time: {
320
364
  Time.startup.systemMs = Time.startup.processMs = 0;
321
365
  real = Time.get();
322
366
  (MockTime as any).sleep = (real as any).sleep;
323
- reinstallTime = () => (Time.get = () => MockTime.activeImplementation);
324
- reinstallTime();
367
+ installActiveImplementation = () => (Time.get = () => MockTime.activeImplementation);
368
+ installActiveImplementation();
325
369
  }
326
370
 
327
371
  Object.assign(globalThis, { MockTime });
328
372
 
329
373
  Boot.init(() => {
330
374
  MockTime.reset();
375
+ MockTime.disable();
331
376
  });
package/src/nodejs.ts CHANGED
@@ -15,11 +15,14 @@ import type { TestRunner } from "./runner.js";
15
15
  // Load globals so settings get applied
16
16
  import { FailureDetail } from "./failure-detail.js";
17
17
  import "./global-definitions.js";
18
+ import { Boot } from "./mocks/boot.js";
18
19
  import { TestDescriptor } from "./test-descriptor.js";
19
20
 
20
21
  extendApi(Mocha);
21
22
 
22
23
  export async function testNodejs(runner: TestRunner, format: "cjs" | "esm") {
24
+ Boot.format = format;
25
+
23
26
  // Grr Mocha (as of 10.2.0) classifies certain unhandled rejections as "mocha". For others, it uninstalls its
24
27
  // unhandled rejection handler and re-emits the "unhandledRejection" event. But since it already handled the event,
25
28
  // Node knows nothing about this and the event disappears silently.