@sun-asterisk/sungen 3.2.27 → 3.2.29

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 (237) hide show
  1. package/dist/capabilities/discover.d.ts +29 -0
  2. package/dist/capabilities/discover.d.ts.map +1 -1
  3. package/dist/capabilities/discover.js +144 -10
  4. package/dist/capabilities/discover.js.map +1 -1
  5. package/dist/capabilities/registry.d.ts +18 -0
  6. package/dist/capabilities/registry.d.ts.map +1 -1
  7. package/dist/capabilities/registry.js +25 -0
  8. package/dist/capabilities/registry.js.map +1 -1
  9. package/dist/cli/commands/audit.d.ts.map +1 -1
  10. package/dist/cli/commands/audit.js +9 -0
  11. package/dist/cli/commands/audit.js.map +1 -1
  12. package/dist/cli/commands/capability.js +1 -1
  13. package/dist/cli/commands/capability.js.map +1 -1
  14. package/dist/dashboard/templates/index.html +1 -1
  15. package/dist/exporters/feature-parser.d.ts +1 -1
  16. package/dist/exporters/feature-parser.js +1 -1
  17. package/dist/exporters/matrix/build.d.ts.map +1 -1
  18. package/dist/exporters/matrix/build.js +14 -1
  19. package/dist/exporters/matrix/build.js.map +1 -1
  20. package/dist/exporters/matrix/item-labels.d.ts +35 -0
  21. package/dist/exporters/matrix/item-labels.d.ts.map +1 -0
  22. package/dist/exporters/matrix/item-labels.js +90 -0
  23. package/dist/exporters/matrix/item-labels.js.map +1 -0
  24. package/dist/exporters/matrix/render-coverage-sheet.d.ts +14 -0
  25. package/dist/exporters/matrix/render-coverage-sheet.d.ts.map +1 -0
  26. package/dist/exporters/matrix/render-coverage-sheet.js +160 -0
  27. package/dist/exporters/matrix/render-coverage-sheet.js.map +1 -0
  28. package/dist/exporters/matrix/render-overview-sheet.d.ts +20 -0
  29. package/dist/exporters/matrix/render-overview-sheet.d.ts.map +1 -0
  30. package/dist/exporters/matrix/render-overview-sheet.js +36 -0
  31. package/dist/exporters/matrix/render-overview-sheet.js.map +1 -0
  32. package/dist/exporters/matrix/render-testcase-sheet.d.ts +30 -0
  33. package/dist/exporters/matrix/render-testcase-sheet.d.ts.map +1 -0
  34. package/dist/exporters/matrix/render-testcase-sheet.js +156 -0
  35. package/dist/exporters/matrix/render-testcase-sheet.js.map +1 -0
  36. package/dist/exporters/matrix/render-xlsx.d.ts +41 -31
  37. package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
  38. package/dist/exporters/matrix/render-xlsx.js +72 -425
  39. package/dist/exporters/matrix/render-xlsx.js.map +1 -1
  40. package/dist/exporters/matrix/testcase-summary-band.d.ts +30 -0
  41. package/dist/exporters/matrix/testcase-summary-band.d.ts.map +1 -0
  42. package/dist/exporters/matrix/testcase-summary-band.js +75 -0
  43. package/dist/exporters/matrix/testcase-summary-band.js.map +1 -0
  44. package/dist/exporters/matrix/wording.d.ts.map +1 -1
  45. package/dist/exporters/matrix/wording.js +13 -0
  46. package/dist/exporters/matrix/wording.js.map +1 -1
  47. package/dist/exporters/matrix/xlsx-cells.d.ts +38 -0
  48. package/dist/exporters/matrix/xlsx-cells.d.ts.map +1 -0
  49. package/dist/exporters/matrix/xlsx-cells.js +52 -0
  50. package/dist/exporters/matrix/xlsx-cells.js.map +1 -0
  51. package/dist/exporters/xlsx-report-builder.d.ts +12 -1
  52. package/dist/exporters/xlsx-report-builder.d.ts.map +1 -1
  53. package/dist/exporters/xlsx-report-builder.js +10 -2
  54. package/dist/exporters/xlsx-report-builder.js.map +1 -1
  55. package/dist/generators/gherkin-parser/index.d.ts +7 -0
  56. package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
  57. package/dist/generators/gherkin-parser/index.js +3 -3
  58. package/dist/generators/gherkin-parser/index.js.map +1 -1
  59. package/dist/generators/test-generator/adapters/appium/os-support.d.ts +53 -0
  60. package/dist/generators/test-generator/adapters/appium/os-support.d.ts.map +1 -0
  61. package/dist/generators/test-generator/adapters/appium/os-support.js +200 -0
  62. package/dist/generators/test-generator/adapters/appium/os-support.js.map +1 -0
  63. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/alert-fill-action.hbs +9 -2
  64. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/capture-variable.hbs +24 -1
  65. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/hover-action.hbs +6 -2
  66. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/hover-element-with-text.hbs +4 -3
  67. package/dist/generators/test-generator/adapters/appium/templates/steps/actions/unknown-element-action.hbs +9 -0
  68. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/have-value-assertion.hbs +34 -1
  69. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +14 -6
  70. package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/page-assertion.hbs +6 -0
  71. package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/go-back-action.hbs +21 -0
  72. package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/set-geolocation-action.hbs +16 -0
  73. package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +8 -0
  74. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row-nth.hbs +4 -1
  75. package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +4 -1
  76. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +2 -1
  77. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +7 -0
  78. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +7 -0
  79. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +4 -1
  80. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-match-data.hbs +4 -1
  81. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +4 -1
  82. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +12 -4
  83. package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +14 -2
  84. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +8 -8
  85. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/id.hbs +1 -1
  86. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/testid.hbs +1 -1
  87. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +8 -8
  88. package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +6 -2
  89. package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
  90. package/dist/generators/test-generator/code-generator.js +6 -2
  91. package/dist/generators/test-generator/code-generator.js.map +1 -1
  92. package/dist/generators/test-generator/diagnostics.d.ts +38 -2
  93. package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
  94. package/dist/generators/test-generator/diagnostics.js +37 -1
  95. package/dist/generators/test-generator/diagnostics.js.map +1 -1
  96. package/dist/generators/test-generator/patterns/index.d.ts +33 -6
  97. package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
  98. package/dist/generators/test-generator/patterns/index.js +71 -7
  99. package/dist/generators/test-generator/patterns/index.js.map +1 -1
  100. package/dist/generators/test-generator/patterns/types.d.ts +8 -0
  101. package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
  102. package/dist/generators/test-generator/step-mapper.d.ts +40 -1
  103. package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
  104. package/dist/generators/test-generator/step-mapper.js +104 -21
  105. package/dist/generators/test-generator/step-mapper.js.map +1 -1
  106. package/dist/generators/test-generator/utils/selector-resolver.d.ts +24 -1
  107. package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
  108. package/dist/generators/test-generator/utils/selector-resolver.js +82 -12
  109. package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
  110. package/dist/harness/audit.d.ts +3 -1
  111. package/dist/harness/audit.d.ts.map +1 -1
  112. package/dist/harness/audit.js +52 -29
  113. package/dist/harness/audit.js.map +1 -1
  114. package/dist/harness/capability-plan.d.ts +4 -0
  115. package/dist/harness/capability-plan.d.ts.map +1 -1
  116. package/dist/harness/capability-plan.js +32 -2
  117. package/dist/harness/capability-plan.js.map +1 -1
  118. package/dist/harness/catalog/drivers.yaml +1 -1
  119. package/dist/harness/catalog/universal-viewpoints.yaml +145 -0
  120. package/dist/harness/next-step.d.ts.map +1 -1
  121. package/dist/harness/next-step.js +1 -0
  122. package/dist/harness/next-step.js.map +1 -1
  123. package/dist/harness/parse.d.ts +6 -0
  124. package/dist/harness/parse.d.ts.map +1 -1
  125. package/dist/harness/parse.js +1 -1
  126. package/dist/harness/parse.js.map +1 -1
  127. package/dist/harness/repair.d.ts.map +1 -1
  128. package/dist/harness/repair.js +8 -1
  129. package/dist/harness/repair.js.map +1 -1
  130. package/dist/harness/sensors.d.ts +49 -0
  131. package/dist/harness/sensors.d.ts.map +1 -1
  132. package/dist/harness/sensors.js +51 -1
  133. package/dist/harness/sensors.js.map +1 -1
  134. package/dist/harness/viewpoint-ledger.d.ts +10 -0
  135. package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
  136. package/dist/harness/viewpoint-ledger.js +23 -2
  137. package/dist/harness/viewpoint-ledger.js.map +1 -1
  138. package/dist/orchestrator/templates/ai-src/commands/delivery.md +4 -3
  139. package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -5
  140. package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +48 -1
  141. package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +39 -6
  142. package/dist/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +1 -0
  143. package/dist/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +16 -1
  144. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +11 -0
  145. package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +14 -3
  146. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +89 -3
  147. package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +58 -1
  148. package/dist/orchestrator/templates/ai-src/skills/sungen-test-design-techniques/SKILL.md +13 -0
  149. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +59 -10
  150. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-d-display.md +1 -0
  151. package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-f-mobile-native.md +419 -0
  152. package/dist/orchestrator/templates/readme.md +1 -1
  153. package/dist/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
  154. package/dist/orchestrator/templates/specs-url-assert.d.ts +31 -0
  155. package/dist/orchestrator/templates/specs-url-assert.d.ts.map +1 -1
  156. package/dist/orchestrator/templates/specs-url-assert.js +43 -0
  157. package/dist/orchestrator/templates/specs-url-assert.js.map +1 -1
  158. package/dist/orchestrator/templates/specs-url-assert.ts +54 -0
  159. package/dist/orchestrator/templates/wdio.conf.ts +105 -1
  160. package/package.json +3 -3
  161. package/src/capabilities/discover.ts +146 -10
  162. package/src/capabilities/registry.ts +30 -0
  163. package/src/cli/commands/audit.ts +9 -0
  164. package/src/cli/commands/capability.ts +1 -1
  165. package/src/dashboard/templates/index.html +1 -1
  166. package/src/exporters/feature-parser.ts +1 -1
  167. package/src/exporters/matrix/build.ts +13 -1
  168. package/src/exporters/matrix/item-labels.ts +78 -0
  169. package/src/exporters/matrix/render-coverage-sheet.ts +168 -0
  170. package/src/exporters/matrix/render-overview-sheet.ts +56 -0
  171. package/src/exporters/matrix/render-testcase-sheet.ts +178 -0
  172. package/src/exporters/matrix/render-xlsx.ts +67 -448
  173. package/src/exporters/matrix/testcase-summary-band.ts +79 -0
  174. package/src/exporters/matrix/wording.ts +13 -0
  175. package/src/exporters/matrix/xlsx-cells.ts +56 -0
  176. package/src/exporters/xlsx-report-builder.ts +16 -2
  177. package/src/generators/gherkin-parser/index.ts +1 -1
  178. package/src/generators/test-generator/adapters/appium/os-support.ts +176 -0
  179. package/src/generators/test-generator/adapters/appium/templates/steps/actions/alert-fill-action.hbs +9 -2
  180. package/src/generators/test-generator/adapters/appium/templates/steps/actions/capture-variable.hbs +24 -1
  181. package/src/generators/test-generator/adapters/appium/templates/steps/actions/hover-action.hbs +6 -2
  182. package/src/generators/test-generator/adapters/appium/templates/steps/actions/hover-element-with-text.hbs +4 -3
  183. package/src/generators/test-generator/adapters/appium/templates/steps/actions/unknown-element-action.hbs +9 -0
  184. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/have-value-assertion.hbs +34 -1
  185. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +14 -6
  186. package/src/generators/test-generator/adapters/appium/templates/steps/assertions/page-assertion.hbs +6 -0
  187. package/src/generators/test-generator/adapters/appium/templates/steps/gestures/go-back-action.hbs +21 -0
  188. package/src/generators/test-generator/adapters/appium/templates/steps/gestures/set-geolocation-action.hbs +16 -0
  189. package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +8 -0
  190. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row-nth.hbs +4 -1
  191. package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +4 -1
  192. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +2 -1
  193. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +7 -0
  194. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +7 -0
  195. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +4 -1
  196. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-match-data.hbs +4 -1
  197. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +4 -1
  198. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +12 -4
  199. package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +14 -2
  200. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +8 -8
  201. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/id.hbs +1 -1
  202. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/testid.hbs +1 -1
  203. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +8 -8
  204. package/src/generators/test-generator/adapters/playwright/templates/steps/partials/url-assertion.hbs +6 -2
  205. package/src/generators/test-generator/code-generator.ts +6 -2
  206. package/src/generators/test-generator/diagnostics.ts +39 -2
  207. package/src/generators/test-generator/patterns/index.ts +78 -8
  208. package/src/generators/test-generator/patterns/types.ts +8 -0
  209. package/src/generators/test-generator/step-mapper.ts +109 -19
  210. package/src/generators/test-generator/utils/selector-resolver.ts +98 -12
  211. package/src/harness/audit.ts +56 -31
  212. package/src/harness/capability-plan.ts +33 -1
  213. package/src/harness/catalog/drivers.yaml +1 -1
  214. package/src/harness/catalog/universal-viewpoints.yaml +145 -0
  215. package/src/harness/next-step.ts +1 -0
  216. package/src/harness/parse.ts +7 -1
  217. package/src/harness/repair.ts +8 -1
  218. package/src/harness/sensors.ts +100 -3
  219. package/src/harness/viewpoint-ledger.ts +26 -5
  220. package/src/orchestrator/templates/ai-src/commands/delivery.md +4 -3
  221. package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -5
  222. package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +48 -1
  223. package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +39 -6
  224. package/src/orchestrator/templates/ai-src/skills/sungen-harness-audit/SKILL.md +1 -0
  225. package/src/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +16 -1
  226. package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +11 -0
  227. package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +14 -3
  228. package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +89 -3
  229. package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +58 -1
  230. package/src/orchestrator/templates/ai-src/skills/sungen-test-design-techniques/SKILL.md +13 -0
  231. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +59 -10
  232. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-d-display.md +1 -0
  233. package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-f-mobile-native.md +419 -0
  234. package/src/orchestrator/templates/readme.md +1 -1
  235. package/src/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
  236. package/src/orchestrator/templates/specs-url-assert.ts +54 -0
  237. package/src/orchestrator/templates/wdio.conf.ts +105 -1
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Sheet 4 — Coverage: requirement coverage (id ↔ items ↔ status), the
4
+ * target × category grid (with explicit `—` gaps), the mock-verified case
5
+ * tracker, dispositions, and the generation manifest.
6
+ *
7
+ * Reports on the WHOLE model — it is deliberately not split by execution mode,
8
+ * because a requirement is covered or not regardless of who runs the case.
9
+ *
10
+ * Moved out of `render-xlsx.ts` unchanged when the workbook grew to four sheets.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.addCoverageSheet = addCoverageSheet;
14
+ const xlsx_report_builder_1 = require("../xlsx-report-builder");
15
+ const build_1 = require("./build");
16
+ const xlsx_cells_1 = require("./xlsx-cells");
17
+ const CATEGORY_ORDER = ['normal', 'abnormal', 'security', 'nfr'];
18
+ function addCoverageSheet(wb, model, sungenVersion) {
19
+ const ws = wb.addWorksheet('Coverage');
20
+ ws.columns = [
21
+ { width: 3 }, { width: 22 }, { width: 18 }, { width: 16 }, { width: 16 }, { width: 16 },
22
+ { width: 16 }, { width: 44 },
23
+ ];
24
+ (0, xlsx_report_builder_1.renderReportHeaderBand)(wb, ws, `${model.unit.toUpperCase()} COVERAGE OVERVIEW`, sungenVersion, model.formNo);
25
+ (0, xlsx_cells_1.draftBanner)(ws, model);
26
+ let rowIdx = 7;
27
+ // --- Performance budget (#569) — advisory: config (qa/perf.yaml) vs measured runs.
28
+ if (model.perf) {
29
+ const p = model.perf;
30
+ (0, xlsx_cells_1.dataCell)(ws.getRow(rowIdx).getCell(2), 'Performance budget', { bold: true });
31
+ rowIdx++;
32
+ const r = ws.getRow(rowIdx);
33
+ (0, xlsx_cells_1.dataCell)(r.getCell(2), `p${p.percentile} ${p.metric.replace('_ms', ' time')}`);
34
+ (0, xlsx_cells_1.dataCell)(r.getCell(3), p.pass ? 'PASS' : 'OVER BUDGET', { bold: true });
35
+ (0, xlsx_cells_1.dataCell)(r.getCell(4), `measured ${p.measuredMs}ms`);
36
+ (0, xlsx_cells_1.dataCell)(r.getCell(5), `budget ${p.budgetMs}ms`);
37
+ (0, xlsx_cells_1.dataCell)(r.getCell(6), `${p.samples} runs`);
38
+ if (!p.pass && p.slowest.length)
39
+ (0, xlsx_cells_1.dataCell)(r.getCell(8), `slowest: ${p.slowest.map((x) => `${x.ms}ms ${x.title.slice(0, 40)}`).join(' · ')}`);
40
+ rowIdx += 2;
41
+ }
42
+ // --- External Dependency Tracking (#580, ISTQB system-test practice): every case that
43
+ // ran against a MOCK is listed centrally. Its Result stays in the canonical vocabulary
44
+ // (the roll-up formulas depend on it); THIS table is where "Pass (Mocked) ≠ Pass (Real)"
45
+ // is visible — a case verified only against mocks is not Done until re-verified real.
46
+ {
47
+ const mockedVars = model.items.flatMap((it) => it.variants.filter((v) => v.mocked).map((v) => ({ it, v })));
48
+ if (mockedVars.length > 0) {
49
+ (0, xlsx_cells_1.dataCell)(ws.getRow(rowIdx).getCell(2), 'External Dependency Tracking — mock-verified cases (Pass here = Pass (Mocked), not Pass (Real))', { bold: true });
50
+ rowIdx++;
51
+ const hd = ws.getRow(rowIdx);
52
+ (0, xlsx_cells_1.dataCell)(hd.getCell(2), 'Variant');
53
+ (0, xlsx_cells_1.dataCell)(hd.getCell(3), 'Mocked dependency');
54
+ (0, xlsx_cells_1.dataCell)(hd.getCell(4), 'Delivery item');
55
+ (0, xlsx_cells_1.dataCell)(hd.getCell(5), 'Result');
56
+ (0, xlsx_cells_1.dataCell)(hd.getCell(8), 'Real-environment re-verify');
57
+ rowIdx++;
58
+ for (const { it, v } of mockedVars) {
59
+ const r = ws.getRow(rowIdx);
60
+ (0, xlsx_cells_1.dataCell)(r.getCell(2), v.ref);
61
+ (0, xlsx_cells_1.dataCell)(r.getCell(3), (v.mockDeps ?? []).join(', ') || '(scenario-level @mock)');
62
+ (0, xlsx_cells_1.dataCell)(r.getCell(4), it.id);
63
+ (0, xlsx_cells_1.dataCell)(r.getCell(5), (0, build_1.variantState)(v));
64
+ (0, xlsx_cells_1.dataCell)(r.getCell(8), '');
65
+ rowIdx++;
66
+ }
67
+ rowIdx++;
68
+ }
69
+ }
70
+ // --- Requirement coverage (review §6): every requirement id gets ONE explicit status.
71
+ if (model.requirements.length > 0) {
72
+ (0, xlsx_cells_1.dataCell)(ws.getRow(rowIdx).getCell(2), 'Requirement coverage — every id has an explicit status', { bold: true });
73
+ rowIdx += 1;
74
+ const rh = ws.getRow(rowIdx);
75
+ ws.mergeCells(rowIdx, 4, rowIdx, 6);
76
+ (0, xlsx_cells_1.headerCell)(rh.getCell(2), 'Requirement');
77
+ (0, xlsx_cells_1.headerCell)(rh.getCell(3), 'Status');
78
+ (0, xlsx_cells_1.headerCell)(rh.getCell(4), 'Delivery items');
79
+ (0, xlsx_cells_1.headerCell)(rh.getCell(7), 'Variants');
80
+ (0, xlsx_cells_1.headerCell)(rh.getCell(8), 'Note');
81
+ rowIdx += 1;
82
+ for (const r of model.requirements) {
83
+ const row = ws.getRow(rowIdx++);
84
+ (0, xlsx_cells_1.dataCell)(row.getCell(2), r.id, { bold: true });
85
+ (0, xlsx_cells_1.dataCell)(row.getCell(3), r.status, {
86
+ center: true,
87
+ ...(r.status === 'gap' ? { fill: xlsx_cells_1.GAP_FILL, bold: true } : {}),
88
+ });
89
+ ws.mergeCells(rowIdx - 1, 4, rowIdx - 1, 6);
90
+ (0, xlsx_cells_1.dataCell)(row.getCell(4), r.items.join(', '));
91
+ (0, xlsx_cells_1.dataCell)(row.getCell(7), r.variantCount > 0 ? String(r.variantCount) : '', { center: true });
92
+ (0, xlsx_cells_1.dataCell)(row.getCell(8), r.note);
93
+ }
94
+ rowIdx += 1;
95
+ }
96
+ // --- Target × category grid ---
97
+ (0, xlsx_cells_1.dataCell)(ws.getRow(rowIdx).getCell(2), 'Coverage matrix — delivery items (coverage variants) per target × category', { bold: true });
98
+ rowIdx += 1;
99
+ const gridHeader = ws.getRow(rowIdx++);
100
+ (0, xlsx_cells_1.headerCell)(gridHeader.getCell(2), 'Target');
101
+ CATEGORY_ORDER.forEach((cat, i) => (0, xlsx_cells_1.headerCell)(gridHeader.getCell(3 + i), cat));
102
+ (0, xlsx_cells_1.headerCell)(gridHeader.getCell(3 + CATEGORY_ORDER.length), 'Total');
103
+ const targets = Array.from(new Set(model.items.map((i) => i.target)));
104
+ for (const target of targets) {
105
+ const row = ws.getRow(rowIdx++);
106
+ (0, xlsx_cells_1.dataCell)(row.getCell(2), target, { bold: true });
107
+ let totalItems = 0;
108
+ let totalVariants = 0;
109
+ CATEGORY_ORDER.forEach((cat, i) => {
110
+ const cell = row.getCell(3 + i);
111
+ const items = model.items.filter((it) => it.target === target && it.category === cat);
112
+ const variants = items.reduce((a, it) => a + it.variants.length, 0);
113
+ totalItems += items.length;
114
+ totalVariants += variants;
115
+ // `—` is an explicit statement: this target × category cell has NO coverage.
116
+ (0, xlsx_cells_1.dataCell)(cell, items.length === 0 ? '—' : `${items.length} (${variants})`, {
117
+ center: true,
118
+ ...(items.length === 0 ? { fill: xlsx_cells_1.GAP_FILL } : {}),
119
+ });
120
+ });
121
+ (0, xlsx_cells_1.dataCell)(row.getCell(3 + CATEGORY_ORDER.length), `${totalItems} (${totalVariants})`, { center: true, bold: true });
122
+ }
123
+ // --- Dispositions ---
124
+ if (model.dispositions.length > 0) {
125
+ rowIdx += 1;
126
+ (0, xlsx_cells_1.dataCell)(ws.getRow(rowIdx).getCell(2), 'Not in the matrix (explicit dispositions)', { bold: true });
127
+ rowIdx += 1;
128
+ const dh = ws.getRow(rowIdx++);
129
+ ['Source', 'Disposition', 'Reason', 'Title'].forEach((l, i) => (0, xlsx_cells_1.headerCell)(dh.getCell(2 + i), l));
130
+ for (const d of model.dispositions) {
131
+ const row = ws.getRow(rowIdx++);
132
+ (0, xlsx_cells_1.dataCell)(row.getCell(2), d.vpId);
133
+ (0, xlsx_cells_1.dataCell)(row.getCell(3), d.as, { center: true });
134
+ (0, xlsx_cells_1.dataCell)(row.getCell(4), d.reason);
135
+ (0, xlsx_cells_1.dataCell)(row.getCell(5), d.title);
136
+ }
137
+ }
138
+ // --- Manifest ---
139
+ rowIdx += 1;
140
+ (0, xlsx_cells_1.dataCell)(ws.getRow(rowIdx).getCell(2), 'Generation manifest', { bold: true });
141
+ rowIdx += 1;
142
+ const m = model.manifest;
143
+ const manifestRows = [
144
+ ['Unit', m.unit],
145
+ ['Approval state', m.approvalState],
146
+ ['Delivery items', String(m.itemCount)],
147
+ ['Coverage variants', String(m.variantCount)],
148
+ ['Source fingerprint', m.sourceFingerprint],
149
+ ['Map fingerprint', m.mapFingerprint],
150
+ ['Transformer version', m.transformerVersion],
151
+ ['Max variants / item (warn)', String(m.thresholds.maxVariantsPerItem)],
152
+ ];
153
+ for (const [k, v] of manifestRows) {
154
+ const row = ws.getRow(rowIdx++);
155
+ (0, xlsx_cells_1.dataCell)(row.getCell(2), k, { bold: true, fill: xlsx_cells_1.SOFT_BLUE });
156
+ ws.mergeCells(rowIdx - 1, 3, rowIdx - 1, 7);
157
+ (0, xlsx_cells_1.dataCell)(row.getCell(3), v);
158
+ }
159
+ }
160
+ //# sourceMappingURL=render-coverage-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-coverage-sheet.js","sourceRoot":"","sources":["../../../src/exporters/matrix/render-coverage-sheet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Sheet 1 — Overview: the roll-up table over the Auto and Manual sheets.
3
+ *
4
+ * Thin adapter. The table itself is `addOverviewSheet` in the shared report
5
+ * builder — the same one the legacy path uses — so both delivery formats show
6
+ * the customer one identical summary. All this module does is turn the matrix
7
+ * model plus the per-sheet item projections into the summary shape it wants.
8
+ *
9
+ * Every count in that table is a LIVE reference into the detail sheet's band
10
+ * (`'Auto'!D7`), never a frozen number, so it recomputes when QA edits results.
11
+ */
12
+ import * as ExcelJS from 'exceljs';
13
+ import { DeliveryItem, MatrixModel } from './types';
14
+ /** One detail sheet: its tab name and the items projected onto it. */
15
+ export interface SheetProjection {
16
+ sheetName: string;
17
+ items: DeliveryItem[];
18
+ }
19
+ export declare function addMatrixOverviewSheet(wb: ExcelJS.Workbook, model: MatrixModel, sheets: SheetProjection[], sungenVersion?: string): void;
20
+ //# sourceMappingURL=render-overview-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-overview-sheet.d.ts","sourceRoot":"","sources":["../../../src/exporters/matrix/render-overview-sheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEpD,sEAAsE;AACtE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAuBD,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,OAAO,CAAC,QAAQ,EACpB,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,eAAe,EAAE,EACzB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAON"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Sheet 1 — Overview: the roll-up table over the Auto and Manual sheets.
4
+ *
5
+ * Thin adapter. The table itself is `addOverviewSheet` in the shared report
6
+ * builder — the same one the legacy path uses — so both delivery formats show
7
+ * the customer one identical summary. All this module does is turn the matrix
8
+ * model plus the per-sheet item projections into the summary shape it wants.
9
+ *
10
+ * Every count in that table is a LIVE reference into the detail sheet's band
11
+ * (`'Auto'!D7`), never a frozen number, so it recomputes when QA edits results.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.addMatrixOverviewSheet = addMatrixOverviewSheet;
15
+ const xlsx_report_builder_1 = require("../xlsx-report-builder");
16
+ /**
17
+ * `total` counts VARIANTS only — parent rows are delivery items, not executable
18
+ * cases. It must match what the detail band's `C7=COUNTA(K14:K…)` counts, since
19
+ * a cached value and the live formula beside it have to tell one story. See
20
+ * `testcase-summary-band.ts` for why the count anchors on column K.
21
+ */
22
+ function summaryOf(unit, items) {
23
+ const sum = (k) => items.reduce((a, i) => a + i.resultCounts[k], 0);
24
+ return {
25
+ screen: unit,
26
+ total: items.reduce((a, i) => a + i.variants.length, 0),
27
+ passed: sum('passed'),
28
+ failed: sum('failed'),
29
+ pending: sum('notRun'),
30
+ na: sum('na'),
31
+ };
32
+ }
33
+ function addMatrixOverviewSheet(wb, model, sheets, sungenVersion) {
34
+ (0, xlsx_report_builder_1.addOverviewSheet)(wb, sheets.map((s) => ({ sheetName: s.sheetName, summary: summaryOf(model.unit, s.items) })), sungenVersion, { titleLabel: `${model.unit.toUpperCase()} TEST CASE & COVERAGE MATRIX`, formNo: model.formNo });
35
+ }
36
+ //# sourceMappingURL=render-overview-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-overview-sheet.js","sourceRoot":"","sources":["../../../src/exporters/matrix/render-overview-sheet.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAiCH,wDAYC;AA1CD,gEAA0D;AAS1D;;;;;GAKG;AACH,SAAS,SAAS,CAAC,IAAY,EAAE,KAAqB;IAGpD,MAAM,GAAG,GAAG,CAAC,CAAwC,EAAU,EAAE,CAC/D,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC;QACrB,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC;QACtB,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC;KACd,CAAC;AACJ,CAAC;AAED,SAAgB,sBAAsB,CACpC,EAAoB,EACpB,KAAkB,EAClB,MAAyB,EACzB,aAAsB;IAEtB,IAAA,sCAAgB,EACd,EAAE,EACF,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EACxF,aAAa,EACb,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,8BAA8B,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAChG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * One BM-2-901-13 testcase sheet of the matrix workbook (Auto or Manual).
3
+ *
4
+ * Layout is the company template, cell for cell: masthead rows 1-4, the summary
5
+ * band on rows 6/7/8, the `*: Mandatory` legend on row 12, the 16 column headers
6
+ * `A..P` on row 13, and data from row 14.
7
+ *
8
+ * Two row levels: one parent row per delivery item, each followed by its variant
9
+ * sub-rows on Excel outline level 1 — the sub-row is where source traceability
10
+ * (VP-id), test data and the manual result/evidence entry live (review B-05/B-06).
11
+ * Variant Result cells carry the state dropdown; the parent Result is a live
12
+ * formula over its children, so a parent can never contradict its variants even
13
+ * after QA edits results by hand.
14
+ */
15
+ import * as ExcelJS from 'exceljs';
16
+ import { DeliveryItem, MatrixModel } from './types';
17
+ /** Column headers on row 13 — `A..P`, matching the template exactly. */
18
+ export declare const TESTCASE_HEADERS: string[];
19
+ export declare const HEADER_ROW = 13;
20
+ /** Column L — the one the band's COUNTIFs and the parent roll-ups read. */
21
+ export declare const RESULT_COL = 12;
22
+ /**
23
+ * Append one testcase sheet holding `items` (already projected onto this sheet's
24
+ * execution mode). Always called for both Auto and Manual, even when one side is
25
+ * empty: Overview then always has exactly two rows, and QA has somewhere to add
26
+ * hand-written cases. An empty sheet's band reads 0 and its percentages resolve
27
+ * through IFERROR — never `#DIV/0!`.
28
+ */
29
+ export declare function addTestcaseSheet(wb: ExcelJS.Workbook, sheetName: string, model: MatrixModel, items: DeliveryItem[], sungenVersion?: string): void;
30
+ //# sourceMappingURL=render-testcase-sheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-testcase-sheet.d.ts","sourceRoot":"","sources":["../../../src/exporters/matrix/render-testcase-sheet.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAKnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAOpD,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,UAK5B,CAAC;AAKF,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,2EAA2E;AAC3E,eAAO,MAAM,UAAU,KAAK,CAAC;AAqE7B;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,OAAO,CAAC,QAAQ,EACpB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,YAAY,EAAE,EACrB,aAAa,CAAC,EAAE,MAAM,GACrB,IAAI,CAuDN"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ /**
3
+ * One BM-2-901-13 testcase sheet of the matrix workbook (Auto or Manual).
4
+ *
5
+ * Layout is the company template, cell for cell: masthead rows 1-4, the summary
6
+ * band on rows 6/7/8, the `*: Mandatory` legend on row 12, the 16 column headers
7
+ * `A..P` on row 13, and data from row 14.
8
+ *
9
+ * Two row levels: one parent row per delivery item, each followed by its variant
10
+ * sub-rows on Excel outline level 1 — the sub-row is where source traceability
11
+ * (VP-id), test data and the manual result/evidence entry live (review B-05/B-06).
12
+ * Variant Result cells carry the state dropdown; the parent Result is a live
13
+ * formula over its children, so a parent can never contradict its variants even
14
+ * after QA edits results by hand.
15
+ */
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.RESULT_COL = exports.HEADER_ROW = exports.TESTCASE_HEADERS = void 0;
18
+ exports.addTestcaseSheet = addTestcaseSheet;
19
+ const xlsx_report_builder_1 = require("../xlsx-report-builder");
20
+ const api_testcase_formatter_1 = require("../api-testcase-formatter");
21
+ const playwright_report_parser_1 = require("../playwright-report-parser");
22
+ const build_1 = require("./build");
23
+ const xlsx_cells_1 = require("./xlsx-cells");
24
+ const testcase_summary_band_1 = require("./testcase-summary-band");
25
+ const item_labels_1 = require("./item-labels");
26
+ /** Column headers on row 13 — `A..P`, matching the template exactly. */
27
+ exports.TESTCASE_HEADERS = [
28
+ 'ID*', 'Target', 'Test Intent / Condition', 'Category', 'Priority', 'Precondition',
29
+ 'Coverage / Test Data', 'Action / Trigger*', 'Expected results*', 'Trace', 'Testcase type',
30
+ 'Test Result*', 'Executed Date*', 'Test Executor*', 'Test Environment',
31
+ 'Note\n(Test evidence, DefectID, Actual result)',
32
+ ];
33
+ /** Column widths `A..P`, from the template (H widened — Action / Trigger is the longest cell). */
34
+ const COLUMN_WIDTHS = [20, 12.5, 15.38, 16.25, 17, 25.51, 24.88, 50, 41, 12, 13.5, 15.88, 13.5, 16.5, 23, 29];
35
+ exports.HEADER_ROW = 13;
36
+ /** Column L — the one the band's COUNTIFs and the parent roll-ups read. */
37
+ exports.RESULT_COL = 12;
38
+ /** Variant sub-row — only what distinguishes it from its parent (review GAP-01). */
39
+ function variantValues(item, v, model) {
40
+ return [
41
+ v.ref,
42
+ '',
43
+ v.condition,
44
+ '', '',
45
+ (0, item_labels_1.numbered)(item.preconditionDeltas[v.ref] ?? []),
46
+ (0, item_labels_1.numbered)(v.data),
47
+ // Only the steps after the parent's shared prefix, numbered so the parent's
48
+ // steps + these read as one continuous procedure.
49
+ (0, item_labels_1.numbered)(item.triggerDeltas[v.ref] ?? [], item.trigger.length + 1),
50
+ (0, item_labels_1.expectedWithVerification)(v.oracle, v.verification),
51
+ v.traces.join(', '),
52
+ (0, item_labels_1.variantTypeLabel)(v),
53
+ (0, build_1.variantState)(v),
54
+ (0, item_labels_1.isoDate)(v.result?.startTime),
55
+ '',
56
+ '',
57
+ // Redact BEFORE clipping — same denylist as the testcases CSV Note column.
58
+ v.result?.error ? (0, playwright_report_parser_1.clipNoteField)((0, api_testcase_formatter_1.redactSecrets)(String(v.result.error), model.secretValues)) : '',
59
+ ];
60
+ }
61
+ /**
62
+ * Live parent roll-up over the child Result cells — precedence
63
+ * failed → blocked → pending → partial → passed. N/A variants leave the
64
+ * denominator (review GAP-06): eff = n − COUNTIF(N/A); all-N/A → "All N/A".
65
+ * The range covers only the children present in THIS sheet, so a mixed item's
66
+ * two parent rows legitimately report two different numbers.
67
+ */
68
+ function rollUpFormula(n, firstChild, lastChild) {
69
+ const rng = `L${firstChild}:L${lastChild}`;
70
+ const EFF = `(${n}-COUNTIF(${rng},"N/A"))`;
71
+ const NA = `IF(COUNTIF(${rng},"N/A")>0," · "&COUNTIF(${rng},"N/A")&" N/A","")`;
72
+ return (`IF(COUNTIF(${rng},"Failed")>0,COUNTIF(${rng},"Passed")&"/"&${EFF}&" Passed · "&COUNTIF(${rng},"Failed")&" Failed"&${NA},` +
73
+ `IF(COUNTIF(${rng},"Blocked")>0,COUNTIF(${rng},"Passed")&"/"&${EFF}&" Passed · "&COUNTIF(${rng},"Blocked")&" Blocked"&${NA},` +
74
+ `IF(${EFF}=0,"All N/A",` +
75
+ `COUNTIF(${rng},"Passed")&"/"&${EFF}&" Passed"&${NA})))`);
76
+ }
77
+ /** Parent row — only values genuinely COMMON to the whole item (review M-04). */
78
+ function parentValues(item, formula) {
79
+ return [
80
+ item.id,
81
+ item.target,
82
+ item.intent,
83
+ item.category,
84
+ item.priority,
85
+ (0, item_labels_1.numbered)(item.precondition),
86
+ (0, item_labels_1.coverageSummary)(item),
87
+ // The shared leading steps; each variant's remaining steps sit on its sub-row.
88
+ (0, item_labels_1.numbered)(item.trigger),
89
+ item.oracle,
90
+ item.traces.join(', '),
91
+ // K (Testcase type) stays blank on a parent — it is not an executable case.
92
+ '',
93
+ { formula, result: (0, item_labels_1.itemResultLabel)(item) },
94
+ '',
95
+ '',
96
+ '',
97
+ item.review === 'proposed' ? 'REVIEW REQUIRED' : '',
98
+ ];
99
+ }
100
+ /**
101
+ * Append one testcase sheet holding `items` (already projected onto this sheet's
102
+ * execution mode). Always called for both Auto and Manual, even when one side is
103
+ * empty: Overview then always has exactly two rows, and QA has somewhere to add
104
+ * hand-written cases. An empty sheet's band reads 0 and its percentages resolve
105
+ * through IFERROR — never `#DIV/0!`.
106
+ */
107
+ function addTestcaseSheet(wb, sheetName, model, items, sungenVersion) {
108
+ const ws = wb.addWorksheet(sheetName);
109
+ ws.properties.outlineLevelRow = 1;
110
+ ws.columns = COLUMN_WIDTHS.map((width) => ({ width }));
111
+ (0, xlsx_report_builder_1.renderReportHeaderBand)(wb, ws, `${model.unit.toUpperCase()} TEST CASE & COVERAGE MATRIX`, sungenVersion, model.formNo);
112
+ (0, xlsx_cells_1.draftBanner)(ws, model);
113
+ (0, testcase_summary_band_1.addSummaryBand)(ws, items);
114
+ const legend = ws.getCell('A12');
115
+ legend.value = '*: Mandatory';
116
+ legend.font = { italic: true, size: 10, name: xlsx_report_builder_1.ARIAL_FONT, color: { argb: 'FF808080' } };
117
+ const hr = ws.getRow(exports.HEADER_ROW);
118
+ hr.height = 38;
119
+ exports.TESTCASE_HEADERS.forEach((label, i) => (0, xlsx_cells_1.headerCell)(hr.getCell(1 + i), label));
120
+ let rowIdx = exports.HEADER_ROW + 1;
121
+ for (const item of items) {
122
+ const parentRowIdx = rowIdx++;
123
+ // Variant sub-rows FIRST — the parent's formula needs their cell range.
124
+ const firstChild = rowIdx;
125
+ for (const v of item.variants) {
126
+ const vr = ws.getRow(rowIdx++);
127
+ vr.outlineLevel = 1;
128
+ variantValues(item, v, model).forEach((val, i) => (0, xlsx_cells_1.dataCell)(vr.getCell(1 + i), val, { center: i === 10 }));
129
+ // Manual-execution entry: constrain the Result cell to the known states.
130
+ vr.getCell(exports.RESULT_COL).dataValidation = {
131
+ type: 'list', allowBlank: true, formulae: [`"${xlsx_cells_1.RESULT_STATES}"`],
132
+ };
133
+ }
134
+ const pr = ws.getRow(parentRowIdx);
135
+ const values = parentValues(item, rollUpFormula(item.variants.length, firstChild, rowIdx - 1));
136
+ values.forEach((v, i) => (0, xlsx_cells_1.dataCell)(pr.getCell(1 + i), v, {
137
+ bold: true,
138
+ fill: xlsx_cells_1.SOFT_BLUE,
139
+ center: i === 3 || i === 4,
140
+ ...(i === 15 && item.review === 'proposed' ? { color: xlsx_cells_1.DRAFT_RED } : {}),
141
+ }));
142
+ }
143
+ const lastRow = Math.max(rowIdx - 1, exports.HEADER_ROW);
144
+ ws.autoFilter = { from: { row: exports.HEADER_ROW, column: 1 }, to: { row: lastRow, column: 16 } };
145
+ ws.views = [{ state: 'frozen', xSplit: 0, ySplit: exports.HEADER_ROW }];
146
+ // Print: landscape, fit width only (never squash all rows into one page),
147
+ // repeat the masthead + band + header rows on every page (review GAP-08).
148
+ ws.pageSetup = {
149
+ orientation: 'landscape',
150
+ fitToPage: true,
151
+ fitToWidth: 1,
152
+ fitToHeight: 0,
153
+ printTitlesRow: `1:${exports.HEADER_ROW}`,
154
+ };
155
+ }
156
+ //# sourceMappingURL=render-testcase-sheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-testcase-sheet.js","sourceRoot":"","sources":["../../../src/exporters/matrix/render-testcase-sheet.ts"],"names":[],"mappings":"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"}
@@ -1,41 +1,51 @@
1
1
  /**
2
- * Render the Test Case & Coverage Matrix workbook.
2
+ * Render the Test Case & Coverage Matrix workbook (BM-2-901-13).
3
3
  *
4
- * Sheets:
5
- * 1. Testcases — one parent row per delivery item; EVERY item (including
6
- * single-variant ones) carries variant sub-rows on Excel outline level 1 —
7
- * the sub-row is where source traceability (VP-id), test data, and the
8
- * manual result/evidence entry live (review B-05/B-06). Collapse outline
9
- * level 1 for the customer/review view; expand to execute.
10
- * 2. Coverage — requirement coverage (id ↔ items ↔ status), the target ×
11
- * category grid (explicit `—` gaps), dispositions, and the manifest.
4
+ * Four sheets, in this order:
5
+ * 1. Overview — one roll-up row per detail sheet, every cell a live reference
6
+ * into that sheet's summary band.
7
+ * 2. Auto — the cases the suite runs.
8
+ * 3. Manual — the cases a person runs.
9
+ * 4. Coverage — requirement coverage, the target × category grid,
10
+ * dispositions and the generation manifest, over the whole model.
12
11
  *
13
- * Manual-execution support: variant Result cells carry a dropdown
14
- * (Passed/Failed/Blocked/Pending/N/A) and the parent Result is a live Excel
15
- * formula derived from its children — a parent can never contradict its
16
- * variants, even after QA edits results by hand (review B-06).
17
- *
18
- * Every sheet keeps the company ISO masthead. A draft matrix (unapproved
19
- * groups / review findings) carries a red DRAFT banner.
12
+ * Auto and Manual are always both created, even when one side is empty: the
13
+ * Overview then always reads the same two rows, and QA has a place to add
14
+ * hand-written cases.
20
15
  */
21
16
  import * as ExcelJS from 'exceljs';
22
17
  import { DeliveryItem, MatrixModel } from './types';
23
- /** Mode is a coverage dimension: mixed items show both counts. */
24
- export declare function itemModeLabel(item: DeliveryItem): string;
25
- /**
26
- * Parent roll-up label. It must NEVER be exactly one of the variant state words
27
- * (`Passed`/`Failed`/`Blocked`/`Pending`/`N/A`) — the summary band counts the
28
- * Result column with exact-match COUNTIF over parent AND child rows, so a parent
29
- * reading plain "Pending" was counted as an extra pending variant (109 instead
30
- * of 77 on st-login).
31
- */
32
- export declare function itemResultLabel(item: DeliveryItem): string;
18
+ export { itemModeLabel, itemResultLabel, coverageSummary } from './item-labels';
33
19
  /**
34
- * Compact coverage summary for the parent row. A declared `dimensions:` digest
35
- * wins ("15 variants — required ×3 · format ×9 …"); otherwise a single variant
36
- * shows its condition and a group falls back to its variant REFS. Concatenating
37
- * every variant's full title turned this cell into an 800-character paragraph.
20
+ * Project an item onto one execution mode.
21
+ *
22
+ * The split is per VARIANT, not per item: an automated variant belongs on the
23
+ * Auto sheet even when a sibling variant under the same delivery item has to be
24
+ * run by hand. A mixed item therefore appears on BOTH sheets, each side carrying
25
+ * only its own variants. The repeated parent row is deliberate — a variant must
26
+ * always be readable next to the delivery item it verifies.
27
+ *
28
+ * Only the fields that would otherwise LIE about the filtered set are recomputed.
29
+ *
30
+ * `variants` / `resultCounts` / `result` — recounted over what survived.
31
+ * `dimensions` — dropped on a partial split. The digest enumerates every
32
+ * variant ("keyboard operation ×1 · announced name ×1"); with half of them on
33
+ * the other sheet it would contradict the count beside it. Cleared, the
34
+ * coverage cell falls back to the surviving variants' own words.
35
+ * `trigger` — when the parent has no shared opening step, `build.ts` puts a
36
+ * synthesized "run each of the N variants below" note there. N is regenerated
37
+ * for this sheet; a genuine step prefix is left alone.
38
+ *
39
+ * Everything else is kept as it stands. A precondition or trigger prefix common
40
+ * to every variant is still common to a subset of them, so the parent stays
41
+ * true — the children just repeat marginally more than the strict minimum. The
42
+ * delta maps are keyed by `v.ref`, so each surviving variant still finds its own.
43
+ *
44
+ * This is a projection over an assembled model, not a second build: nothing in
45
+ * `build.ts` is re-run.
38
46
  */
39
- export declare function coverageSummary(item: DeliveryItem): string;
47
+ export declare function projectItem(item: DeliveryItem, mode: 'auto' | 'manual'): DeliveryItem | null;
48
+ /** Items projected onto one sheet, in model order. */
49
+ export declare function projectItems(model: MatrixModel, mode: 'auto' | 'manual'): DeliveryItem[];
40
50
  export declare function renderMatrixXlsx(model: MatrixModel, sungenVersion?: string): ExcelJS.Workbook;
41
51
  //# sourceMappingURL=render-xlsx.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render-xlsx.d.ts","sourceRoot":"","sources":["../../../src/exporters/matrix/render-xlsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAWnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAe,MAAM,SAAS,CAAC;AA0BjE,kEAAkE;AAClE,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAMxD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAQ1D;AAgBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAM1D;AA+VD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAK7F"}
1
+ {"version":3,"file":"render-xlsx.d.ts","sourceRoot":"","sources":["../../../src/exporters/matrix/render-xlsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAOpD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,IAAI,CAY5F;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,YAAY,EAAE,CAExF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAW7F"}