@specsafe/test-gen 0.7.0 → 0.7.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.
@@ -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
  /**
@@ -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;AAErD,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;IASxB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,YAAY;IAOpB;;OAEG;IACH,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;CAkB5C"}
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"}
@@ -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 tests = spec.requirements
31
- .flatMap(r => r.scenarios)
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(spec.name)}', () => {\n${tests}\n});`;
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
- ? ` // GIVEN: ${scenario.given}\n // WHEN: ${scenario.when}\n // THEN: ${scenario.thenOutcome}\n`
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
- return `${comments} it('${testName}', () => {\n${body}\n });`;
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
@@ -1 +1 @@
1
- {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../src/typescript.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specsafe/test-gen",
3
- "version": "0.7.0",
3
+ "version": "0.7.1",
4
4
  "description": "Test generators for SpecSafe",
5
5
  "type": "module",
6
6
  "engines": {
@@ -23,7 +23,7 @@
23
23
  "access": "public"
24
24
  },
25
25
  "dependencies": {
26
- "@specsafe/core": "0.7.0"
26
+ "@specsafe/core": "0.7.1"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "^20.0.0",