@sun-asterisk/sungen 3.2.28 → 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.
- package/dist/capabilities/discover.d.ts +29 -0
- package/dist/capabilities/discover.d.ts.map +1 -1
- package/dist/capabilities/discover.js +144 -10
- package/dist/capabilities/discover.js.map +1 -1
- package/dist/capabilities/registry.d.ts +18 -0
- package/dist/capabilities/registry.d.ts.map +1 -1
- package/dist/capabilities/registry.js +25 -0
- package/dist/capabilities/registry.js.map +1 -1
- package/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +9 -0
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/cli/commands/capability.js +1 -1
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/dashboard/templates/index.html +1 -1
- package/dist/exporters/feature-parser.d.ts +1 -1
- package/dist/exporters/feature-parser.js +1 -1
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +14 -1
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/item-labels.d.ts +35 -0
- package/dist/exporters/matrix/item-labels.d.ts.map +1 -0
- package/dist/exporters/matrix/item-labels.js +90 -0
- package/dist/exporters/matrix/item-labels.js.map +1 -0
- package/dist/exporters/matrix/render-coverage-sheet.d.ts +14 -0
- package/dist/exporters/matrix/render-coverage-sheet.d.ts.map +1 -0
- package/dist/exporters/matrix/render-coverage-sheet.js +160 -0
- package/dist/exporters/matrix/render-coverage-sheet.js.map +1 -0
- package/dist/exporters/matrix/render-overview-sheet.d.ts +20 -0
- package/dist/exporters/matrix/render-overview-sheet.d.ts.map +1 -0
- package/dist/exporters/matrix/render-overview-sheet.js +36 -0
- package/dist/exporters/matrix/render-overview-sheet.js.map +1 -0
- package/dist/exporters/matrix/render-testcase-sheet.d.ts +30 -0
- package/dist/exporters/matrix/render-testcase-sheet.d.ts.map +1 -0
- package/dist/exporters/matrix/render-testcase-sheet.js +156 -0
- package/dist/exporters/matrix/render-testcase-sheet.js.map +1 -0
- package/dist/exporters/matrix/render-xlsx.d.ts +41 -31
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
- package/dist/exporters/matrix/render-xlsx.js +72 -425
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/testcase-summary-band.d.ts +30 -0
- package/dist/exporters/matrix/testcase-summary-band.d.ts.map +1 -0
- package/dist/exporters/matrix/testcase-summary-band.js +75 -0
- package/dist/exporters/matrix/testcase-summary-band.js.map +1 -0
- package/dist/exporters/matrix/wording.d.ts.map +1 -1
- package/dist/exporters/matrix/wording.js +13 -0
- package/dist/exporters/matrix/wording.js.map +1 -1
- package/dist/exporters/matrix/xlsx-cells.d.ts +38 -0
- package/dist/exporters/matrix/xlsx-cells.d.ts.map +1 -0
- package/dist/exporters/matrix/xlsx-cells.js +52 -0
- package/dist/exporters/matrix/xlsx-cells.js.map +1 -0
- package/dist/exporters/xlsx-report-builder.d.ts +12 -1
- package/dist/exporters/xlsx-report-builder.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.js +10 -2
- package/dist/exporters/xlsx-report-builder.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +7 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +3 -3
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/appium/os-support.d.ts +53 -0
- package/dist/generators/test-generator/adapters/appium/os-support.d.ts.map +1 -0
- package/dist/generators/test-generator/adapters/appium/os-support.js +200 -0
- package/dist/generators/test-generator/adapters/appium/os-support.js.map +1 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/alert-fill-action.hbs +9 -2
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/capture-variable.hbs +24 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/hover-action.hbs +6 -2
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/hover-element-with-text.hbs +4 -3
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/unknown-element-action.hbs +9 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/have-value-assertion.hbs +34 -1
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +14 -6
- package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/go-back-action.hbs +21 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/set-geolocation-action.hbs +16 -0
- package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +8 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row-nth.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +7 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +7 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-match-data.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +12 -4
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +14 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +8 -8
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/id.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/testid.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +8 -8
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +5 -1
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +38 -2
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +37 -1
- package/dist/generators/test-generator/diagnostics.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +33 -6
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +71 -7
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +8 -0
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +40 -1
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +100 -17
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts +23 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +78 -12
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/harness/audit.d.ts +3 -1
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +51 -28
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +4 -0
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +32 -2
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/catalog/drivers.yaml +1 -1
- package/dist/harness/catalog/universal-viewpoints.yaml +145 -0
- package/dist/harness/parse.d.ts +6 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +1 -1
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/repair.d.ts.map +1 -1
- package/dist/harness/repair.js +8 -1
- package/dist/harness/repair.js.map +1 -1
- package/dist/harness/sensors.d.ts +48 -0
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +26 -1
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/viewpoint-ledger.d.ts +10 -0
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +23 -2
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +4 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -5
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +48 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +18 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +16 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +11 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +10 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +88 -2
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +58 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-test-design-techniques/SKILL.md +13 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +59 -10
- package/dist/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-f-mobile-native.md +419 -0
- package/dist/orchestrator/templates/readme.md +1 -1
- package/dist/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
- package/dist/orchestrator/templates/wdio.conf.ts +105 -1
- package/package.json +3 -3
- package/src/capabilities/discover.ts +146 -10
- package/src/capabilities/registry.ts +30 -0
- package/src/cli/commands/audit.ts +9 -0
- package/src/cli/commands/capability.ts +1 -1
- package/src/dashboard/templates/index.html +1 -1
- package/src/exporters/feature-parser.ts +1 -1
- package/src/exporters/matrix/build.ts +13 -1
- package/src/exporters/matrix/item-labels.ts +78 -0
- package/src/exporters/matrix/render-coverage-sheet.ts +168 -0
- package/src/exporters/matrix/render-overview-sheet.ts +56 -0
- package/src/exporters/matrix/render-testcase-sheet.ts +178 -0
- package/src/exporters/matrix/render-xlsx.ts +67 -448
- package/src/exporters/matrix/testcase-summary-band.ts +79 -0
- package/src/exporters/matrix/wording.ts +13 -0
- package/src/exporters/matrix/xlsx-cells.ts +56 -0
- package/src/exporters/xlsx-report-builder.ts +16 -2
- package/src/generators/gherkin-parser/index.ts +1 -1
- package/src/generators/test-generator/adapters/appium/os-support.ts +176 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/alert-fill-action.hbs +9 -2
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/capture-variable.hbs +24 -1
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/hover-action.hbs +6 -2
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/hover-element-with-text.hbs +4 -3
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/unknown-element-action.hbs +9 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/have-value-assertion.hbs +34 -1
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/label-value-assertion.hbs +14 -6
- package/src/generators/test-generator/adapters/appium/templates/steps/gestures/go-back-action.hbs +21 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/gestures/set-geolocation-action.hbs +16 -0
- package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +8 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row-nth.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/table-action-in-row.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/selected-assertion.hbs +7 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +7 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-empty.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-match-data.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-count.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-exists.hbs +12 -4
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/table-row-not-exists.hbs +14 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-base.hbs +8 -8
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/id.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator-strategies/testid.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/locator.hbs +8 -8
- package/src/generators/test-generator/code-generator.ts +5 -1
- package/src/generators/test-generator/diagnostics.ts +39 -2
- package/src/generators/test-generator/patterns/index.ts +78 -8
- package/src/generators/test-generator/patterns/types.ts +8 -0
- package/src/generators/test-generator/step-mapper.ts +107 -17
- package/src/generators/test-generator/utils/selector-resolver.ts +88 -12
- package/src/harness/audit.ts +55 -30
- package/src/harness/capability-plan.ts +33 -1
- package/src/harness/catalog/drivers.yaml +1 -1
- package/src/harness/catalog/universal-viewpoints.yaml +145 -0
- package/src/harness/parse.ts +7 -1
- package/src/harness/repair.ts +8 -1
- package/src/harness/sensors.ts +75 -1
- package/src/harness/viewpoint-ledger.ts +26 -5
- package/src/orchestrator/templates/ai-src/commands/delivery.md +4 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-delivery/SKILL.md +14 -5
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +48 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +18 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +16 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +11 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-keys/SKILL.md +10 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +88 -2
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +58 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-test-design-techniques/SKILL.md +13 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/SKILL.md +59 -10
- package/src/orchestrator/templates/ai-src/skills/sungen-viewpoint/group-f-mobile-native.md +419 -0
- package/src/orchestrator/templates/readme.md +1 -1
- package/src/orchestrator/templates/specs-pw-shape-reporter.ts +0 -0
- 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
|
-
*
|
|
5
|
-
* 1.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
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
|
|
14
|
-
*
|
|
15
|
-
*
|
|
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
|
-
|
|
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
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
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
|
|
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
|
|
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"}
|