@pixel-point/toolcraft 0.0.14 → 0.0.15
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 +13 -2
- package/package.json +1 -1
- package/scripts/prepare-pack.mjs +2 -28
- package/src/cli-io.mjs +174 -0
- package/src/cli-package-manager-flow.test.mjs +206 -0
- package/src/cli.mjs +7 -495
- package/src/cli.test.mjs +34 -177
- package/src/create-command.mjs +152 -0
- package/src/create-options.mjs +194 -0
- package/src/generate-test-assertions.mjs +27 -0
- package/src/generate-test-doc-assertions.mjs +162 -0
- package/src/generate-test-file-assertions.mjs +251 -0
- package/src/generate-test-fs-utils.mjs +59 -0
- package/src/generate-test-integrity-assertions.mjs +30 -0
- package/src/generate-test-integrity-framework-assertions.mjs +222 -0
- package/src/generate-test-integrity-manifest-assertions.mjs +150 -0
- package/src/generate-test-integrity-ownership-assertions.mjs +127 -0
- package/src/generate-test-integrity-test-utils.mjs +102 -0
- package/src/generate-test-package-assertions.mjs +75 -0
- package/src/generate-test-product-fixture.mjs +84 -0
- package/src/generate-test-product-fixture.test.mjs +73 -0
- package/src/generate-test-standalone-assertions.mjs +209 -0
- package/src/generate-transactional.test.mjs +151 -0
- package/src/generate.mjs +182 -102
- package/src/generate.test.mjs +242 -338
- package/src/generated-integrity-manifest.mjs +127 -0
- package/src/generated-integrity-manifest.test.mjs +151 -0
- package/src/generated-source-policy.mjs +22 -0
- package/src/generated-source-policy.test.mjs +35 -0
- package/src/generated-target-policy.mjs +55 -0
- package/src/generation-transaction.mjs +135 -0
- package/src/generation-transaction.test.mjs +74 -0
- package/src/package-json.mjs +18 -1
- package/src/package-json.test.mjs +38 -5
- package/src/package-manager.mjs +2 -0
- package/src/package-manager.test.mjs +5 -1
- package/src/packaged-template-fallback.test.mjs +126 -0
- package/src/prepare-pack-templates.mjs +34 -0
- package/templates/runtime/contracts/component-contract-builders.ts +95 -0
- package/templates/runtime/contracts/component-contracts.choices.test.ts +293 -0
- package/templates/runtime/contracts/component-contracts.choices.ts +322 -0
- package/templates/runtime/contracts/component-contracts.inputs.test.ts +210 -0
- package/templates/runtime/contracts/component-contracts.inputs.ts +252 -0
- package/templates/runtime/contracts/component-contracts.media-custom.test.ts +116 -0
- package/templates/runtime/contracts/component-contracts.media-custom.ts +144 -0
- package/templates/runtime/contracts/component-contracts.runtime-acceptance.test.ts +229 -0
- package/templates/runtime/contracts/component-contracts.runtime-labels.test.ts +76 -0
- package/templates/runtime/contracts/component-contracts.runtime-panels.test.ts +135 -0
- package/templates/runtime/contracts/component-contracts.runtime-shell.test.ts +148 -0
- package/templates/runtime/contracts/component-contracts.runtime.ts +361 -0
- package/templates/runtime/contracts/component-contracts.test.ts +39 -1458
- package/templates/runtime/contracts/component-contracts.ts +44 -1505
- package/templates/runtime/contracts/component-contracts.visual.test.ts +316 -0
- package/templates/runtime/contracts/component-contracts.visual.ts +385 -0
- package/templates/runtime/contracts/contract-manifest.test.ts +64 -0
- package/templates/runtime/contracts/decision-contracts.test.ts +29 -4
- package/templates/runtime/contracts/decision-contracts.ts +38 -1
- package/templates/runtime/index.ts +1 -0
- package/templates/runtime/react/{runtime-public-api.test.tsx → app-shell/runtime-public-api.test.tsx} +29 -7
- package/templates/runtime/react/{settings-transfer.test.ts → app-shell/settings-transfer.test.ts} +4 -4
- package/templates/runtime/react/{settings-transfer.ts → app-shell/settings-transfer.ts} +3 -3
- package/templates/runtime/react/{toolbar-panel.test.tsx → app-shell/toolbar-panel.test.tsx} +2 -2
- package/templates/runtime/react/{toolbar-panel.tsx → app-shell/toolbar-panel.tsx} +3 -3
- package/templates/runtime/react/{toolcraft-app.integration.test.tsx → app-shell/toolcraft-app.integration.test.tsx} +6 -6
- package/templates/runtime/react/{toolcraft-app.test.tsx → app-shell/toolcraft-app.test.tsx} +3 -3
- package/templates/runtime/react/{toolcraft-app.tsx → app-shell/toolcraft-app.tsx} +11 -8
- package/templates/runtime/react/{toolcraft-root.test.tsx → app-shell/toolcraft-root.test.tsx} +1 -1
- package/templates/runtime/react/{toolcraft-root.tsx → app-shell/toolcraft-root.tsx} +5 -5
- package/templates/runtime/react/{use-toolcraft.ts → app-shell/use-toolcraft.ts} +1 -1
- package/templates/runtime/react/canvas/canvas-default-media-layer.tsx +81 -0
- package/templates/runtime/react/canvas/canvas-media-transform.ts +33 -0
- package/templates/runtime/react/canvas/canvas-shell-interactions.test.tsx +156 -0
- package/templates/runtime/react/canvas/canvas-shell-media-rendering.test.tsx +87 -0
- package/templates/runtime/react/canvas/canvas-shell-rendering.test.tsx +102 -0
- package/templates/runtime/react/canvas/canvas-shell-test-utils.tsx +108 -0
- package/templates/runtime/react/canvas/canvas-shell-upload.test.tsx +106 -0
- package/templates/runtime/react/canvas/canvas-shell.tsx +146 -0
- package/templates/runtime/react/canvas/canvas-upload-routing.ts +84 -0
- package/templates/runtime/react/{media-file.ts → canvas/media-file.ts} +1 -1
- package/templates/runtime/react/canvas/use-canvas-drop-import.ts +145 -0
- package/templates/runtime/react/canvas/use-canvas-viewport-interactions.ts +227 -0
- package/templates/runtime/react/controls-panel/__tests__/control-conditions.test.ts +89 -0
- package/templates/runtime/react/{controls-panel-filedrop-reorder.test.tsx → controls-panel/__tests__/controls-panel-filedrop-reorder.test.tsx} +4 -4
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.actions-layout.test.tsx +91 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.collection-actions.test.tsx +213 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-layout.test.tsx +366 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.color-picker-models.test.tsx +169 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.compound-layout.test.tsx +160 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.control-visibility.test.tsx +352 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.curves.test.tsx +226 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.floating-shell.test.tsx +13 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.font-picker.test.tsx +302 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.footer-actions.test.tsx +401 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.gradient-control.test.tsx +139 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.help-policy.test.tsx +103 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.image-picker.test.tsx +16 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.inline-layout.test.tsx +290 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.keyframes.test.tsx +175 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-files.test.tsx +121 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-image.test.tsx +363 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.media-upload-multi-image.test.tsx +105 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.range-slider-editing.test.tsx +149 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.section-shell.test.tsx +138 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.select-layout.test.tsx +148 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.setup-controls.test.tsx +189 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.slider-rendering.test.tsx +317 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.state-reset.test.tsx +137 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.structure.test.tsx +66 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.text-input.test.tsx +205 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-interaction.test.tsx +388 -0
- package/templates/runtime/react/controls-panel/__tests__/controls-panel.vector-layout.test.tsx +155 -0
- package/templates/runtime/react/controls-panel/actions/controls-panel-actions.ts +172 -0
- package/templates/runtime/react/{control-conditions.ts → controls-panel/conditions/control-conditions.ts} +26 -3
- package/templates/runtime/react/{control-renderers.ts → controls-panel/control-renderers.ts} +2 -2
- package/templates/runtime/react/controls-panel/controls-panel.tsx +250 -0
- package/templates/runtime/react/controls-panel/keyframes/controls-panel-keyframes.tsx +265 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-collapse-storage.ts +131 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-help.tsx +132 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-inline-layout.tsx +311 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-layout.tsx +216 -0
- package/templates/runtime/react/controls-panel/layout/controls-panel-section.tsx +401 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-action-renderer.tsx +137 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-basic-renderers.tsx +421 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-collection-renderer.tsx +286 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-compound-renderers.tsx +366 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-media-renderer.tsx +173 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.test.ts +23 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-renderer-registry.ts +55 -0
- package/templates/runtime/react/controls-panel/renderers/controls-panel-settings-transfer-renderer.tsx +45 -0
- package/templates/runtime/react/controls-panel/testing/controls-panel-test-utils.tsx +300 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-aspect-ratio-values.ts +94 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-collection-values.ts +87 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-color-values.ts +82 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-font-values.ts +69 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-spatial-values.ts +64 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-value-labels.ts +93 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-value-primitives.ts +30 -0
- package/templates/runtime/react/controls-panel/values/controls-panel-values.ts +7 -0
- package/templates/runtime/react/index.ts +13 -13
- package/templates/runtime/react/{layer-tree.ts → layers/layer-tree.ts} +1 -1
- package/templates/runtime/react/layers/layers-panel-drag-drop.test.tsx +190 -0
- package/templates/runtime/react/layers/layers-panel-editing.test.tsx +41 -0
- package/templates/runtime/react/layers/layers-panel-insert-targets.test.ts +87 -0
- package/templates/runtime/react/layers/layers-panel-insert-targets.ts +254 -0
- package/templates/runtime/react/layers/layers-panel-model.ts +15 -0
- package/templates/runtime/react/layers/layers-panel-rendering.test.tsx +43 -0
- package/templates/runtime/react/layers/layers-panel-reorder.ts +148 -0
- package/templates/runtime/react/layers/layers-panel-row.tsx +475 -0
- package/templates/runtime/react/layers/layers-panel-test-utils.tsx +135 -0
- package/templates/runtime/react/layers/layers-panel-visibility.test.tsx +126 -0
- package/templates/runtime/react/layers/layers-panel.tsx +349 -0
- package/templates/runtime/react/layers/use-layers-panel-drag-controller.ts +327 -0
- package/templates/runtime/react/{panel-host-types.ts → panel-host/panel-host-types.ts} +2 -2
- package/templates/runtime/react/{panel-host.test.tsx → panel-host/panel-host.test.tsx} +3 -3
- package/templates/runtime/react/{panel-host.tsx → panel-host/panel-host.tsx} +1 -1
- package/templates/runtime/react/timeline/timeline-easing-editor.tsx +409 -0
- package/templates/runtime/react/timeline/timeline-easing-geometry.ts +42 -0
- package/templates/runtime/react/timeline/timeline-easing-icons.tsx +135 -0
- package/templates/runtime/react/timeline/timeline-easing-model.test.ts +87 -0
- package/templates/runtime/react/timeline/timeline-easing-model.ts +271 -0
- package/templates/runtime/react/timeline/timeline-easing-popover-content.tsx +227 -0
- package/templates/runtime/react/timeline/timeline-easing-popover-layout.ts +69 -0
- package/templates/runtime/react/timeline/timeline-easing-popover.tsx +60 -0
- package/templates/runtime/react/timeline/timeline-event-targets.ts +19 -0
- package/templates/runtime/react/timeline/timeline-expanded-content.tsx +299 -0
- package/templates/runtime/react/timeline/timeline-icon-button.tsx +51 -0
- package/templates/runtime/react/timeline/timeline-keyframe-row.tsx +360 -0
- package/templates/runtime/react/timeline/timeline-keyframes.ts +23 -0
- package/templates/runtime/react/timeline/timeline-panel-floating-layout.test.tsx +328 -0
- package/templates/runtime/react/timeline/timeline-panel-header.tsx +404 -0
- package/templates/runtime/react/timeline/timeline-panel-keyframes.test.tsx +90 -0
- package/templates/runtime/react/timeline/timeline-panel-layout.ts +30 -0
- package/templates/runtime/react/timeline/timeline-panel-responsive-layout.ts +182 -0
- package/templates/runtime/react/timeline/timeline-panel-test-utils.tsx +88 -0
- package/templates/runtime/react/timeline/timeline-panel-transport.test.tsx +202 -0
- package/templates/runtime/react/timeline/timeline-panel-upload.test.tsx +53 -0
- package/templates/runtime/react/timeline/timeline-panel.tsx +449 -0
- package/templates/runtime/react/timeline/timeline-playback-hooks.ts +254 -0
- package/templates/runtime/schema/assembly-contract.ts +271 -0
- package/templates/runtime/schema/control-schema-normalization.ts +55 -0
- package/templates/runtime/schema/controls-panel-actions.ts +141 -0
- package/templates/runtime/schema/controls-panel-layout-groups.ts +144 -0
- package/templates/runtime/schema/controls-panel-normalization.ts +19 -0
- package/templates/runtime/schema/controls-panel-section-layout.ts +140 -0
- package/templates/runtime/schema/controls-panel-section-titles.ts +161 -0
- package/templates/runtime/schema/define-toolcraft-test-utils.ts +18 -0
- package/templates/runtime/schema/define-toolcraft.actions.test.ts +182 -0
- package/templates/runtime/schema/define-toolcraft.assembly.test.ts +246 -0
- package/templates/runtime/schema/define-toolcraft.canvas.test.ts +150 -0
- package/templates/runtime/schema/define-toolcraft.control-layout.test.ts +345 -0
- package/templates/runtime/schema/define-toolcraft.control-sections.test.ts +304 -0
- package/templates/runtime/schema/define-toolcraft.setup-canvas.test.ts +69 -0
- package/templates/runtime/schema/define-toolcraft.setup-persistence.test.ts +66 -0
- package/templates/runtime/schema/define-toolcraft.setup-render-scale-timeline.test.ts +116 -0
- package/templates/runtime/schema/define-toolcraft.setup-settings-transfer.test.ts +291 -0
- package/templates/runtime/schema/define-toolcraft.ts +24 -1449
- package/templates/runtime/schema/panels-schema-normalization.ts +49 -0
- package/templates/runtime/schema/runtime-section-titles.ts +1 -0
- package/templates/runtime/schema/runtime-setup-section.ts +282 -0
- package/templates/runtime/schema/schema-resolvers.ts +168 -0
- package/templates/runtime/schema/types.ts +17 -0
- package/templates/runtime/state/canvas-reducer.ts +106 -0
- package/templates/runtime/state/canvas-state.ts +209 -0
- package/templates/runtime/state/controls-reducer.ts +277 -0
- package/templates/runtime/state/history-patches.ts +174 -0
- package/templates/runtime/state/layer-state.ts +12 -0
- package/templates/runtime/state/layers-reducer.ts +318 -0
- package/templates/runtime/state/media-reducer.ts +283 -0
- package/templates/runtime/state/media-state.ts +105 -0
- package/templates/runtime/state/panels-reducer.ts +58 -0
- package/templates/runtime/state/persistence-merge.ts +53 -0
- package/templates/runtime/state/persistence-reader-canvas.ts +27 -0
- package/templates/runtime/state/persistence-reader-layers.ts +73 -0
- package/templates/runtime/state/persistence-reader-media.ts +82 -0
- package/templates/runtime/state/persistence-reader-panels.ts +56 -0
- package/templates/runtime/state/persistence-reader-primitives.ts +27 -0
- package/templates/runtime/state/persistence-reader-timeline.ts +145 -0
- package/templates/runtime/state/persistence-reader-values.ts +40 -0
- package/templates/runtime/state/persistence-readers.ts +72 -0
- package/templates/runtime/state/persistence-shared.ts +23 -0
- package/templates/runtime/state/persistence-snapshot.ts +57 -0
- package/templates/runtime/state/persistence.ts +16 -581
- package/templates/runtime/state/reducer-canvas-panels.test.ts +324 -0
- package/templates/runtime/state/reducer-controls.test.ts +158 -0
- package/templates/runtime/state/reducer-layers.test.ts +306 -0
- package/templates/runtime/state/reducer-media-import-sizing.test.ts +197 -0
- package/templates/runtime/state/reducer-media-reorder-history.test.ts +116 -0
- package/templates/runtime/state/reducer-media-reset.test.ts +249 -0
- package/templates/runtime/state/reducer-media-test-utils.ts +40 -0
- package/templates/runtime/state/reducer-media-transform.test.ts +52 -0
- package/templates/runtime/state/reducer-test-utils.ts +30 -0
- package/templates/runtime/state/reducer-timeline.test.ts +242 -0
- package/templates/runtime/state/reducer.ts +57 -1785
- package/templates/runtime/state/timeline-reducer.ts +412 -0
- package/templates/runtime/state/timeline-values.test.ts +45 -0
- package/templates/runtime/state/timeline-values.ts +45 -0
- package/templates/runtime/testing/performance-browser-policy.test.ts +81 -0
- package/templates/runtime/testing/performance-browser-policy.ts +102 -0
- package/templates/runtime/testing/performance-budget-validation.ts +84 -0
- package/templates/runtime/testing/performance-control-classification.test.ts +106 -0
- package/templates/runtime/testing/performance-control-classification.ts +101 -0
- package/templates/runtime/testing/performance-coverage-context.ts +44 -0
- package/templates/runtime/testing/performance-coverage-renderer-policy.ts +221 -0
- package/templates/runtime/testing/performance-coverage-scenario-policy.ts +147 -0
- package/templates/runtime/testing/performance-coverage-target-policy.ts +121 -0
- package/templates/runtime/testing/performance-coverage-validator.ts +34 -0
- package/templates/runtime/testing/performance-export-coverage.test.ts +234 -0
- package/templates/runtime/testing/performance-fixture-load-profile.test.ts +360 -0
- package/templates/runtime/testing/performance-fixture-media.test.ts +80 -0
- package/templates/runtime/testing/performance-fixture-stress.test.ts +314 -0
- package/templates/runtime/testing/performance-fixture-validation.ts +255 -0
- package/templates/runtime/testing/performance-fixture-values.ts +275 -0
- package/templates/runtime/testing/performance-fixture-workload.test.ts +140 -0
- package/templates/runtime/testing/performance-load-profile-validation.ts +467 -0
- package/templates/runtime/testing/performance-renderer-coverage.test.ts +325 -0
- package/templates/runtime/testing/performance-renderer-pipeline-coverage.test.ts +115 -0
- package/templates/runtime/testing/performance-renderer-pipeline-interactions.test.ts +201 -0
- package/templates/runtime/testing/performance-renderer-pipeline-passes.test.ts +247 -0
- package/templates/runtime/testing/performance-renderer-pipeline-validation.ts +360 -0
- package/templates/runtime/testing/performance-renderer-technique-validation.ts +329 -0
- package/templates/runtime/testing/performance-renderer-technique.test.ts +275 -0
- package/templates/runtime/testing/performance-renderer-validation.ts +2 -0
- package/templates/runtime/testing/performance-scenario-coverage.test.ts +303 -0
- package/templates/runtime/testing/performance-scenario-validation.ts +49 -0
- package/templates/runtime/testing/performance-schema-derived-workloads.test.ts +231 -0
- package/templates/runtime/testing/performance-schema-queries.ts +181 -0
- package/templates/runtime/testing/performance-test-fixtures/index.ts +4 -0
- package/templates/runtime/testing/performance-test-fixtures/renderer-pipelines.ts +322 -0
- package/templates/runtime/testing/performance-test-fixtures/scenarios.ts +172 -0
- package/templates/runtime/testing/performance-test-fixtures/schemas.ts +151 -0
- package/templates/runtime/testing/performance-test-fixtures/stress-fixtures.ts +133 -0
- package/templates/runtime/testing/performance-test-fixtures.ts +1 -0
- package/templates/runtime/testing/performance-types.ts +338 -0
- package/templates/runtime/testing/performance.ts +15 -2485
- package/templates/starter/AGENTS.md +41 -26
- package/templates/starter/LICENSE.md +18 -95
- package/templates/starter/NOTICE.md +3 -3
- package/templates/starter/docs/toolcraft/README.md +5 -5
- package/templates/starter/docs/toolcraft/acceptance-testing.md +36 -8
- package/templates/starter/docs/toolcraft/assembly-workflow.md +12 -15
- package/templates/starter/docs/toolcraft/component-rules.md +6 -2
- package/templates/starter/docs/toolcraft/core/layout.md +1 -0
- package/templates/starter/docs/toolcraft/core/performance.md +7 -4
- package/templates/starter/docs/toolcraft/core/runtime-boundary.md +11 -4
- package/templates/starter/docs/toolcraft/core/timeline-animation.md +1 -0
- package/templates/starter/docs/toolcraft/custom-controls.md +8 -1
- package/templates/starter/docs/toolcraft/decision-contract.md +26 -22
- package/templates/starter/docs/toolcraft/performance.md +42 -16
- package/templates/starter/docs/toolcraft/schema-reference.md +34 -23
- package/templates/starter/docs/toolcraft/workflow.md +25 -17
- package/templates/starter/e2e/app-browser-acceptance-evidence.spec.ts +111 -0
- package/templates/starter/e2e/app-browser-control-coverage.spec.ts +118 -0
- package/templates/starter/e2e/app-browser-performance-evidence.spec.ts +217 -0
- package/templates/starter/e2e/app-browser-performance-probe.spec.ts +322 -0
- package/templates/starter/e2e/app-browser-proof-session.spec.ts +196 -0
- package/templates/starter/e2e/app-browser-runtime-evidence.spec.ts +9 -0
- package/templates/starter/e2e/app-browser-runtime-provenance.spec.ts +240 -0
- package/templates/starter/e2e/app-browser-runtime-reporter.spec.ts +180 -0
- package/templates/starter/e2e/app-browser-runtime-requirements.spec.ts +310 -0
- package/templates/starter/e2e/app-browser-semantic-evidence.spec.ts +432 -0
- package/templates/starter/e2e/app-browser-shell.spec.ts +171 -0
- package/templates/starter/e2e/app-browser-timeline-layers-reference.spec.ts +70 -0
- package/templates/starter/e2e/app-performance.spec.ts +0 -491
- package/templates/starter/e2e/browser-acceptance-outcome-helpers.ts +97 -0
- package/templates/starter/e2e/browser-acceptance-transition-helpers.ts +74 -0
- package/templates/starter/e2e/browser-conditional-output-evidence-helpers.ts +230 -0
- package/templates/starter/e2e/browser-control-target-helpers.ts +109 -0
- package/templates/starter/e2e/browser-layer-evidence-helpers.ts +229 -0
- package/templates/starter/e2e/browser-proof-session.ts +392 -0
- package/templates/starter/e2e/browser-runtime-evidence-reporter.ts +136 -0
- package/templates/starter/e2e/browser-runtime-evidence-requirements.ts +290 -0
- package/templates/starter/e2e/browser-runtime-evidence.ts +27 -0
- package/templates/starter/e2e/browser-state-evidence-helpers.ts +205 -0
- package/templates/starter/e2e/browser-timeline-evidence-helpers.ts +319 -0
- package/templates/starter/e2e/canvas-handle-helpers.ts +86 -4
- package/templates/starter/e2e/export-artifact-helpers.ts +132 -0
- package/templates/starter/e2e/performance-budget-helpers.ts +159 -0
- package/templates/starter/e2e/performance-canvas-helpers.ts +123 -0
- package/templates/starter/e2e/performance-control-helpers.ts +3 -0
- package/templates/starter/e2e/performance-control-layout-helpers.ts +161 -0
- package/templates/starter/e2e/performance-fixture-helpers.ts +217 -0
- package/templates/starter/e2e/performance-frame-probe.ts +247 -0
- package/templates/starter/e2e/performance-helpers.ts +6 -854
- package/templates/starter/e2e/performance-interaction-measurement.ts +251 -0
- package/templates/starter/e2e/performance-measurement-evidence.ts +72 -0
- package/templates/starter/e2e/performance-output-action-helpers.spec.ts +43 -0
- package/templates/starter/e2e/performance-output-action-helpers.ts +109 -0
- package/templates/starter/e2e/performance-probe-helpers.ts +12 -0
- package/templates/starter/e2e/performance-render-scale-helpers.ts +55 -0
- package/templates/starter/e2e/performance-slider-helpers.ts +271 -0
- package/templates/starter/e2e/product-observable-helpers.ts +72 -17
- package/templates/starter/e2e/stable-outcome-helpers.ts +208 -0
- package/templates/starter/package.json +10 -5
- package/templates/starter/playwright.config.ts +5 -2
- package/templates/starter/scripts/check-ai-skills.mjs +14 -8
- package/templates/starter/scripts/check-ai-skills.test.mjs +64 -0
- package/templates/starter/scripts/check-toolcraft-code-health.mjs +108 -0
- package/templates/starter/scripts/check-toolcraft-code-health.test.mjs +213 -0
- package/templates/starter/scripts/check-toolcraft-docs.mjs +47 -34
- package/templates/starter/scripts/check-toolcraft-integrity.mjs +141 -144
- package/templates/starter/scripts/run-browser-performance.mjs +118 -0
- package/templates/starter/scripts/run-browser-performance.test.mjs +53 -0
- package/templates/starter/scripts/toolcraft-code-health-core.mjs +297 -0
- package/templates/starter/scripts/toolcraft-contract-doc-integrity.mjs +77 -0
- package/templates/starter/scripts/toolcraft-contract-doc-integrity.test.mjs +81 -0
- package/templates/starter/scripts/toolcraft-contract-manifest.json +113 -0
- package/templates/starter/scripts/toolcraft-contract-manifest.mjs +128 -0
- package/templates/starter/scripts/toolcraft-contract-manifest.test.mjs +72 -0
- package/templates/starter/scripts/toolcraft-integrity-manifest.mjs +172 -0
- package/templates/starter/scripts/toolcraft-integrity-policy.mjs +60 -0
- package/templates/starter/scripts/toolcraft-product-boundary-ast-utils.mjs +23 -0
- package/templates/starter/scripts/toolcraft-product-boundary-ast.mjs +264 -0
- package/templates/starter/scripts/toolcraft-product-boundary-test-fixtures.mjs +16 -0
- package/templates/starter/scripts/toolcraft-product-boundary.mjs +243 -0
- package/templates/starter/scripts/toolcraft-product-boundary.test.mjs +289 -0
- package/templates/starter/scripts/toolcraft-product-dependency-graph.mjs +176 -0
- package/templates/starter/scripts/toolcraft-product-dependency-graph.test.mjs +196 -0
- package/templates/starter/scripts/toolcraft-product-dependency-resolution.mjs +279 -0
- package/templates/starter/scripts/toolcraft-product-evidence-boundary-ast.mjs +91 -0
- package/templates/starter/scripts/toolcraft-product-evidence-boundary.test.mjs +138 -0
- package/templates/starter/scripts/toolcraft-product-style-boundary.mjs +219 -0
- package/templates/starter/scripts/toolcraft-source-inventory.d.mts +46 -0
- package/templates/starter/scripts/toolcraft-source-inventory.mjs +187 -0
- package/templates/starter/scripts/toolcraft-source-inventory.test.mjs +132 -0
- package/templates/starter/scripts/toolcraft-source-ownership.mjs +167 -0
- package/templates/starter/scripts/toolcraft-source-ownership.test.mjs +113 -0
- package/templates/starter/scripts/toolcraft-static-string.mjs +104 -0
- package/templates/starter/scripts/toolcraft-verification-inventory.mjs +123 -0
- package/templates/starter/scripts/toolcraft-verification-receipt.d.mts +19 -0
- package/templates/starter/scripts/toolcraft-verification-receipt.mjs +284 -0
- package/templates/starter/scripts/toolcraft-verification-receipt.test.mjs +282 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.d.mts +32 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.mjs +88 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-contract.test.mjs +87 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.mjs +109 -0
- package/templates/starter/scripts/toolcraft-vitest-runtime-evidence-reporter.test.mjs +111 -0
- package/templates/starter/scripts/toolcraft-workflow-routes.mjs +314 -0
- package/templates/starter/scripts/toolcraft-workflow-routes.test.mjs +204 -0
- package/templates/starter/src/app/acceptance/actions.ts +30 -0
- package/templates/starter/src/app/acceptance/animation-intent.ts +184 -0
- package/templates/starter/src/app/acceptance/canvas-handle-acceptance.ts +70 -0
- package/templates/starter/src/app/acceptance/color-bank-labels.ts +164 -0
- package/templates/starter/src/app/acceptance/conditions.ts +80 -0
- package/templates/starter/src/app/acceptance/control-acceptance-context.ts +70 -0
- package/templates/starter/src/app/acceptance/control-acceptance-coverage.ts +271 -0
- package/templates/starter/src/app/acceptance/control-acceptance-kind-rules.ts +149 -0
- package/templates/starter/src/app/acceptance/control-acceptance-policy.ts +189 -0
- package/templates/starter/src/app/acceptance/control-acceptance.ts +70 -0
- package/templates/starter/src/app/acceptance/control-component-rules.ts +277 -0
- package/templates/starter/src/app/acceptance/control-labels.ts +223 -0
- package/templates/starter/src/app/acceptance/control-layout-dependency-rules.ts +107 -0
- package/templates/starter/src/app/acceptance/control-layout-entity-rules.ts +104 -0
- package/templates/starter/src/app/acceptance/control-layout-model.ts +159 -0
- package/templates/starter/src/app/acceptance/control-layout-section-rules.ts +164 -0
- package/templates/starter/src/app/acceptance/control-layout.ts +45 -0
- package/templates/starter/src/app/acceptance/control-order.ts +123 -0
- package/templates/starter/src/app/acceptance/control-parts.ts +47 -0
- package/templates/starter/src/app/acceptance/control-section-inventory.ts +183 -0
- package/templates/starter/src/app/acceptance/controls.ts +27 -0
- package/templates/starter/src/app/acceptance/coverage.ts +81 -0
- package/templates/starter/src/app/acceptance/custom-controls.ts +140 -0
- package/templates/starter/src/app/acceptance/inline-layout.ts +192 -0
- package/templates/starter/src/app/acceptance/media-upload.ts +55 -0
- package/templates/starter/src/app/acceptance/output-background-rules.ts +135 -0
- package/templates/starter/src/app/acceptance/output-export-actions.test.ts +76 -0
- package/templates/starter/src/app/acceptance/output-export-actions.ts +34 -0
- package/templates/starter/src/app/acceptance/output-export-layout-rules.ts +46 -0
- package/templates/starter/src/app/acceptance/output-export-model.ts +146 -0
- package/templates/starter/src/app/acceptance/output-export.ts +45 -0
- package/templates/starter/src/app/acceptance/output-image-export-rules.ts +87 -0
- package/templates/starter/src/app/acceptance/reference-runtime-coverage.ts +96 -0
- package/templates/starter/src/app/acceptance/reference-runtime-feature-inventory.ts +171 -0
- package/templates/starter/src/app/acceptance/reference-runtime-study.ts +73 -0
- package/templates/starter/src/app/acceptance/reference-runtime-timeline.ts +291 -0
- package/templates/starter/src/app/acceptance/reference-runtime.ts +99 -0
- package/templates/starter/src/app/acceptance/runtime-coverage.ts +290 -0
- package/templates/starter/src/app/acceptance/runtime-setup.ts +117 -0
- package/templates/starter/src/app/acceptance/section-title-rules.ts +8 -0
- package/templates/starter/src/app/acceptance/sections.ts +6 -0
- package/templates/starter/src/app/acceptance/semantic.ts +63 -0
- package/templates/starter/src/app/acceptance/timeline-loop.ts +21 -0
- package/templates/starter/src/app/acceptance/types.ts +363 -0
- package/templates/starter/src/app/acceptance/validate-coverage.ts +217 -0
- package/templates/starter/src/app/acceptance/validation-pipeline.test.ts +56 -0
- package/templates/starter/src/app/acceptance/validation-pipeline.ts +60 -0
- package/templates/starter/src/app/acceptance/video-reference-study.ts +217 -0
- package/templates/starter/src/app/starter-acceptance-data.ts +21 -0
- package/templates/starter/src/app/starter-acceptance.animation-intent.test.ts +383 -0
- package/templates/starter/src/app/starter-acceptance.background-export.test.ts +349 -0
- package/templates/starter/src/app/starter-acceptance.base-coverage.test.ts +47 -0
- package/templates/starter/src/app/starter-acceptance.canvas-handles.test.ts +71 -0
- package/templates/starter/src/app/starter-acceptance.canvas-sizing.test.ts +199 -0
- package/templates/starter/src/app/starter-acceptance.compound-part-coverage.test.ts +244 -0
- package/templates/starter/src/app/starter-acceptance.contract-fixtures.ts +63 -0
- package/templates/starter/src/app/starter-acceptance.control-label-context.test.ts +172 -0
- package/templates/starter/src/app/starter-acceptance.control-labels.test.ts +387 -0
- package/templates/starter/src/app/starter-acceptance.control-naming-rules.test.ts +215 -0
- package/templates/starter/src/app/starter-acceptance.control-order.test.ts +274 -0
- package/templates/starter/src/app/starter-acceptance.control-state.test.ts +275 -0
- package/templates/starter/src/app/starter-acceptance.curves-rules.test.ts +184 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-collections.test.ts +200 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-coverage.test.ts +111 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-fit-check.test.ts +135 -0
- package/templates/starter/src/app/starter-acceptance.custom-control-valid.test.ts +74 -0
- package/templates/starter/src/app/starter-acceptance.export-test-utils.ts +107 -0
- package/templates/starter/src/app/starter-acceptance.framework-boundary.test.ts +327 -0
- package/templates/starter/src/app/starter-acceptance.image-video-export-settings.test.ts +328 -0
- package/templates/starter/src/app/starter-acceptance.keyframes.test.ts +242 -0
- package/templates/starter/src/app/starter-acceptance.layers.test.ts +203 -0
- package/templates/starter/src/app/starter-acceptance.media-upload.fixtures.ts +110 -0
- package/templates/starter/src/app/starter-acceptance.media-upload.test.ts +153 -0
- package/templates/starter/src/app/starter-acceptance.output-export-rules.test.ts +97 -0
- package/templates/starter/src/app/starter-acceptance.persistence-coverage.test.ts +134 -0
- package/templates/starter/src/app/starter-acceptance.product-output-export.test.ts +202 -0
- package/templates/starter/src/app/starter-acceptance.product-readiness-rules.test.ts +14 -0
- package/templates/starter/src/app/starter-acceptance.product-readiness-test-utils.ts +25 -0
- package/templates/starter/src/app/starter-acceptance.product-readiness.test.ts +50 -0
- package/templates/starter/src/app/starter-acceptance.product-worklog.test.ts +27 -0
- package/templates/starter/src/app/starter-acceptance.range-slider-rules.test.ts +147 -0
- package/templates/starter/src/app/starter-acceptance.reference-custom-timeline.test.ts +197 -0
- package/templates/starter/src/app/starter-acceptance.reference-foundation.test.ts +304 -0
- package/templates/starter/src/app/starter-acceptance.reference-test-utils.ts +102 -0
- package/templates/starter/src/app/starter-acceptance.reference-timeline.test.ts +267 -0
- package/templates/starter/src/app/starter-acceptance.schema-test-utils.ts +116 -0
- package/templates/starter/src/app/starter-acceptance.section-cohesion.test.ts +373 -0
- package/templates/starter/src/app/starter-acceptance.section-dependencies.test.ts +260 -0
- package/templates/starter/src/app/starter-acceptance.section-titles.test.ts +180 -0
- package/templates/starter/src/app/starter-acceptance.setup-readiness.test.ts +205 -0
- package/templates/starter/src/app/starter-acceptance.slider-rules.test.ts +470 -0
- package/templates/starter/src/app/starter-acceptance.slider-unit-rules.test.ts +61 -0
- package/templates/starter/src/app/starter-acceptance.source-test-utils.ts +43 -0
- package/templates/starter/src/app/starter-acceptance.test-utils.ts +21 -0
- package/templates/starter/src/app/starter-acceptance.text-control-kind.test.ts +89 -0
- package/templates/starter/src/app/starter-acceptance.timeline-playback.test.ts +264 -0
- package/templates/starter/src/app/starter-acceptance.timeline-test-utils.ts +56 -0
- package/templates/starter/src/app/starter-acceptance.toggle-pair-layout.test.ts +200 -0
- package/templates/starter/src/app/starter-acceptance.toggle-parameter-layout.test.ts +277 -0
- package/templates/starter/src/app/starter-acceptance.ts +151 -4576
- package/templates/starter/src/app/starter-acceptance.video-export-test-utils.ts +37 -0
- package/templates/starter/src/app/starter-acceptance.video-reference-study.test.ts +262 -0
- package/templates/starter/src/app/starter-acceptance.worklog-test-utils.ts +428 -0
- package/templates/starter/src/app/starter-acceptance.worklog.test.ts +283 -0
- package/templates/starter/src/app/starter-automated-runtime-evidence.test.ts +34 -0
- package/templates/starter/src/app/starter-composition.tsx +7 -0
- package/templates/starter/src/app/starter-performance-test-utils.ts +275 -0
- package/templates/starter/src/app/starter-performance.budgets.test.ts +374 -0
- package/templates/starter/src/app/starter-performance.gates.test.ts +128 -0
- package/templates/starter/src/app/starter-performance.renderer-source.test.ts +136 -0
- package/templates/starter/src/app/starter-performance.renderer-technique.test.ts +291 -0
- package/templates/starter/src/app/starter-performance.scenarios.test.ts +355 -0
- package/templates/starter/src/app/test-evidence/browser-runtime-contract.test.ts +253 -0
- package/templates/starter/src/app/test-evidence/browser-runtime-contract.ts +243 -0
- package/templates/starter/src/routes/index.tsx +11 -2
- package/templates/starter/vite.config.ts +8 -0
- package/templates/ui/components/controls/color/color-control-types.ts +38 -0
- package/templates/ui/components/controls/color/color-control.tsx +19 -437
- package/templates/ui/components/controls/color/color-footer.tsx +272 -0
- package/templates/ui/components/controls/color/color-model-slider.tsx +271 -0
- package/templates/ui/components/controls/color/color-opacity-input.tsx +94 -0
- package/templates/ui/components/controls/color/color-surface.tsx +194 -0
- package/templates/ui/components/controls/color/color-value-control.tsx +159 -0
- package/templates/ui/components/controls/color/color-value-utils.ts +170 -0
- package/templates/ui/components/controls/color/index.ts +10 -3
- package/templates/ui/components/controls/color/palette-control-controller.ts +407 -0
- package/templates/ui/components/controls/color/palette-control-layout.ts +14 -0
- package/templates/ui/components/controls/color/palette-control-types.ts +50 -0
- package/templates/ui/components/controls/color/palette-control-view.tsx +174 -0
- package/templates/ui/components/controls/color/palette-control.tsx +6 -544
- package/templates/ui/components/controls/color/style-guide-color-picker-color-utils.ts +39 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-controller.ts +370 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-hue-handlers.ts +66 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-interaction-state.ts +49 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-interactions.ts +2 -2
- package/templates/ui/components/controls/color/style-guide-color-picker-model.ts +125 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-parts.tsx +10 -707
- package/templates/ui/components/controls/color/style-guide-color-picker-surface-drag.ts +93 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-surface-geometry.ts +114 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-surface-preview.ts +45 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-types.ts +84 -0
- package/templates/ui/components/controls/color/style-guide-color-picker-view.tsx +69 -0
- package/templates/ui/components/controls/color/style-guide-color-picker.tsx +6 -495
- package/templates/ui/components/controls/curves/curves-control.tsx +4 -3
- package/templates/ui/components/controls/file-drop/file-drop-control.tsx +39 -515
- package/templates/ui/components/controls/file-drop/file-drop-empty-state.tsx +35 -0
- package/templates/ui/components/controls/file-drop/file-drop-file-list.tsx +160 -0
- package/templates/ui/components/controls/file-drop/file-drop-image-grid.tsx +175 -0
- package/templates/ui/components/controls/file-drop/file-drop-model.tsx +170 -0
- package/templates/ui/components/controls/file-drop/file-drop-single-preview.tsx +63 -0
- package/templates/ui/components/controls/file-drop/file-drop-types.ts +48 -0
- package/templates/ui/components/controls/file-drop/index.ts +2 -2
- package/templates/ui/components/controls/font-picker/font-picker-control.tsx +133 -906
- package/templates/ui/components/controls/font-picker/font-picker-footer.tsx +116 -0
- package/templates/ui/components/controls/font-picker/font-picker-list.tsx +194 -0
- package/templates/ui/components/controls/font-picker/font-picker-popover-content.tsx +191 -0
- package/templates/ui/components/controls/font-picker/font-picker-value.ts +222 -0
- package/templates/ui/components/controls/font-picker/index.ts +4 -1
- package/templates/ui/components/controls/font-picker/use-font-picker-preview-pipeline.ts +163 -0
- package/templates/ui/components/controls/font-picker/use-font-picker-virtual-list.ts +293 -0
- package/templates/ui/components/controls/gradient/gradient-control-utils.ts +2 -25
- package/templates/ui/components/controls/gradient/gradient-control.tsx +4 -464
- package/templates/ui/components/controls/gradient/gradient-stops-controller.ts +332 -0
- package/templates/ui/components/controls/gradient/gradient-stops-track.tsx +159 -0
- package/templates/ui/components/controls/vector/vector-control-types.ts +26 -0
- package/templates/ui/components/controls/vector/vector-control.tsx +10 -486
- package/templates/ui/components/controls/vector/vector-pad-field.tsx +211 -0
- package/templates/ui/components/controls/vector/vector-pad-geometry.ts +61 -0
- package/templates/ui/components/controls/vector/vector-pad-parts.tsx +72 -0
- package/templates/ui/components/controls/vector/vector-pad-variants.ts +20 -0
- package/templates/ui/components/controls/vector/vector-size-field.tsx +104 -0
- package/templates/ui/components/controls/vector/vector-value.ts +46 -0
- package/templates/ui/components/primitives/slider/slider-discrete-state.ts +181 -0
- package/templates/ui/components/primitives/slider/slider-marker-policy.ts +52 -0
- package/templates/ui/components/primitives/slider/slider-pointer-dragging.ts +87 -0
- package/templates/ui/components/primitives/slider/slider-runtime.ts +109 -0
- package/templates/ui/components/primitives/slider/slider-types.ts +21 -0
- package/templates/ui/components/primitives/slider/slider.tsx +2 -403
- package/templates/runtime/react/canvas-shell.test.tsx +0 -554
- package/templates/runtime/react/canvas-shell.tsx +0 -585
- package/templates/runtime/react/controls-panel.test.tsx +0 -5446
- package/templates/runtime/react/controls-panel.tsx +0 -3220
- package/templates/runtime/react/layers-panel.test.tsx +0 -487
- package/templates/runtime/react/layers-panel.tsx +0 -1348
- package/templates/runtime/react/timeline-panel.test.tsx +0 -751
- package/templates/runtime/react/timeline-panel.tsx +0 -3078
- package/templates/runtime/schema/define-toolcraft.test.ts +0 -1742
- package/templates/runtime/state/reducer.test.ts +0 -1703
- package/templates/runtime/testing/performance.test.ts +0 -3081
- package/templates/starter/e2e/app-browser-acceptance.spec.ts +0 -785
- package/templates/starter/src/app/starter-acceptance.test.ts +0 -10068
- package/templates/starter/src/app/starter-performance.test.ts +0 -1583
- package/templates/ui/components/controls/color/style-guide-color-picker-logic.ts +0 -490
- /package/templates/runtime/react/{storage-key-migration.ts → app-shell/storage-key-migration.ts} +0 -0
- /package/templates/runtime/react/{theme-runtime.tsx → app-shell/theme-runtime.tsx} +0 -0
- /package/templates/runtime/react/{curve-geometry.test.ts → controls-panel/__tests__/curve-geometry.test.ts} +0 -0
- /package/templates/runtime/react/{panel-host-config.ts → panel-host/panel-host-config.ts} +0 -0
- /package/templates/runtime/react/{panel-host-geometry.test.ts → panel-host/panel-host-geometry.test.ts} +0 -0
- /package/templates/runtime/react/{panel-host-geometry.ts → panel-host/panel-host-geometry.ts} +0 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { defineToolcraft } from "@repo/toolcraft-runtime";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
contractAcceptanceFixture,
|
|
6
|
+
contractSchemaFixture,
|
|
7
|
+
validateContractAcceptance,
|
|
8
|
+
} from "./starter-acceptance.contract-fixtures";
|
|
9
|
+
import { makeControlAcceptance } from "./starter-acceptance.test-utils";
|
|
10
|
+
import {
|
|
11
|
+
makeReferenceCoverageAcceptance,
|
|
12
|
+
makeReferenceFeatureInventory,
|
|
13
|
+
referenceStudyEvidence,
|
|
14
|
+
} from "./starter-acceptance.reference-test-utils";
|
|
15
|
+
|
|
16
|
+
describe("starter acceptance reference-runtime foundation", () => {
|
|
17
|
+
it("requires explicit reference behavior coverage in reference-runtime-clone mode", () => {
|
|
18
|
+
expect(
|
|
19
|
+
validateContractAcceptance({
|
|
20
|
+
schema: contractSchemaFixture,
|
|
21
|
+
acceptance: contractAcceptanceFixture,
|
|
22
|
+
transferMode: {
|
|
23
|
+
behaviorCoverage: [
|
|
24
|
+
"canvas-sizing",
|
|
25
|
+
"control-mapping",
|
|
26
|
+
"renderer-state",
|
|
27
|
+
"renderer-loop",
|
|
28
|
+
],
|
|
29
|
+
mode: "reference-runtime-clone",
|
|
30
|
+
referenceName: "legacy badge wall",
|
|
31
|
+
sourceOfTruth: "reference-runtime",
|
|
32
|
+
} as never,
|
|
33
|
+
}),
|
|
34
|
+
).toEqual(
|
|
35
|
+
expect.arrayContaining([
|
|
36
|
+
'reference-runtime-clone behaviorCoverage "canvas-sizing" is missing an acceptance entry with referenceCoverage "canvas-sizing".',
|
|
37
|
+
'reference-runtime-clone behaviorCoverage "control-mapping" is missing an acceptance entry with referenceCoverage "control-mapping".',
|
|
38
|
+
'reference-runtime-clone behaviorCoverage "renderer-state" is missing an acceptance entry with referenceCoverage "renderer-state".',
|
|
39
|
+
'reference-runtime-clone behaviorCoverage "renderer-loop" is missing an acceptance entry with referenceCoverage "renderer-loop".',
|
|
40
|
+
'reference-runtime-clone transferMode must declare referenceTimeline with mode "none", "toolcraft-playback", "toolcraft-keyframes", or "custom-reference-timeline".',
|
|
41
|
+
]),
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("requires a reference feature inventory before accepting a reference-runtime-clone", () => {
|
|
46
|
+
const referenceAcceptance = [
|
|
47
|
+
...contractAcceptanceFixture,
|
|
48
|
+
makeReferenceCoverageAcceptance("reference.canvasSizing", "canvas-sizing"),
|
|
49
|
+
makeReferenceCoverageAcceptance("reference.controlMapping", "control-mapping"),
|
|
50
|
+
makeReferenceCoverageAcceptance("reference.rendererState", "renderer-state"),
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
expect(
|
|
54
|
+
validateContractAcceptance({
|
|
55
|
+
schema: contractSchemaFixture,
|
|
56
|
+
acceptance: referenceAcceptance,
|
|
57
|
+
transferMode: {
|
|
58
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
59
|
+
mode: "reference-runtime-clone",
|
|
60
|
+
referenceName: "legacy badge wall",
|
|
61
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
62
|
+
sourceOfTruth: "reference-runtime",
|
|
63
|
+
},
|
|
64
|
+
}),
|
|
65
|
+
).toEqual(
|
|
66
|
+
expect.arrayContaining([
|
|
67
|
+
"reference-runtime-clone transferMode must declare referenceFeatureInventory with every user-visible and output-affecting behavior from the inspected reference, mapped to Toolcraft implementation and acceptance coverage.",
|
|
68
|
+
'reference-runtime-clone behaviorCoverage "canvas-sizing" must be represented in referenceFeatureInventory by an item whose acceptanceId points to that referenceCoverage.',
|
|
69
|
+
'reference-runtime-clone behaviorCoverage "control-mapping" must be represented in referenceFeatureInventory by an item whose acceptanceId points to that referenceCoverage.',
|
|
70
|
+
'reference-runtime-clone behaviorCoverage "renderer-state" must be represented in referenceFeatureInventory by an item whose acceptanceId points to that referenceCoverage.',
|
|
71
|
+
"reference.canvasSizing declares reference coverage but is not mapped from referenceFeatureInventory. Every reference acceptance row must correspond to an inventoried reference feature.",
|
|
72
|
+
]),
|
|
73
|
+
);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("requires reference study evidence before accepting a reference-runtime-clone", () => {
|
|
77
|
+
expect(
|
|
78
|
+
validateContractAcceptance({
|
|
79
|
+
schema: contractSchemaFixture,
|
|
80
|
+
acceptance: [
|
|
81
|
+
...contractAcceptanceFixture,
|
|
82
|
+
makeReferenceCoverageAcceptance("reference.canvasSizing", "canvas-sizing"),
|
|
83
|
+
makeReferenceCoverageAcceptance("reference.controlMapping", "control-mapping"),
|
|
84
|
+
makeReferenceCoverageAcceptance("reference.rendererState", "renderer-state"),
|
|
85
|
+
],
|
|
86
|
+
transferMode: {
|
|
87
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
88
|
+
mode: "reference-runtime-clone",
|
|
89
|
+
referenceFeatureInventory: makeReferenceFeatureInventory(),
|
|
90
|
+
referenceName: "legacy badge wall",
|
|
91
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
92
|
+
sourceOfTruth: "reference-runtime",
|
|
93
|
+
},
|
|
94
|
+
}),
|
|
95
|
+
).toContain(
|
|
96
|
+
"reference-runtime-clone transferMode must declare referenceStudy proving the reference was inspected and, when runnable or reconstructable, run or restored locally before implementation.",
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("requires a concrete blocker for source-only reference study", () => {
|
|
101
|
+
expect(
|
|
102
|
+
validateContractAcceptance({
|
|
103
|
+
schema: contractSchemaFixture,
|
|
104
|
+
acceptance: [
|
|
105
|
+
...contractAcceptanceFixture,
|
|
106
|
+
makeReferenceCoverageAcceptance("reference.canvasSizing", "canvas-sizing"),
|
|
107
|
+
makeReferenceCoverageAcceptance("reference.controlMapping", "control-mapping"),
|
|
108
|
+
makeReferenceCoverageAcceptance("reference.rendererState", "renderer-state"),
|
|
109
|
+
],
|
|
110
|
+
transferMode: {
|
|
111
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
112
|
+
mode: "reference-runtime-clone",
|
|
113
|
+
referenceFeatureInventory: makeReferenceFeatureInventory(),
|
|
114
|
+
referenceName: "legacy badge wall",
|
|
115
|
+
referenceStudy: {
|
|
116
|
+
...referenceStudyEvidence,
|
|
117
|
+
sourceOnlyReason: "Source review was enough.",
|
|
118
|
+
status: "source-inspection-only",
|
|
119
|
+
},
|
|
120
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
121
|
+
sourceOfTruth: "reference-runtime",
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
).toContain(
|
|
125
|
+
"referenceStudy.sourceOnlyReason must state the concrete blocker that made running or restoring the reference unavailable.",
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("rejects reference feature inventory items that are not backed by reference acceptance coverage", () => {
|
|
130
|
+
const ordinaryControlAcceptance = makeControlAcceptance("appearance.opacity", "slider");
|
|
131
|
+
|
|
132
|
+
expect(
|
|
133
|
+
validateContractAcceptance({
|
|
134
|
+
schema: contractSchemaFixture,
|
|
135
|
+
acceptance: [
|
|
136
|
+
...contractAcceptanceFixture,
|
|
137
|
+
ordinaryControlAcceptance,
|
|
138
|
+
makeReferenceCoverageAcceptance("reference.controlMapping", "control-mapping"),
|
|
139
|
+
makeReferenceCoverageAcceptance("reference.rendererState", "renderer-state"),
|
|
140
|
+
],
|
|
141
|
+
transferMode: {
|
|
142
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
143
|
+
mode: "reference-runtime-clone",
|
|
144
|
+
referenceFeatureInventory: [
|
|
145
|
+
{
|
|
146
|
+
acceptanceId: "appearance.opacity",
|
|
147
|
+
behaviorEvidence: "Observed the reference browser output preserve its canvas dimensions.",
|
|
148
|
+
featureName: "Canvas sizing",
|
|
149
|
+
id: "canvas-sizing",
|
|
150
|
+
referenceBehavior: "The reference renderer owns output sizing and canvas dimensions.",
|
|
151
|
+
sourceEvidence: "Inspected reference renderer sizing source.",
|
|
152
|
+
status: "ported",
|
|
153
|
+
toolcraftMapping: "Toolcraft editable-output sizing preserves the reference dimensions.",
|
|
154
|
+
},
|
|
155
|
+
...makeReferenceFeatureInventory().slice(1),
|
|
156
|
+
],
|
|
157
|
+
referenceName: "legacy badge wall",
|
|
158
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
159
|
+
sourceOfTruth: "reference-runtime",
|
|
160
|
+
},
|
|
161
|
+
}),
|
|
162
|
+
).toEqual(
|
|
163
|
+
expect.arrayContaining([
|
|
164
|
+
'referenceFeatureInventory "canvas-sizing" acceptanceId "appearance.opacity" must point to an acceptance entry with referenceCoverage or referenceTimelineCoverage.',
|
|
165
|
+
'reference-runtime-clone behaviorCoverage "canvas-sizing" must be represented in referenceFeatureInventory by an item whose acceptanceId points to that referenceCoverage.',
|
|
166
|
+
]),
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("requires feature-level behavior evidence for reference inventory items", () => {
|
|
171
|
+
expect(
|
|
172
|
+
validateContractAcceptance({
|
|
173
|
+
schema: contractSchemaFixture,
|
|
174
|
+
acceptance: [
|
|
175
|
+
...contractAcceptanceFixture,
|
|
176
|
+
makeReferenceCoverageAcceptance("reference.canvasSizing", "canvas-sizing"),
|
|
177
|
+
makeReferenceCoverageAcceptance("reference.controlMapping", "control-mapping"),
|
|
178
|
+
makeReferenceCoverageAcceptance("reference.rendererState", "renderer-state"),
|
|
179
|
+
],
|
|
180
|
+
transferMode: {
|
|
181
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
182
|
+
mode: "reference-runtime-clone",
|
|
183
|
+
referenceFeatureInventory: [
|
|
184
|
+
{ ...makeReferenceFeatureInventory()[0], behaviorEvidence: "" },
|
|
185
|
+
...makeReferenceFeatureInventory().slice(1),
|
|
186
|
+
],
|
|
187
|
+
referenceName: "legacy badge wall",
|
|
188
|
+
referenceStudy: referenceStudyEvidence,
|
|
189
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
190
|
+
sourceOfTruth: "reference-runtime",
|
|
191
|
+
},
|
|
192
|
+
}),
|
|
193
|
+
).toContain(
|
|
194
|
+
'referenceFeatureInventory "canvas-sizing" must include behaviorEvidence from the original, restored, or source-only reference study proving this feature was observed before Toolcraft mapping.',
|
|
195
|
+
);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it("requires explicit user evidence before marking reference behavior intentionally changed", () => {
|
|
199
|
+
expect(
|
|
200
|
+
validateContractAcceptance({
|
|
201
|
+
schema: contractSchemaFixture,
|
|
202
|
+
acceptance: [
|
|
203
|
+
...contractAcceptanceFixture,
|
|
204
|
+
makeReferenceCoverageAcceptance("reference.canvasSizing", "canvas-sizing"),
|
|
205
|
+
makeReferenceCoverageAcceptance("reference.controlMapping", "control-mapping"),
|
|
206
|
+
makeReferenceCoverageAcceptance("reference.rendererState", "renderer-state"),
|
|
207
|
+
],
|
|
208
|
+
transferMode: {
|
|
209
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
210
|
+
mode: "reference-runtime-clone",
|
|
211
|
+
referenceFeatureInventory: [
|
|
212
|
+
{
|
|
213
|
+
...makeReferenceFeatureInventory()[0],
|
|
214
|
+
status: "intentionally-changed",
|
|
215
|
+
userApprovedChangeReason: "Cleaner implementation.",
|
|
216
|
+
},
|
|
217
|
+
...makeReferenceFeatureInventory().slice(1),
|
|
218
|
+
],
|
|
219
|
+
referenceName: "legacy badge wall",
|
|
220
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
221
|
+
sourceOfTruth: "reference-runtime",
|
|
222
|
+
},
|
|
223
|
+
}),
|
|
224
|
+
).toContain(
|
|
225
|
+
'referenceFeatureInventory "canvas-sizing" userApprovedChangeReason must cite explicit user approval or redesign/change-request evidence.',
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("rejects reference-runtime-clone apps that disable the Toolcraft canvas shell", () => {
|
|
230
|
+
const schemaWithoutCanvas = defineToolcraft({
|
|
231
|
+
canvas: {
|
|
232
|
+
enabled: false,
|
|
233
|
+
size: { height: 720, unit: "px", width: 1280 },
|
|
234
|
+
},
|
|
235
|
+
panels: {},
|
|
236
|
+
toolbar: {
|
|
237
|
+
history: false,
|
|
238
|
+
radar: false,
|
|
239
|
+
theme: false,
|
|
240
|
+
zoom: false,
|
|
241
|
+
},
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
expect(
|
|
245
|
+
validateContractAcceptance({
|
|
246
|
+
schema: schemaWithoutCanvas,
|
|
247
|
+
acceptance: [
|
|
248
|
+
...contractAcceptanceFixture,
|
|
249
|
+
{
|
|
250
|
+
automated: true,
|
|
251
|
+
automatedTestName: "reference canvas size matches legacy renderer",
|
|
252
|
+
browser: true,
|
|
253
|
+
browserTestName: "browser: reference canvas size matches legacy renderer",
|
|
254
|
+
componentType: "custom-renderer",
|
|
255
|
+
evidence: "rendered-pixels",
|
|
256
|
+
expectedObservable: "The Toolcraft renderer uses the same output dimensions as the reference runtime.",
|
|
257
|
+
fixture: "legacy renderer fixture",
|
|
258
|
+
id: "reference.canvasSizing",
|
|
259
|
+
kind: "runtime",
|
|
260
|
+
referenceCoverage: "canvas-sizing",
|
|
261
|
+
userAction: "Render the reference-sized output.",
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
automated: true,
|
|
265
|
+
automatedTestName: "reference control mapping preserves legacy output",
|
|
266
|
+
browser: true,
|
|
267
|
+
browserTestName: "browser: reference control mapping preserves legacy output",
|
|
268
|
+
componentType: "custom-renderer",
|
|
269
|
+
evidence: "product-output",
|
|
270
|
+
expectedObservable: "Changing each mapped control updates the same renderer parameter as the reference app.",
|
|
271
|
+
fixture: "legacy controls fixture",
|
|
272
|
+
id: "reference.controlMapping",
|
|
273
|
+
kind: "runtime",
|
|
274
|
+
referenceCoverage: "control-mapping",
|
|
275
|
+
userAction: "Change mapped controls and compare reference output behavior.",
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
automated: true,
|
|
279
|
+
automatedTestName: "reference renderer state preserves legacy lifecycle",
|
|
280
|
+
browser: true,
|
|
281
|
+
browserTestName: "browser: reference renderer state preserves legacy lifecycle",
|
|
282
|
+
componentType: "custom-renderer",
|
|
283
|
+
evidence: "product-output",
|
|
284
|
+
expectedObservable: "The renderer preserves the reference runtime mutable state lifecycle across frames.",
|
|
285
|
+
fixture: "legacy renderer state fixture",
|
|
286
|
+
id: "reference.rendererState",
|
|
287
|
+
kind: "runtime",
|
|
288
|
+
referenceCoverage: "renderer-state",
|
|
289
|
+
userAction: "Run the renderer across frames and compare stateful output.",
|
|
290
|
+
},
|
|
291
|
+
],
|
|
292
|
+
transferMode: {
|
|
293
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
294
|
+
mode: "reference-runtime-clone",
|
|
295
|
+
referenceName: "legacy iframe shell",
|
|
296
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
297
|
+
sourceOfTruth: "reference-runtime",
|
|
298
|
+
},
|
|
299
|
+
}),
|
|
300
|
+
).toContain(
|
|
301
|
+
"reference-runtime-clone must keep the Toolcraft canvas shell enabled; preserve the reference renderer inside ToolcraftApp canvasContent instead of replacing the app with the original UI.",
|
|
302
|
+
);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ToolcraftComponentAcceptance,
|
|
3
|
+
ToolcraftReferenceCoverage,
|
|
4
|
+
ToolcraftReferenceFeatureInventoryItem,
|
|
5
|
+
ToolcraftReferenceStudyEvidence,
|
|
6
|
+
ToolcraftReferenceTimelineCoverage,
|
|
7
|
+
} from "./acceptance/types";
|
|
8
|
+
|
|
9
|
+
export const referenceStudyEvidence = {
|
|
10
|
+
behaviorEvidence:
|
|
11
|
+
"Ran the original app in a local browser and checked canvas sizing, controls, and renderer state changes.",
|
|
12
|
+
referenceLocation: "/fixtures/legacy-badge-wall",
|
|
13
|
+
reproductionSteps:
|
|
14
|
+
"Installed dependencies, started the reference app, opened it in the browser, and compared behavior against the port.",
|
|
15
|
+
sourceEvidence:
|
|
16
|
+
"Inspected reference routes, renderer, control state, export handlers, and media lifecycle source files.",
|
|
17
|
+
status: "ran-original",
|
|
18
|
+
} satisfies ToolcraftReferenceStudyEvidence;
|
|
19
|
+
|
|
20
|
+
export function makeReferenceFeatureInventory(
|
|
21
|
+
extra: readonly ToolcraftReferenceFeatureInventoryItem[] = [],
|
|
22
|
+
): readonly ToolcraftReferenceFeatureInventoryItem[] {
|
|
23
|
+
return [
|
|
24
|
+
{
|
|
25
|
+
acceptanceId: "reference.canvasSizing",
|
|
26
|
+
behaviorEvidence:
|
|
27
|
+
"Observed the reference output keep its authored dimensions in the browser.",
|
|
28
|
+
featureName: "Canvas sizing",
|
|
29
|
+
id: "canvas-sizing",
|
|
30
|
+
referenceBehavior: "The reference renderer owns the output dimensions.",
|
|
31
|
+
sourceEvidence: "Inspected reference renderer sizing and browser output.",
|
|
32
|
+
status: "ported",
|
|
33
|
+
toolcraftMapping:
|
|
34
|
+
"Toolcraft editable-output canvas starts from the reference dimensions and keeps runtime sizing visible.",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
acceptanceId: "reference.controlMapping",
|
|
38
|
+
behaviorEvidence:
|
|
39
|
+
"Changed reference controls in the browser and observed renderer parameters update.",
|
|
40
|
+
featureName: "Control mapping",
|
|
41
|
+
id: "control-mapping",
|
|
42
|
+
referenceBehavior: "Reference controls update renderer parameters directly.",
|
|
43
|
+
sourceEvidence: "Inspected reference control state and parameter wiring.",
|
|
44
|
+
status: "ported",
|
|
45
|
+
toolcraftMapping:
|
|
46
|
+
"Toolcraft schema controls write runtime values consumed by the renderer.",
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
acceptanceId: "reference.rendererState",
|
|
50
|
+
behaviorEvidence:
|
|
51
|
+
"Observed reference renderer state persist across multiple animation frames.",
|
|
52
|
+
featureName: "Renderer state",
|
|
53
|
+
id: "renderer-state",
|
|
54
|
+
referenceBehavior: "Reference renderer mutable state persists across frames.",
|
|
55
|
+
sourceEvidence: "Inspected reference renderer lifecycle and frame updates.",
|
|
56
|
+
status: "ported",
|
|
57
|
+
toolcraftMapping:
|
|
58
|
+
"Toolcraft renderer keeps equivalent mutable state and invalidation lifecycle.",
|
|
59
|
+
},
|
|
60
|
+
...extra,
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function makeReferenceCoverageAcceptance(
|
|
65
|
+
id: string,
|
|
66
|
+
referenceCoverage: ToolcraftReferenceCoverage,
|
|
67
|
+
): ToolcraftComponentAcceptance {
|
|
68
|
+
return {
|
|
69
|
+
automated: true,
|
|
70
|
+
automatedTestName: `${id} preserves reference behavior`,
|
|
71
|
+
browser: true,
|
|
72
|
+
browserTestName: `browser: ${id} preserves reference behavior`,
|
|
73
|
+
componentType: "custom-renderer",
|
|
74
|
+
evidence: "product-output",
|
|
75
|
+
expectedObservable: `${id} preserves the reference behavior in Toolcraft output.`,
|
|
76
|
+
fixture: `${id} fixture`,
|
|
77
|
+
id,
|
|
78
|
+
kind: "runtime",
|
|
79
|
+
referenceCoverage,
|
|
80
|
+
userAction: `Exercise ${id}.`,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function makeReferenceTimelineCoverageAcceptance(
|
|
85
|
+
id: string,
|
|
86
|
+
referenceTimelineCoverage: ToolcraftReferenceTimelineCoverage,
|
|
87
|
+
): ToolcraftComponentAcceptance {
|
|
88
|
+
return {
|
|
89
|
+
automated: true,
|
|
90
|
+
automatedTestName: `${id} preserves reference timeline behavior`,
|
|
91
|
+
browser: true,
|
|
92
|
+
browserTestName: `browser: ${id} preserves reference timeline behavior`,
|
|
93
|
+
componentType: "custom-timeline",
|
|
94
|
+
evidence: "timeline-output",
|
|
95
|
+
expectedObservable: `${id} preserves the reference timeline behavior.`,
|
|
96
|
+
fixture: `${id} fixture`,
|
|
97
|
+
id,
|
|
98
|
+
kind: "runtime",
|
|
99
|
+
referenceTimelineCoverage,
|
|
100
|
+
userAction: `Exercise ${id}.`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
contractAcceptanceFixture,
|
|
5
|
+
contractSchemaFixture,
|
|
6
|
+
validateContractAcceptance,
|
|
7
|
+
} from "./starter-acceptance.contract-fixtures";
|
|
8
|
+
import {
|
|
9
|
+
keyframesTimelineAcceptance,
|
|
10
|
+
playbackTimelineAcceptance,
|
|
11
|
+
} from "./starter-acceptance.timeline-test-utils";
|
|
12
|
+
import {
|
|
13
|
+
makeReferenceFeatureInventory,
|
|
14
|
+
referenceStudyEvidence,
|
|
15
|
+
} from "./starter-acceptance.reference-test-utils";
|
|
16
|
+
|
|
17
|
+
describe("starter acceptance reference timeline contract", () => {
|
|
18
|
+
it("accepts reference-runtime-clone mode only when required reference behavior is test-backed", () => {
|
|
19
|
+
expect(
|
|
20
|
+
validateContractAcceptance({
|
|
21
|
+
schema: contractSchemaFixture,
|
|
22
|
+
acceptance: [
|
|
23
|
+
...contractAcceptanceFixture,
|
|
24
|
+
{
|
|
25
|
+
automated: true,
|
|
26
|
+
automatedTestName: "reference canvas size matches legacy renderer",
|
|
27
|
+
browser: true,
|
|
28
|
+
browserTestName: "browser: reference canvas size matches legacy renderer",
|
|
29
|
+
componentType: "custom-renderer",
|
|
30
|
+
evidence: "rendered-pixels",
|
|
31
|
+
expectedObservable: "The Toolcraft renderer uses the same output dimensions as the reference runtime.",
|
|
32
|
+
fixture: "legacy renderer fixture",
|
|
33
|
+
id: "reference.canvasSizing",
|
|
34
|
+
kind: "runtime",
|
|
35
|
+
referenceCoverage: "canvas-sizing",
|
|
36
|
+
userAction: "Render the reference-sized output.",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
automated: true,
|
|
40
|
+
automatedTestName: "reference control mapping preserves legacy output",
|
|
41
|
+
browser: true,
|
|
42
|
+
browserTestName: "browser: reference control mapping preserves legacy output",
|
|
43
|
+
componentType: "custom-renderer",
|
|
44
|
+
evidence: "product-output",
|
|
45
|
+
expectedObservable: "Changing each mapped control updates the same renderer parameter as the reference app.",
|
|
46
|
+
fixture: "legacy controls fixture",
|
|
47
|
+
id: "reference.controlMapping",
|
|
48
|
+
kind: "runtime",
|
|
49
|
+
referenceCoverage: "control-mapping",
|
|
50
|
+
userAction: "Change mapped controls and compare reference output behavior.",
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
automated: true,
|
|
54
|
+
automatedTestName: "reference renderer state preserves legacy lifecycle",
|
|
55
|
+
browser: true,
|
|
56
|
+
browserTestName: "browser: reference renderer state preserves legacy lifecycle",
|
|
57
|
+
componentType: "custom-renderer",
|
|
58
|
+
evidence: "product-output",
|
|
59
|
+
expectedObservable: "The renderer preserves the reference runtime mutable state lifecycle across frames.",
|
|
60
|
+
fixture: "legacy renderer state fixture",
|
|
61
|
+
id: "reference.rendererState",
|
|
62
|
+
kind: "runtime",
|
|
63
|
+
referenceCoverage: "renderer-state",
|
|
64
|
+
userAction: "Run the renderer across frames and compare stateful output.",
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
transferMode: {
|
|
68
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
69
|
+
mode: "reference-runtime-clone",
|
|
70
|
+
referenceFeatureInventory: makeReferenceFeatureInventory(),
|
|
71
|
+
referenceName: "legacy badge wall",
|
|
72
|
+
referenceStudy: referenceStudyEvidence,
|
|
73
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
74
|
+
sourceOfTruth: "reference-runtime",
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("requires reference clones with pause resume behavior to choose a non-none timeline mode", () => {
|
|
81
|
+
expect(
|
|
82
|
+
validateContractAcceptance({
|
|
83
|
+
schema: contractSchemaFixture,
|
|
84
|
+
acceptance: contractAcceptanceFixture,
|
|
85
|
+
transferMode: {
|
|
86
|
+
behaviorCoverage: [
|
|
87
|
+
"canvas-sizing",
|
|
88
|
+
"control-mapping",
|
|
89
|
+
"renderer-state",
|
|
90
|
+
"pause-resume",
|
|
91
|
+
],
|
|
92
|
+
mode: "reference-runtime-clone",
|
|
93
|
+
referenceName: "legacy pause animation",
|
|
94
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
95
|
+
sourceOfTruth: "reference-runtime",
|
|
96
|
+
},
|
|
97
|
+
}),
|
|
98
|
+
).toContain(
|
|
99
|
+
'reference-runtime-clone transport behaviorCoverage "pause-resume" requires referenceTimeline mode "toolcraft-playback", "toolcraft-keyframes", or "custom-reference-timeline"; mode "none" is only for references with no user-facing transport behavior.',
|
|
100
|
+
);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("rejects reference clones that hide restart transport behind timeline none", () => {
|
|
104
|
+
expect(
|
|
105
|
+
validateContractAcceptance({
|
|
106
|
+
schema: contractSchemaFixture,
|
|
107
|
+
acceptance: contractAcceptanceFixture,
|
|
108
|
+
transferMode: {
|
|
109
|
+
behaviorCoverage: [
|
|
110
|
+
"canvas-sizing",
|
|
111
|
+
"control-mapping",
|
|
112
|
+
"renderer-state",
|
|
113
|
+
"restart",
|
|
114
|
+
"time-progress",
|
|
115
|
+
],
|
|
116
|
+
mode: "reference-runtime-clone",
|
|
117
|
+
referenceName: "legacy restart animation",
|
|
118
|
+
referenceTimeline: { behaviorCoverage: [], mode: "none" },
|
|
119
|
+
sourceOfTruth: "reference-runtime",
|
|
120
|
+
},
|
|
121
|
+
}),
|
|
122
|
+
).toContain(
|
|
123
|
+
'reference-runtime-clone transport behaviorCoverage "restart", "time-progress" requires referenceTimeline mode "toolcraft-playback", "toolcraft-keyframes", or "custom-reference-timeline"; mode "none" is only for references with no user-facing transport behavior.',
|
|
124
|
+
);
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it("requires playback reference timelines to declare concrete behavior coverage", () => {
|
|
128
|
+
expect(
|
|
129
|
+
validateContractAcceptance({
|
|
130
|
+
schema: contractSchemaFixture,
|
|
131
|
+
acceptance: contractAcceptanceFixture,
|
|
132
|
+
transferMode: {
|
|
133
|
+
behaviorCoverage: ["canvas-sizing", "control-mapping", "renderer-state"],
|
|
134
|
+
mode: "reference-runtime-clone",
|
|
135
|
+
referenceName: "legacy playback animation",
|
|
136
|
+
referenceTimeline: { behaviorCoverage: [], mode: "toolcraft-playback" },
|
|
137
|
+
sourceOfTruth: "reference-runtime",
|
|
138
|
+
},
|
|
139
|
+
}),
|
|
140
|
+
).toContain(
|
|
141
|
+
'referenceTimeline mode "toolcraft-playback" must list the concrete timeline transport behaviors in behaviorCoverage.',
|
|
142
|
+
);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
it("requires Toolcraft reference playback timelines to declare loop duration provenance", () => {
|
|
146
|
+
const schemaWithPlaybackTimeline = {
|
|
147
|
+
...contractSchemaFixture,
|
|
148
|
+
panels: {
|
|
149
|
+
...contractSchemaFixture.panels,
|
|
150
|
+
timeline: { defaultDurationSeconds: 8, enabled: true, mode: "playback" as const },
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
expect(
|
|
155
|
+
validateContractAcceptance({
|
|
156
|
+
schema: schemaWithPlaybackTimeline,
|
|
157
|
+
acceptance: [
|
|
158
|
+
...contractAcceptanceFixture,
|
|
159
|
+
{
|
|
160
|
+
...playbackTimelineAcceptance,
|
|
161
|
+
id: "reference.timeline.playback",
|
|
162
|
+
referenceTimelineCoverage: "playback",
|
|
163
|
+
},
|
|
164
|
+
],
|
|
165
|
+
transferMode: {
|
|
166
|
+
behaviorCoverage: [
|
|
167
|
+
"canvas-sizing",
|
|
168
|
+
"control-mapping",
|
|
169
|
+
"renderer-state",
|
|
170
|
+
"pause-resume",
|
|
171
|
+
],
|
|
172
|
+
mode: "reference-runtime-clone",
|
|
173
|
+
referenceName: "legacy playback animation",
|
|
174
|
+
referenceTimeline: { behaviorCoverage: ["playback"], mode: "toolcraft-playback" },
|
|
175
|
+
sourceOfTruth: "reference-runtime",
|
|
176
|
+
},
|
|
177
|
+
}),
|
|
178
|
+
).toContain(
|
|
179
|
+
'referenceTimeline mode "toolcraft-playback" must declare loopDuration with source, seconds, and evidence. Do not let runtime/template fallback duration such as 8s stand in for reference loop intent.',
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it("requires Toolcraft reference timeline loop duration to match the timeline default", () => {
|
|
184
|
+
const schemaWithPlaybackTimeline = {
|
|
185
|
+
...contractSchemaFixture,
|
|
186
|
+
panels: {
|
|
187
|
+
...contractSchemaFixture.panels,
|
|
188
|
+
timeline: { defaultDurationSeconds: 8, enabled: true, mode: "playback" as const },
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
expect(
|
|
193
|
+
validateContractAcceptance({
|
|
194
|
+
schema: schemaWithPlaybackTimeline,
|
|
195
|
+
acceptance: [
|
|
196
|
+
...contractAcceptanceFixture,
|
|
197
|
+
{
|
|
198
|
+
...playbackTimelineAcceptance,
|
|
199
|
+
id: "reference.timeline.playback",
|
|
200
|
+
referenceTimelineCoverage: "playback",
|
|
201
|
+
},
|
|
202
|
+
],
|
|
203
|
+
transferMode: {
|
|
204
|
+
behaviorCoverage: [
|
|
205
|
+
"canvas-sizing",
|
|
206
|
+
"control-mapping",
|
|
207
|
+
"renderer-state",
|
|
208
|
+
"pause-resume",
|
|
209
|
+
],
|
|
210
|
+
mode: "reference-runtime-clone",
|
|
211
|
+
referenceName: "legacy playback animation",
|
|
212
|
+
referenceTimeline: {
|
|
213
|
+
behaviorCoverage: ["playback"],
|
|
214
|
+
loopDuration: {
|
|
215
|
+
evidence: "The reference app completes one seamless forward playback cycle over 6s.",
|
|
216
|
+
seconds: 6,
|
|
217
|
+
source: "reference",
|
|
218
|
+
},
|
|
219
|
+
mode: "toolcraft-playback",
|
|
220
|
+
},
|
|
221
|
+
sourceOfTruth: "reference-runtime",
|
|
222
|
+
},
|
|
223
|
+
}),
|
|
224
|
+
).toContain(
|
|
225
|
+
"panels.timeline.defaultDurationSeconds (8) must match referenceTimeline.loopDuration.seconds (6).",
|
|
226
|
+
);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("requires Toolcraft reference keyframe timelines to declare loop duration provenance", () => {
|
|
230
|
+
const schemaWithKeyframesTimeline = {
|
|
231
|
+
...contractSchemaFixture,
|
|
232
|
+
panels: {
|
|
233
|
+
...contractSchemaFixture.panels,
|
|
234
|
+
timeline: { defaultDurationSeconds: 8, enabled: true, mode: "keyframes" as const },
|
|
235
|
+
},
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
expect(
|
|
239
|
+
validateContractAcceptance({
|
|
240
|
+
schema: schemaWithKeyframesTimeline,
|
|
241
|
+
acceptance: [
|
|
242
|
+
...contractAcceptanceFixture,
|
|
243
|
+
playbackTimelineAcceptance,
|
|
244
|
+
{
|
|
245
|
+
...keyframesTimelineAcceptance,
|
|
246
|
+
id: "reference.timeline.keyframes",
|
|
247
|
+
referenceTimelineCoverage: "keyframes",
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
transferMode: {
|
|
251
|
+
behaviorCoverage: [
|
|
252
|
+
"canvas-sizing",
|
|
253
|
+
"control-mapping",
|
|
254
|
+
"renderer-state",
|
|
255
|
+
"time-progress",
|
|
256
|
+
],
|
|
257
|
+
mode: "reference-runtime-clone",
|
|
258
|
+
referenceName: "legacy keyframe animation",
|
|
259
|
+
referenceTimeline: { behaviorCoverage: ["keyframes"], mode: "toolcraft-keyframes" },
|
|
260
|
+
sourceOfTruth: "reference-runtime",
|
|
261
|
+
},
|
|
262
|
+
}),
|
|
263
|
+
).toContain(
|
|
264
|
+
'referenceTimeline mode "toolcraft-keyframes" must declare loopDuration with source, seconds, and evidence. Do not let runtime/template fallback duration such as 8s stand in for reference loop intent.',
|
|
265
|
+
);
|
|
266
|
+
});
|
|
267
|
+
});
|