testgen-ts 1.0.0

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.
@@ -0,0 +1,67 @@
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.formatCode = formatCode;
37
+ const prettier = __importStar(require("prettier"));
38
+ const path = __importStar(require("path"));
39
+ const fs = __importStar(require("fs"));
40
+ /**
41
+ * Format TypeScript source code using Prettier.
42
+ * Attempts to load the host project's .prettierrc; falls back to sensible defaults.
43
+ */
44
+ async function formatCode(code, projectRoot) {
45
+ let options = {
46
+ parser: "typescript",
47
+ singleQuote: true,
48
+ trailingComma: "all",
49
+ printWidth: 100,
50
+ tabWidth: 2,
51
+ semi: true,
52
+ };
53
+ // Try to load the project's prettier config
54
+ try {
55
+ const prettierConfigPath = path.join(projectRoot, ".prettierrc");
56
+ if (fs.existsSync(prettierConfigPath)) {
57
+ const raw = fs.readFileSync(prettierConfigPath, "utf-8");
58
+ const userOpts = JSON.parse(raw);
59
+ options = { ...options, ...userOpts, parser: "typescript" };
60
+ }
61
+ }
62
+ catch {
63
+ // Ignore — use defaults
64
+ }
65
+ return prettier.format(code, options);
66
+ }
67
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,gCA0BC;AAlCD,mDAAqC;AACrC,2CAA6B;AAC7B,uCAAyB;AAEzB;;;GAGG;AACI,KAAK,UAAU,UAAU,CAC5B,IAAY,EACZ,WAAmB;IAEnB,IAAI,OAAO,GAAqB;QAC5B,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,GAAG;QACf,QAAQ,EAAE,CAAC;QACX,IAAI,EAAE,IAAI;KACb,CAAC;IAEF,4CAA4C;IAC5C,IAAI,CAAC;QACD,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;QACjE,IAAI,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACjC,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAChE,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,wBAAwB;IAC5B,CAAC;IAED,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { TestScenario } from "./scenarioEngine";
2
+ import { MockFileResult } from "./mockGenerator";
3
+ /**
4
+ * Generate a test file for the given source file.
5
+ *
6
+ * The test file imports mock data from the corresponding `.mock.ts`
7
+ * file, sets up jest.mock() calls for dependencies, and uses
8
+ * constructor injection for classes with DI.
9
+ */
10
+ export declare function generateTestFile(srcFilePath: string, scenarios: TestScenario[], projectRoot: string, srcDir: string, testDir: string, mockResult: MockFileResult | null): Promise<string | null>;
@@ -0,0 +1,446 @@
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
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateTestFile = generateTestFile;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const formatter_1 = require("./formatter");
40
+ const utils_1 = require("./utils");
41
+ /**
42
+ * Generate a test file for the given source file.
43
+ *
44
+ * The test file imports mock data from the corresponding `.mock.ts`
45
+ * file, sets up jest.mock() calls for dependencies, and uses
46
+ * constructor injection for classes with DI.
47
+ */
48
+ async function generateTestFile(srcFilePath, scenarios, projectRoot, srcDir, testDir, mockResult) {
49
+ if (scenarios.length === 0) {
50
+ return null;
51
+ }
52
+ const testFilePath = (0, utils_1.mirrorPath)(srcFilePath, srcDir, path.join(projectRoot, testDir), ".test.ts");
53
+ const code = buildTestSource(scenarios, srcFilePath, testFilePath, mockResult, projectRoot, srcDir);
54
+ const formatted = await (0, formatter_1.formatCode)(code, projectRoot);
55
+ (0, utils_1.ensureDir)(path.dirname(testFilePath));
56
+ fs.writeFileSync(testFilePath, formatted, "utf-8");
57
+ (0, utils_1.log)(`Test file → ${path.relative(projectRoot, testFilePath)}`, "success");
58
+ return testFilePath;
59
+ }
60
+ // ─── Build the full test source ──────────────────────────────────────────────
61
+ function buildTestSource(scenarios, srcFilePath, testFilePath, mockResult, projectRoot, srcDir) {
62
+ const lines = [];
63
+ // ── Collect all unique dependencies across scenarios ─────────────
64
+ const allDeps = collectAllDependencies(scenarios);
65
+ // ── jest.mock() calls (must appear before imports) ───────────────
66
+ for (const dep of allDeps) {
67
+ const depAbsPath = resolveDepPath(srcFilePath, dep.modulePath);
68
+ const depImportPath = computeRelativeImport(depAbsPath, testFilePath);
69
+ const mockFns = dep.importedNames
70
+ .map((n) => ` ${n}: jest.fn(),`)
71
+ .join("\n");
72
+ lines.push(`jest.mock('${depImportPath}', () => ({`);
73
+ lines.push(mockFns);
74
+ lines.push(`}));`);
75
+ lines.push("");
76
+ }
77
+ // ── Import the source module ────────────────────────────────────
78
+ const importPath = computeRelativeImport(srcFilePath, testFilePath);
79
+ const importNames = collectImportNames(scenarios);
80
+ lines.push(`import { ${importNames.join(", ")} } from '${importPath}';`);
81
+ // ── Import the companion mock file ──────────────────────────────
82
+ if (mockResult) {
83
+ const mockImportPath = computeRelativeImport(mockResult.filePath, testFilePath);
84
+ lines.push(`import * as mocks from '${mockImportPath}';`);
85
+ }
86
+ // ── Import mocked dependencies (for type access / mockReturnValue) ──
87
+ for (const dep of allDeps) {
88
+ const depAbsPath = resolveDepPath(srcFilePath, dep.modulePath);
89
+ const depImportPath = computeRelativeImport(depAbsPath, testFilePath);
90
+ const names = dep.importedNames.filter((n) => n !== "default");
91
+ if (names.length > 0) {
92
+ lines.push(`import { ${names.join(", ")} } from '${depImportPath}';`);
93
+ }
94
+ }
95
+ lines.push("");
96
+ // ── Group by class vs standalone ────────────────────────────────
97
+ const classMap = new Map();
98
+ const standaloneFns = [];
99
+ for (const s of scenarios) {
100
+ if (s.className) {
101
+ const list = classMap.get(s.className) ?? [];
102
+ list.push(s);
103
+ classMap.set(s.className, list);
104
+ }
105
+ else {
106
+ standaloneFns.push(s);
107
+ }
108
+ }
109
+ // ── Standalone functions ────────────────────────────────────────
110
+ for (const fn of standaloneFns) {
111
+ lines.push(buildFunctionDescribe(fn, mockResult));
112
+ lines.push("");
113
+ }
114
+ // ── Class methods ───────────────────────────────────────────────
115
+ for (const [className, methods] of classMap) {
116
+ lines.push(buildClassDescribe(className, methods, mockResult));
117
+ lines.push("");
118
+ }
119
+ return lines.join("\n");
120
+ }
121
+ // ─── Class describe block with constructor DI ────────────────────────────────
122
+ function buildClassDescribe(className, methods, mockResult) {
123
+ const lines = [];
124
+ lines.push(`describe('${className}', () => {`);
125
+ lines.push(` let instance: ${className};`);
126
+ // Generate mock objects for constructor dependencies
127
+ const ctorParams = methods[0]?.constructorParams ?? [];
128
+ const mockDeclarations = [];
129
+ for (const param of ctorParams) {
130
+ const mockName = `mock${capitalize(param.name)}`;
131
+ mockDeclarations.push(` const ${mockName} = { } as any; // TODO: add mock methods for ${param.type}`);
132
+ }
133
+ if (mockDeclarations.length > 0) {
134
+ lines.push("");
135
+ for (const decl of mockDeclarations) {
136
+ lines.push(decl);
137
+ }
138
+ }
139
+ lines.push("");
140
+ lines.push(" beforeEach(() => {");
141
+ lines.push(" jest.clearAllMocks();");
142
+ if (ctorParams.length > 0) {
143
+ const args = ctorParams
144
+ .map((p) => `mock${capitalize(p.name)}`)
145
+ .join(", ");
146
+ lines.push(` instance = new ${className}(${args});`);
147
+ }
148
+ else {
149
+ lines.push(` instance = new ${className}();`);
150
+ }
151
+ lines.push(" });");
152
+ lines.push("");
153
+ for (const method of methods) {
154
+ lines.push(indentBlock(buildMethodDescribe(method, mockResult), 1));
155
+ lines.push("");
156
+ }
157
+ lines.push("});");
158
+ return lines.join("\n");
159
+ }
160
+ // ─── describe block for a standalone function ────────────────────────────────
161
+ function buildFunctionDescribe(fn, mockResult) {
162
+ const lines = [];
163
+ lines.push(`describe('${fn.functionName}', () => {`);
164
+ // Add beforeEach with clearAllMocks if this function has dependencies
165
+ if (fn.dependencies.length > 0) {
166
+ lines.push(" beforeEach(() => {");
167
+ lines.push(" jest.clearAllMocks();");
168
+ lines.push(" });");
169
+ lines.push("");
170
+ }
171
+ const constName = mockResult?.constantNames.get(fn.functionName);
172
+ for (const c of fn.cases) {
173
+ lines.push(indentBlock(buildTestBlock(fn, c, constName), 1));
174
+ lines.push("");
175
+ }
176
+ lines.push("});");
177
+ return lines.join("\n");
178
+ }
179
+ // ─── describe block for a class method ───────────────────────────────────────
180
+ function buildMethodDescribe(fn, mockResult) {
181
+ const lines = [];
182
+ lines.push(`describe('${fn.functionName}', () => {`);
183
+ const constName = mockResult?.constantNames.get(fn.functionName);
184
+ for (const c of fn.cases) {
185
+ lines.push(indentBlock(buildTestBlock(fn, c, constName), 1));
186
+ lines.push("");
187
+ }
188
+ lines.push("});");
189
+ return lines.join("\n");
190
+ }
191
+ // ─── Individual test block ───────────────────────────────────────────────────
192
+ function buildTestBlock(scenario, testCase, mockConstName) {
193
+ switch (testCase.kind) {
194
+ case "throws":
195
+ return buildThrowsBlock(scenario, testCase, mockConstName);
196
+ case "rejects":
197
+ return buildRejectsBlock(scenario, testCase, mockConstName);
198
+ default:
199
+ return buildStandardBlock(scenario, testCase, mockConstName);
200
+ }
201
+ }
202
+ // ─── Standard test block (Arrange / Act / Assert) ────────────────────────────
203
+ function buildStandardBlock(scenario, testCase, mockConstName) {
204
+ const lines = [];
205
+ const fnName = scenario.functionName;
206
+ const isAsync = scenario.isAsync;
207
+ const isMethod = !!scenario.className;
208
+ const isDependencyTest = testCase.label === "verifies dependency interactions";
209
+ lines.push(`test('${testCase.label}', ${isAsync ? "async " : ""}() => {`);
210
+ // ── Arrange ──────────────────────────────────────────────────────
211
+ const caseKey = camelCase(testCase.label);
212
+ if (testCase.paramNames.length > 0 && mockConstName) {
213
+ lines.push(" // Arrange");
214
+ const mockRef = `mocks.${mockConstName}.${caseKey}`;
215
+ for (const name of testCase.paramNames) {
216
+ lines.push(` const ${name} = ${mockRef}.${name};`);
217
+ }
218
+ lines.push("");
219
+ }
220
+ else if (testCase.argLiterals.length > 0) {
221
+ lines.push(" // Arrange");
222
+ for (let i = 0; i < testCase.paramNames.length; i++) {
223
+ const name = testCase.paramNames[i];
224
+ const literal = testCase.argLiterals[i] ?? "undefined";
225
+ lines.push(` const ${name} = ${literal};`);
226
+ }
227
+ lines.push("");
228
+ }
229
+ // ── Act ──────────────────────────────────────────────────────────
230
+ lines.push(" // Act");
231
+ const argsStr = testCase.paramNames.join(", ");
232
+ const caller = isMethod ? `instance.${fnName}` : fnName;
233
+ const callExpr = `${caller}(${argsStr})`;
234
+ if (isAsync) {
235
+ lines.push(` const result = await ${callExpr};`);
236
+ }
237
+ else {
238
+ lines.push(` const result = ${callExpr};`);
239
+ }
240
+ lines.push("");
241
+ // ── Assert ──────────────────────────────────────────────────────
242
+ lines.push(" // Assert");
243
+ if (isDependencyTest) {
244
+ // For dependency tests, verify the mocked functions were called
245
+ for (const dep of scenario.dependencies) {
246
+ for (const impName of dep.importedNames) {
247
+ if (impName !== "default") {
248
+ lines.push(` expect(${impName}).toHaveBeenCalled();`);
249
+ }
250
+ }
251
+ }
252
+ }
253
+ else {
254
+ const expectLines = buildExpectStubs(scenario.returnType, testCase.label);
255
+ for (const e of expectLines) {
256
+ lines.push(` ${e}`);
257
+ }
258
+ }
259
+ lines.push("});");
260
+ return lines.join("\n");
261
+ }
262
+ // ─── Throws test block (sync error) ─────────────────────────────────────────
263
+ function buildThrowsBlock(scenario, testCase, mockConstName) {
264
+ const lines = [];
265
+ const fnName = scenario.functionName;
266
+ const isMethod = !!scenario.className;
267
+ lines.push(`test('${testCase.label}', () => {`);
268
+ // ── Arrange ──────────────────────────────────────────────────────
269
+ const caseKey = camelCase(testCase.label);
270
+ if (testCase.paramNames.length > 0 && mockConstName) {
271
+ lines.push(" // Arrange");
272
+ const mockRef = `mocks.${mockConstName}.${caseKey}`;
273
+ for (const name of testCase.paramNames) {
274
+ lines.push(` const ${name} = ${mockRef}.${name};`);
275
+ }
276
+ lines.push("");
277
+ }
278
+ else if (testCase.argLiterals.length > 0) {
279
+ lines.push(" // Arrange");
280
+ for (let i = 0; i < testCase.paramNames.length; i++) {
281
+ const name = testCase.paramNames[i];
282
+ const literal = testCase.argLiterals[i] ?? "undefined";
283
+ lines.push(` const ${name} = ${literal};`);
284
+ }
285
+ lines.push("");
286
+ }
287
+ // ── Act & Assert ────────────────────────────────────────────────
288
+ lines.push(" // Act & Assert");
289
+ const argsStr = testCase.paramNames.join(", ");
290
+ const caller = isMethod ? `instance.${fnName}` : fnName;
291
+ lines.push(` expect(() => ${caller}(${argsStr})).toThrow();`);
292
+ lines.push("});");
293
+ return lines.join("\n");
294
+ }
295
+ // ─── Rejects test block (async rejection) ────────────────────────────────────
296
+ function buildRejectsBlock(scenario, testCase, mockConstName) {
297
+ const lines = [];
298
+ const fnName = scenario.functionName;
299
+ const isMethod = !!scenario.className;
300
+ lines.push(`test('${testCase.label}', async () => {`);
301
+ // ── Arrange ──────────────────────────────────────────────────────
302
+ const caseKey = camelCase(testCase.label);
303
+ if (testCase.paramNames.length > 0 && mockConstName) {
304
+ lines.push(" // Arrange");
305
+ const mockRef = `mocks.${mockConstName}.${caseKey}`;
306
+ for (const name of testCase.paramNames) {
307
+ lines.push(` const ${name} = ${mockRef}.${name};`);
308
+ }
309
+ lines.push("");
310
+ }
311
+ else if (testCase.argLiterals.length > 0) {
312
+ lines.push(" // Arrange");
313
+ for (let i = 0; i < testCase.paramNames.length; i++) {
314
+ const name = testCase.paramNames[i];
315
+ const literal = testCase.argLiterals[i] ?? "undefined";
316
+ lines.push(` const ${name} = ${literal};`);
317
+ }
318
+ lines.push("");
319
+ }
320
+ // ── Act & Assert ────────────────────────────────────────────────
321
+ lines.push(" // Act & Assert");
322
+ const argsStr = testCase.paramNames.join(", ");
323
+ const caller = isMethod ? `instance.${fnName}` : fnName;
324
+ lines.push(` await expect(${caller}(${argsStr})).rejects.toThrow();`);
325
+ lines.push("});");
326
+ return lines.join("\n");
327
+ }
328
+ // ─── Expect stubs based on return type ───────────────────────────────────────
329
+ function buildExpectStubs(returnType, scenarioLabel) {
330
+ const t = returnType.trim().toLowerCase();
331
+ const unwrapped = unwrapType(t);
332
+ const stubs = [];
333
+ stubs.push("expect(result).toBeDefined();");
334
+ if (unwrapped === "number") {
335
+ stubs.push("expect(typeof result).toBe('number');");
336
+ if (scenarioLabel.includes("negative"))
337
+ stubs.push("// expect(result).toBeLessThan(0);");
338
+ if (scenarioLabel.includes("zero"))
339
+ stubs.push("// expect(result).toBe(0);");
340
+ if (scenarioLabel.includes("boundary"))
341
+ stubs.push("expect(Number.isFinite(result)).toBe(true);");
342
+ }
343
+ else if (unwrapped === "string") {
344
+ stubs.push("expect(typeof result).toBe('string');");
345
+ if (scenarioLabel.includes("empty"))
346
+ stubs.push("// expect(result).toBe('');");
347
+ if (scenarioLabel.includes("valid"))
348
+ stubs.push("expect(result.length).toBeGreaterThan(0);");
349
+ }
350
+ else if (unwrapped === "boolean") {
351
+ stubs.push("expect(typeof result).toBe('boolean');");
352
+ if (scenarioLabel.includes("truthy"))
353
+ stubs.push("// expect(result).toBe(true);");
354
+ if (scenarioLabel.includes("falsy"))
355
+ stubs.push("// expect(result).toBe(false);");
356
+ }
357
+ else if (unwrapped === "void") {
358
+ stubs.length = 0;
359
+ stubs.push("expect(result).toBeUndefined();");
360
+ }
361
+ else if (unwrapped.endsWith("[]")) {
362
+ stubs.push("expect(Array.isArray(result)).toBe(true);");
363
+ if (scenarioLabel.includes("empty"))
364
+ stubs.push("// expect(result).toHaveLength(0);");
365
+ }
366
+ else {
367
+ stubs.push("expect(result).not.toBeNull();");
368
+ }
369
+ return stubs;
370
+ }
371
+ function unwrapType(t) {
372
+ const promiseMatch = t.match(/^promise<(.+)>$/);
373
+ if (promiseMatch)
374
+ return promiseMatch[1].trim();
375
+ return t;
376
+ }
377
+ // ─── Dependency helpers ──────────────────────────────────────────────────────
378
+ function collectAllDependencies(scenarios) {
379
+ const depMap = new Map();
380
+ for (const s of scenarios) {
381
+ for (const dep of s.dependencies) {
382
+ const existing = depMap.get(dep.modulePath);
383
+ if (existing) {
384
+ for (const name of dep.importedNames) {
385
+ if (!existing.importedNames.includes(name)) {
386
+ existing.importedNames.push(name);
387
+ }
388
+ }
389
+ }
390
+ else {
391
+ depMap.set(dep.modulePath, { ...dep });
392
+ }
393
+ }
394
+ }
395
+ return Array.from(depMap.values());
396
+ }
397
+ function resolveDepPath(srcFilePath, modulePath) {
398
+ const srcDir = path.dirname(srcFilePath);
399
+ let resolved = path.resolve(srcDir, modulePath);
400
+ if (!resolved.endsWith(".ts"))
401
+ resolved += ".ts";
402
+ return resolved;
403
+ }
404
+ // ─── Import helpers ──────────────────────────────────────────────────────────
405
+ function collectImportNames(scenarios) {
406
+ const names = new Set();
407
+ for (const s of scenarios) {
408
+ if (s.className) {
409
+ names.add(s.className);
410
+ }
411
+ else {
412
+ names.add(s.functionName);
413
+ }
414
+ }
415
+ return Array.from(names);
416
+ }
417
+ function computeRelativeImport(targetFilePath, fromFilePath) {
418
+ const targetDir = path.dirname(targetFilePath);
419
+ const fromDir = path.dirname(fromFilePath);
420
+ let rel = path.relative(fromDir, targetDir).replace(/\\/g, "/");
421
+ if (!rel.startsWith("."))
422
+ rel = "./" + rel;
423
+ const basename = path.basename(targetFilePath, ".ts");
424
+ return `${rel}/${basename}`;
425
+ }
426
+ // ─── Utility helpers ─────────────────────────────────────────────────────────
427
+ function indentBlock(block, level) {
428
+ const prefix = " ".repeat(level);
429
+ return block
430
+ .split("\n")
431
+ .map((line) => (line.trim() === "" ? "" : prefix + line))
432
+ .join("\n");
433
+ }
434
+ function camelCase(label) {
435
+ return label
436
+ .replace(/[^a-zA-Z0-9 ]/g, "")
437
+ .split(/\s+/)
438
+ .map((word, i) => i === 0
439
+ ? word.toLowerCase()
440
+ : word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
441
+ .join("");
442
+ }
443
+ function capitalize(str) {
444
+ return str.charAt(0).toUpperCase() + str.slice(1);
445
+ }
446
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { ParameterMeta } from "./analyzer";
2
+ import { TestScenario } from "./scenarioEngine";
3
+ /**
4
+ * Result of generating a mock file — carries the path
5
+ * and the constant names so the test generator can reference them.
6
+ */
7
+ export interface MockFileResult {
8
+ /** Absolute path to the written mock file */
9
+ filePath: string;
10
+ /**
11
+ * Map: functionName → mockConstantName
12
+ * e.g. "add" → "addMocks"
13
+ */
14
+ constantNames: Map<string, string>;
15
+ }
16
+ /**
17
+ * Generate a mock file that mirrors the source file path.
18
+ *
19
+ * Produces `testgen/mocks/<mirror>/file.mock.ts` containing exported
20
+ * constants with structured mock data for every analysed function.
21
+ */
22
+ export declare function generateMockFile(srcFilePath: string, scenarios: TestScenario[], projectRoot: string, srcDir: string, mockDir: string): Promise<MockFileResult | null>;
23
+ /**
24
+ * Mock value entry — a concrete value to use in a test scenario,
25
+ * along with a human-readable label describing the case.
26
+ */
27
+ export interface MockValue {
28
+ /** Human label, e.g. "positive number" */
29
+ label: string;
30
+ /** Literal code representation, e.g. "42" or '"hello"' */
31
+ literal: string;
32
+ }
33
+ export interface MockArgSet {
34
+ /** Scenario label for the test name */
35
+ scenarioLabel: string;
36
+ /** One mock value per parameter, in order */
37
+ args: MockValue[];
38
+ }
39
+ /**
40
+ * Get mock values for a parameter type.
41
+ * For custom interfaces/types, attempts to resolve properties and
42
+ * build a structured mock object.
43
+ */
44
+ export declare function getMocksForType(typeStr: string): MockValue[];
45
+ /**
46
+ * Get mocks specifically for the return type — used for boolean return assertion hints.
47
+ */
48
+ export declare function getMocksForReturnType(typeStr: string): MockValue[];
49
+ /**
50
+ * Build all mock arg sets for a function.
51
+ *
52
+ * Strategy: for each parameter, pick the mock values for its type.
53
+ * We iterate through the mocks in a "zip-longest" fashion so each
54
+ * scenario gets a unique combination where possible.
55
+ */
56
+ export declare function buildMockArgSets(params: ParameterMeta[]): MockArgSet[];
57
+ /**
58
+ * Get all available mock data as a structured map — used to generate
59
+ * the testgen/mocks/mockData.ts reusable constants file.
60
+ */
61
+ export declare function getAllMockData(): Record<string, MockValue[]>;