@sun-asterisk/sungen 3.2.24-beta.6 → 3.2.25
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/context-router.d.ts.map +1 -1
- package/dist/capabilities/context-router.js +15 -7
- package/dist/capabilities/context-router.js.map +1 -1
- package/dist/cli/commands/capability.d.ts.map +1 -1
- package/dist/cli/commands/capability.js +6 -48
- package/dist/cli/commands/capability.js.map +1 -1
- package/dist/cli/commands/changed.d.ts +14 -0
- package/dist/cli/commands/changed.d.ts.map +1 -0
- package/dist/cli/commands/changed.js +128 -0
- package/dist/cli/commands/changed.js.map +1 -0
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +25 -1
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.js +1 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/results-merge.d.ts +19 -0
- package/dist/cli/commands/results-merge.d.ts.map +1 -0
- package/dist/cli/commands/results-merge.js +191 -0
- package/dist/cli/commands/results-merge.js.map +1 -0
- package/dist/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +100 -12
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/exporters/api-catalog-loader.d.ts.map +1 -1
- package/dist/exporters/api-catalog-loader.js +10 -3
- package/dist/exporters/api-catalog-loader.js.map +1 -1
- package/dist/exporters/api-testcase-formatter.d.ts +9 -0
- package/dist/exporters/api-testcase-formatter.d.ts.map +1 -1
- package/dist/exporters/api-testcase-formatter.js +55 -3
- package/dist/exporters/api-testcase-formatter.js.map +1 -1
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +10 -1
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/json-exporter.d.ts.map +1 -1
- package/dist/exporters/json-exporter.js +6 -1
- package/dist/exporters/json-exporter.js.map +1 -1
- package/dist/exporters/matrix/build.d.ts.map +1 -1
- package/dist/exporters/matrix/build.js +10 -0
- package/dist/exporters/matrix/build.js.map +1 -1
- package/dist/exporters/matrix/export.js +1 -1
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/matrix/render-csv.d.ts.map +1 -1
- package/dist/exporters/matrix/render-csv.js +5 -1
- package/dist/exporters/matrix/render-csv.js.map +1 -1
- package/dist/exporters/matrix/render-xlsx.d.ts.map +1 -1
- package/dist/exporters/matrix/render-xlsx.js +4 -1
- package/dist/exporters/matrix/render-xlsx.js.map +1 -1
- package/dist/exporters/matrix/types.d.ts +7 -0
- package/dist/exporters/matrix/types.d.ts.map +1 -1
- package/dist/exporters/matrix/types.js.map +1 -1
- package/dist/exporters/playwright-report-parser.d.ts +17 -2
- package/dist/exporters/playwright-report-parser.d.ts.map +1 -1
- package/dist/exporters/playwright-report-parser.js +68 -8
- package/dist/exporters/playwright-report-parser.js.map +1 -1
- package/dist/exporters/results-merge.d.ts +46 -0
- package/dist/exporters/results-merge.d.ts.map +1 -0
- package/dist/exporters/results-merge.js +148 -0
- package/dist/exporters/results-merge.js.map +1 -0
- package/dist/exporters/selector-key-resolver.d.ts +4 -0
- package/dist/exporters/selector-key-resolver.d.ts.map +1 -1
- package/dist/exporters/selector-key-resolver.js +101 -1
- package/dist/exporters/selector-key-resolver.js.map +1 -1
- package/dist/exporters/types.d.ts +8 -1
- package/dist/exporters/types.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.d.ts.map +1 -1
- package/dist/exporters/xlsx-report-builder.js +5 -4
- package/dist/exporters/xlsx-report-builder.js.map +1 -1
- package/dist/generators/gherkin-parser/index.d.ts +2 -0
- package/dist/generators/gherkin-parser/index.d.ts.map +1 -1
- package/dist/generators/gherkin-parser/index.js +52 -1
- package/dist/generators/gherkin-parser/index.js.map +1 -1
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts +20 -10
- package/dist/generators/test-generator/adapters/adapter-interface.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/appium/appium-adapter.d.ts +2 -11
- package/dist/generators/test-generator/adapters/appium/appium-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/appium/appium-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/appium/templates/imports.hbs +3 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/biometric-action.hbs +9 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/check-action.hbs +11 -6
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/date-picker-unsupported.hbs +4 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/deep-link-action.hbs +8 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/lifecycle-missing-app-id.hbs +5 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/location-services-action.hbs +11 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +21 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/restart-app-action.hbs +16 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/set-connectivity-action.hbs +11 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/actions/uncheck-action.hbs +9 -5
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/checked-assertion.hbs +10 -4
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/device-log-assertion.hbs +16 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/disappears-within-assertion.hbs +5 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/matches-format-assertion.hbs +15 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/not-checked-assertion.hbs +6 -4
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/state-with-filter-assertion.hbs +4 -3
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/still-visible-after-assertion.hbs +4 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/assertions/visible-filtered-assertion.hbs +5 -2
- package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/pull-to-refresh-action.hbs +3 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/gestures/swipe-action.hbs +3 -0
- package/dist/generators/test-generator/adapters/appium/templates/steps/partials/appium-selector.hbs +7 -1
- package/dist/generators/test-generator/adapters/appium/templates/test-file.hbs +302 -29
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts +2 -11
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.d.ts.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/playwright-adapter.js.map +1 -1
- package/dist/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +17 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/attribute-assertion.hbs +6 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/have-value-assertion.hbs +18 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +5 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/matches-format-assertion.hbs +5 -0
- package/dist/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +4 -2
- package/dist/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +4 -1
- package/dist/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-text.hbs +1 -1
- package/dist/generators/test-generator/code-generator.d.ts +6 -0
- package/dist/generators/test-generator/code-generator.d.ts.map +1 -1
- package/dist/generators/test-generator/code-generator.js +80 -7
- package/dist/generators/test-generator/code-generator.js.map +1 -1
- package/dist/generators/test-generator/diagnostics.d.ts +60 -6
- package/dist/generators/test-generator/diagnostics.d.ts.map +1 -1
- package/dist/generators/test-generator/diagnostics.js +59 -5
- package/dist/generators/test-generator/diagnostics.js.map +1 -1
- package/dist/generators/test-generator/patterns/expect-patterns.d.ts +7 -0
- package/dist/generators/test-generator/patterns/expect-patterns.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/expect-patterns.js +36 -2
- package/dist/generators/test-generator/patterns/expect-patterns.js.map +1 -1
- package/dist/generators/test-generator/patterns/index.d.ts +19 -12
- package/dist/generators/test-generator/patterns/index.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/index.js +58 -38
- package/dist/generators/test-generator/patterns/index.js.map +1 -1
- package/dist/generators/test-generator/patterns/types.d.ts +23 -0
- package/dist/generators/test-generator/patterns/types.d.ts.map +1 -1
- package/dist/generators/test-generator/patterns/unsupported-step-code.d.ts +18 -0
- package/dist/generators/test-generator/patterns/unsupported-step-code.d.ts.map +1 -0
- package/dist/generators/test-generator/patterns/unsupported-step-code.js +23 -0
- package/dist/generators/test-generator/patterns/unsupported-step-code.js.map +1 -0
- package/dist/generators/test-generator/recipe-expander.js +9 -1
- package/dist/generators/test-generator/recipe-expander.js.map +1 -1
- package/dist/generators/test-generator/reset-tier.d.ts +68 -0
- package/dist/generators/test-generator/reset-tier.d.ts.map +1 -0
- package/dist/generators/test-generator/reset-tier.js +94 -0
- package/dist/generators/test-generator/reset-tier.js.map +1 -0
- package/dist/generators/test-generator/step-mapper.d.ts +39 -0
- package/dist/generators/test-generator/step-mapper.d.ts.map +1 -1
- package/dist/generators/test-generator/step-mapper.js +144 -5
- package/dist/generators/test-generator/step-mapper.js.map +1 -1
- package/dist/generators/test-generator/template-engine.d.ts +2 -10
- package/dist/generators/test-generator/template-engine.d.ts.map +1 -1
- package/dist/generators/test-generator/template-engine.js +19 -2
- package/dist/generators/test-generator/template-engine.js.map +1 -1
- package/dist/generators/test-generator/utils/format-pattern.d.ts +35 -0
- package/dist/generators/test-generator/utils/format-pattern.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/format-pattern.js +82 -0
- package/dist/generators/test-generator/utils/format-pattern.js.map +1 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.d.ts +42 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.js +142 -0
- package/dist/generators/test-generator/utils/js-literal-scanner.js.map +1 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.d.ts +18 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.js +25 -0
- package/dist/generators/test-generator/utils/mask-refs-for-matching.js.map +1 -0
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts +9 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.d.ts.map +1 -1
- package/dist/generators/test-generator/utils/runtime-data-transformer.js +124 -63
- package/dist/generators/test-generator/utils/runtime-data-transformer.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 +24 -1
- package/dist/generators/test-generator/utils/selector-resolver.js.map +1 -1
- package/dist/generators/test-generator/utils/spec-syntax-check.d.ts +14 -0
- package/dist/generators/test-generator/utils/spec-syntax-check.d.ts.map +1 -0
- package/dist/generators/test-generator/utils/spec-syntax-check.js +26 -0
- package/dist/generators/test-generator/utils/spec-syntax-check.js.map +1 -0
- package/dist/harness/annotation-overrides.d.ts +0 -12
- package/dist/harness/annotation-overrides.d.ts.map +1 -1
- package/dist/harness/annotation-overrides.js +9 -5
- package/dist/harness/annotation-overrides.js.map +1 -1
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +7 -5
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/capability-plan.d.ts +2 -1
- package/dist/harness/capability-plan.d.ts.map +1 -1
- package/dist/harness/capability-plan.js +14 -4
- package/dist/harness/capability-plan.js.map +1 -1
- package/dist/harness/capability.d.ts +11 -0
- package/dist/harness/capability.d.ts.map +1 -1
- package/dist/harness/capability.js +8 -0
- package/dist/harness/capability.js.map +1 -1
- package/dist/harness/catalog/drivers.yaml +5 -0
- package/dist/harness/parse.d.ts +1 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +6 -1
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/run-manifest.d.ts +58 -0
- package/dist/harness/run-manifest.d.ts.map +1 -0
- package/dist/harness/run-manifest.js +264 -0
- package/dist/harness/run-manifest.js.map +1 -0
- package/dist/harness/script-check.d.ts.map +1 -1
- package/dist/harness/script-check.js +6 -2
- package/dist/harness/script-check.js.map +1 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +5 -1
- package/dist/harness/sensors.js.map +1 -1
- package/dist/harness/viewpoint-ledger.d.ts +1 -1
- package/dist/harness/viewpoint-ledger.d.ts.map +1 -1
- package/dist/harness/viewpoint-ledger.js +25 -4
- package/dist/harness/viewpoint-ledger.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/orchestrator/lockstep-version.d.ts +22 -0
- package/dist/orchestrator/lockstep-version.d.ts.map +1 -0
- package/dist/orchestrator/lockstep-version.js +58 -0
- package/dist/orchestrator/lockstep-version.js.map +1 -0
- package/dist/orchestrator/mobile-runtime-scaffolder.d.ts.map +1 -1
- package/dist/orchestrator/mobile-runtime-scaffolder.js +5 -1
- package/dist/orchestrator/mobile-runtime-scaffolder.js.map +1 -1
- package/dist/orchestrator/project-deps-sync.d.ts +39 -0
- package/dist/orchestrator/project-deps-sync.d.ts.map +1 -0
- package/dist/orchestrator/project-deps-sync.js +175 -0
- package/dist/orchestrator/project-deps-sync.js.map +1 -0
- package/dist/orchestrator/project-initializer.d.ts.map +1 -1
- package/dist/orchestrator/project-initializer.js +5 -2
- package/dist/orchestrator/project-initializer.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/run-test.md +109 -0
- package/dist/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/dist/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-api-design/SKILL.md +49 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +14 -3
- package/dist/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +120 -10
- package/dist/orchestrator/templates/ai-src/skills/sungen-locale/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +31 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +1 -1
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +9 -0
- package/dist/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +15 -0
- package/dist/orchestrator/templates/env.appium.example +21 -0
- package/dist/orchestrator/templates/specs-api.d.ts +4 -2
- package/dist/orchestrator/templates/specs-api.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-api.js +233 -10
- package/dist/orchestrator/templates/specs-api.js.map +1 -1
- package/dist/orchestrator/templates/specs-api.ts +214 -11
- package/dist/orchestrator/templates/specs-db.d.ts.map +1 -1
- package/dist/orchestrator/templates/specs-db.js +79 -6
- package/dist/orchestrator/templates/specs-db.js.map +1 -1
- package/dist/orchestrator/templates/specs-db.ts +70 -7
- package/dist/orchestrator/templates/specs-regex-escape.d.ts +13 -0
- package/dist/orchestrator/templates/specs-regex-escape.d.ts.map +1 -0
- package/dist/orchestrator/templates/specs-regex-escape.js +19 -0
- package/dist/orchestrator/templates/specs-regex-escape.js.map +1 -0
- package/dist/orchestrator/templates/specs-regex-escape.ts +16 -0
- package/dist/orchestrator/templates/specs-test-data.ts +53 -6
- package/dist/orchestrator/templates/wdio.conf.ts +126 -10
- package/dist/utils/selector-types.d.ts +1 -1
- package/dist/utils/selector-types.d.ts.map +1 -1
- package/dist/utils/selector-types.js +1 -0
- package/dist/utils/selector-types.js.map +1 -1
- package/package.json +8 -6
- package/src/capabilities/context-router.ts +13 -5
- package/src/cli/commands/capability.ts +4 -38
- package/src/cli/commands/changed.ts +104 -0
- package/src/cli/commands/delivery.ts +27 -2
- package/src/cli/commands/generate.ts +1 -1
- package/src/cli/commands/results-merge.ts +153 -0
- package/src/cli/commands/update.ts +72 -13
- package/src/cli/index.ts +4 -0
- package/src/exporters/api-catalog-loader.ts +10 -2
- package/src/exporters/api-testcase-formatter.ts +59 -3
- package/src/exporters/csv-exporter.ts +11 -2
- package/src/exporters/json-exporter.ts +7 -2
- package/src/exporters/matrix/build.ts +9 -0
- package/src/exporters/matrix/export.ts +1 -1
- package/src/exporters/matrix/render-csv.ts +5 -1
- package/src/exporters/matrix/render-xlsx.ts +4 -1
- package/src/exporters/matrix/types.ts +7 -0
- package/src/exporters/playwright-report-parser.ts +68 -9
- package/src/exporters/results-merge.ts +150 -0
- package/src/exporters/selector-key-resolver.ts +81 -1
- package/src/exporters/types.ts +8 -1
- package/src/exporters/xlsx-report-builder.ts +5 -4
- package/src/generators/gherkin-parser/index.ts +55 -1
- package/src/generators/test-generator/adapters/adapter-interface.ts +23 -1
- package/src/generators/test-generator/adapters/appium/appium-adapter.ts +2 -2
- package/src/generators/test-generator/adapters/appium/templates/imports.hbs +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/biometric-action.hbs +9 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/check-action.hbs +11 -6
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/date-picker-unsupported.hbs +4 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/deep-link-action.hbs +8 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/lifecycle-missing-app-id.hbs +5 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/location-services-action.hbs +11 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/reinstall-app-action.hbs +21 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/restart-app-action.hbs +16 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/set-connectivity-action.hbs +11 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/actions/uncheck-action.hbs +9 -5
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/checked-assertion.hbs +10 -4
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/device-log-assertion.hbs +16 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/disappears-within-assertion.hbs +5 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/matches-format-assertion.hbs +15 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/not-checked-assertion.hbs +6 -4
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/state-with-filter-assertion.hbs +4 -3
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/still-visible-after-assertion.hbs +4 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/assertions/visible-filtered-assertion.hbs +5 -2
- package/src/generators/test-generator/adapters/appium/templates/steps/gestures/pull-to-refresh-action.hbs +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/gestures/swipe-action.hbs +3 -0
- package/src/generators/test-generator/adapters/appium/templates/steps/partials/appium-selector.hbs +7 -1
- package/src/generators/test-generator/adapters/appium/templates/test-file.hbs +302 -29
- package/src/generators/test-generator/adapters/playwright/playwright-adapter.ts +2 -2
- package/src/generators/test-generator/adapters/playwright/templates/imports.hbs +3 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/actions/select-action.hbs +17 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/attribute-assertion.hbs +6 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/have-value-assertion.hbs +18 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/hidden-with-filter-assertion.hbs +5 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/matches-format-assertion.hbs +5 -0
- package/src/generators/test-generator/adapters/playwright/templates/steps/assertions/state-with-filter-assertion.hbs +4 -2
- package/src/generators/test-generator/adapters/playwright/templates/steps/navigation/wait-for-element-with-text.hbs +4 -1
- package/src/generators/test-generator/adapters/playwright/templates/steps/partials/recipe-expect-text.hbs +1 -1
- package/src/generators/test-generator/code-generator.ts +86 -7
- package/src/generators/test-generator/diagnostics.ts +60 -6
- package/src/generators/test-generator/patterns/expect-patterns.ts +37 -2
- package/src/generators/test-generator/patterns/index.ts +58 -33
- package/src/generators/test-generator/patterns/types.ts +36 -0
- package/src/generators/test-generator/patterns/unsupported-step-code.ts +19 -0
- package/src/generators/test-generator/recipe-expander.ts +9 -1
- package/src/generators/test-generator/reset-tier.ts +93 -0
- package/src/generators/test-generator/step-mapper.ts +149 -6
- package/src/generators/test-generator/template-engine.ts +22 -3
- package/src/generators/test-generator/utils/format-pattern.ts +79 -0
- package/src/generators/test-generator/utils/js-literal-scanner.ts +132 -0
- package/src/generators/test-generator/utils/mask-refs-for-matching.ts +21 -0
- package/src/generators/test-generator/utils/runtime-data-transformer.ts +126 -76
- package/src/generators/test-generator/utils/selector-resolver.ts +26 -1
- package/src/generators/test-generator/utils/spec-syntax-check.ts +22 -0
- package/src/harness/annotation-overrides.ts +10 -5
- package/src/harness/audit.ts +7 -5
- package/src/harness/capability-plan.ts +13 -6
- package/src/harness/capability.ts +16 -0
- package/src/harness/catalog/drivers.yaml +5 -0
- package/src/harness/parse.ts +7 -1
- package/src/harness/run-manifest.ts +254 -0
- package/src/harness/script-check.ts +6 -2
- package/src/harness/sensors.ts +5 -1
- package/src/harness/viewpoint-ledger.ts +26 -5
- package/src/index.ts +1 -0
- package/src/orchestrator/lockstep-version.ts +46 -0
- package/src/orchestrator/mobile-runtime-scaffolder.ts +5 -1
- package/src/orchestrator/project-deps-sync.ts +175 -0
- package/src/orchestrator/project-initializer.ts +5 -2
- package/src/orchestrator/templates/ai-src/commands/run-test.md +109 -0
- package/src/orchestrator/templates/ai-src/config/claude.md +1 -1
- package/src/orchestrator/templates/ai-src/config/copilot.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-api-design/SKILL.md +49 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-error-mapping/SKILL.md +14 -3
- package/src/orchestrator/templates/ai-src/skills/sungen-gherkin-syntax/SKILL.md +120 -10
- package/src/orchestrator/templates/ai-src/skills/sungen-locale/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-mobile-gestures/SKILL.md +31 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-selector-fix/SKILL.md +1 -1
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-generation/SKILL.md +9 -0
- package/src/orchestrator/templates/ai-src/skills/sungen-tc-review/SKILL.md +15 -0
- package/src/orchestrator/templates/env.appium.example +21 -0
- package/src/orchestrator/templates/specs-api.ts +214 -11
- package/src/orchestrator/templates/specs-db.ts +70 -7
- package/src/orchestrator/templates/specs-regex-escape.ts +16 -0
- package/src/orchestrator/templates/specs-test-data.ts +53 -6
- package/src/orchestrator/templates/wdio.conf.ts +126 -10
- package/src/utils/selector-types.ts +1 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.expectPatterns = void 0;
|
|
4
|
+
exports.literalExpr = literalExpr;
|
|
4
5
|
/**
|
|
5
6
|
* Data-vs-data assertions — compare two runtime values directly (no UI element).
|
|
6
7
|
* The primary use is asserting on an `@query`-bound result via path access, e.g.
|
|
@@ -22,6 +23,36 @@ const reExpect = new RegExp(`^\\s*(?:User\\s+)?expect\\s+(${VALUE})\\s+is\\s+(no
|
|
|
22
23
|
* GENERATOR gets the ORIGINAL step text, so it extracts the real `[Ref]`. */
|
|
23
24
|
const reMatchesSchemaMasked = /^\s*(?:User\s+)?expect\s+\{\{~\}\}\s+matches\s+schema\s+\[~\]\s*$/i;
|
|
24
25
|
const reMatchesSchema = new RegExp(`^\\s*(?:User\\s+)?expect\\s+(\\{\\{[^}]+\\}\\})\\s+matches\\s+schema\\s+\\[([A-Za-z0-9_.-]+)\\]\\s*$`, 'i');
|
|
26
|
+
/**
|
|
27
|
+
* `{{var}}` EMBEDDED in a quoted literal — test-data keys and paths only
|
|
28
|
+
* (`user.name`, `q.rows[0].id`, `items[*]`, kebab flow namespaces like
|
|
29
|
+
* `password-reset.email`). `{{$...}}` dynamic tokens are excluded on purpose:
|
|
30
|
+
* they have no test-data key, so converting one to a get() call throws
|
|
31
|
+
* "Test data key not found" at runtime — they stay literal.
|
|
32
|
+
*/
|
|
33
|
+
const RE_EMBEDDED_VAR = /\{\{\s*([\w.[\]*-]+?)\s*\}\}/g;
|
|
34
|
+
/** Escape static literal text for a template-literal context. */
|
|
35
|
+
const escapeForTemplate = (s) => s.replace(/\\/g, '\\\\').replace(/`/g, '\\`').replace(/\$\{/g, '\\${');
|
|
36
|
+
/**
|
|
37
|
+
* Render a quoted literal's BODY as a JS expression. Text without vars keeps
|
|
38
|
+
* its exact JSON.stringify shape; an embedded `{{var}}` interpolates the
|
|
39
|
+
* runtime value (the literal used to ship verbatim, so the assertion compared
|
|
40
|
+
* against the raw `{{...}}` text and could never pass with correct data).
|
|
41
|
+
*/
|
|
42
|
+
function literalExpr(text) {
|
|
43
|
+
const vars = [...text.matchAll(RE_EMBEDDED_VAR)];
|
|
44
|
+
if (vars.length === 0)
|
|
45
|
+
return JSON.stringify(text);
|
|
46
|
+
if (vars.length === 1 && vars[0][0] === text)
|
|
47
|
+
return `testData.get(${JSON.stringify(vars[0][1])})`;
|
|
48
|
+
let out = '';
|
|
49
|
+
let last = 0;
|
|
50
|
+
for (const m of vars) {
|
|
51
|
+
out += escapeForTemplate(text.slice(last, m.index)) + `\${testData.get(${JSON.stringify(m[1])})}`;
|
|
52
|
+
last = m.index + m[0].length;
|
|
53
|
+
}
|
|
54
|
+
return `\`${out + escapeForTemplate(text.slice(last))}\``;
|
|
55
|
+
}
|
|
25
56
|
/** Render a value token (`{{var}}` | "literal" | 'literal' | number) as a JS expression. */
|
|
26
57
|
function valueExpr(token) {
|
|
27
58
|
const t = token.trim();
|
|
@@ -30,7 +61,7 @@ function valueExpr(token) {
|
|
|
30
61
|
return `testData.get(${JSON.stringify(v[1])})`;
|
|
31
62
|
const q = t.match(/^["'](.*)["']$/);
|
|
32
63
|
if (q)
|
|
33
|
-
return
|
|
64
|
+
return literalExpr(q[1]);
|
|
34
65
|
if (/^-?\d+(?:\.\d+)?$/.test(t))
|
|
35
66
|
return t;
|
|
36
67
|
return JSON.stringify(t);
|
|
@@ -46,7 +77,10 @@ exports.expectPatterns = [
|
|
|
46
77
|
const m = step.text.match(reMatchesSchema);
|
|
47
78
|
if (!m)
|
|
48
79
|
return { code: `// TODO: malformed 'matches schema' step (expected: expect {{name.body}} matches schema [Ref]): ${step.text}`, comment: 'Unrecognized matches-schema step' };
|
|
49
|
-
|
|
80
|
+
// raw(), not get(): Ajv must receive the NATIVE bound object. get() serializes
|
|
81
|
+
// to JSON text, so every schema validation failed with "(root) must be object"
|
|
82
|
+
// no matter how correct the response body was.
|
|
83
|
+
const value = `testData.raw(${JSON.stringify(m[1].replace(/^\{\{\s*|\s*\}\}$/g, ''))})`;
|
|
50
84
|
const ref = m[2];
|
|
51
85
|
const code = `{ const __schema = api.assertSchema(${value}, ${JSON.stringify(ref)}); expect(__schema.ok, \`matches schema [${ref}]: \${__schema.errors}\`).toBe(true); }`;
|
|
52
86
|
return { code, comment: `Expect ${m[1]} matches schema [${ref}]` };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expect-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/expect-patterns.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"expect-patterns.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/expect-patterns.ts"],"names":[],"mappings":";;;AA8CA,kCAWC;AArDD;;;;;;;;;;;GAWG;AACH,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAA,+CAA+C,CAAC;AACxE,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,gCAAgC,KAAK,wDAAwD,KAAK,QAAQ,EAAE,GAAG,CAAC,CAAC;AAE7I;;;;8EAI8E;AAC9E,MAAM,qBAAqB,GAAG,oEAAoE,CAAC;AACnG,MAAM,eAAe,GAAG,IAAI,MAAM,CAAC,sGAAsG,EAAE,GAAG,CAAC,CAAC;AAEhJ;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,+BAA+B,CAAC;AAExD,iEAAiE;AACjE,MAAM,iBAAiB,GAAG,CAAC,CAAS,EAAU,EAAE,CAC9C,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AAEzE;;;;;GAKG;AACH,SAAgB,WAAW,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;IACjD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;QAAE,OAAO,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACnG,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,KAAM,CAAC,CAAC,GAAG,mBAAmB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnG,IAAI,GAAG,CAAC,CAAC,KAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,4FAA4F;AAC5F,SAAS,SAAS,CAAC,KAAa;IAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,IAAI,CAAC;QAAE,OAAO,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpC,IAAI,CAAC;QAAE,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAEY,QAAA,cAAc,GAAkB;IAC3C;QACE,IAAI,EAAE,uBAAuB;QAC7B,QAAQ,EAAE,EAAE,EAAE,qEAAqE;QACnF,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACpE,SAAS,EAAE,CAAC,IAAgB,EAAE,IAAoB,EAAc,EAAE;YAChE,+FAA+F;YAC/F,kGAAkG;YAClG,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC3C,IAAI,CAAC,CAAC;gBAAE,OAAO,EAAE,IAAI,EAAE,mGAAmG,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;YACrL,+EAA+E;YAC/E,+EAA+E;YAC/E,+CAA+C;YAC/C,MAAM,KAAK,GAAG,gBAAgB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC;YACxF,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,uCAAuC,KAAK,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,4CAA4C,GAAG,yCAAyC,CAAC;YAC1K,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAAC;QACrE,CAAC;KACF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,EAAE,EAAE,6DAA6D;QAC3E,OAAO,EAAE,CAAC,IAAgB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACvD,SAAS,EAAE,CAAC,IAAgB,EAAE,IAAoB,EAAc,EAAE;YAChE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAE,CAAC;YACrC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAY,CAAC;YACjB,IAAI,EAAE,KAAK,UAAU;gBAAE,IAAI,GAAG,iBAAiB,CAAC,oCAAoC,CAAC,KAAK,CAAC;iBACtF,IAAI,EAAE,KAAK,SAAS;gBAAE,IAAI,GAAG,iBAAiB,CAAC,iCAAiC,CAAC,KAAK,CAAC;iBACvF,IAAI,EAAE,KAAK,KAAK;gBAAE,IAAI,GAAG,iBAAiB,CAAC,sBAAsB,CAAC,KAAK,CAAC;;gBACxE,IAAI,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,CAAC;YACvD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC7E,CAAC;KACF;CACF,CAAC"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { ParsedStep } from '../../gherkin-parser';
|
|
2
2
|
import { MappedStep } from '../step-mapper';
|
|
3
3
|
import { StepPattern, PatternContext } from './types';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
* variable NAME — but matchers scan `step.text` with substring checks (e.g. `includes('click')`),
|
|
8
|
-
* so a data ref like `{{double_click_guard_account.email}}` would spuriously satisfy the click
|
|
9
|
-
* matcher and pre-empt fill. The content is replaced with an inert placeholder (`~` — carries no
|
|
10
|
-
* verb/keyword/digit substring) rather than emptied, so structural matchers that require a NON-EMPTY
|
|
11
|
-
* ref survive too — e.g. `expect {{a}} is {{b}}` matches `\{\{[^}]+\}\}`, and `in [X] table` /
|
|
12
|
-
* `/\bto\s+\[/` keep their delimiters. The resolver/generator always receives the ORIGINAL step, so
|
|
13
|
-
* value extraction and codegen are unaffected.
|
|
14
|
-
*/
|
|
15
|
-
export declare function maskRefsForMatching(text: string): string;
|
|
4
|
+
import { maskRefsForMatching } from '../utils/mask-refs-for-matching';
|
|
5
|
+
import { unsupportedStepCode } from './unsupported-step-code';
|
|
6
|
+
export { maskRefsForMatching, unsupportedStepCode };
|
|
16
7
|
/**
|
|
17
8
|
* `tap` is a synonym of `click` — for MATCHING only.
|
|
18
9
|
*
|
|
@@ -76,6 +67,22 @@ export declare class PatternRegistry {
|
|
|
76
67
|
* SG-W020 — the matched pattern declares `platforms` and the active one is not among them.
|
|
77
68
|
*/
|
|
78
69
|
private static platformMiss;
|
|
70
|
+
/**
|
|
71
|
+
* SG-E021 — the step carries a trailing state clause the matched pattern does not account for.
|
|
72
|
+
*
|
|
73
|
+
* Priority decides which pattern wins, and the winner is not always the one that reads the clause:
|
|
74
|
+
* `see [X] page is hidden` matched `page-assertion` (13) ahead of `is-hidden` (11), so `is hidden`
|
|
75
|
+
* was dropped and the step compiled to `toHaveURL(...)` — asserting the page IS shown, the exact
|
|
76
|
+
* inverse of the sentence, and passing. Nothing detected it, because the clause lived only inside
|
|
77
|
+
* `step.text` and each pattern re-regexed it privately.
|
|
78
|
+
*
|
|
79
|
+
* `states` makes the claim explicit and checkable: a pattern declares what its template accounts
|
|
80
|
+
* for, and anything else lands here. Strict reading — an ABSENT `states` accounts for nothing —
|
|
81
|
+
* because the failure modes are asymmetric. Under-declaring throws on valid input, which is loud,
|
|
82
|
+
* local, and fixed by one annotation. Over-declaring restores the silent inversion this exists to
|
|
83
|
+
* close, and nothing catches it again.
|
|
84
|
+
*/
|
|
85
|
+
private static stateMiss;
|
|
79
86
|
/**
|
|
80
87
|
* SG-E020 — the pattern is in-platform but the active adapter ships no template for it. A gap in
|
|
81
88
|
* the adapter, not in the authored Gherkin: name every coordinate a reader needs to act on it.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAK9D,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,CAAC;AASpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGnD;AAUD;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAqB;;IAMrC;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAK3C;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAejD;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,cAAc,GAAG,UAAU,GAAG,IAAI;IAmE1E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAwB3B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;IAwBxB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAmBlC;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAyBnC;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,WAAW,IAAI,WAAW,EAAE;IAI5B;;OAEG;IACH,eAAe,IAAI,MAAM;CAG1B;AAID,cAAc,SAAS,CAAC"}
|
|
@@ -14,27 +14,14 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.PatternRegistry = void 0;
|
|
18
|
-
exports.maskRefsForMatching = maskRefsForMatching;
|
|
17
|
+
exports.PatternRegistry = exports.unsupportedStepCode = exports.maskRefsForMatching = void 0;
|
|
19
18
|
exports.normalizeVerbs = normalizeVerbs;
|
|
20
19
|
const registry_1 = require("../../../capabilities/registry");
|
|
21
20
|
const discover_1 = require("../../../capabilities/discover");
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* so a data ref like `{{double_click_guard_account.email}}` would spuriously satisfy the click
|
|
27
|
-
* matcher and pre-empt fill. The content is replaced with an inert placeholder (`~` — carries no
|
|
28
|
-
* verb/keyword/digit substring) rather than emptied, so structural matchers that require a NON-EMPTY
|
|
29
|
-
* ref survive too — e.g. `expect {{a}} is {{b}}` matches `\{\{[^}]+\}\}`, and `in [X] table` /
|
|
30
|
-
* `/\bto\s+\[/` keep their delimiters. The resolver/generator always receives the ORIGINAL step, so
|
|
31
|
-
* value extraction and codegen are unaffected.
|
|
32
|
-
*/
|
|
33
|
-
function maskRefsForMatching(text) {
|
|
34
|
-
return text
|
|
35
|
-
.replace(/\{\{[^}]*\}\}/g, '{{~}}')
|
|
36
|
-
.replace(/\[[^\]]*\]/g, '[~]');
|
|
37
|
-
}
|
|
21
|
+
const mask_refs_for_matching_1 = require("../utils/mask-refs-for-matching");
|
|
22
|
+
Object.defineProperty(exports, "maskRefsForMatching", { enumerable: true, get: function () { return mask_refs_for_matching_1.maskRefsForMatching; } });
|
|
23
|
+
const unsupported_step_code_1 = require("./unsupported-step-code");
|
|
24
|
+
Object.defineProperty(exports, "unsupportedStepCode", { enumerable: true, get: function () { return unsupported_step_code_1.unsupportedStepCode; } });
|
|
38
25
|
/**
|
|
39
26
|
* Gesture forms that OWN the word "tap" — each has its own pattern keyed on it (`mobile-double-tap`
|
|
40
27
|
* at priority 17, `tap-top-of-element` at 18) and means MORE than a click. They are the one
|
|
@@ -88,22 +75,6 @@ function normalizeVerbs(text) {
|
|
|
88
75
|
* propagating untouched.
|
|
89
76
|
*/
|
|
90
77
|
const TEMPLATE_NOT_FOUND = /^Template not found: (.+)\.hbs in any subfolder$/;
|
|
91
|
-
/**
|
|
92
|
-
* The step body emitted in place of code the active adapter cannot produce. A comment alone would
|
|
93
|
-
* let the test go GREEN having asserted nothing — the silent-loss class this SPI exists to close —
|
|
94
|
-
* so the step throws at run time as well as reporting at compile time.
|
|
95
|
-
*
|
|
96
|
-
* `JSON.stringify` does the quoting, NOT a hand-rolled `replace(/'/g, …)`. The reason string embeds
|
|
97
|
-
* arbitrary author text (the step sentence), and hand-escaping only the quote character is wrong for
|
|
98
|
-
* any input containing a backslash or a raw newline: a step ending `…\` would emit `'…\\'`, whose
|
|
99
|
-
* trailing escaped-backslash-then-quote breaks the literal and takes the WHOLE generated spec down
|
|
100
|
-
* with a syntax error — reopening, one level deeper, the exact "one bad step kills the file" failure
|
|
101
|
-
* this function exists to prevent. Step text here is routinely non-ASCII (Vietnamese, Japanese),
|
|
102
|
-
* which JSON.stringify also handles correctly.
|
|
103
|
-
*/
|
|
104
|
-
function unsupportedStepCode(reason) {
|
|
105
|
-
return `throw new Error(${JSON.stringify(`[sungen] ${reason}`)});`;
|
|
106
|
-
}
|
|
107
78
|
/**
|
|
108
79
|
* Pattern Registry - manages all step patterns
|
|
109
80
|
*/
|
|
@@ -140,7 +111,7 @@ class PatternRegistry {
|
|
|
140
111
|
// THEN normalise `tap` → `click`, so the mobile phrasing reaches the whole shared vocabulary
|
|
141
112
|
// instead of only the three patterns that happen to key on "tap". Masking first is what keeps a
|
|
142
113
|
// `[Tap Water]` ref from being read as a verb.
|
|
143
|
-
const matchStep = { ...step, text: normalizeVerbs(maskRefsForMatching(step.text)) };
|
|
114
|
+
const matchStep = { ...step, text: normalizeVerbs((0, mask_refs_for_matching_1.maskRefsForMatching)(step.text)) };
|
|
144
115
|
for (const pattern of this.patterns) {
|
|
145
116
|
if (this.matchesPattern(matchStep, pattern.matcher)) {
|
|
146
117
|
return pattern;
|
|
@@ -159,7 +130,7 @@ class PatternRegistry {
|
|
|
159
130
|
// pattern in priority order instead of crashing or silently dropping the step.
|
|
160
131
|
// Matching mirrors findPattern exactly: refs masked FIRST (so `[Tap Water]` is not a
|
|
161
132
|
// verb), then `tap` → `click` normalisation for the mobile vocabulary.
|
|
162
|
-
const matchStep = { ...step, text: normalizeVerbs(maskRefsForMatching(step.text)) };
|
|
133
|
+
const matchStep = { ...step, text: normalizeVerbs((0, mask_refs_for_matching_1.maskRefsForMatching)(step.text)) };
|
|
163
134
|
for (const pattern of this.patterns) {
|
|
164
135
|
if (!this.matchesPattern(matchStep, pattern.matcher))
|
|
165
136
|
continue;
|
|
@@ -175,6 +146,16 @@ class PatternRegistry {
|
|
|
175
146
|
const resolved = pattern.resolver(step, context);
|
|
176
147
|
if (!resolved)
|
|
177
148
|
continue; // resolver declined — fall through
|
|
149
|
+
// State-clause gate. Deliberately AFTER the resolver, not before it: a resolver may return
|
|
150
|
+
// null to say "not mine after all", and the search then continues to a lower-priority
|
|
151
|
+
// pattern that may well be the one that asserts the state. Gating earlier judged a pattern
|
|
152
|
+
// that had not yet claimed the step — `row-count` declines a non-numeric `{{value}}` so
|
|
153
|
+
// `see [R] row with {{status_label}} is disabled` should reach see-with-variable-disabled,
|
|
154
|
+
// but the gate short-circuited it into a throw. Only the pattern that actually OWNS the
|
|
155
|
+
// step gets to be judged on what it drops.
|
|
156
|
+
const resolverStateMiss = PatternRegistry.stateMiss(pattern, context, step);
|
|
157
|
+
if (resolverStateMiss)
|
|
158
|
+
return resolverStateMiss;
|
|
178
159
|
// Auto-inject parent scoping if step has parentRef
|
|
179
160
|
// Skip for table-* patterns — they resolve the table name internally from step text
|
|
180
161
|
if (step.parentRef && step.parentType && !pattern.name.startsWith('table-')) {
|
|
@@ -187,6 +168,10 @@ class PatternRegistry {
|
|
|
187
168
|
};
|
|
188
169
|
}
|
|
189
170
|
if (pattern.generator) {
|
|
171
|
+
// A legacy generator has no decline path, so this pattern owns the step already.
|
|
172
|
+
const generatorStateMiss = PatternRegistry.stateMiss(pattern, context, step);
|
|
173
|
+
if (generatorStateMiss)
|
|
174
|
+
return generatorStateMiss;
|
|
190
175
|
return pattern.generator(step, context);
|
|
191
176
|
}
|
|
192
177
|
return null;
|
|
@@ -220,10 +205,45 @@ class PatternRegistry {
|
|
|
220
205
|
step: step.text,
|
|
221
206
|
});
|
|
222
207
|
return {
|
|
223
|
-
code: unsupportedStepCode(reason),
|
|
208
|
+
code: (0, unsupported_step_code_1.unsupportedStepCode)(reason),
|
|
224
209
|
comment: `${supported}-only step on the ${adapter} adapter — see SG-W020`,
|
|
225
210
|
};
|
|
226
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* SG-E021 — the step carries a trailing state clause the matched pattern does not account for.
|
|
214
|
+
*
|
|
215
|
+
* Priority decides which pattern wins, and the winner is not always the one that reads the clause:
|
|
216
|
+
* `see [X] page is hidden` matched `page-assertion` (13) ahead of `is-hidden` (11), so `is hidden`
|
|
217
|
+
* was dropped and the step compiled to `toHaveURL(...)` — asserting the page IS shown, the exact
|
|
218
|
+
* inverse of the sentence, and passing. Nothing detected it, because the clause lived only inside
|
|
219
|
+
* `step.text` and each pattern re-regexed it privately.
|
|
220
|
+
*
|
|
221
|
+
* `states` makes the claim explicit and checkable: a pattern declares what its template accounts
|
|
222
|
+
* for, and anything else lands here. Strict reading — an ABSENT `states` accounts for nothing —
|
|
223
|
+
* because the failure modes are asymmetric. Under-declaring throws on valid input, which is loud,
|
|
224
|
+
* local, and fixed by one annotation. Over-declaring restores the silent inversion this exists to
|
|
225
|
+
* close, and nothing catches it again.
|
|
226
|
+
*/
|
|
227
|
+
static stateMiss(pattern, context, step) {
|
|
228
|
+
const state = step.state;
|
|
229
|
+
if (!state)
|
|
230
|
+
return null;
|
|
231
|
+
if (pattern.states?.includes(state))
|
|
232
|
+
return null;
|
|
233
|
+
const reason = `step "${step.text}" carries the state clause "is ${state}", but the pattern that matched it ` +
|
|
234
|
+
`("${pattern.name}") does not assert that state — the clause would be SILENTLY DROPPED and the ` +
|
|
235
|
+
`step would check something other than what it reads as. Use a step form that owns the state ` +
|
|
236
|
+
`(e.g. "User see [Ref] <type> is ${state}" on the element itself), or drop the clause if the ` +
|
|
237
|
+
`bare assertion is what you meant. If sungen cannot express the check, tag the scenario @manual.`;
|
|
238
|
+
context.diagnostics?.add('SG-E021', reason, {
|
|
239
|
+
feature: context.featureName,
|
|
240
|
+
step: step.text,
|
|
241
|
+
});
|
|
242
|
+
return {
|
|
243
|
+
code: (0, unsupported_step_code_1.unsupportedStepCode)(reason),
|
|
244
|
+
comment: `"is ${state}" not asserted by "${pattern.name}" — see SG-E021`,
|
|
245
|
+
};
|
|
246
|
+
}
|
|
227
247
|
/**
|
|
228
248
|
* SG-E020 — the pattern is in-platform but the active adapter ships no template for it. A gap in
|
|
229
249
|
* the adapter, not in the authored Gherkin: name every coordinate a reader needs to act on it.
|
|
@@ -238,7 +258,7 @@ class PatternRegistry {
|
|
|
238
258
|
step: step.text,
|
|
239
259
|
});
|
|
240
260
|
return {
|
|
241
|
-
code: unsupportedStepCode(reason),
|
|
261
|
+
code: (0, unsupported_step_code_1.unsupportedStepCode)(reason),
|
|
242
262
|
comment: `no ${adapter} template for "${templateName}" — see SG-E020`,
|
|
243
263
|
};
|
|
244
264
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,15 @@ export interface DiagnosticsSink {
|
|
|
19
19
|
* behaviour.
|
|
20
20
|
*/
|
|
21
21
|
export type Platform = 'web' | 'mobile';
|
|
22
|
+
/**
|
|
23
|
+
* The canonical state clauses an assertion step may carry, exactly as documented for authors in
|
|
24
|
+
* `README.md` ("States") and in the `sungen-gherkin-syntax` skill. Deliberately CLOSED: real feature
|
|
25
|
+
* files carry trailing phrases like `is rejected` / `is active` / `is unchanged` that belong to other
|
|
26
|
+
* grammars or are prose, and reading those as state clauses would put valid steps in front of the
|
|
27
|
+
* SG-E021 gate. Widening this union widens that gate — add a member only alongside a pattern that
|
|
28
|
+
* asserts it.
|
|
29
|
+
*/
|
|
30
|
+
export type StateClause = 'hidden' | 'visible' | 'disabled' | 'enabled' | 'checked' | 'unchecked' | 'focused' | 'empty' | 'loading' | 'selected' | 'sorted ascending' | 'sorted descending';
|
|
22
31
|
/**
|
|
23
32
|
* Pattern matcher function or regex
|
|
24
33
|
*/
|
|
@@ -99,5 +108,19 @@ export interface StepPattern {
|
|
|
99
108
|
* emitted when absent.
|
|
100
109
|
*/
|
|
101
110
|
platformAlternative?: string;
|
|
111
|
+
/**
|
|
112
|
+
* State clauses this pattern's generated code ACTUALLY asserts. ABSENT = asserts none.
|
|
113
|
+
*
|
|
114
|
+
* The contract runs in one direction and is easy to get backwards: declaring a state is a promise
|
|
115
|
+
* that the emitted code checks it. A pattern that wins a step carrying an UNDECLARED state clause
|
|
116
|
+
* emits SG-E021 and compiles to a loud `throw`, because the alternative is what this field exists
|
|
117
|
+
* to prevent — the clause being silently dropped and the assertion reading as something it is not.
|
|
118
|
+
* (`see [X] page is hidden` matched `page-assertion` at a higher priority than `is-hidden`, so the
|
|
119
|
+
* clause vanished and the step asserted the OPPOSITE: that the page IS displayed.)
|
|
120
|
+
*
|
|
121
|
+
* So: under-declaring throws on valid input, over-declaring re-opens the silent-drop hole. Declare
|
|
122
|
+
* a state only after reading the template the resolver names.
|
|
123
|
+
*/
|
|
124
|
+
states?: ReadonlyArray<StateClause>;
|
|
102
125
|
}
|
|
103
126
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The step body emitted in place of code sungen cannot honestly produce — because the active adapter
|
|
3
|
+
* ships no template for it (SG-E020), because the pattern is off-platform (SG-W020), because the
|
|
4
|
+
* matched pattern would silently DROP the author's state clause (SG-E021), or because no pattern
|
|
5
|
+
* matched at all (SG-W001/SG-W011). A comment alone would let the test go GREEN having asserted
|
|
6
|
+
* nothing — the silent-loss class these diagnostics exist to close — so the step throws at run time
|
|
7
|
+
* as well as reporting at compile time.
|
|
8
|
+
*
|
|
9
|
+
* `JSON.stringify` does the quoting, NOT a hand-rolled `replace(/'/g, …)`. The reason string embeds
|
|
10
|
+
* arbitrary author text (the step sentence), and hand-escaping only the quote character is wrong for
|
|
11
|
+
* any input containing a backslash or a raw newline: a step ending `…\` would emit `'…\\'`, whose
|
|
12
|
+
* trailing escaped-backslash-then-quote breaks the literal and takes the WHOLE generated spec down
|
|
13
|
+
* with a syntax error — reopening, one level deeper, the exact "one bad step kills the file" failure
|
|
14
|
+
* this function exists to prevent. Step text here is routinely non-ASCII (Vietnamese, Japanese),
|
|
15
|
+
* which JSON.stringify also handles correctly.
|
|
16
|
+
*/
|
|
17
|
+
export declare function unsupportedStepCode(reason: string): string;
|
|
18
|
+
//# sourceMappingURL=unsupported-step-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsupported-step-code.d.ts","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/unsupported-step-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.unsupportedStepCode = unsupportedStepCode;
|
|
4
|
+
/**
|
|
5
|
+
* The step body emitted in place of code sungen cannot honestly produce — because the active adapter
|
|
6
|
+
* ships no template for it (SG-E020), because the pattern is off-platform (SG-W020), because the
|
|
7
|
+
* matched pattern would silently DROP the author's state clause (SG-E021), or because no pattern
|
|
8
|
+
* matched at all (SG-W001/SG-W011). A comment alone would let the test go GREEN having asserted
|
|
9
|
+
* nothing — the silent-loss class these diagnostics exist to close — so the step throws at run time
|
|
10
|
+
* as well as reporting at compile time.
|
|
11
|
+
*
|
|
12
|
+
* `JSON.stringify` does the quoting, NOT a hand-rolled `replace(/'/g, …)`. The reason string embeds
|
|
13
|
+
* arbitrary author text (the step sentence), and hand-escaping only the quote character is wrong for
|
|
14
|
+
* any input containing a backslash or a raw newline: a step ending `…\` would emit `'…\\'`, whose
|
|
15
|
+
* trailing escaped-backslash-then-quote breaks the literal and takes the WHOLE generated spec down
|
|
16
|
+
* with a syntax error — reopening, one level deeper, the exact "one bad step kills the file" failure
|
|
17
|
+
* this function exists to prevent. Step text here is routinely non-ASCII (Vietnamese, Japanese),
|
|
18
|
+
* which JSON.stringify also handles correctly.
|
|
19
|
+
*/
|
|
20
|
+
function unsupportedStepCode(reason) {
|
|
21
|
+
return `throw new Error(${JSON.stringify(`[sungen] ${reason}`)});`;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=unsupported-step-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unsupported-step-code.js","sourceRoot":"","sources":["../../../../src/generators/test-generator/patterns/unsupported-step-code.ts"],"names":[],"mappings":";;AAgBA,kDAEC;AAlBD;;;;;;;;;;;;;;;GAeG;AACH,SAAgB,mBAAmB,CAAC,MAAc;IAChD,OAAO,mBAAmB,IAAI,CAAC,SAAS,CAAC,YAAY,MAAM,EAAE,CAAC,IAAI,CAAC;AACrE,CAAC"}
|
|
@@ -89,8 +89,16 @@ function expandPrimitive(prim, ctx, itemVar) {
|
|
|
89
89
|
return { partial: 'recipe-click-text', targetExpr: expr };
|
|
90
90
|
}
|
|
91
91
|
case 'expectText': {
|
|
92
|
+
// `exact: true` asserts the element's WHOLE text (toHaveText) instead of a substring
|
|
93
|
+
// (toContainText) — same opt-in flag `clickText` carries. Substring stays the default so
|
|
94
|
+
// existing recipes keep their behavior.
|
|
92
95
|
const o = (typeof arg === 'object' && arg !== null ? arg : {});
|
|
93
|
-
return {
|
|
96
|
+
return {
|
|
97
|
+
partial: 'recipe-expect-text',
|
|
98
|
+
targetExpr: targetExpr(o.locator ?? '$trigger'),
|
|
99
|
+
valueExpr: valueExpr(o.value ?? '$value'),
|
|
100
|
+
exact: o.exact === true,
|
|
101
|
+
};
|
|
94
102
|
}
|
|
95
103
|
case 'expectValue': {
|
|
96
104
|
const o = (typeof arg === 'object' && arg !== null ? arg : {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recipe-expander.js","sourceRoot":"","sources":["../../../src/generators/test-generator/recipe-expander.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"recipe-expander.js","sourceRoot":"","sources":["../../../src/generators/test-generator/recipe-expander.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mobile reset tiers — how much state a scenario starts from.
|
|
3
|
+
*
|
|
4
|
+
* Web gets a clean slate for free: a URL reload is effectively a fresh state. Mobile does not. To save
|
|
5
|
+
* time, mobile automation keeps the app alive across a whole session, so the end state of one scenario
|
|
6
|
+
* becomes the start state of the next — which breaks test independence three ways: scenarios can no
|
|
7
|
+
* longer run in isolation or in parallel, a "nearly right" leftover state makes the FOLLOWING scenario
|
|
8
|
+
* fail for reasons that have nothing to do with it, and a scenario that dies mid-flow poisons every
|
|
9
|
+
* scenario after it.
|
|
10
|
+
*
|
|
11
|
+
* The reason nobody just reinstalls between scenarios is cost: a cold start is 5–30s, which across a
|
|
12
|
+
* large suite is the whole CI budget. So the state layers (local DB, cache, prefs, keychain, OS
|
|
13
|
+
* permissions) need a LADDER rather than one all-or-nothing switch — the same conclusion every major
|
|
14
|
+
* framework reached (Appium's `mobile: clearApp`, Detox's `device.reloadReactNative()`, the OS-level
|
|
15
|
+
* reset APIs in XCUITest/Espresso).
|
|
16
|
+
*
|
|
17
|
+
* none — nothing is reset. State carries over BY DESIGN (a cart that accumulates across scenarios).
|
|
18
|
+
* soft — terminateApp + activateApp. Clears in-memory state and the navigation stack. THE DEFAULT,
|
|
19
|
+
* and exactly what the compiler emitted before tiers existed, so no existing suite changes.
|
|
20
|
+
* data — soft + wipe the app's data layer (local DB, cache, prefs, keychain).
|
|
21
|
+
* full — remove + reinstall. Also resets permissions and any install-time state.
|
|
22
|
+
*
|
|
23
|
+
* Declared per feature via `@reset:<tier>`; a run can RAISE the floor with SUNGEN_RESET_TIER without
|
|
24
|
+
* regenerating specs (resolved inside the generated spec, the same runtime model as test-data overlays).
|
|
25
|
+
*/
|
|
26
|
+
/** Ordered weakest → strongest. Index order IS the comparison, so never reorder this. */
|
|
27
|
+
export declare const RESET_TIERS: readonly ["none", "soft", "data", "full"];
|
|
28
|
+
export type ResetTier = (typeof RESET_TIERS)[number];
|
|
29
|
+
/**
|
|
30
|
+
* `soft` — the behaviour the appium adapter emitted before tiers existed. Keeping it the default is
|
|
31
|
+
* what makes this feature additive: an untagged feature compiles to the same spec it did before.
|
|
32
|
+
*/
|
|
33
|
+
export declare const DEFAULT_RESET_TIER: ResetTier;
|
|
34
|
+
/**
|
|
35
|
+
* Read the `@reset:<tier>` tag off a tag list.
|
|
36
|
+
*
|
|
37
|
+
* Returns `undefined` when no `@reset:` tag is present — deliberately NOT the default. Callers need to
|
|
38
|
+
* tell "absent" from "explicitly soft": a scenario with no tag must inherit its feature's tier, and
|
|
39
|
+
* collapsing absent into `soft` here would silently RAISE a `@reset:none` feature.
|
|
40
|
+
*
|
|
41
|
+
* An unrecognized value warns and yields the default rather than throwing, matching how `@cleanup:`
|
|
42
|
+
* handles an unknown key — a typo in a tag should not stop a build.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseResetTier(tags: string[]): ResetTier | undefined;
|
|
45
|
+
/** The stronger of two tiers. Used to combine a declared tier with a run-level floor. */
|
|
46
|
+
export declare function maxResetTier(a: ResetTier, b: ResetTier): ResetTier;
|
|
47
|
+
/**
|
|
48
|
+
* One rung harder — what the NEXT scenario resets to after this one failed.
|
|
49
|
+
*
|
|
50
|
+
* A failed scenario left unknown state behind (a half-written local DB, an open modal) that a plain
|
|
51
|
+
* process relaunch does not undo, so the scenario after it deserves a stronger reset than it asked for.
|
|
52
|
+
*
|
|
53
|
+
* `none` is a FIXED POINT, on purpose. It is an explicit "state carries over" contract — a chain of
|
|
54
|
+
* scenarios building up one cart. Escalating it would silently break that contract, and the chain is
|
|
55
|
+
* already dead once one link fails, so the relaunch would only change how the rest fail, not whether.
|
|
56
|
+
*
|
|
57
|
+
* Applies to the next DIFFERENT scenario only — never to a RETRY of the one that just failed. The
|
|
58
|
+
* runner re-runs a failed scenario, and giving attempt 2 a stronger reset would break the guarantee
|
|
59
|
+
* `mochaOpts.retries` rests on: race victims recover on attempt 2, real failures fail both attempts.
|
|
60
|
+
* A dirty-state failure IS a real failure; if its retry silently got a wiped data layer it would pass,
|
|
61
|
+
* the reporter keeps the last attempt, and a scenario that only works after a wipe would ship as a
|
|
62
|
+
* clean `Passed`. That false pass is worse than the flakiness escalation was added to fix.
|
|
63
|
+
*
|
|
64
|
+
* The generated spec emits this same ladder inline; both exist so the compiler and the runtime cannot
|
|
65
|
+
* drift apart, and a test asserts they agree.
|
|
66
|
+
*/
|
|
67
|
+
export declare function escalateResetTier(tier: ResetTier): ResetTier;
|
|
68
|
+
//# sourceMappingURL=reset-tier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reset-tier.d.ts","sourceRoot":"","sources":["../../../src/generators/test-generator/reset-tier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,yFAAyF;AACzF,eAAO,MAAM,WAAW,2CAA4C,CAAC;AAErE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAkB,CAAC;AAMpD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,SAAS,CAOpE;AAED,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,SAAS,CAElE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAO5D"}
|