@sun-asterisk/sungen 1.0.19 → 1.0.21
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/README.md +3 -3
- package/dist/cli/commands/add.d.ts +3 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +27 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/cache-clear.d.ts +3 -0
- package/dist/cli/commands/cache-clear.d.ts.map +1 -0
- package/dist/cli/commands/cache-clear.js +24 -0
- package/dist/cli/commands/cache-clear.js.map +1 -0
- package/dist/cli/commands/full.d.ts +3 -0
- package/dist/cli/commands/full.d.ts.map +1 -0
- package/dist/cli/commands/full.js +37 -0
- package/dist/cli/commands/full.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +3 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +53 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/init.d.ts +3 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +20 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/live-scan.d.ts +3 -0
- package/dist/cli/commands/live-scan.d.ts.map +1 -0
- package/dist/cli/commands/{live-scan-command.js → live-scan.js} +22 -16
- package/dist/cli/commands/live-scan.js.map +1 -0
- package/dist/cli/commands/makeauth.d.ts +3 -0
- package/dist/cli/commands/makeauth.d.ts.map +1 -0
- package/dist/cli/commands/makeauth.js +76 -0
- package/dist/cli/commands/makeauth.js.map +1 -0
- package/dist/cli/commands/map.d.ts +3 -0
- package/dist/cli/commands/map.d.ts.map +1 -0
- package/dist/cli/commands/map.js +93 -0
- package/dist/cli/commands/map.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +3 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +43 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.js +29 -442
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/types.d.ts +9 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +7 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/utils.d.ts +6 -0
- package/dist/cli/utils.d.ts.map +1 -0
- package/dist/cli/utils.js +101 -0
- package/dist/cli/utils.js.map +1 -0
- package/dist/core/live-scanner/matrix-reader.d.ts.map +1 -1
- package/dist/core/live-scanner/matrix-reader.js +2 -40
- package/dist/core/live-scanner/matrix-reader.js.map +1 -1
- package/dist/core/live-scanner/scanner.d.ts.map +1 -1
- package/dist/core/live-scanner/scanner.js +22 -4
- package/dist/core/live-scanner/scanner.js.map +1 -1
- package/dist/core/live-scanner/step-replayer.d.ts +1 -1
- package/dist/core/live-scanner/step-replayer.d.ts.map +1 -1
- package/dist/core/live-scanner/step-replayer.js +107 -6
- package/dist/core/live-scanner/step-replayer.js.map +1 -1
- package/dist/core/live-scanner/types.d.ts +1 -0
- package/dist/core/live-scanner/types.d.ts.map +1 -1
- package/dist/core/validator/selector-validator.d.ts.map +1 -1
- package/dist/core/validator/selector-validator.js +2 -1
- package/dist/core/validator/selector-validator.js.map +1 -1
- package/dist/generators/scaffold-generator/index.d.ts +2 -1
- package/dist/generators/scaffold-generator/index.d.ts.map +1 -1
- package/dist/generators/scaffold-generator/index.js +21 -1
- package/dist/generators/scaffold-generator/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/assertion-patterns.js +95 -58
- package/dist/generators/test-generator/patterns/assertion-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.d.ts +0 -2
- package/dist/generators/test-generator/patterns/form-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/form-patterns.js +34 -47
- package/dist/generators/test-generator/patterns/form-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +3 -1
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +20 -3
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts +0 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/interaction-patterns.js +44 -85
- package/dist/generators/test-generator/patterns/interaction-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.js +98 -0
- package/dist/generators/test-generator/patterns/legacy-patterns.js.map +1 -0
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts +0 -2
- package/dist/generators/test-generator/patterns/navigation-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/navigation-patterns.js +14 -42
- package/dist/generators/test-generator/patterns/navigation-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts +0 -1
- package/dist/generators/test-generator/patterns/setup-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/setup-patterns.js +23 -35
- package/dist/generators/test-generator/patterns/setup-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +18 -3
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.d.ts +0 -15
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +4 -106
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/{executor/test-generator.d.ts → generators/test-generator/types.d.ts} +4 -25
- package/dist/generators/test-generator/types.d.ts.map +1 -0
- package/dist/generators/test-generator/types.js +106 -0
- package/dist/generators/test-generator/types.js.map +1 -0
- package/dist/generators/test-generator/utils/data-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/data-resolver.js +8 -17
- package/dist/generators/test-generator/utils/data-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/selector-resolver.js +10 -18
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/orchestrator/cache-manager.d.ts +1 -23
- package/dist/orchestrator/cache-manager.d.ts.map +1 -1
- package/dist/orchestrator/cache-manager.js +1 -87
- package/dist/orchestrator/cache-manager.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +11 -28
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +52 -371
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/reporter.d.ts +1 -1
- package/dist/orchestrator/reporter.d.ts.map +1 -1
- package/dist/orchestrator/screen-manager.js +1 -1
- package/dist/orchestrator/screen-manager.js.map +1 -1
- package/dist/utils/feature-finder.d.ts +9 -0
- package/dist/utils/feature-finder.d.ts.map +1 -0
- package/dist/utils/feature-finder.js +67 -0
- package/dist/utils/feature-finder.js.map +1 -0
- package/dist/utils/screen-paths.d.ts +10 -0
- package/dist/utils/screen-paths.d.ts.map +1 -0
- package/dist/utils/screen-paths.js +73 -0
- package/dist/utils/screen-paths.js.map +1 -0
- package/dist/utils/selector-loader.d.ts +6 -0
- package/dist/utils/selector-loader.d.ts.map +1 -0
- package/dist/utils/selector-loader.js +20 -0
- package/dist/utils/selector-loader.js.map +1 -0
- package/dist/utils/selector-types.d.ts +7 -0
- package/dist/utils/selector-types.d.ts.map +1 -0
- package/dist/utils/selector-types.js +19 -0
- package/dist/utils/selector-types.js.map +1 -0
- package/dist/utils/test-data-loader.d.ts +6 -0
- package/dist/utils/test-data-loader.d.ts.map +1 -0
- package/dist/utils/test-data-loader.js +20 -0
- package/dist/utils/test-data-loader.js.map +1 -0
- package/dist/utils/yaml-io.d.ts +14 -0
- package/dist/utils/yaml-io.d.ts.map +1 -0
- package/dist/utils/yaml-io.js +72 -0
- package/dist/utils/yaml-io.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/commands/add.ts +25 -0
- package/src/cli/commands/cache-clear.ts +22 -0
- package/src/cli/commands/full.ts +35 -0
- package/src/cli/commands/generate.ts +55 -0
- package/src/cli/commands/init.ts +17 -0
- package/src/cli/commands/{live-scan-command.ts → live-scan.ts} +21 -18
- package/src/cli/commands/makeauth.ts +77 -0
- package/src/cli/commands/map.ts +97 -0
- package/src/cli/commands/validate.ts +43 -0
- package/src/cli/index.ts +32 -473
- package/src/cli/types.ts +9 -0
- package/src/cli/utils.ts +106 -0
- package/src/core/live-scanner/matrix-reader.ts +2 -8
- package/src/core/live-scanner/scanner.ts +27 -4
- package/src/core/live-scanner/step-replayer.ts +92 -6
- package/src/core/live-scanner/types.ts +1 -0
- package/src/core/validator/selector-validator.ts +3 -2
- package/src/generators/scaffold-generator/index.ts +23 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/click-select-action.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role-with-data.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/wait-for-role.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/checked-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/column-cell-assertion.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/contain-text-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/count-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-filter-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/disabled-with-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/empty-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/enabled-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/focused-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-text-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-dialog-heading-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/is-hidden-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/list-item-count-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/not-checked-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/page-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-dialog-heading-assertion.hbs +2 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-locator-variable-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-role-variable-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-value-assertion.hbs +2 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/visible-with-variable-assertion.hbs +1 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/navigation.hbs +1 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +1 -1
- package/src/generators/test-generator/patterns/assertion-patterns.ts +102 -62
- package/src/generators/test-generator/patterns/form-patterns.ts +38 -60
- package/src/generators/test-generator/patterns/index.ts +22 -4
- package/src/generators/test-generator/patterns/interaction-patterns.ts +47 -107
- package/src/generators/test-generator/patterns/legacy-patterns.ts +104 -0
- package/src/generators/test-generator/patterns/navigation-patterns.ts +27 -69
- package/src/generators/test-generator/patterns/setup-patterns.ts +23 -41
- package/src/generators/test-generator/patterns/types.ts +26 -9
- package/src/generators/test-generator/step-mapper.ts +4 -124
- package/src/generators/test-generator/types.ts +131 -0
- package/src/generators/test-generator/utils/data-resolver.ts +8 -13
- package/src/generators/test-generator/utils/selector-resolver.ts +15 -17
- package/src/orchestrator/cache-manager.ts +1 -107
- package/src/orchestrator/pipeline.ts +58 -433
- package/src/orchestrator/reporter.ts +1 -1
- package/src/orchestrator/screen-manager.ts +1 -1
- package/src/utils/feature-finder.ts +33 -0
- package/src/utils/screen-paths.ts +37 -0
- package/src/utils/selector-loader.ts +23 -0
- package/src/utils/selector-types.ts +17 -0
- package/src/utils/test-data-loader.ts +23 -0
- package/src/utils/yaml-io.ts +33 -0
- package/dist/cli/commands/auto-tag-command.d.ts +0 -8
- package/dist/cli/commands/auto-tag-command.d.ts.map +0 -1
- package/dist/cli/commands/auto-tag-command.js +0 -104
- package/dist/cli/commands/auto-tag-command.js.map +0 -1
- package/dist/cli/commands/live-scan-command.d.ts +0 -9
- package/dist/cli/commands/live-scan-command.d.ts.map +0 -1
- package/dist/cli/commands/live-scan-command.js.map +0 -1
- package/dist/executor/playwright/playwright-generator.d.ts +0 -33
- package/dist/executor/playwright/playwright-generator.d.ts.map +0 -1
- package/dist/executor/playwright/playwright-generator.js +0 -136
- package/dist/executor/playwright/playwright-generator.js.map +0 -1
- package/dist/executor/test-generator.d.ts.map +0 -1
- package/dist/executor/test-generator.js +0 -30
- package/dist/executor/test-generator.js.map +0 -1
- package/dist/generators/cli.d.ts +0 -7
- package/dist/generators/cli.d.ts.map +0 -1
- package/dist/generators/cli.js +0 -570
- package/dist/generators/cli.js.map +0 -1
- package/dist/input/cli-adapter.d.ts +0 -75
- package/dist/input/cli-adapter.d.ts.map +0 -1
- package/dist/input/cli-adapter.js +0 -218
- package/dist/input/cli-adapter.js.map +0 -1
- package/dist/input/config-adapter.d.ts +0 -25
- package/dist/input/config-adapter.d.ts.map +0 -1
- package/dist/input/config-adapter.js +0 -70
- package/dist/input/config-adapter.js.map +0 -1
- package/dist/input/input-adapter.d.ts +0 -28
- package/dist/input/input-adapter.d.ts.map +0 -1
- package/dist/input/input-adapter.js +0 -17
- package/dist/input/input-adapter.js.map +0 -1
- package/dist/input/vscode-adapter.d.ts +0 -62
- package/dist/input/vscode-adapter.d.ts.map +0 -1
- package/dist/input/vscode-adapter.js +0 -64
- package/dist/input/vscode-adapter.js.map +0 -1
- package/dist/tools/auto-tagger.d.ts +0 -107
- package/dist/tools/auto-tagger.d.ts.map +0 -1
- package/dist/tools/auto-tagger.js +0 -502
- package/dist/tools/auto-tagger.js.map +0 -1
- package/src/cli/commands/auto-tag-command.ts +0 -80
- package/src/executor/playwright/playwright-generator.ts +0 -125
- package/src/executor/test-generator.ts +0 -90
- package/src/generators/cli.ts +0 -640
- package/src/input/cli-adapter.ts +0 -233
- package/src/input/config-adapter.ts +0 -71
- package/src/input/input-adapter.ts +0 -32
- package/src/input/vscode-adapter.ts +0 -90
- package/src/tools/auto-tagger.ts +0 -572
|
@@ -1,11 +1,45 @@
|
|
|
1
1
|
import { ParsedStep } from '../../gherkin-parser';
|
|
2
|
-
import { StepPattern } from './types';
|
|
2
|
+
import { StepPattern, StepTemplateData } from './types';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Assertion patterns: visibility, text content, state, attributes
|
|
6
6
|
* Uses template engine for framework-agnostic code generation
|
|
7
7
|
*/
|
|
8
8
|
export const assertionPatterns: StepPattern[] = [
|
|
9
|
+
// Column cell assertion: "see [Department] column 1 with {{value}}" -> check table cell text
|
|
10
|
+
{
|
|
11
|
+
name: 'column-cell-assertion',
|
|
12
|
+
matcher: (step: ParsedStep) =>
|
|
13
|
+
(step.text.includes('should see') || step.text.match(/\b(see|sees)\s+\[/)) &&
|
|
14
|
+
!!step.selectorRef &&
|
|
15
|
+
!!step.dataRef &&
|
|
16
|
+
(step.elementType === 'column' || step.elementType === 'columnheader'),
|
|
17
|
+
resolver: (step, context): StepTemplateData => {
|
|
18
|
+
let dataValue: string;
|
|
19
|
+
try {
|
|
20
|
+
dataValue = context.dataResolver.resolveData(step.dataRef!, context.featureName);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
dataValue = `\${${step.dataRef}}`;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// getByRole('row') includes header row as nth(0), so Gherkin nth=1 maps to locator nth(1)
|
|
26
|
+
const rowNth = step.nth || 1;
|
|
27
|
+
// Create a safe variable name from column name
|
|
28
|
+
const columnIndexVar = `colIndex${step.selectorRef!.replace(/[^a-zA-Z0-9]/g, '')}`;
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
templateName: 'column-cell-assertion',
|
|
32
|
+
data: {
|
|
33
|
+
columnName: step.selectorRef,
|
|
34
|
+
rowNth,
|
|
35
|
+
columnIndexVar,
|
|
36
|
+
dataValue,
|
|
37
|
+
},
|
|
38
|
+
comment: `Assert ${step.selectorRef} column row ${step.nth || 1} has text ${step.dataRef}`,
|
|
39
|
+
};
|
|
40
|
+
},
|
|
41
|
+
priority: 15, // Higher than all other assertion patterns
|
|
42
|
+
},
|
|
9
43
|
// Page assertion pattern: "see [home] page" -> check URL matches selector value
|
|
10
44
|
{
|
|
11
45
|
name: 'page-assertion',
|
|
@@ -14,9 +48,9 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
14
48
|
step.text.includes('see') ||
|
|
15
49
|
step.text.includes('sees')) &&
|
|
16
50
|
step.elementType === 'page',
|
|
17
|
-
|
|
51
|
+
resolver: (step, context): StepTemplateData => {
|
|
18
52
|
let path = step.featurePath || '/';
|
|
19
|
-
|
|
53
|
+
|
|
20
54
|
// If selector is present, extract path from selector's value attribute
|
|
21
55
|
if (step.selectorRef) {
|
|
22
56
|
try {
|
|
@@ -33,12 +67,12 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
33
67
|
path = step.featurePath || '/';
|
|
34
68
|
}
|
|
35
69
|
}
|
|
36
|
-
|
|
70
|
+
|
|
37
71
|
// Convert path to regex-safe string
|
|
38
72
|
const pathRegex = path.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
|
|
39
|
-
const code = context.templateEngine.renderStep('page-assertion', { pathRegex });
|
|
40
73
|
return {
|
|
41
|
-
|
|
74
|
+
templateName: 'page-assertion',
|
|
75
|
+
data: { pathRegex },
|
|
42
76
|
comment: step.selectorRef ? `Assert on ${step.selectorRef} page` : `Assert on page`,
|
|
43
77
|
};
|
|
44
78
|
},
|
|
@@ -81,6 +115,14 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
81
115
|
}
|
|
82
116
|
|
|
83
117
|
if (resolved.strategy === 'role' && resolved.role) {
|
|
118
|
+
// Dialog role: check heading inside dialog instead of filter on full text content
|
|
119
|
+
if (resolved.role === 'dialog') {
|
|
120
|
+
const code = context.templateEngine.renderStep('hidden-dialog-heading-assertion', {
|
|
121
|
+
dataValue,
|
|
122
|
+
});
|
|
123
|
+
return { code, comment: `Assert ${step.selectorRef} dialog hidden with heading ${step.dataRef}` };
|
|
124
|
+
}
|
|
125
|
+
|
|
84
126
|
const code = context.templateEngine.renderStep('hidden-with-role-variable-assertion', {
|
|
85
127
|
role: resolved.role,
|
|
86
128
|
name: resolved.name && resolved.name.trim() ? resolved.name : undefined,
|
|
@@ -223,6 +265,17 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
223
265
|
|
|
224
266
|
// Check if it's a role-based selector with data
|
|
225
267
|
if (resolved.strategy === 'role' && resolved.role) {
|
|
268
|
+
// Dialog role: check heading inside dialog instead of filter on full text content
|
|
269
|
+
if (resolved.role === 'dialog') {
|
|
270
|
+
const code = context.templateEngine.renderStep('visible-dialog-heading-assertion', {
|
|
271
|
+
dataValue,
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
code,
|
|
275
|
+
comment: `Assert ${step.selectorRef} dialog with heading ${step.dataRef}`,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
|
|
226
279
|
const hasName = resolved.name && resolved.name.trim();
|
|
227
280
|
// For img role: images have no text content, so put dataValue in name instead of filter
|
|
228
281
|
const isImgRole = resolved.role === 'img';
|
|
@@ -278,11 +331,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
278
331
|
step.text.includes('should see') ||
|
|
279
332
|
step.text.match(/\b(see|sees)\s+\[/)) &&
|
|
280
333
|
!!step.selectorRef,
|
|
281
|
-
|
|
334
|
+
resolver: (step, context): StepTemplateData => {
|
|
282
335
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
283
|
-
const code = context.templateEngine.renderStep('visible-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
284
336
|
return {
|
|
285
|
-
|
|
337
|
+
templateName: 'visible-assertion',
|
|
338
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
286
339
|
comment: `Assert ${step.selectorRef} is visible`,
|
|
287
340
|
};
|
|
288
341
|
},
|
|
@@ -294,11 +347,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
294
347
|
matcher: (step: ParsedStep) =>
|
|
295
348
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis hidden\b/.test(step.text) &&
|
|
296
349
|
!step.dataRef && !!step.selectorRef,
|
|
297
|
-
|
|
350
|
+
resolver: (step, context): StepTemplateData => {
|
|
298
351
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
299
|
-
const code = context.templateEngine.renderStep('is-hidden-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
300
352
|
return {
|
|
301
|
-
|
|
353
|
+
templateName: 'is-hidden-assertion',
|
|
354
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
302
355
|
comment: `Assert ${step.selectorRef} is not visible`,
|
|
303
356
|
};
|
|
304
357
|
},
|
|
@@ -308,11 +361,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
308
361
|
name: 'should-be-enabled',
|
|
309
362
|
matcher: (step: ParsedStep) =>
|
|
310
363
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis enabled\b/.test(step.text) && !!step.selectorRef,
|
|
311
|
-
|
|
364
|
+
resolver: (step, context): StepTemplateData => {
|
|
312
365
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
313
|
-
const code = context.templateEngine.renderStep('enabled-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
314
366
|
return {
|
|
315
|
-
|
|
367
|
+
templateName: 'enabled-assertion',
|
|
368
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
316
369
|
comment: `Assert ${step.selectorRef} is enabled`,
|
|
317
370
|
};
|
|
318
371
|
},
|
|
@@ -322,11 +375,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
322
375
|
name: 'should-be-disabled',
|
|
323
376
|
matcher: (step: ParsedStep) =>
|
|
324
377
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis disabled\b/.test(step.text) && !!step.selectorRef,
|
|
325
|
-
|
|
378
|
+
resolver: (step, context): StepTemplateData => {
|
|
326
379
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
327
|
-
const code = context.templateEngine.renderStep('disabled-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
328
380
|
return {
|
|
329
|
-
|
|
381
|
+
templateName: 'disabled-assertion',
|
|
382
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
330
383
|
comment: `Assert ${step.selectorRef} is disabled`,
|
|
331
384
|
};
|
|
332
385
|
},
|
|
@@ -336,15 +389,12 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
336
389
|
name: 'should-contain-text',
|
|
337
390
|
matcher: (step: ParsedStep) =>
|
|
338
391
|
step.text.includes('should contain') && !!step.selectorRef && !!(step.value || step.dataRef),
|
|
339
|
-
|
|
392
|
+
resolver: (step, context): StepTemplateData => {
|
|
340
393
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
341
394
|
const expectedText = step.value || `\${${step.dataRef}}`;
|
|
342
|
-
const code = context.templateEngine.renderStep('contain-text-assertion', {
|
|
343
|
-
...resolved,
|
|
344
|
-
expectedText,
|
|
345
|
-
});
|
|
346
395
|
return {
|
|
347
|
-
|
|
396
|
+
templateName: 'contain-text-assertion',
|
|
397
|
+
data: { ...resolved, expectedText },
|
|
348
398
|
comment: `Assert ${step.selectorRef} contains "${step.value || step.dataRef}"`,
|
|
349
399
|
};
|
|
350
400
|
},
|
|
@@ -354,15 +404,12 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
354
404
|
name: 'should-have-text',
|
|
355
405
|
matcher: (step: ParsedStep) =>
|
|
356
406
|
step.text.includes('should have text') && !!step.selectorRef && !!(step.value || step.dataRef),
|
|
357
|
-
|
|
407
|
+
resolver: (step, context): StepTemplateData => {
|
|
358
408
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
359
409
|
const expectedText = step.value || `\${${step.dataRef}}`;
|
|
360
|
-
const code = context.templateEngine.renderStep('have-text-assertion', {
|
|
361
|
-
...resolved,
|
|
362
|
-
expectedText,
|
|
363
|
-
});
|
|
364
410
|
return {
|
|
365
|
-
|
|
411
|
+
templateName: 'have-text-assertion',
|
|
412
|
+
data: { ...resolved, expectedText },
|
|
366
413
|
comment: `Assert ${step.selectorRef} has text "${step.value || step.dataRef}"`,
|
|
367
414
|
};
|
|
368
415
|
},
|
|
@@ -372,11 +419,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
372
419
|
name: 'is-empty',
|
|
373
420
|
matcher: (step: ParsedStep) =>
|
|
374
421
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis empty\b/.test(step.text) && !!step.selectorRef,
|
|
375
|
-
|
|
422
|
+
resolver: (step, context): StepTemplateData => {
|
|
376
423
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
377
|
-
const code = context.templateEngine.renderStep('empty-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
378
424
|
return {
|
|
379
|
-
|
|
425
|
+
templateName: 'empty-assertion',
|
|
426
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
380
427
|
comment: `Assert ${step.selectorRef} is empty`,
|
|
381
428
|
};
|
|
382
429
|
},
|
|
@@ -386,11 +433,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
386
433
|
name: 'is-checked',
|
|
387
434
|
matcher: (step: ParsedStep) =>
|
|
388
435
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis checked\b/.test(step.text) && !!step.selectorRef,
|
|
389
|
-
|
|
436
|
+
resolver: (step, context): StepTemplateData => {
|
|
390
437
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
391
|
-
const code = context.templateEngine.renderStep('checked-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
392
438
|
return {
|
|
393
|
-
|
|
439
|
+
templateName: 'checked-assertion',
|
|
440
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
394
441
|
comment: `Assert ${step.selectorRef} is checked`,
|
|
395
442
|
};
|
|
396
443
|
},
|
|
@@ -400,11 +447,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
400
447
|
name: 'is-unchecked',
|
|
401
448
|
matcher: (step: ParsedStep) =>
|
|
402
449
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis unchecked\b/.test(step.text) && !!step.selectorRef,
|
|
403
|
-
|
|
450
|
+
resolver: (step, context): StepTemplateData => {
|
|
404
451
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
405
|
-
const code = context.templateEngine.renderStep('not-checked-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
406
452
|
return {
|
|
407
|
-
|
|
453
|
+
templateName: 'not-checked-assertion',
|
|
454
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
408
455
|
comment: `Assert ${step.selectorRef} is unchecked`,
|
|
409
456
|
};
|
|
410
457
|
},
|
|
@@ -414,11 +461,11 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
414
461
|
name: 'is-focused',
|
|
415
462
|
matcher: (step: ParsedStep) =>
|
|
416
463
|
/\b(see|sees)\s+\[/.test(step.text) && /\bis focused\b/.test(step.text) && !!step.selectorRef,
|
|
417
|
-
|
|
464
|
+
resolver: (step, context): StepTemplateData => {
|
|
418
465
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
419
|
-
const code = context.templateEngine.renderStep('focused-assertion', { ...resolved, selectorRef: step.selectorRef });
|
|
420
466
|
return {
|
|
421
|
-
|
|
467
|
+
templateName: 'focused-assertion',
|
|
468
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
422
469
|
comment: `Assert ${step.selectorRef} is focused`,
|
|
423
470
|
};
|
|
424
471
|
},
|
|
@@ -431,7 +478,7 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
431
478
|
step.text.match(/\b(see|sees)\b/)) &&
|
|
432
479
|
!step.selectorRef &&
|
|
433
480
|
!!step.dataRef,
|
|
434
|
-
|
|
481
|
+
resolver: (step, context): StepTemplateData => {
|
|
435
482
|
// Resolve data reference to actual value
|
|
436
483
|
let dataValue: string;
|
|
437
484
|
try {
|
|
@@ -440,14 +487,13 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
440
487
|
dataValue = `\${${step.dataRef}}`;
|
|
441
488
|
}
|
|
442
489
|
|
|
443
|
-
const code = context.templateEngine.renderStep('visible-assertion', {
|
|
444
|
-
strategy: 'text',
|
|
445
|
-
value: dataValue,
|
|
446
|
-
nth: 0,
|
|
447
|
-
});
|
|
448
|
-
|
|
449
490
|
return {
|
|
450
|
-
|
|
491
|
+
templateName: 'visible-assertion',
|
|
492
|
+
data: {
|
|
493
|
+
strategy: 'text',
|
|
494
|
+
value: dataValue,
|
|
495
|
+
nth: 0,
|
|
496
|
+
},
|
|
451
497
|
comment: `Assert ${step.dataRef} is visible`,
|
|
452
498
|
};
|
|
453
499
|
},
|
|
@@ -459,7 +505,7 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
459
505
|
step.text.includes('should have') && step.text.includes('count') &&
|
|
460
506
|
!!step.selectorRef && step.text.includes('items') &&
|
|
461
507
|
(step.elementType === 'list' || step.elementType === 'list-item' || step.elementType === 'listitem'),
|
|
462
|
-
|
|
508
|
+
resolver: (step, context): StepTemplateData => {
|
|
463
509
|
let expectedCount: number | string = 1;
|
|
464
510
|
|
|
465
511
|
const match = step.text.match(/count\s+(\d+)/);
|
|
@@ -476,12 +522,9 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
476
522
|
}
|
|
477
523
|
|
|
478
524
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
479
|
-
const code = context.templateEngine.renderStep('list-item-count-assertion', {
|
|
480
|
-
...resolved,
|
|
481
|
-
expectedCount,
|
|
482
|
-
});
|
|
483
525
|
return {
|
|
484
|
-
|
|
526
|
+
templateName: 'list-item-count-assertion',
|
|
527
|
+
data: { ...resolved, expectedCount },
|
|
485
528
|
comment: `Assert ${step.selectorRef} list has ${expectedCount} items`,
|
|
486
529
|
};
|
|
487
530
|
},
|
|
@@ -491,7 +534,7 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
491
534
|
name: 'should-have-count',
|
|
492
535
|
matcher: (step: ParsedStep) =>
|
|
493
536
|
step.text.includes('should have') && step.text.includes('count') && !!step.selectorRef,
|
|
494
|
-
|
|
537
|
+
resolver: (step, context): StepTemplateData => {
|
|
495
538
|
let expectedCount: number | string = 1;
|
|
496
539
|
|
|
497
540
|
// Try literal digit first: "count 10"
|
|
@@ -510,12 +553,9 @@ export const assertionPatterns: StepPattern[] = [
|
|
|
510
553
|
}
|
|
511
554
|
|
|
512
555
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
513
|
-
const code = context.templateEngine.renderStep('count-assertion', {
|
|
514
|
-
...resolved,
|
|
515
|
-
expectedCount,
|
|
516
|
-
});
|
|
517
556
|
return {
|
|
518
|
-
|
|
557
|
+
templateName: 'count-assertion',
|
|
558
|
+
data: { ...resolved, expectedCount },
|
|
519
559
|
comment: `Assert ${step.selectorRef} has count ${expectedCount}`,
|
|
520
560
|
};
|
|
521
561
|
},
|
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { ParsedStep } from '../../gherkin-parser';
|
|
2
|
-
import { StepPattern } from './types';
|
|
2
|
+
import { StepPattern, StepTemplateData } from './types';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Form action patterns: fill, type, select, check, uncheck
|
|
6
|
-
* Uses template engine for framework-agnostic code generation
|
|
7
|
-
* Resolvers return metadata, templates handle framework syntax
|
|
8
6
|
*/
|
|
9
7
|
export const formPatterns: StepPattern[] = [
|
|
10
8
|
{
|
|
@@ -14,7 +12,7 @@ export const formPatterns: StepPattern[] = [
|
|
|
14
12
|
step.elementType === 'uploader' &&
|
|
15
13
|
!!step.selectorRef &&
|
|
16
14
|
!!(step.dataRef || step.value),
|
|
17
|
-
|
|
15
|
+
resolver: (step, context) => {
|
|
18
16
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
19
17
|
|
|
20
18
|
let fileName: string;
|
|
@@ -28,14 +26,9 @@ export const formPatterns: StepPattern[] = [
|
|
|
28
26
|
fileName = step.value!;
|
|
29
27
|
}
|
|
30
28
|
|
|
31
|
-
const code = context.templateEngine.renderStep('upload-action', {
|
|
32
|
-
...resolved,
|
|
33
|
-
selectorRef: step.selectorRef,
|
|
34
|
-
fileName,
|
|
35
|
-
});
|
|
36
|
-
|
|
37
29
|
return {
|
|
38
|
-
|
|
30
|
+
templateName: 'upload-action',
|
|
31
|
+
data: { ...resolved, selectorRef: step.selectorRef, fileName },
|
|
39
32
|
comment: `Upload file ${fileName} via ${step.selectorRef}`,
|
|
40
33
|
};
|
|
41
34
|
},
|
|
@@ -45,31 +38,23 @@ export const formPatterns: StepPattern[] = [
|
|
|
45
38
|
name: 'fill-input',
|
|
46
39
|
matcher: (step: ParsedStep) =>
|
|
47
40
|
(step.text.includes('fills') || step.text.includes('fill') || step.text.includes('inputs') || step.text.includes('input')) && !!step.selectorRef && !!(step.dataRef || step.value),
|
|
48
|
-
|
|
41
|
+
resolver: (step, context) => {
|
|
49
42
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
50
|
-
|
|
51
|
-
// Resolve data reference to actual value
|
|
43
|
+
|
|
52
44
|
let value: string;
|
|
53
45
|
if (step.dataRef) {
|
|
54
46
|
try {
|
|
55
47
|
value = context.dataResolver.resolveData(step.dataRef, context.featureName);
|
|
56
48
|
} catch (error) {
|
|
57
|
-
// Fallback: keep as template literal if data resolution fails
|
|
58
49
|
value = `\${${step.dataRef}}`;
|
|
59
50
|
}
|
|
60
51
|
} else {
|
|
61
52
|
value = step.value!;
|
|
62
53
|
}
|
|
63
|
-
|
|
64
|
-
// Use template engine to render framework-specific code
|
|
65
|
-
const code = context.templateEngine.renderStep('fill-action', {
|
|
66
|
-
...resolved, // strategy, value, role, name, selector
|
|
67
|
-
selectorRef: step.selectorRef,
|
|
68
|
-
fillValue: value,
|
|
69
|
-
});
|
|
70
|
-
|
|
54
|
+
|
|
71
55
|
return {
|
|
72
|
-
|
|
56
|
+
templateName: 'fill-action',
|
|
57
|
+
data: { ...resolved, selectorRef: step.selectorRef, fillValue: value },
|
|
73
58
|
comment: `Fill ${step.selectorRef} with ${step.dataRef || step.value}`,
|
|
74
59
|
};
|
|
75
60
|
},
|
|
@@ -79,13 +64,11 @@ export const formPatterns: StepPattern[] = [
|
|
|
79
64
|
name: 'check-checkbox',
|
|
80
65
|
matcher: (step: ParsedStep) =>
|
|
81
66
|
step.text.includes('checks') && !!step.selectorRef,
|
|
82
|
-
|
|
67
|
+
resolver: (step, context) => {
|
|
83
68
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
84
|
-
|
|
85
|
-
const code = context.templateEngine.renderStep('check-action', { ...resolved, selectorRef: step.selectorRef });
|
|
86
|
-
|
|
87
69
|
return {
|
|
88
|
-
|
|
70
|
+
templateName: 'check-action',
|
|
71
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
89
72
|
comment: `Check ${step.selectorRef}`,
|
|
90
73
|
};
|
|
91
74
|
},
|
|
@@ -95,13 +78,11 @@ export const formPatterns: StepPattern[] = [
|
|
|
95
78
|
name: 'uncheck-checkbox',
|
|
96
79
|
matcher: (step: ParsedStep) =>
|
|
97
80
|
step.text.includes('unchecks') && !!step.selectorRef,
|
|
98
|
-
|
|
81
|
+
resolver: (step, context) => {
|
|
99
82
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
100
|
-
|
|
101
|
-
const code = context.templateEngine.renderStep('uncheck-action', { ...resolved, selectorRef: step.selectorRef });
|
|
102
|
-
|
|
103
83
|
return {
|
|
104
|
-
|
|
84
|
+
templateName: 'uncheck-action',
|
|
85
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
105
86
|
comment: `Uncheck ${step.selectorRef}`,
|
|
106
87
|
};
|
|
107
88
|
},
|
|
@@ -113,10 +94,9 @@ export const formPatterns: StepPattern[] = [
|
|
|
113
94
|
(step.text.includes('selects') || step.text.match(/\bselect\b/)) &&
|
|
114
95
|
!!step.selectorRef &&
|
|
115
96
|
!!(step.dataRef || step.value),
|
|
116
|
-
|
|
97
|
+
resolver: (step, context): StepTemplateData => {
|
|
117
98
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
118
99
|
|
|
119
|
-
// Resolve data reference to actual value
|
|
120
100
|
let value: string;
|
|
121
101
|
if (step.dataRef) {
|
|
122
102
|
try {
|
|
@@ -128,32 +108,34 @@ export const formPatterns: StepPattern[] = [
|
|
|
128
108
|
value = step.value!;
|
|
129
109
|
}
|
|
130
110
|
|
|
131
|
-
// Determine action based on role type
|
|
132
|
-
// Radio buttons use check(), dropdowns use selectOption()
|
|
133
111
|
const isRadio = resolved.role === 'radio' || step.text.includes('radio');
|
|
134
112
|
const isCheckbox = resolved.role === 'checkbox' || step.text.includes('checkbox');
|
|
135
113
|
|
|
136
|
-
let
|
|
114
|
+
let templateName: string;
|
|
115
|
+
let data: Record<string, any>;
|
|
116
|
+
|
|
137
117
|
if (isRadio) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
...resolved,
|
|
141
|
-
selectorRef: step.selectorRef,
|
|
142
|
-
selectValue: value,
|
|
143
|
-
});
|
|
118
|
+
templateName = 'radio-select-action';
|
|
119
|
+
data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
|
|
144
120
|
} else if (isCheckbox) {
|
|
145
|
-
|
|
121
|
+
templateName = 'check-action';
|
|
122
|
+
data = { ...resolved, selectorRef: step.selectorRef };
|
|
146
123
|
} else {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
124
|
+
const nativeSelectRoles = ['combobox', 'listbox', 'select'];
|
|
125
|
+
const isNativeSelect = nativeSelectRoles.includes(resolved.role);
|
|
126
|
+
|
|
127
|
+
if (isNativeSelect) {
|
|
128
|
+
templateName = 'select-action';
|
|
129
|
+
data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
|
|
130
|
+
} else {
|
|
131
|
+
templateName = 'click-select-action';
|
|
132
|
+
data = { ...resolved, selectorRef: step.selectorRef, selectValue: value };
|
|
133
|
+
}
|
|
153
134
|
}
|
|
154
135
|
|
|
155
136
|
return {
|
|
156
|
-
|
|
137
|
+
templateName,
|
|
138
|
+
data,
|
|
157
139
|
comment: `Select ${step.dataRef || step.value} in ${step.selectorRef}`,
|
|
158
140
|
};
|
|
159
141
|
},
|
|
@@ -163,18 +145,14 @@ export const formPatterns: StepPattern[] = [
|
|
|
163
145
|
name: 'clear-input',
|
|
164
146
|
matcher: (step: ParsedStep) =>
|
|
165
147
|
step.text.includes('clears') && !!step.selectorRef,
|
|
166
|
-
|
|
148
|
+
resolver: (step, context) => {
|
|
167
149
|
const resolved = context.selectorResolver.resolveSelector(step.selectorRef!, undefined, step.elementType, step.nth);
|
|
168
|
-
|
|
169
|
-
const code = context.templateEngine.renderStep('clear-action', { ...resolved, selectorRef: step.selectorRef });
|
|
170
|
-
|
|
171
150
|
return {
|
|
172
|
-
|
|
151
|
+
templateName: 'clear-action',
|
|
152
|
+
data: { ...resolved, selectorRef: step.selectorRef },
|
|
173
153
|
comment: `Clear ${step.selectorRef}`,
|
|
174
154
|
};
|
|
175
155
|
},
|
|
176
156
|
priority: 7,
|
|
177
157
|
},
|
|
178
158
|
];
|
|
179
|
-
|
|
180
|
-
|
|
@@ -6,6 +6,7 @@ import { formPatterns } from './form-patterns';
|
|
|
6
6
|
import { interactionPatterns } from './interaction-patterns';
|
|
7
7
|
import { assertionPatterns } from './assertion-patterns';
|
|
8
8
|
import { setupPatterns } from './setup-patterns';
|
|
9
|
+
import { legacyPatterns } from './legacy-patterns';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Pattern Registry - manages all step patterns
|
|
@@ -26,7 +27,8 @@ export class PatternRegistry {
|
|
|
26
27
|
this.patterns.push(...formPatterns);
|
|
27
28
|
this.patterns.push(...interactionPatterns);
|
|
28
29
|
this.patterns.push(...assertionPatterns);
|
|
29
|
-
|
|
30
|
+
this.patterns.push(...legacyPatterns);
|
|
31
|
+
|
|
30
32
|
// Sort by priority (higher first)
|
|
31
33
|
this.patterns.sort((a, b) => (b.priority || 0) - (a.priority || 0));
|
|
32
34
|
}
|
|
@@ -52,15 +54,30 @@ export class PatternRegistry {
|
|
|
52
54
|
}
|
|
53
55
|
|
|
54
56
|
/**
|
|
55
|
-
* Generate code for a step using matched pattern
|
|
57
|
+
* Generate code for a step using matched pattern.
|
|
58
|
+
* Prefers resolver (returns template data) over generator (renders directly).
|
|
56
59
|
*/
|
|
57
60
|
generateStep(step: ParsedStep, context: PatternContext): MappedStep | null {
|
|
58
61
|
const pattern = this.findPattern(step);
|
|
59
62
|
if (!pattern) {
|
|
60
63
|
return null;
|
|
61
64
|
}
|
|
62
|
-
|
|
63
|
-
|
|
65
|
+
|
|
66
|
+
// Prefer resolver (framework-agnostic) over generator (legacy)
|
|
67
|
+
if (pattern.resolver) {
|
|
68
|
+
const resolved = pattern.resolver(step, context);
|
|
69
|
+
const code = context.templateEngine.renderStep(resolved.templateName, resolved.data);
|
|
70
|
+
return {
|
|
71
|
+
code,
|
|
72
|
+
comment: resolved.comment,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (pattern.generator) {
|
|
77
|
+
return pattern.generator(step, context);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return null;
|
|
64
81
|
}
|
|
65
82
|
|
|
66
83
|
/**
|
|
@@ -94,4 +111,5 @@ export { navigationPatterns } from './navigation-patterns';
|
|
|
94
111
|
export { formPatterns } from './form-patterns';
|
|
95
112
|
export { interactionPatterns } from './interaction-patterns';
|
|
96
113
|
export { assertionPatterns } from './assertion-patterns';
|
|
114
|
+
export { legacyPatterns } from './legacy-patterns';
|
|
97
115
|
export * from './types';
|