@rhost/testkit 0.1.1 → 1.3.1
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/README.md +393 -5
- package/ROADMAP.md +241 -0
- package/dist/benchmark.d.ts +44 -0
- package/dist/benchmark.d.ts.map +1 -0
- package/dist/benchmark.js +118 -0
- package/dist/benchmark.js.map +1 -0
- package/dist/cli/deploy.d.ts +2 -0
- package/dist/cli/deploy.d.ts.map +1 -0
- package/dist/cli/deploy.js +120 -0
- package/dist/cli/deploy.js.map +1 -0
- package/dist/cli/fmt.d.ts +2 -0
- package/dist/cli/fmt.d.ts.map +1 -0
- package/dist/cli/fmt.js +119 -0
- package/dist/cli/fmt.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +81 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +210 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/validate.d.ts +2 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +126 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/cli/watch.d.ts +2 -0
- package/dist/cli/watch.d.ts.map +1 -0
- package/dist/cli/watch.js +136 -0
- package/dist/cli/watch.js.map +1 -0
- package/dist/client.d.ts +48 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +113 -30
- package/dist/client.js.map +1 -1
- package/dist/container.d.ts.map +1 -1
- package/dist/container.js +1 -1
- package/dist/container.js.map +1 -1
- package/dist/deployer.d.ts +86 -0
- package/dist/deployer.d.ts.map +1 -0
- package/dist/deployer.js +154 -0
- package/dist/deployer.js.map +1 -0
- package/dist/expect.d.ts +27 -1
- package/dist/expect.d.ts.map +1 -1
- package/dist/expect.js +47 -2
- package/dist/expect.js.map +1 -1
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +39 -1
- package/dist/index.js.map +1 -1
- package/dist/preflight.d.ts +70 -0
- package/dist/preflight.d.ts.map +1 -0
- package/dist/preflight.js +121 -0
- package/dist/preflight.js.map +1 -0
- package/dist/reporter.d.ts +2 -0
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +24 -1
- package/dist/reporter.js.map +1 -1
- package/dist/runner.d.ts +83 -2
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +137 -8
- package/dist/runner.js.map +1 -1
- package/dist/snapshots.d.ts +84 -0
- package/dist/snapshots.d.ts.map +1 -0
- package/dist/snapshots.js +230 -0
- package/dist/snapshots.js.map +1 -0
- package/dist/validator/builtins.d.ts +18 -0
- package/dist/validator/builtins.d.ts.map +1 -0
- package/dist/validator/builtins.js +265 -0
- package/dist/validator/builtins.js.map +1 -0
- package/dist/validator/checker.d.ts +13 -0
- package/dist/validator/checker.d.ts.map +1 -0
- package/dist/validator/checker.js +111 -0
- package/dist/validator/checker.js.map +1 -0
- package/dist/validator/clobber.d.ts +7 -0
- package/dist/validator/clobber.d.ts.map +1 -0
- package/dist/validator/clobber.js +102 -0
- package/dist/validator/clobber.js.map +1 -0
- package/dist/validator/compat.d.ts +19 -0
- package/dist/validator/compat.d.ts.map +1 -0
- package/dist/validator/compat.js +58 -0
- package/dist/validator/compat.js.map +1 -0
- package/dist/validator/formatter.d.ts +21 -0
- package/dist/validator/formatter.d.ts.map +1 -0
- package/dist/validator/formatter.js +120 -0
- package/dist/validator/formatter.js.map +1 -0
- package/dist/validator/index.d.ts +57 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +133 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/parser.d.ts +16 -0
- package/dist/validator/parser.d.ts.map +1 -0
- package/dist/validator/parser.js +260 -0
- package/dist/validator/parser.js.map +1 -0
- package/dist/validator/tokenizer.d.ts +28 -0
- package/dist/validator/tokenizer.d.ts.map +1 -0
- package/dist/validator/tokenizer.js +174 -0
- package/dist/validator/tokenizer.js.map +1 -0
- package/dist/validator/types.d.ts +55 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +6 -0
- package/dist/validator/types.js.map +1 -0
- package/dist/watcher.d.ts +44 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +297 -0
- package/dist/watcher.js.map +1 -0
- package/dist/world.d.ts +79 -0
- package/dist/world.d.ts.map +1 -1
- package/dist/world.js +167 -1
- package/dist/world.js.map +1 -1
- package/package.json +19 -3
package/dist/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.js
CHANGED
|
@@ -1,12 +1,47 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.RhostAssert = exports.RhostRunner = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
4
38
|
const client_1 = require("./client");
|
|
5
39
|
const assertions_1 = require("./assertions");
|
|
6
40
|
Object.defineProperty(exports, "RhostAssert", { enumerable: true, get: function () { return assertions_1.RhostAssert; } });
|
|
7
41
|
const expect_1 = require("./expect");
|
|
8
42
|
const world_1 = require("./world");
|
|
9
43
|
const reporter_1 = require("./reporter");
|
|
44
|
+
const snapshots_1 = require("./snapshots");
|
|
10
45
|
// ---------------------------------------------------------------------------
|
|
11
46
|
// RhostRunner
|
|
12
47
|
// ---------------------------------------------------------------------------
|
|
@@ -14,7 +49,8 @@ const reporter_1 = require("./reporter");
|
|
|
14
49
|
* Jest-style test runner for RhostMUSH softcode.
|
|
15
50
|
*
|
|
16
51
|
* Supports nested describes, it.skip/it.only, describe.skip/describe.only,
|
|
17
|
-
* per-test timeouts, lifecycle hooks,
|
|
52
|
+
* per-test timeouts, lifecycle hooks, automatic world cleanup, and snapshot
|
|
53
|
+
* testing via `expect().toMatchSnapshot()`.
|
|
18
54
|
*
|
|
19
55
|
* @example
|
|
20
56
|
* const runner = new RhostRunner();
|
|
@@ -43,13 +79,20 @@ class RhostRunner {
|
|
|
43
79
|
// Execution phase
|
|
44
80
|
// -------------------------------------------------------------------------
|
|
45
81
|
async run(options) {
|
|
82
|
+
this._options = options;
|
|
46
83
|
const verbose = options.verbose !== false;
|
|
84
|
+
const updateMode = options.updateSnapshots === true ||
|
|
85
|
+
process.env['RHOST_UPDATE_SNAPSHOTS'] === '1';
|
|
86
|
+
const snapshotFile = this.resolveSnapshotFile(options);
|
|
87
|
+
const snapshots = new snapshots_1.SnapshotManager(snapshotFile, updateMode);
|
|
47
88
|
const client = new client_1.RhostClient(options);
|
|
48
89
|
await client.connect();
|
|
49
90
|
await client.login(options.username, options.password);
|
|
50
91
|
const reporter = new reporter_1.Reporter(verbose);
|
|
51
92
|
const result = {
|
|
52
|
-
passed: 0, failed: 0, skipped: 0, total: 0, duration: 0,
|
|
93
|
+
passed: 0, failed: 0, skipped: 0, total: 0, duration: 0,
|
|
94
|
+
failures: [],
|
|
95
|
+
snapshots: { matched: 0, written: 0, updated: 0, obsolete: 0 },
|
|
53
96
|
};
|
|
54
97
|
const start = Date.now();
|
|
55
98
|
// Wrap top-level nodes in a root suite for uniform execution
|
|
@@ -60,8 +103,10 @@ class RhostRunner {
|
|
|
60
103
|
children: this.topLevel,
|
|
61
104
|
beforeAll: [], afterAll: [], beforeEach: [], afterEach: [],
|
|
62
105
|
};
|
|
63
|
-
await this._runSuite(root, client, reporter, result, [], 0);
|
|
106
|
+
await this._runSuite(root, client, reporter, result, [], 0, [], snapshots);
|
|
64
107
|
result.duration = Date.now() - start;
|
|
108
|
+
snapshots.save();
|
|
109
|
+
result.snapshots = snapshots.stats();
|
|
65
110
|
reporter.summary(result);
|
|
66
111
|
await client.disconnect();
|
|
67
112
|
return result;
|
|
@@ -86,6 +131,39 @@ class RhostRunner {
|
|
|
86
131
|
const describeFn = makeDescribeFn('normal');
|
|
87
132
|
describeFn.skip = makeDescribeFn('skip');
|
|
88
133
|
describeFn.only = makeDescribeFn('only');
|
|
134
|
+
const personasFn = (names, testName, personaFn, timeout) => {
|
|
135
|
+
for (const personaName of names) {
|
|
136
|
+
const wrappedFn = async (ctx) => {
|
|
137
|
+
const opts = this._options;
|
|
138
|
+
const creds = opts?.personas?.[personaName];
|
|
139
|
+
if (!creds) {
|
|
140
|
+
throw new Error(`personas(): persona '${personaName}' not defined — ` +
|
|
141
|
+
`add it to runner.run({ personas: { ${personaName}: { username, password } } })`);
|
|
142
|
+
}
|
|
143
|
+
const personaClient = new client_1.RhostClient({ ...opts, ...creds });
|
|
144
|
+
await personaClient.connect();
|
|
145
|
+
await personaClient.login(creds.username, creds.password);
|
|
146
|
+
const personaWorld = new world_1.RhostWorld(personaClient);
|
|
147
|
+
try {
|
|
148
|
+
await personaFn({ ...ctx, client: personaClient, world: personaWorld, persona: personaName });
|
|
149
|
+
}
|
|
150
|
+
finally {
|
|
151
|
+
try {
|
|
152
|
+
await personaWorld.cleanup();
|
|
153
|
+
}
|
|
154
|
+
catch { /* ignore */ }
|
|
155
|
+
await personaClient.disconnect();
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
node.children.push({
|
|
159
|
+
kind: 'test',
|
|
160
|
+
name: `${testName} [${personaName}]`,
|
|
161
|
+
fn: wrappedFn,
|
|
162
|
+
mode: 'normal',
|
|
163
|
+
timeout,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
};
|
|
89
167
|
fn({
|
|
90
168
|
it: itFn,
|
|
91
169
|
test: itFn,
|
|
@@ -94,13 +172,14 @@ class RhostRunner {
|
|
|
94
172
|
afterAll: (h) => node.afterAll.push(h),
|
|
95
173
|
beforeEach: (h) => node.beforeEach.push(h),
|
|
96
174
|
afterEach: (h) => node.afterEach.push(h),
|
|
175
|
+
personas: personasFn,
|
|
97
176
|
});
|
|
98
177
|
return node;
|
|
99
178
|
}
|
|
100
179
|
// -------------------------------------------------------------------------
|
|
101
180
|
// Internal: executing the tree
|
|
102
181
|
// -------------------------------------------------------------------------
|
|
103
|
-
async _runSuite(suite, client, reporter, result, inheritedBeforeEach, depth) {
|
|
182
|
+
async _runSuite(suite, client, reporter, result, inheritedBeforeEach, depth, suitePath, snapshots) {
|
|
104
183
|
// Skip entire suite if marked skip
|
|
105
184
|
if (suite.mode === 'skip') {
|
|
106
185
|
this._countSkipped(suite, result, reporter, depth);
|
|
@@ -112,6 +191,8 @@ class RhostRunner {
|
|
|
112
191
|
const activeChildren = this._resolveOnly(suite.children);
|
|
113
192
|
// Build the cumulative beforeEach/afterEach stack (inherited + suite-level)
|
|
114
193
|
const combinedBeforeEach = [...inheritedBeforeEach, ...suite.beforeEach];
|
|
194
|
+
// Build the path for this suite's children
|
|
195
|
+
const childPath = suite.name ? [...suitePath, suite.name] : suitePath;
|
|
115
196
|
// Run suite-level beforeAll hooks — if one throws, count all suite tests as failures
|
|
116
197
|
const hookCtx = { client, world: new world_1.RhostWorld(client) };
|
|
117
198
|
for (const hook of suite.beforeAll) {
|
|
@@ -130,11 +211,11 @@ class RhostRunner {
|
|
|
130
211
|
const childWithMode = effectiveMode !== child.mode
|
|
131
212
|
? { ...child, mode: effectiveMode }
|
|
132
213
|
: child;
|
|
133
|
-
await this._runSuite(childWithMode, client, reporter, result, combinedBeforeEach, depth + (suite.name ? 1 : 0));
|
|
214
|
+
await this._runSuite(childWithMode, client, reporter, result, combinedBeforeEach, depth + (suite.name ? 1 : 0), childPath, snapshots);
|
|
134
215
|
}
|
|
135
216
|
else {
|
|
136
217
|
const skip = !activeChildren.includes(child) || child.mode === 'skip';
|
|
137
|
-
await this._runTest(child, skip, client, reporter, result, combinedBeforeEach, suite.afterEach,
|
|
218
|
+
await this._runTest(child, skip, client, reporter, result, combinedBeforeEach, suite.afterEach, childPath, depth + (suite.name ? 1 : 0), snapshots);
|
|
138
219
|
}
|
|
139
220
|
}
|
|
140
221
|
// Run suite-level afterAll hooks
|
|
@@ -142,19 +223,29 @@ class RhostRunner {
|
|
|
142
223
|
await hook(hookCtx);
|
|
143
224
|
}
|
|
144
225
|
}
|
|
145
|
-
async _runTest(test, skip, client, reporter, result, beforeEachHooks, afterEachHooks,
|
|
226
|
+
async _runTest(test, skip, client, reporter, result, beforeEachHooks, afterEachHooks, suitePath, depth, snapshots) {
|
|
146
227
|
result.total++;
|
|
147
228
|
if (skip || test.mode === 'skip') {
|
|
148
229
|
result.skipped++;
|
|
149
230
|
reporter.testSkip(test.name, depth);
|
|
150
231
|
return;
|
|
151
232
|
}
|
|
233
|
+
// Full path used as the snapshot key prefix and for failure reporting
|
|
234
|
+
const testKey = [...suitePath, test.name].join(' > ');
|
|
235
|
+
const suiteName = suitePath[suitePath.length - 1] ?? '';
|
|
236
|
+
// Reset snapshot counter for this test
|
|
237
|
+
snapshots.resetCounter(testKey);
|
|
152
238
|
const world = new world_1.RhostWorld(client);
|
|
153
239
|
const hookCtx = { client, world };
|
|
240
|
+
const snapshotCtx = {
|
|
241
|
+
manager: snapshots,
|
|
242
|
+
testName: testKey,
|
|
243
|
+
};
|
|
154
244
|
const testCtx = {
|
|
155
245
|
client,
|
|
156
246
|
world,
|
|
157
|
-
expect: (expr) => new expect_1.RhostExpect(client, expr),
|
|
247
|
+
expect: (expr) => new expect_1.RhostExpect(client, expr, false, snapshotCtx),
|
|
248
|
+
preview: (input, opts) => client.preview(input, opts),
|
|
158
249
|
};
|
|
159
250
|
// Run inherited + suite beforeEach — if one throws, count as a test failure
|
|
160
251
|
for (const hook of beforeEachHooks) {
|
|
@@ -252,6 +343,44 @@ class RhostRunner {
|
|
|
252
343
|
p.then(() => { clearTimeout(timer); resolve(); }, (err) => { clearTimeout(timer); reject(err); });
|
|
253
344
|
});
|
|
254
345
|
}
|
|
346
|
+
// -------------------------------------------------------------------------
|
|
347
|
+
// Snapshot file resolution
|
|
348
|
+
// -------------------------------------------------------------------------
|
|
349
|
+
resolveSnapshotFile(options) {
|
|
350
|
+
if (options.snapshotFile)
|
|
351
|
+
return path.resolve(options.snapshotFile);
|
|
352
|
+
const callerFile = this.getCallerFile();
|
|
353
|
+
if (callerFile) {
|
|
354
|
+
const dir = path.dirname(callerFile);
|
|
355
|
+
const base = path.basename(callerFile);
|
|
356
|
+
return path.join(dir, '__snapshots__', `${base}.snap`);
|
|
357
|
+
}
|
|
358
|
+
return path.join(process.cwd(), '__snapshots__', 'testkit.snap');
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Walk the Error.stack to find the first file that is not the runner
|
|
362
|
+
* itself and not inside node_modules. Used to auto-derive the snapshot
|
|
363
|
+
* file path from the test file's location.
|
|
364
|
+
*/
|
|
365
|
+
getCallerFile() {
|
|
366
|
+
const lines = (new Error().stack ?? '').split('\n').slice(1);
|
|
367
|
+
for (const line of lines) {
|
|
368
|
+
const match = line.match(/\((.+?):\d+:\d+\)/) ??
|
|
369
|
+
line.match(/at (.+?):\d+:\d+\s*$/);
|
|
370
|
+
if (!match)
|
|
371
|
+
continue;
|
|
372
|
+
const file = match[1];
|
|
373
|
+
if (!file)
|
|
374
|
+
continue;
|
|
375
|
+
if (file.includes('node_modules') ||
|
|
376
|
+
file.startsWith('internal/') ||
|
|
377
|
+
file.startsWith('node:') ||
|
|
378
|
+
/[\\/]runner\.[jt]s$/.test(file))
|
|
379
|
+
continue;
|
|
380
|
+
return file;
|
|
381
|
+
}
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
255
384
|
}
|
|
256
385
|
exports.RhostRunner = RhostRunner;
|
|
257
386
|
//# sourceMappingURL=runner.js.map
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":";;;AAAA,qCAA2D;AAC3D,6CAA2C;AAoXlC,4FApXA,wBAAW,OAoXA;AAnXpB,qCAAuC;AACvC,mCAAqC;AACrC,yCAAsC;AAuEtC,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,WAAW;IAAxB;QACY,aAAQ,GAAgC,EAAE,CAAC;IA8QvD,CAAC;IA5QG,4EAA4E;IAC5E,uBAAuB;IACvB,4EAA4E;IAE5E,QAAQ,CAAC,IAAY,EAAE,EAA+B;QAClD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,kBAAkB;IAClB,4EAA4E;IAE5E,KAAK,CAAC,GAAG,CAAC,OAAsB;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,oBAAW,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEvD,MAAM,QAAQ,GAAG,IAAI,mBAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,MAAM,GAAc;YACtB,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE;SACxE,CAAC;QACF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,6DAA6D;QAC7D,MAAM,IAAI,GAAc;YACpB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;SAC7D,CAAC;QAEF,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAE5D,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEzB,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,4EAA4E;IAC5E,8BAA8B;IAC9B,4EAA4E;IAEpE,WAAW,CAAC,IAAY,EAAE,EAA+B,EAAE,IAAc;QAC7E,MAAM,IAAI,GAAc;YACpB,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI;YACzB,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;SAC3E,CAAC;QAEF,MAAM,QAAQ,GAAG,CAAC,MAAgB,EAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAQ,EAAE,EAAE;YACxE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5F,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,QAAkB,EAAc,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;YAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC;QAEF,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAsC,CAAC;QACrE,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAwD,CAAC;QACnG,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACzC,UAAU,CAAC,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAEzC,EAAE,CAAC;YACC,EAAE,EAAE,IAAI;YACR,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,UAAU;YACpB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACxC,QAAQ,EAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACvC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1C,SAAS,EAAG,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;SAC5C,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,4EAA4E;IAC5E,+BAA+B;IAC/B,4EAA4E;IAEpE,KAAK,CAAC,SAAS,CACnB,KAAgB,EAChB,MAAmB,EACnB,QAAkB,EAClB,MAAiB,EACjB,mBAA6B,EAC7B,KAAa;QAEb,mCAAmC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO;QACX,CAAC;QAED,IAAI,KAAK,CAAC,IAAI;YAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEvD,2DAA2D;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAEzD,4EAA4E;QAC5E,MAAM,kBAAkB,GAAG,CAAC,GAAG,mBAAmB,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;QAEzE,qFAAqF;QACrF,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,kBAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClE,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACtE,OAAO;YACX,CAAC;QACL,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,MAAM,aAAa,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC3E,MAAM,aAAa,GAAc,aAAa,KAAK,KAAK,CAAC,IAAI;oBACzD,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE;oBACnC,CAAC,CAAC,KAAK,CAAC;gBACZ,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpH,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,GAAG,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC;gBACtE,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9I,CAAC;QACL,CAAC;QAED,iCAAiC;QACjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,QAAQ,CAClB,IAAc,EACd,IAAa,EACb,MAAmB,EACnB,QAAkB,EAClB,MAAiB,EACjB,eAAyB,EACzB,cAAwB,EACxB,SAAiB,EACjB,KAAa;QAEb,MAAM,CAAC,KAAK,EAAE,CAAC;QAEf,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpC,OAAO;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,kBAAU,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAClC,MAAM,OAAO,GAAgB;YACzB,MAAM;YACN,KAAK;YACL,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,oBAAW,CAAC,MAAM,EAAE,IAAI,CAAC;SAC1D,CAAC;QAEF,4EAA4E;QAC5E,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACjC,IAAI,CAAC;gBACD,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAClE,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACnE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC9C,IAAI,CAAC;oBAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;gBACrD,OAAO;YACX,CAAC;QACL,CAAC;QAED,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;YACxC,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAClE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACnE,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACP,qCAAqC;YACrC,IAAI,CAAC;gBAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC;QAED,sBAAsB;QACtB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;YAChC,IAAI,CAAC;gBAAC,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACvD,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,YAAY,CAAC,QAAqC;QACtD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACxD,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACrD,CAAC;IAEO,yBAAyB,CAC7B,KAAgB,EAChB,MAAiB,EACjB,QAAkB,EAClB,KAAa,EACb,KAAY;QAEZ,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YAC9E,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACrE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;QACL,CAAC;IACL,CAAC;IAEO,aAAa,CACjB,KAAgB,EAChB,MAAiB,EACjB,QAAkB,EAClB,KAAa;QAEb,IAAI,KAAK,CAAC,IAAI;YAAE,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACJ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,CAAuB,EAAE,EAAU,EAAE,IAAY;QAClE,IAAI,CAAC,CAAC,CAAC,YAAY,OAAO,CAAC;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,KAAK,GAAG,UAAU,CACpB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,IAAI,qBAAqB,EAAE,IAAI,CAAC,CAAC,EACjE,EAAE,CACL,CAAC;YACF,+DAA+D;YAC/D,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;gBAAE,KAAK,CAAC,KAAK,EAAE,CAAC;YACrD,CAAC,CAAC,IAAI,CACF,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EACzC,CAAC,GAAG,EAAE,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACjD,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AA/QD,kCA+QC"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export interface SnapshotStats {
|
|
2
|
+
/** Snapshots that matched stored values */
|
|
3
|
+
matched: number;
|
|
4
|
+
/** New snapshots written for the first time */
|
|
5
|
+
written: number;
|
|
6
|
+
/** Existing snapshots overwritten in update mode */
|
|
7
|
+
updated: number;
|
|
8
|
+
/** Keys present in the snapshot file that were never evaluated in this run */
|
|
9
|
+
obsolete: number;
|
|
10
|
+
}
|
|
11
|
+
export type SnapshotStatus = 'matched' | 'mismatch' | 'written' | 'updated';
|
|
12
|
+
export interface SnapshotCheckResult {
|
|
13
|
+
status: SnapshotStatus;
|
|
14
|
+
/** The stored/expected value. Undefined for 'written' (no prior value). */
|
|
15
|
+
expected: string | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Manages a single `.snap` JSON file on disk.
|
|
19
|
+
*
|
|
20
|
+
* Lifecycle per test run:
|
|
21
|
+
* 1. `new SnapshotManager(filePath, updateMode)` — loads existing snapshots
|
|
22
|
+
* 2. For each test: `resetCounter(testName)` at test start
|
|
23
|
+
* 3. For each assertion: `check(nextKey(testName), actual)` inside `toMatchSnapshot()`
|
|
24
|
+
* 4. `save()` after all tests complete — writes new/updated snapshots to disk
|
|
25
|
+
* 5. `stats()` — retrieve final counts for the run summary
|
|
26
|
+
*
|
|
27
|
+
* Snapshot file format:
|
|
28
|
+
* A sorted JSON object mapping string keys → string values, e.g.:
|
|
29
|
+
* {
|
|
30
|
+
* "Math > add returns sum: 1": "5",
|
|
31
|
+
* "Math > iter lnum(1,10): 1": "1 2 3 4 5 6 7 8 9 10"
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* Key format: `"Suite > Sub > Test Name: N"` where N resets to 1 per test.
|
|
35
|
+
*/
|
|
36
|
+
export declare class SnapshotManager {
|
|
37
|
+
private readonly filePath;
|
|
38
|
+
private readonly updateMode;
|
|
39
|
+
/** Snapshots loaded from disk at startup */
|
|
40
|
+
private readonly stored;
|
|
41
|
+
/** All key→actual values evaluated in this run */
|
|
42
|
+
private readonly touched;
|
|
43
|
+
/** Per-test snapshot call counter */
|
|
44
|
+
private readonly counters;
|
|
45
|
+
private _matched;
|
|
46
|
+
private _written;
|
|
47
|
+
private _updated;
|
|
48
|
+
constructor(filePath: string, updateMode: boolean);
|
|
49
|
+
/**
|
|
50
|
+
* Advance and return the next snapshot key for `testName`.
|
|
51
|
+
* Call `resetCounter(testName)` at the start of each test.
|
|
52
|
+
*/
|
|
53
|
+
nextKey(testName: string): string;
|
|
54
|
+
/** Reset the per-test counter. Call this at the start of every test. */
|
|
55
|
+
resetCounter(testName: string): void;
|
|
56
|
+
/**
|
|
57
|
+
* Check `actual` against the stored snapshot for `key`.
|
|
58
|
+
*
|
|
59
|
+
* - **No prior value**: write it (returns `'written'`, always passes)
|
|
60
|
+
* - **Update mode**: overwrite with `actual` (returns `'updated'` if changed, `'matched'` if same)
|
|
61
|
+
* - **Normal mode**: compare; returns `'matched'` or `'mismatch'`
|
|
62
|
+
*/
|
|
63
|
+
check(key: string, actual: string): SnapshotCheckResult;
|
|
64
|
+
/**
|
|
65
|
+
* Flush snapshot state to disk.
|
|
66
|
+
*
|
|
67
|
+
* **Normal mode**: merges new snapshots into the existing file.
|
|
68
|
+
* Existing values are never overwritten — failed snapshots retain
|
|
69
|
+
* their previous (correct) value until the user runs `--updateSnapshot`.
|
|
70
|
+
*
|
|
71
|
+
* **Update mode**: writes only the snapshots evaluated in this run,
|
|
72
|
+
* discarding any obsolete entries that were not touched.
|
|
73
|
+
*/
|
|
74
|
+
save(): void;
|
|
75
|
+
stats(): SnapshotStats;
|
|
76
|
+
private load;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Format a human-readable diff between expected and actual snapshot values.
|
|
80
|
+
* Uses a simple line-by-line format (not a full diff algorithm — values are
|
|
81
|
+
* single-line MUSH results in most cases).
|
|
82
|
+
*/
|
|
83
|
+
export declare function formatSnapshotDiff(expected: string, actual: string): string;
|
|
84
|
+
//# sourceMappingURL=snapshots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshots.d.ts","sourceRoot":"","sources":["../src/snapshots.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,aAAa;IAC5B,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,cAAc,CAAC;IACvB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAMD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,eAAe;IAaxB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAb7B,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,qCAAqC;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,QAAQ,CAAK;gBAGF,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO;IAStC;;;OAGG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAMjC,wEAAwE;IACxE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQpC;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,mBAAmB;IAiCvD;;;;;;;;;OASG;IACH,IAAI,IAAI,IAAI;IAwCZ,KAAK,IAAI,aAAa;IAetB,OAAO,CAAC,IAAI;CAYb;AAMD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAkB3E"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// SnapshotManager — persistent snapshot storage for toMatchSnapshot()
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.SnapshotManager = void 0;
|
|
40
|
+
exports.formatSnapshotDiff = formatSnapshotDiff;
|
|
41
|
+
const fs = __importStar(require("fs"));
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
// SnapshotManager
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
/**
|
|
47
|
+
* Manages a single `.snap` JSON file on disk.
|
|
48
|
+
*
|
|
49
|
+
* Lifecycle per test run:
|
|
50
|
+
* 1. `new SnapshotManager(filePath, updateMode)` — loads existing snapshots
|
|
51
|
+
* 2. For each test: `resetCounter(testName)` at test start
|
|
52
|
+
* 3. For each assertion: `check(nextKey(testName), actual)` inside `toMatchSnapshot()`
|
|
53
|
+
* 4. `save()` after all tests complete — writes new/updated snapshots to disk
|
|
54
|
+
* 5. `stats()` — retrieve final counts for the run summary
|
|
55
|
+
*
|
|
56
|
+
* Snapshot file format:
|
|
57
|
+
* A sorted JSON object mapping string keys → string values, e.g.:
|
|
58
|
+
* {
|
|
59
|
+
* "Math > add returns sum: 1": "5",
|
|
60
|
+
* "Math > iter lnum(1,10): 1": "1 2 3 4 5 6 7 8 9 10"
|
|
61
|
+
* }
|
|
62
|
+
*
|
|
63
|
+
* Key format: `"Suite > Sub > Test Name: N"` where N resets to 1 per test.
|
|
64
|
+
*/
|
|
65
|
+
class SnapshotManager {
|
|
66
|
+
constructor(filePath, updateMode) {
|
|
67
|
+
this.filePath = filePath;
|
|
68
|
+
this.updateMode = updateMode;
|
|
69
|
+
/** All key→actual values evaluated in this run */
|
|
70
|
+
this.touched = new Map();
|
|
71
|
+
/** Per-test snapshot call counter */
|
|
72
|
+
this.counters = new Map();
|
|
73
|
+
this._matched = 0;
|
|
74
|
+
this._written = 0;
|
|
75
|
+
this._updated = 0;
|
|
76
|
+
this.stored = this.load();
|
|
77
|
+
}
|
|
78
|
+
// -------------------------------------------------------------------------
|
|
79
|
+
// Key management
|
|
80
|
+
// -------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Advance and return the next snapshot key for `testName`.
|
|
83
|
+
* Call `resetCounter(testName)` at the start of each test.
|
|
84
|
+
*/
|
|
85
|
+
nextKey(testName) {
|
|
86
|
+
const n = (this.counters.get(testName) ?? 0) + 1;
|
|
87
|
+
this.counters.set(testName, n);
|
|
88
|
+
return `${testName}: ${n}`;
|
|
89
|
+
}
|
|
90
|
+
/** Reset the per-test counter. Call this at the start of every test. */
|
|
91
|
+
resetCounter(testName) {
|
|
92
|
+
this.counters.delete(testName);
|
|
93
|
+
}
|
|
94
|
+
// -------------------------------------------------------------------------
|
|
95
|
+
// Core assertion logic
|
|
96
|
+
// -------------------------------------------------------------------------
|
|
97
|
+
/**
|
|
98
|
+
* Check `actual` against the stored snapshot for `key`.
|
|
99
|
+
*
|
|
100
|
+
* - **No prior value**: write it (returns `'written'`, always passes)
|
|
101
|
+
* - **Update mode**: overwrite with `actual` (returns `'updated'` if changed, `'matched'` if same)
|
|
102
|
+
* - **Normal mode**: compare; returns `'matched'` or `'mismatch'`
|
|
103
|
+
*/
|
|
104
|
+
check(key, actual) {
|
|
105
|
+
this.touched.set(key, actual);
|
|
106
|
+
const hasStored = Object.prototype.hasOwnProperty.call(this.stored, key);
|
|
107
|
+
if (!hasStored) {
|
|
108
|
+
this._written++;
|
|
109
|
+
return { status: 'written', expected: undefined };
|
|
110
|
+
}
|
|
111
|
+
const expected = this.stored[key];
|
|
112
|
+
if (this.updateMode) {
|
|
113
|
+
if (expected !== actual) {
|
|
114
|
+
this._updated++;
|
|
115
|
+
return { status: 'updated', expected };
|
|
116
|
+
}
|
|
117
|
+
this._matched++;
|
|
118
|
+
return { status: 'matched', expected };
|
|
119
|
+
}
|
|
120
|
+
if (expected === actual) {
|
|
121
|
+
this._matched++;
|
|
122
|
+
return { status: 'matched', expected };
|
|
123
|
+
}
|
|
124
|
+
return { status: 'mismatch', expected };
|
|
125
|
+
}
|
|
126
|
+
// -------------------------------------------------------------------------
|
|
127
|
+
// Persistence
|
|
128
|
+
// -------------------------------------------------------------------------
|
|
129
|
+
/**
|
|
130
|
+
* Flush snapshot state to disk.
|
|
131
|
+
*
|
|
132
|
+
* **Normal mode**: merges new snapshots into the existing file.
|
|
133
|
+
* Existing values are never overwritten — failed snapshots retain
|
|
134
|
+
* their previous (correct) value until the user runs `--updateSnapshot`.
|
|
135
|
+
*
|
|
136
|
+
* **Update mode**: writes only the snapshots evaluated in this run,
|
|
137
|
+
* discarding any obsolete entries that were not touched.
|
|
138
|
+
*/
|
|
139
|
+
save() {
|
|
140
|
+
let toWrite;
|
|
141
|
+
if (this.updateMode) {
|
|
142
|
+
// Write only what was evaluated — trims obsolete entries automatically
|
|
143
|
+
toWrite = Object.fromEntries(this.touched);
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
// Start from existing, add only NEW keys (never overwrite)
|
|
147
|
+
toWrite = { ...this.stored };
|
|
148
|
+
for (const [key, value] of this.touched) {
|
|
149
|
+
if (!Object.prototype.hasOwnProperty.call(toWrite, key)) {
|
|
150
|
+
toWrite[key] = value;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
// Sort keys for stable diffs
|
|
155
|
+
const sorted = {};
|
|
156
|
+
for (const key of Object.keys(toWrite).sort()) {
|
|
157
|
+
sorted[key] = toWrite[key];
|
|
158
|
+
}
|
|
159
|
+
// If there's nothing to write, don't create (or leave) an empty snapshot file.
|
|
160
|
+
// An empty {} file would be flagged as obsolete by Jest and cause exit code 1.
|
|
161
|
+
if (Object.keys(sorted).length === 0) {
|
|
162
|
+
if (fs.existsSync(this.filePath)) {
|
|
163
|
+
fs.unlinkSync(this.filePath);
|
|
164
|
+
}
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const dir = path.dirname(this.filePath);
|
|
168
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
169
|
+
fs.writeFileSync(this.filePath, JSON.stringify(sorted, null, 2) + '\n', 'utf-8');
|
|
170
|
+
}
|
|
171
|
+
// -------------------------------------------------------------------------
|
|
172
|
+
// Stats
|
|
173
|
+
// -------------------------------------------------------------------------
|
|
174
|
+
stats() {
|
|
175
|
+
const touchedKeys = new Set(this.touched.keys());
|
|
176
|
+
const obsolete = Object.keys(this.stored).filter((k) => !touchedKeys.has(k)).length;
|
|
177
|
+
return {
|
|
178
|
+
matched: this._matched,
|
|
179
|
+
written: this._written,
|
|
180
|
+
updated: this._updated,
|
|
181
|
+
obsolete,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
// -------------------------------------------------------------------------
|
|
185
|
+
// Internals
|
|
186
|
+
// -------------------------------------------------------------------------
|
|
187
|
+
load() {
|
|
188
|
+
try {
|
|
189
|
+
const raw = fs.readFileSync(this.filePath, 'utf-8');
|
|
190
|
+
const parsed = JSON.parse(raw);
|
|
191
|
+
if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {
|
|
192
|
+
return parsed;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// File doesn't exist or is malformed — start fresh
|
|
197
|
+
}
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.SnapshotManager = SnapshotManager;
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
// Snapshot diff formatter (used in error messages)
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
/**
|
|
206
|
+
* Format a human-readable diff between expected and actual snapshot values.
|
|
207
|
+
* Uses a simple line-by-line format (not a full diff algorithm — values are
|
|
208
|
+
* single-line MUSH results in most cases).
|
|
209
|
+
*/
|
|
210
|
+
function formatSnapshotDiff(expected, actual) {
|
|
211
|
+
const expLines = expected.split('\n');
|
|
212
|
+
const actLines = actual.split('\n');
|
|
213
|
+
const maxLines = Math.max(expLines.length, actLines.length);
|
|
214
|
+
const lines = [];
|
|
215
|
+
for (let i = 0; i < maxLines; i++) {
|
|
216
|
+
const e = expLines[i];
|
|
217
|
+
const a = actLines[i];
|
|
218
|
+
if (e !== undefined && a !== undefined && e === a) {
|
|
219
|
+
lines.push(` ${e}`);
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
if (e !== undefined)
|
|
223
|
+
lines.push(` - ${e}`);
|
|
224
|
+
if (a !== undefined)
|
|
225
|
+
lines.push(` + ${a}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return lines.join('\n');
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=snapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../src/snapshots.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type Platform = 'rhost' | 'penn' | 'mux';
|
|
2
|
+
export interface FunctionSignature {
|
|
3
|
+
name: string;
|
|
4
|
+
minArgs: number;
|
|
5
|
+
/** Use Infinity for variadic functions with no upper bound */
|
|
6
|
+
maxArgs: number;
|
|
7
|
+
deprecated?: boolean;
|
|
8
|
+
/** True for functions specific to RhostMUSH (not standard PennMUSH/TinyMUX) */
|
|
9
|
+
rhostOnly?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* If set, the function is only available on these platforms.
|
|
12
|
+
* Omit for functions that are universally available.
|
|
13
|
+
*/
|
|
14
|
+
platforms?: Platform[];
|
|
15
|
+
}
|
|
16
|
+
/** Pre-built map of lowercase function name → signature for O(1) lookup */
|
|
17
|
+
export declare const BUILTIN_FUNCTIONS: ReadonlyMap<string, FunctionSignature>;
|
|
18
|
+
//# sourceMappingURL=builtins.d.ts.map
|