@specsafe/test-gen 0.7.0 → 0.8.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.
- package/dist/typescript.d.ts +6 -1
- package/dist/typescript.d.ts.map +1 -1
- package/dist/typescript.js +39 -8
- package/dist/typescript.js.map +1 -1
- package/package.json +5 -4
package/dist/typescript.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* TypeScript/Vitest Test Generator
|
|
3
3
|
* Converts spec scenarios to Vitest test files
|
|
4
4
|
*/
|
|
5
|
-
import type { Spec, Scenario } from '@specsafe/core';
|
|
5
|
+
import type { Spec, Scenario, Requirement } from '@specsafe/core';
|
|
6
6
|
export interface TestGenerationOptions {
|
|
7
7
|
framework: 'vitest' | 'jest';
|
|
8
8
|
includeComments: boolean;
|
|
@@ -17,6 +17,11 @@ export declare class TypeScriptTestGenerator {
|
|
|
17
17
|
generate(spec: Spec): string;
|
|
18
18
|
private generateImports;
|
|
19
19
|
private generateDescribe;
|
|
20
|
+
private generateRequirementBlock;
|
|
21
|
+
/**
|
|
22
|
+
* Generate a stub test for a requirement without scenarios
|
|
23
|
+
*/
|
|
24
|
+
generateRequirementTest(req: Requirement): string;
|
|
20
25
|
private generateTest;
|
|
21
26
|
private scenarioToTestName;
|
|
22
27
|
/**
|
package/dist/typescript.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"typescript.d.ts","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElE,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,GAAE,OAAO,CAAC,qBAAqB,CAAM;IASxD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;IAO5B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,wBAAwB;IAgBhC;;OAEG;IACH,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM;IASjD,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;CAkB5C"}
|
package/dist/typescript.js
CHANGED
|
@@ -27,21 +27,52 @@ export class TypeScriptTestGenerator {
|
|
|
27
27
|
return "import { describe, it, expect } from '@jest/globals';";
|
|
28
28
|
}
|
|
29
29
|
generateDescribe(spec) {
|
|
30
|
-
const
|
|
31
|
-
|
|
30
|
+
const requirements = spec.requirements;
|
|
31
|
+
// If no requirements, produce empty describe
|
|
32
|
+
if (requirements.length === 0) {
|
|
33
|
+
return `describe('${this.escapeString(spec.name)}', () => {\n});`;
|
|
34
|
+
}
|
|
35
|
+
// Generate a nested describe block per requirement
|
|
36
|
+
const requirementBlocks = requirements
|
|
37
|
+
.map(r => this.generateRequirementBlock(r))
|
|
38
|
+
.join('\n\n');
|
|
39
|
+
return `describe('${this.escapeString(spec.name)}', () => {\n${requirementBlocks}\n});`;
|
|
40
|
+
}
|
|
41
|
+
generateRequirementBlock(req) {
|
|
42
|
+
const label = `[${req.id}] ${req.text}`;
|
|
43
|
+
if (req.scenarios.length === 0) {
|
|
44
|
+
// Generate stub test from requirement text
|
|
45
|
+
const stubTest = this.generateRequirementTest(req);
|
|
46
|
+
return ` describe('${this.escapeString(label)}', () => {\n${stubTest}\n });`;
|
|
47
|
+
}
|
|
48
|
+
const tests = req.scenarios
|
|
32
49
|
.map(s => this.generateTest(s))
|
|
33
50
|
.join('\n\n');
|
|
34
|
-
return `describe('${this.escapeString(
|
|
51
|
+
return ` describe('${this.escapeString(label)}', () => {\n${tests}\n });`;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Generate a stub test for a requirement without scenarios
|
|
55
|
+
*/
|
|
56
|
+
generateRequirementTest(req) {
|
|
57
|
+
const testName = this.escapeString(`should ${req.text.toLowerCase()}`);
|
|
58
|
+
const body = this.options.generatePlaceholders
|
|
59
|
+
? ` // TODO: Implement test for requirement ${req.id}\n // Verify: ${req.text}\n expect(true).toBe(true); // TODO: Replace with actual assertion`
|
|
60
|
+
: '';
|
|
61
|
+
return ` it('${testName}', () => {\n${body}\n });`;
|
|
35
62
|
}
|
|
36
63
|
generateTest(scenario) {
|
|
37
64
|
const testName = this.escapeString(this.scenarioToTestName(scenario));
|
|
38
65
|
const comments = this.options.includeComments
|
|
39
|
-
? `
|
|
40
|
-
: '';
|
|
41
|
-
const body = this.options.generatePlaceholders
|
|
42
|
-
? ` expect(true).toBe(true); // TODO: Implement test`
|
|
66
|
+
? ` // GIVEN: ${scenario.given}\n // WHEN: ${scenario.when}\n // THEN: ${scenario.thenOutcome}\n`
|
|
43
67
|
: '';
|
|
44
|
-
|
|
68
|
+
let body;
|
|
69
|
+
if (this.options.generatePlaceholders) {
|
|
70
|
+
body = ` // Arrange\n // ${scenario.given}\n\n // Act\n // ${scenario.when}\n\n // Assert\n // ${scenario.thenOutcome}\n expect(true).toBe(true); // TODO: Implement test`;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
body = '';
|
|
74
|
+
}
|
|
75
|
+
return `${comments} it('${testName}', () => {\n${body}\n });`;
|
|
45
76
|
}
|
|
46
77
|
scenarioToTestName(scenario) {
|
|
47
78
|
// Convert scenario to readable test name, preserving original case
|
package/dist/typescript.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,uBAAuB;IAC1B,OAAO,CAAwB;IAEvC,YAAY,UAA0C,EAAE;QACtD,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE,QAAQ;YACnB,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI;YAC1B,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAU;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO,GAAG,OAAO,OAAO,QAAQ,EAAE,CAAC;IACrC,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,gDAAgD,CAAC;QAC1D,CAAC;QACD,OAAO,uDAAuD,CAAC;IACjE,CAAC;IAEO,gBAAgB,CAAC,IAAU;QACjC,MAAM,
|
|
1
|
+
{"version":3,"file":"typescript.js","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,OAAO,uBAAuB;IAC1B,OAAO,CAAwB;IAEvC,YAAY,UAA0C,EAAE;QACtD,IAAI,CAAC,OAAO,GAAG;YACb,SAAS,EAAE,QAAQ;YACnB,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI;YAC1B,GAAG,OAAO;SACX,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,QAAQ,CAAC,IAAU;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,OAAO,GAAG,OAAO,OAAO,QAAQ,EAAE,CAAC;IACrC,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACxC,OAAO,gDAAgD,CAAC;QAC1D,CAAC;QACD,OAAO,uDAAuD,CAAC;IACjE,CAAC;IAEO,gBAAgB,CAAC,IAAU;QACjC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QAEvC,6CAA6C;QAC7C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,aAAa,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACpE,CAAC;QAED,mDAAmD;QACnD,MAAM,iBAAiB,GAAG,YAAY;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC;aAC1C,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO,aAAa,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,iBAAiB,OAAO,CAAC;IAC1F,CAAC;IAEO,wBAAwB,CAAC,GAAgB;QAC/C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC;QAExC,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,2CAA2C;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,eAAe,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,QAAQ,SAAS,CAAC;QACjF,CAAC;QAED,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS;aACxB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aAC9B,IAAI,CAAC,MAAM,CAAC,CAAC;QAEhB,OAAO,eAAe,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,GAAgB;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB;YAC5C,CAAC,CAAC,iDAAiD,GAAG,CAAC,EAAE,sBAAsB,GAAG,CAAC,IAAI,yEAAyE;YAChK,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO,WAAW,QAAQ,eAAe,IAAI,WAAW,CAAC;IAC3D,CAAC;IAEO,YAAY,CAAC,QAAkB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe;YAC3C,CAAC,CAAC,iBAAiB,QAAQ,CAAC,KAAK,kBAAkB,QAAQ,CAAC,IAAI,kBAAkB,QAAQ,CAAC,WAAW,IAAI;YAC1G,CAAC,CAAC,EAAE,CAAC;QAEP,IAAI,IAAY,CAAC;QACjB,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACtC,IAAI,GAAG,8BAA8B,QAAQ,CAAC,KAAK,8BAA8B,QAAQ,CAAC,IAAI,iCAAiC,QAAQ,CAAC,WAAW,0DAA0D,CAAC;QAChN,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC;QAED,OAAO,GAAG,QAAQ,WAAW,QAAQ,eAAe,IAAI,WAAW,CAAC;IACtE,CAAC;IAEO,kBAAkB,CAAC,QAAkB;QAC3C,mEAAmE;QACnE,OAAO,QAAQ,CAAC,WAAW;aACxB,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;aACxB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,OAAO,GAAG;aACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;aACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,OAAe;QAC5B,MAAM,SAAS,GAAe,EAAE,CAAC;QAEjC,gDAAgD;QAChD,MAAM,aAAa,GAAG,8GAA8G,CAAC;QAErI,IAAI,KAAK,CAAC;QACV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtD,SAAS,CAAC,IAAI,CAAC;gBACb,EAAE,EAAE,MAAM,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;gBAChC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACtB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;gBACrB,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;aAC7B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@specsafe/test-gen",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "Test generators for SpecSafe",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -23,17 +23,18 @@
|
|
|
23
23
|
"access": "public"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@specsafe/core": "0.
|
|
26
|
+
"@specsafe/core": "0.8.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^20.0.0",
|
|
30
30
|
"typescript": "^5.3.0",
|
|
31
|
-
"vitest": "^
|
|
31
|
+
"vitest": "^3.0.0"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"build": "tsc",
|
|
35
35
|
"dev": "tsc --watch",
|
|
36
36
|
"test": "vitest --passWithNoTests",
|
|
37
|
-
"typecheck": "tsc --noEmit"
|
|
37
|
+
"typecheck": "tsc --noEmit",
|
|
38
|
+
"lint": "echo \"No linter configured\""
|
|
38
39
|
}
|
|
39
40
|
}
|