@divmain/jdm-asm 0.2.0 → 0.2.3
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/index.js +2227 -29
- package/dist/index.js.map +1 -1
- package/package.json +8 -2
- package/.github/workflows/ci.yml +0 -53
- package/.oxfmtrc.json +0 -16
- package/.oxlintrc.json +0 -183
- package/AGENTS.md +0 -81
- package/asconfig.json +0 -23
- package/benchmarks/fixtures.ts +0 -111
- package/benchmarks/input-fixtures.ts +0 -80
- package/benchmarks/run.ts +0 -913
- package/benchmarks/worker-pool.ts +0 -223
- package/benchmarks/worker.ts +0 -374
- package/scripts/run-all-tests.ts +0 -220
- package/src/compiler/EXPRESSION_SUBSETS.md +0 -228
- package/src/compiler/asc-compiler.ts +0 -315
- package/src/compiler/ast-types.ts +0 -215
- package/src/compiler/build.ts +0 -56
- package/src/compiler/cache.ts +0 -414
- package/src/compiler/code-generators.ts +0 -211
- package/src/compiler/codegen/index.ts +0 -15
- package/src/compiler/codegen/js-marshal.ts +0 -999
- package/src/compiler/codegen/js-validation.ts +0 -243
- package/src/compiler/codegen.ts +0 -19
- package/src/compiler/compile-time-validation.ts +0 -507
- package/src/compiler/cst-visitor.ts +0 -434
- package/src/compiler/errors.ts +0 -227
- package/src/compiler/expression-parser.ts +0 -536
- package/src/compiler/graph.ts +0 -197
- package/src/compiler/index.ts +0 -199
- package/src/compiler/input-validation.ts +0 -33
- package/src/compiler/marshal-gen.ts +0 -21
- package/src/compiler/nodes/context-resolvers.ts +0 -197
- package/src/compiler/nodes/decision-table.ts +0 -507
- package/src/compiler/nodes/decision.ts +0 -292
- package/src/compiler/nodes/expression-compiler.ts +0 -526
- package/src/compiler/nodes/expression.ts +0 -425
- package/src/compiler/nodes/function.ts +0 -316
- package/src/compiler/nodes/input.ts +0 -60
- package/src/compiler/nodes/switch.ts +0 -547
- package/src/compiler/optimizer.ts +0 -948
- package/src/compiler/orchestrator.ts +0 -352
- package/src/compiler/parser.ts +0 -115
- package/src/compiler/result-selection.ts +0 -161
- package/src/compiler/runtime/index.ts +0 -26
- package/src/compiler/runtime-codegen.ts +0 -211
- package/src/compiler/runtime-validation-codegen.ts +0 -294
- package/src/compiler/runtime.ts +0 -452
- package/src/compiler/schema.ts +0 -245
- package/src/compiler/switch-branch-detection.ts +0 -92
- package/src/compiler/types.ts +0 -136
- package/src/compiler/unary-ast-transforms.ts +0 -148
- package/src/compiler/unary-parser.ts +0 -301
- package/src/compiler/unary-transform.ts +0 -161
- package/src/compiler/utils.ts +0 -27
- package/src/compiler/virtual-fs.ts +0 -90
- package/src/compiler/wasm-instantiate.ts +0 -127
- package/src/index.ts +0 -1
- package/src/runtime/arrays.ts +0 -579
- package/src/runtime/context.ts +0 -189
- package/src/runtime/expressions.ts +0 -1811
- package/src/runtime/index.ts +0 -8
- package/src/runtime/memory.ts +0 -607
- package/src/runtime/strings.ts +0 -260
- package/src/runtime/tables.ts +0 -96
- package/src/runtime/tsconfig.json +0 -4
- package/src/runtime/values.ts +0 -209
- package/test-data/README.md +0 -83
- package/test-data/decision-tables/basic/8k.json +0 -87992
- package/test-data/decision-tables/basic/affiliate-commission-calculator.json +0 -228
- package/test-data/decision-tables/basic/airline-loyalty-points-calculations.json +0 -285
- package/test-data/decision-tables/basic/airline-upgrade-eligibility.json +0 -466
- package/test-data/decision-tables/basic/auto-insurance-premium-calculator.json +0 -412
- package/test-data/decision-tables/basic/booking-personalization-system.json +0 -553
- package/test-data/decision-tables/basic/care-team-assignment-system.json +0 -585
- package/test-data/decision-tables/basic/claim-validation-system.json +0 -307
- package/test-data/decision-tables/basic/clinical-lab-result-interpreter.json +0 -433
- package/test-data/decision-tables/basic/clinical-treatment-protocol.json +0 -474
- package/test-data/decision-tables/basic/credit-limit-adjustment.json +0 -479
- package/test-data/decision-tables/basic/customer-eligibility-engine.json +0 -551
- package/test-data/decision-tables/basic/customer-lifetime-value.json +0 -200
- package/test-data/decision-tables/basic/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/decision-tables/basic/customer-service-escalation.json +0 -191
- package/test-data/decision-tables/basic/decision-table-discounts.json +0 -168
- package/test-data/decision-tables/basic/decision-table-shipping.json +0 -398
- package/test-data/decision-tables/basic/delivery-route-optimizer.json +0 -271
- package/test-data/decision-tables/basic/device-compatibility-checker.json +0 -303
- package/test-data/decision-tables/basic/disaster-relief-fund-allocation.json +0 -296
- package/test-data/decision-tables/basic/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/decision-tables/basic/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/decision-tables/basic/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/decision-tables/basic/dynamic-tarrif-engine.json +0 -289
- package/test-data/decision-tables/basic/dynamic-ticket-pricing.json +0 -325
- package/test-data/decision-tables/basic/empty-column-with-space.json +0 -100
- package/test-data/decision-tables/basic/empty-column-without-space.json +0 -100
- package/test-data/decision-tables/basic/environment-compliance-assessment.json +0 -386
- package/test-data/decision-tables/basic/expression-table-map.json +0 -313
- package/test-data/decision-tables/basic/flash-sale-eligibility.json +0 -366
- package/test-data/decision-tables/basic/flight-dispatch-decision-system.json +0 -455
- package/test-data/decision-tables/basic/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/decision-tables/basic/government-assistance.json +0 -299
- package/test-data/decision-tables/basic/grant-funding-distribution.json +0 -307
- package/test-data/decision-tables/basic/hazardous-materials-management-system.json +0 -414
- package/test-data/decision-tables/basic/immigration-eligibility-evaluator.json +0 -765
- package/test-data/decision-tables/basic/import-duties-calculator.json +0 -318
- package/test-data/decision-tables/basic/insurance-agent-commission.json +0 -228
- package/test-data/decision-tables/basic/insurance-coverage-calculator.json +0 -362
- package/test-data/decision-tables/basic/insurance-underwriting-risk.json +0 -321
- package/test-data/decision-tables/basic/international-roaming-policy-manager.json +0 -199
- package/test-data/decision-tables/basic/legacy-plan-management.json +0 -434
- package/test-data/decision-tables/basic/marketplace-listing-verification-system.json +0 -334
- package/test-data/decision-tables/basic/medication-dosage-calculator.json +0 -318
- package/test-data/decision-tables/basic/merch-bags.json +0 -171
- package/test-data/decision-tables/basic/municipal-permit-evaluation-system.json +0 -364
- package/test-data/decision-tables/basic/mvno-partner-enablement.json +0 -313
- package/test-data/decision-tables/basic/partner-revenue-sharing.json +0 -244
- package/test-data/decision-tables/basic/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/decision-tables/basic/policy-discount-calculator.json +0 -307
- package/test-data/decision-tables/basic/policy-eligibility-analyzer.json +0 -299
- package/test-data/decision-tables/basic/product-listing-scoring.json +0 -358
- package/test-data/decision-tables/basic/realtime-fraud-detection.json +0 -235
- package/test-data/decision-tables/basic/regional-compliance-manager.json +0 -278
- package/test-data/decision-tables/basic/returns-and-refund-policy.json +0 -366
- package/test-data/decision-tables/basic/returns-processing-system.json +0 -448
- package/test-data/decision-tables/basic/school-district-resource-allocation.json +0 -282
- package/test-data/decision-tables/basic/seat-map-optimization.json +0 -325
- package/test-data/decision-tables/basic/seller-fee-calculator.json +0 -307
- package/test-data/decision-tables/basic/service-level-agreement-enforcement.json +0 -575
- package/test-data/decision-tables/basic/smart-financial-product-matcher.json +0 -249
- package/test-data/decision-tables/basic/supply-chain-risk.json +0 -316
- package/test-data/decision-tables/basic/table-loop.json +0 -93
- package/test-data/decision-tables/basic/table.json +0 -76
- package/test-data/decision-tables/basic/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/decision-tables/basic/transaction-compliance-classifier.json +0 -525
- package/test-data/decision-tables/basic/vehicle-claims-resolution.json +0 -310
- package/test-data/decision-tables/basic/warehouse-storage-location.json +0 -345
- package/test-data/decision-tables/hit-policy-collect/collect-multiple-matches.json +0 -127
- package/test-data/decision-tables/hit-policy-collect/collect-no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-first/first-match.json +0 -103
- package/test-data/decision-tables/hit-policy-first/no-match.json +0 -95
- package/test-data/decision-tables/hit-policy-output-order/output-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-output-order/string-output-order.json +0 -94
- package/test-data/decision-tables/hit-policy-priority/priority-respected.json +0 -86
- package/test-data/decision-tables/hit-policy-rule-order/rule-order-respected.json +0 -94
- package/test-data/decision-tables/hit-policy-unique/all-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/multiple-match-error.json +0 -89
- package/test-data/decision-tables/hit-policy-unique/no-match.json +0 -88
- package/test-data/decision-tables/hit-policy-unique/unique-match.json +0 -99
- package/test-data/expressions/arithmetic/error-cyclic.json +0 -114
- package/test-data/expressions/arithmetic/error-missing-input.json +0 -54
- package/test-data/expressions/arithmetic/error-missing-output.json +0 -54
- package/test-data/expressions/arithmetic/expression-default.json +0 -93
- package/test-data/expressions/arithmetic/expression-fields.json +0 -94
- package/test-data/expressions/arithmetic/expression-loop.json +0 -94
- package/test-data/expressions/arithmetic/expression-passthrough.json +0 -108
- package/test-data/expressions/arithmetic/expression.json +0 -69
- package/test-data/expressions/arithmetic/nested-request.json +0 -125
- package/test-data/expressions/arithmetic/number-function.json +0 -58
- package/test-data/expressions/arithmetic/test-number-functions.json +0 -68
- package/test-data/expressions/functions/all.json +0 -149
- package/test-data/expressions/functions/avg.json +0 -89
- package/test-data/expressions/functions/filter.json +0 -109
- package/test-data/expressions/functions/flat.json +0 -167
- package/test-data/expressions/functions/map-strings.json +0 -65
- package/test-data/expressions/functions/map.json +0 -73
- package/test-data/expressions/functions/reduce.json +0 -49
- package/test-data/expressions/functions/some.json +0 -175
- package/test-data/expressions/functions/sort-strings.json +0 -97
- package/test-data/expressions/functions/sort.json +0 -97
- package/test-data/expressions/logical/logical-and.json +0 -116
- package/test-data/expressions/logical/logical-complex.json +0 -260
- package/test-data/expressions/logical/logical-not.json +0 -111
- package/test-data/expressions/logical/logical-or.json +0 -123
- package/test-data/expressions/string/string-comparison.json +0 -128
- package/test-data/expressions/string/string-concat.json +0 -106
- package/test-data/expressions/string/string-contains.json +0 -125
- package/test-data/expressions/string/string-endsWith.json +0 -113
- package/test-data/expressions/string/string-indexOf.json +0 -131
- package/test-data/expressions/string/string-join.json +0 -92
- package/test-data/expressions/string/string-lower.json +0 -94
- package/test-data/expressions/string/string-replace.json +0 -130
- package/test-data/expressions/string/string-split.json +0 -101
- package/test-data/expressions/string/string-startsWith.json +0 -113
- package/test-data/expressions/string/string-substring.json +0 -138
- package/test-data/expressions/string/string-trim.json +0 -100
- package/test-data/expressions/string/string-upper.json +0 -94
- package/test-data/other/custom.json +0 -51
- package/test-data/other/customer-input-schema.json +0 -34
- package/test-data/other/customer-output-schema.json +0 -34
- package/test-data/other/passthrough.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-child.json +0 -31
- package/test-data/sub-decisions/basic/$nodes-parent.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table1.json +0 -49
- package/test-data/sub-decisions/basic/recursive-table2.json +0 -49
- package/test-data/sub-decisions/complex-multi/approval-decision.json +0 -31
- package/test-data/sub-decisions/complex-multi/complex-dag.json +0 -175
- package/test-data/sub-decisions/complex-multi/credit-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/customer-segmentation.json +0 -31
- package/test-data/sub-decisions/complex-multi/discount-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/eligibility-check.json +0 -31
- package/test-data/sub-decisions/complex-multi/final-offer.json +0 -31
- package/test-data/sub-decisions/complex-multi/income-verification.json +0 -31
- package/test-data/sub-decisions/complex-multi/linear-chain.json +0 -121
- package/test-data/sub-decisions/complex-multi/pricing-calculation.json +0 -31
- package/test-data/sub-decisions/complex-multi/product-eligibility.json +0 -31
- package/test-data/sub-decisions/complex-multi/risk-assessment.json +0 -31
- package/test-data/sub-decisions/complex-multi/shared-validation.json +0 -31
- package/test-data/sub-decisions/complex-multi/validation.json +0 -31
- package/test-data/sub-decisions/diamond/decision-a.json +0 -31
- package/test-data/sub-decisions/diamond/decision-b.json +0 -31
- package/test-data/sub-decisions/diamond/decision-c.json +0 -31
- package/test-data/sub-decisions/diamond/decision-shared.json +0 -31
- package/test-data/sub-decisions/diamond/diamond-pattern.json +0 -109
- package/test-data/sub-decisions/error-propagation/parent-calls-error.json +0 -44
- package/test-data/sub-decisions/error-propagation/sub-decision-with-error.json +0 -60
- package/test-data/switch-nodes/basic/account-dormancy-management.json +0 -245
- package/test-data/switch-nodes/basic/application-risk-assessment.json +0 -474
- package/test-data/switch-nodes/basic/cellular-data-rollover-system.json +0 -281
- package/test-data/switch-nodes/basic/clinical-pathway-selection.json +0 -454
- package/test-data/switch-nodes/basic/insurance-prior-authorization.json +0 -467
- package/test-data/switch-nodes/basic/last-mile-delivery-assignment.json +0 -373
- package/test-data/switch-nodes/basic/loan-approval.json +0 -469
- package/test-data/switch-nodes/basic/multi-switch.json +0 -498
- package/test-data/switch-nodes/basic/online-checkin-eligibility.json +0 -285
- package/test-data/switch-nodes/basic/order-consolidation-system.json +0 -493
- package/test-data/switch-nodes/basic/seller-approval-workflow.json +0 -383
- package/test-data/switch-nodes/basic/set-fee.json +0 -243
- package/test-data/switch-nodes/basic/shipping-carrier-selector.json +0 -379
- package/test-data/switch-nodes/basic/switch-node.json +0 -167
- package/test-data/switch-nodes/basic/switch-performance-2.json +0 -1307
- package/test-data/switch-nodes/basic/switch-performance.json +0 -691
- package/test-data/switch-nodes/basic/tax-exemption.json +0 -295
- package/test-data/switch-nodes/basic/warehouse-cross-docking.json +0 -313
- package/test-data/switch-nodes/default-cases/switch-with-default.json +0 -134
- package/test-data/zen-reference/$nodes-child.json +0 -69
- package/test-data/zen-reference/$nodes-parent.json +0 -34
- package/test-data/zen-reference/8k.json +0 -87992
- package/test-data/zen-reference/credit-analysis.json +0 -324
- package/test-data/zen-reference/custom.json +0 -51
- package/test-data/zen-reference/customer-input-schema.json +0 -34
- package/test-data/zen-reference/customer-output-schema.json +0 -34
- package/test-data/zen-reference/error-cyclic.json +0 -114
- package/test-data/zen-reference/error-missing-input.json +0 -54
- package/test-data/zen-reference/error-missing-output.json +0 -54
- package/test-data/zen-reference/expression.json +0 -69
- package/test-data/zen-reference/function-v2.json +0 -48
- package/test-data/zen-reference/function.json +0 -46
- package/test-data/zen-reference/graphs/account-dormancy-management.json +0 -245
- package/test-data/zen-reference/graphs/affiliate-commission-calculator.json +0 -228
- package/test-data/zen-reference/graphs/airline-loyalty-points-calculations.json +0 -285
- package/test-data/zen-reference/graphs/airline-upgrade-eligibility.json +0 -466
- package/test-data/zen-reference/graphs/aml.json +0 -537
- package/test-data/zen-reference/graphs/application-risk-assessment.json +0 -474
- package/test-data/zen-reference/graphs/auto-insurance-premium-calculator.json +0 -412
- package/test-data/zen-reference/graphs/booking-personalization-system.json +0 -553
- package/test-data/zen-reference/graphs/care-team-assignment-system.json +0 -585
- package/test-data/zen-reference/graphs/cellular-data-rollover-system.json +0 -281
- package/test-data/zen-reference/graphs/claim-validation-system.json +0 -307
- package/test-data/zen-reference/graphs/clinical-lab-result-interpreter.json +0 -433
- package/test-data/zen-reference/graphs/clinical-pathway-selection.json +0 -454
- package/test-data/zen-reference/graphs/clinical-treatment-protocol.json +0 -474
- package/test-data/zen-reference/graphs/company-analysis.json +0 -390
- package/test-data/zen-reference/graphs/credit-limit-adjustment.json +0 -479
- package/test-data/zen-reference/graphs/customer-eligibility-engine.json +0 -551
- package/test-data/zen-reference/graphs/customer-lifetime-value.json +0 -200
- package/test-data/zen-reference/graphs/customer-onboarding-kyc-verification.json +0 -611
- package/test-data/zen-reference/graphs/customer-service-escalation.json +0 -191
- package/test-data/zen-reference/graphs/decision-table-discounts.json +0 -168
- package/test-data/zen-reference/graphs/decision-table-shipping.json +0 -398
- package/test-data/zen-reference/graphs/delivery-route-optimizer.json +0 -271
- package/test-data/zen-reference/graphs/device-compatibility-checker.json +0 -303
- package/test-data/zen-reference/graphs/disaster-relief-fund-allocation.json +0 -296
- package/test-data/zen-reference/graphs/dynamic-fx-rate-pricing-system.json +0 -237
- package/test-data/zen-reference/graphs/dynamic-marketplace-comission-calculator.json +0 -242
- package/test-data/zen-reference/graphs/dynamic-shipping-cost-calculator.json +0 -378
- package/test-data/zen-reference/graphs/dynamic-tarrif-engine.json +0 -289
- package/test-data/zen-reference/graphs/dynamic-ticket-pricing.json +0 -325
- package/test-data/zen-reference/graphs/empty-column-with-space.json +0 -100
- package/test-data/zen-reference/graphs/empty-column-without-space.json +0 -100
- package/test-data/zen-reference/graphs/environment-compliance-assessment.json +0 -386
- package/test-data/zen-reference/graphs/expression-default.json +0 -93
- package/test-data/zen-reference/graphs/expression-fields.json +0 -94
- package/test-data/zen-reference/graphs/expression-loop.json +0 -94
- package/test-data/zen-reference/graphs/expression-passthrough.json +0 -108
- package/test-data/zen-reference/graphs/expression-table-map.json +0 -313
- package/test-data/zen-reference/graphs/flash-sale-eligibility.json +0 -366
- package/test-data/zen-reference/graphs/flight-dispatch-decision-system.json +0 -455
- package/test-data/zen-reference/graphs/flight-rebooking-fee-calculator.json +0 -406
- package/test-data/zen-reference/graphs/government-assistance.json +0 -299
- package/test-data/zen-reference/graphs/grant-funding-distribution.json +0 -307
- package/test-data/zen-reference/graphs/hazardous-materials-management-system.json +0 -414
- package/test-data/zen-reference/graphs/immigration-eligibility-evaluator.json +0 -765
- package/test-data/zen-reference/graphs/import-duties-calculator.json +0 -318
- package/test-data/zen-reference/graphs/insurance-agent-commission.json +0 -228
- package/test-data/zen-reference/graphs/insurance-breakdown.json +0 -421
- package/test-data/zen-reference/graphs/insurance-coverage-calculator.json +0 -362
- package/test-data/zen-reference/graphs/insurance-prior-authorization.json +0 -467
- package/test-data/zen-reference/graphs/insurance-underwriting-risk.json +0 -321
- package/test-data/zen-reference/graphs/international-roaming-policy-manager.json +0 -199
- package/test-data/zen-reference/graphs/last-mile-delivery-assignment.json +0 -373
- package/test-data/zen-reference/graphs/legacy-plan-management.json +0 -434
- package/test-data/zen-reference/graphs/loan-approval.json +0 -469
- package/test-data/zen-reference/graphs/marketplace-listing-verification-system.json +0 -334
- package/test-data/zen-reference/graphs/medication-dosage-calculator.json +0 -318
- package/test-data/zen-reference/graphs/merch-bags.json +0 -171
- package/test-data/zen-reference/graphs/multi-switch.json +0 -498
- package/test-data/zen-reference/graphs/municipal-permit-evaluation-system.json +0 -364
- package/test-data/zen-reference/graphs/mvno-partner-enablement.json +0 -313
- package/test-data/zen-reference/graphs/nested-request.json +0 -125
- package/test-data/zen-reference/graphs/online-checkin-eligibility.json +0 -285
- package/test-data/zen-reference/graphs/order-consolidation-system.json +0 -493
- package/test-data/zen-reference/graphs/partner-revenue-sharing.json +0 -244
- package/test-data/zen-reference/graphs/payment-routing-and-fee-calculator.json +0 -475
- package/test-data/zen-reference/graphs/policy-discount-calculator.json +0 -307
- package/test-data/zen-reference/graphs/policy-eligibility-analyzer.json +0 -299
- package/test-data/zen-reference/graphs/product-listing-scoring.json +0 -358
- package/test-data/zen-reference/graphs/realtime-fraud-detection.json +0 -235
- package/test-data/zen-reference/graphs/regional-compliance-manager.json +0 -278
- package/test-data/zen-reference/graphs/returns-and-refund-policy.json +0 -366
- package/test-data/zen-reference/graphs/returns-processing-system.json +0 -448
- package/test-data/zen-reference/graphs/school-district-resource-allocation.json +0 -282
- package/test-data/zen-reference/graphs/seat-map-optimization.json +0 -325
- package/test-data/zen-reference/graphs/seller-approval-workflow.json +0 -383
- package/test-data/zen-reference/graphs/seller-fee-calculator.json +0 -307
- package/test-data/zen-reference/graphs/service-level-agreement-enforcement.json +0 -575
- package/test-data/zen-reference/graphs/set-fee.json +0 -243
- package/test-data/zen-reference/graphs/shipping-carrier-selector.json +0 -379
- package/test-data/zen-reference/graphs/smart-financial-product-matcher.json +0 -249
- package/test-data/zen-reference/graphs/supply-chain-risk.json +0 -316
- package/test-data/zen-reference/graphs/table-loop.json +0 -93
- package/test-data/zen-reference/graphs/tax-exemption.json +0 -295
- package/test-data/zen-reference/graphs/traffic-violation-penalty-calculator.json +0 -436
- package/test-data/zen-reference/graphs/transaction-compliance-classifier.json +0 -525
- package/test-data/zen-reference/graphs/vehicle-claims-resolution.json +0 -310
- package/test-data/zen-reference/graphs/warehouse-cross-docking.json +0 -313
- package/test-data/zen-reference/graphs/warehouse-storage-location.json +0 -345
- package/test-data/zen-reference/http-function.json +0 -34
- package/test-data/zen-reference/infinite-function.json +0 -46
- package/test-data/zen-reference/js/imports.js +0 -25
- package/test-data/zen-reference/passthrough.json +0 -31
- package/test-data/zen-reference/recursive-table1.json +0 -49
- package/test-data/zen-reference/recursive-table2.json +0 -49
- package/test-data/zen-reference/sleep-function.json +0 -34
- package/test-data/zen-reference/switch-node.json +0 -167
- package/test-data/zen-reference/switch-performance-2.json +0 -1307
- package/test-data/zen-reference/switch-performance.json +0 -691
- package/test-data/zen-reference/table.json +0 -76
- package/tests/helpers/index.ts +0 -73
- package/tests/helpers/mock-context.ts +0 -231
- package/tests/helpers/round-trip.ts +0 -398
- package/tests/helpers/test-harness-comparison.ts +0 -325
- package/tests/helpers/test-harness-wasm.ts +0 -710
- package/tests/helpers/test-harness.ts +0 -28
- package/tests/helpers/wasm-test.ts +0 -659
- package/tests/integration/compilation-errors.test.ts +0 -864
- package/tests/integration/decision-tables.test.ts +0 -531
- package/tests/integration/edge-cases.test.ts +0 -787
- package/tests/integration/expressions.test.ts +0 -513
- package/tests/integration/function-node-integration.test.ts +0 -182
- package/tests/integration/sub-decisions.test.ts +0 -108
- package/tests/integration/switch-nodes.test.ts +0 -399
- package/tests/integration/unary-or-matching.test.ts +0 -53
- package/tests/integration/wasm-data-types.test.ts +0 -398
- package/tests/integration/wasm-errors.test.ts +0 -199
- package/tests/integration/wasm-execution.test.ts +0 -348
- package/tests/integration/wasm-memory.test.ts +0 -228
- package/tests/scripts/analyze-coverage.ts +0 -166
- package/tests/scripts/categorize-tests.ts +0 -396
- package/tests/scripts/coverage-analysis.ts +0 -836
- package/tests/unit/compiler/cache.test.ts +0 -238
- package/tests/unit/compiler/errors.test.ts +0 -316
- package/tests/unit/compiler/graph-scalability.test.ts +0 -510
- package/tests/unit/compiler/graph.test.ts +0 -878
- package/tests/unit/compiler/input-validation.test.ts +0 -447
- package/tests/unit/compiler/logical-and-parser.test.ts +0 -143
- package/tests/unit/compiler/logical-not-parser.test.ts +0 -107
- package/tests/unit/compiler/logical-or-parser.test.ts +0 -236
- package/tests/unit/compiler/marshal-gen/marshal-gen.test.ts +0 -97
- package/tests/unit/compiler/nodes/decision-table.test.ts +0 -103
- package/tests/unit/compiler/nodes/decision.test.ts +0 -182
- package/tests/unit/compiler/nodes/function-compile.test.ts +0 -204
- package/tests/unit/compiler/nodes/function.test.ts +0 -176
- package/tests/unit/compiler/nodes/input.test.ts +0 -30
- package/tests/unit/compiler/nodes/switch.test.ts +0 -127
- package/tests/unit/compiler/optimizer-cache.test.ts +0 -327
- package/tests/unit/compiler/optimizer-implementation.test.ts +0 -625
- package/tests/unit/compiler/parser.test.ts +0 -508
- package/tests/unit/compiler/runtime-error-cleanup.test.ts +0 -426
- package/tests/unit/compiler/runtime-validation.test.ts +0 -303
- package/tests/unit/compiler/runtime.test.ts +0 -221
- package/tests/unit/compiler/schema/schema.test.ts +0 -248
- package/tests/unit/compiler/unary-ast-transforms.test.ts +0 -245
- package/tsconfig.json +0 -27
- package/tsup.config.ts +0 -11
- package/vitest.config.ts +0 -12
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
// tests/unit/compiler/runtime-error-cleanup.test.ts
|
|
2
|
-
// Tests for error state cleanup in CompiledDecision to ensure error state
|
|
3
|
-
// does not persist between evaluations (ERR-2592)
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
6
|
-
import { CompiledDecision } from '../../../src/compiler/runtime';
|
|
7
|
-
|
|
8
|
-
describe('CompiledDecision Error State Cleanup', () => {
|
|
9
|
-
// Shared memory for mock instances (768KB to match real requirements)
|
|
10
|
-
const mockMemory = new WebAssembly.Memory({ initial: 12, maximum: 256 });
|
|
11
|
-
|
|
12
|
-
// Helper to create a mock WebAssembly instance with full exports
|
|
13
|
-
const createMockInstance = (
|
|
14
|
-
options: {
|
|
15
|
-
clearLastErrorFn?: () => void;
|
|
16
|
-
getLastErrorFn?: () => number;
|
|
17
|
-
resetHeapFn?: () => void;
|
|
18
|
-
evaluateFn?: (ptr: number) => number;
|
|
19
|
-
} = {},
|
|
20
|
-
) => {
|
|
21
|
-
return {
|
|
22
|
-
exports: {
|
|
23
|
-
memory: mockMemory,
|
|
24
|
-
clearLastError: options.clearLastErrorFn ?? (() => {}),
|
|
25
|
-
getLastError: options.getLastErrorFn ?? (() => 0),
|
|
26
|
-
resetHeap: options.resetHeapFn ?? (() => {}),
|
|
27
|
-
evaluate: options.evaluateFn ?? ((_ptr: number) => 100),
|
|
28
|
-
},
|
|
29
|
-
} as unknown as WebAssembly.Instance;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
// Helper to create a minimal valid WASM module
|
|
33
|
-
const createMockWasm = () =>
|
|
34
|
-
new Uint8Array([
|
|
35
|
-
0x00,
|
|
36
|
-
0x61,
|
|
37
|
-
0x73,
|
|
38
|
-
0x6d, // WASM magic
|
|
39
|
-
0x01,
|
|
40
|
-
0x00,
|
|
41
|
-
0x00,
|
|
42
|
-
0x00, // version
|
|
43
|
-
]);
|
|
44
|
-
|
|
45
|
-
describe('Error State Isolation Between Evaluations', () => {
|
|
46
|
-
it('should call clearLastError at start and end of evaluation', async () => {
|
|
47
|
-
let clearLastErrorCallCount = 0;
|
|
48
|
-
const mockMarshal = vi.fn(() => 4);
|
|
49
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
50
|
-
|
|
51
|
-
const decision = new CompiledDecision({
|
|
52
|
-
wasm: createMockWasm(),
|
|
53
|
-
schemaHash: 123n,
|
|
54
|
-
marshal: mockMarshal,
|
|
55
|
-
unmarshal: mockUnmarshal,
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// Mock the WebAssembly.instantiate to return our mock instance
|
|
59
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
60
|
-
return createMockInstance({
|
|
61
|
-
clearLastErrorFn: () => {
|
|
62
|
-
clearLastErrorCallCount++;
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
await decision.evaluate({ test: 'value' });
|
|
69
|
-
|
|
70
|
-
// clearLastError should be called twice: once at start, once in finally
|
|
71
|
-
expect(clearLastErrorCallCount).toBe(2);
|
|
72
|
-
} finally {
|
|
73
|
-
// Restore original
|
|
74
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('should clear error state even when marshal throws', async () => {
|
|
79
|
-
let clearLastErrorCallCount = 0;
|
|
80
|
-
const mockMarshal = vi.fn(() => {
|
|
81
|
-
throw new Error('Marshal failed');
|
|
82
|
-
});
|
|
83
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
84
|
-
|
|
85
|
-
const decision = new CompiledDecision({
|
|
86
|
-
wasm: createMockWasm(),
|
|
87
|
-
schemaHash: 123n,
|
|
88
|
-
marshal: mockMarshal,
|
|
89
|
-
unmarshal: mockUnmarshal,
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// Mock the WebAssembly.instantiate
|
|
93
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
94
|
-
return createMockInstance({
|
|
95
|
-
clearLastErrorFn: () => {
|
|
96
|
-
clearLastErrorCallCount++;
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
try {
|
|
102
|
-
await expect(decision.evaluate({ test: 'value' })).rejects.toThrow('Marshal failed');
|
|
103
|
-
|
|
104
|
-
// clearLastError should still be called: once at start, once in finally
|
|
105
|
-
expect(clearLastErrorCallCount).toBe(2);
|
|
106
|
-
} finally {
|
|
107
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
it('should clear error state when evaluation fails with error code', async () => {
|
|
112
|
-
const mockMarshal = vi.fn(() => 4);
|
|
113
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
114
|
-
let clearLastErrorCallCount = 0;
|
|
115
|
-
let lastErrorCode = 0;
|
|
116
|
-
let evaluationCount = 0;
|
|
117
|
-
|
|
118
|
-
const decision = new CompiledDecision({
|
|
119
|
-
wasm: createMockWasm(),
|
|
120
|
-
schemaHash: 123n,
|
|
121
|
-
marshal: mockMarshal,
|
|
122
|
-
unmarshal: mockUnmarshal,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
// Mock the WebAssembly.instantiate
|
|
126
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
127
|
-
return createMockInstance({
|
|
128
|
-
clearLastErrorFn: () => {
|
|
129
|
-
clearLastErrorCallCount++;
|
|
130
|
-
lastErrorCode = 0; // Simulate clearing
|
|
131
|
-
},
|
|
132
|
-
getLastErrorFn: () => lastErrorCode,
|
|
133
|
-
evaluateFn: () => {
|
|
134
|
-
evaluationCount++;
|
|
135
|
-
// First evaluation sets error, second doesn't
|
|
136
|
-
if (evaluationCount === 1) {
|
|
137
|
-
lastErrorCode = 1; // SCHEMA_MISMATCH
|
|
138
|
-
}
|
|
139
|
-
return 100;
|
|
140
|
-
},
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
try {
|
|
145
|
-
// First evaluation: simulate WASM error (schema mismatch)
|
|
146
|
-
await expect(decision.evaluate({ test: 'value' })).rejects.toThrow('Schema mismatch');
|
|
147
|
-
|
|
148
|
-
// Verify error was cleared in finally block
|
|
149
|
-
expect(lastErrorCode).toBe(0); // Should be cleared by clearLastError
|
|
150
|
-
expect(clearLastErrorCallCount).toBe(2); // Start + finally
|
|
151
|
-
|
|
152
|
-
// Second evaluation: should succeed without seeing old error
|
|
153
|
-
const result = await decision.evaluate({ test: 'value' });
|
|
154
|
-
|
|
155
|
-
// Should succeed
|
|
156
|
-
expect(result).toEqual({ result: 'success' });
|
|
157
|
-
expect(clearLastErrorCallCount).toBe(4); // 2 more calls for second evaluation
|
|
158
|
-
} finally {
|
|
159
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
it('should clear error state even when unmarshal throws', async () => {
|
|
164
|
-
const mockMarshal = vi.fn(() => 4);
|
|
165
|
-
const mockUnmarshal = vi.fn(() => {
|
|
166
|
-
throw new Error('Unmarshal failed');
|
|
167
|
-
});
|
|
168
|
-
let clearLastErrorCallCount = 0;
|
|
169
|
-
|
|
170
|
-
const decision = new CompiledDecision({
|
|
171
|
-
wasm: createMockWasm(),
|
|
172
|
-
schemaHash: 123n,
|
|
173
|
-
marshal: mockMarshal,
|
|
174
|
-
unmarshal: mockUnmarshal,
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// Mock the WebAssembly.instantiate
|
|
178
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
179
|
-
return createMockInstance({
|
|
180
|
-
clearLastErrorFn: () => {
|
|
181
|
-
clearLastErrorCallCount++;
|
|
182
|
-
},
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
try {
|
|
187
|
-
// Evaluation: unmarshal throws
|
|
188
|
-
await expect(decision.evaluate({ test: 'value' })).rejects.toThrow('Unmarshal failed');
|
|
189
|
-
|
|
190
|
-
// clearLastError should still be called in finally block
|
|
191
|
-
expect(clearLastErrorCallCount).toBe(2); // Start + finally
|
|
192
|
-
} finally {
|
|
193
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
it('should handle clearLastError not being exported gracefully', async () => {
|
|
198
|
-
const mockMarshal = vi.fn(() => 4);
|
|
199
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
200
|
-
|
|
201
|
-
const decision = new CompiledDecision({
|
|
202
|
-
wasm: createMockWasm(),
|
|
203
|
-
schemaHash: 123n,
|
|
204
|
-
marshal: mockMarshal,
|
|
205
|
-
unmarshal: mockUnmarshal,
|
|
206
|
-
});
|
|
207
|
-
|
|
208
|
-
// Mock the WebAssembly.instantiate WITHOUT clearLastError export (older WASM modules)
|
|
209
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
210
|
-
return {
|
|
211
|
-
exports: {
|
|
212
|
-
memory: mockMemory,
|
|
213
|
-
getLastError: () => 0,
|
|
214
|
-
resetHeap: () => {},
|
|
215
|
-
evaluate: () => 100,
|
|
216
|
-
// Note: clearLastError is NOT exported
|
|
217
|
-
},
|
|
218
|
-
} as unknown as WebAssembly.Instance;
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
try {
|
|
222
|
-
// Should not throw even though clearLastError is missing
|
|
223
|
-
const result = await decision.evaluate({ test: 'value' });
|
|
224
|
-
expect(result).toEqual({ result: 'success' });
|
|
225
|
-
} finally {
|
|
226
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
|
|
231
|
-
describe('Multiple Consecutive Evaluations', () => {
|
|
232
|
-
it('should maintain clean error state across multiple successful evaluations', async () => {
|
|
233
|
-
const mockMarshal = vi.fn(() => 4);
|
|
234
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
235
|
-
let clearLastErrorCallCount = 0;
|
|
236
|
-
|
|
237
|
-
const decision = new CompiledDecision({
|
|
238
|
-
wasm: createMockWasm(),
|
|
239
|
-
schemaHash: 123n,
|
|
240
|
-
marshal: mockMarshal,
|
|
241
|
-
unmarshal: mockUnmarshal,
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
// Mock the WebAssembly.instantiate
|
|
245
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
246
|
-
return createMockInstance({
|
|
247
|
-
clearLastErrorFn: () => {
|
|
248
|
-
clearLastErrorCallCount++;
|
|
249
|
-
},
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
try {
|
|
254
|
-
// Run multiple evaluations
|
|
255
|
-
for (let i = 0; i < 5; i++) {
|
|
256
|
-
const result = await decision.evaluate({ iteration: i });
|
|
257
|
-
expect(result).toEqual({ result: 'success' });
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// clearLastError should be called for each evaluation (start + finally)
|
|
261
|
-
expect(clearLastErrorCallCount).toBe(10); // 2 calls per evaluation * 5 evaluations
|
|
262
|
-
} finally {
|
|
263
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
264
|
-
}
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it('should recover after multiple consecutive errors', async () => {
|
|
268
|
-
const mockMarshal = vi.fn(() => 4);
|
|
269
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
270
|
-
let clearLastErrorCallCount = 0;
|
|
271
|
-
let evaluationCount = 0;
|
|
272
|
-
let lastErrorCode = 0;
|
|
273
|
-
|
|
274
|
-
const decision = new CompiledDecision({
|
|
275
|
-
wasm: createMockWasm(),
|
|
276
|
-
schemaHash: 123n,
|
|
277
|
-
marshal: mockMarshal,
|
|
278
|
-
unmarshal: mockUnmarshal,
|
|
279
|
-
});
|
|
280
|
-
|
|
281
|
-
// Mock the WebAssembly.instantiate
|
|
282
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
283
|
-
return createMockInstance({
|
|
284
|
-
clearLastErrorFn: () => {
|
|
285
|
-
clearLastErrorCallCount++;
|
|
286
|
-
lastErrorCode = 0; // Clear error
|
|
287
|
-
},
|
|
288
|
-
getLastErrorFn: () => lastErrorCode,
|
|
289
|
-
evaluateFn: () => {
|
|
290
|
-
evaluationCount++;
|
|
291
|
-
// First 3 evaluations set error, 4th doesn't
|
|
292
|
-
if (evaluationCount <= 3) {
|
|
293
|
-
lastErrorCode = 4; // EVALUATION_ERROR
|
|
294
|
-
}
|
|
295
|
-
return 100;
|
|
296
|
-
},
|
|
297
|
-
});
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
try {
|
|
301
|
-
// Multiple failing evaluations
|
|
302
|
-
for (let i = 0; i < 3; i++) {
|
|
303
|
-
await expect(decision.evaluate({ iteration: i })).rejects.toThrow('Evaluation error');
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
// Then a successful evaluation
|
|
307
|
-
const result = await decision.evaluate({ final: true });
|
|
308
|
-
expect(result).toEqual({ result: 'success' });
|
|
309
|
-
|
|
310
|
-
// clearLastError should be called for all evaluations
|
|
311
|
-
expect(clearLastErrorCallCount).toBe(8); // 2 calls * 4 evaluations
|
|
312
|
-
} finally {
|
|
313
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
314
|
-
}
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
it('should alternate between success and failure cleanly', async () => {
|
|
318
|
-
const mockMarshal = vi.fn(() => 4);
|
|
319
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
320
|
-
let clearLastErrorCallCount = 0;
|
|
321
|
-
let evaluationCount = 0;
|
|
322
|
-
let lastErrorCode = 0;
|
|
323
|
-
|
|
324
|
-
const decision = new CompiledDecision({
|
|
325
|
-
wasm: createMockWasm(),
|
|
326
|
-
schemaHash: 123n,
|
|
327
|
-
marshal: mockMarshal,
|
|
328
|
-
unmarshal: mockUnmarshal,
|
|
329
|
-
});
|
|
330
|
-
|
|
331
|
-
// Mock the WebAssembly.instantiate
|
|
332
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
333
|
-
return createMockInstance({
|
|
334
|
-
clearLastErrorFn: () => {
|
|
335
|
-
clearLastErrorCallCount++;
|
|
336
|
-
lastErrorCode = 0; // Clear error
|
|
337
|
-
},
|
|
338
|
-
getLastErrorFn: () => lastErrorCode,
|
|
339
|
-
evaluateFn: () => {
|
|
340
|
-
evaluationCount++;
|
|
341
|
-
// Alternate: even evaluations (1st, 3rd, 5th...) fail, odd succeed
|
|
342
|
-
if (evaluationCount % 2 === 1) {
|
|
343
|
-
lastErrorCode = 1; // SCHEMA_MISMATCH
|
|
344
|
-
}
|
|
345
|
-
return 100;
|
|
346
|
-
},
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
try {
|
|
351
|
-
// Alternate between success and failure
|
|
352
|
-
for (let i = 0; i < 10; i++) {
|
|
353
|
-
const shouldFail = i % 2 === 0;
|
|
354
|
-
|
|
355
|
-
if (shouldFail) {
|
|
356
|
-
await expect(decision.evaluate({ iteration: i })).rejects.toThrow();
|
|
357
|
-
} else {
|
|
358
|
-
const result = await decision.evaluate({ iteration: i });
|
|
359
|
-
expect(result).toEqual({ result: 'success' });
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// clearLastError should be called for all evaluations
|
|
364
|
-
expect(clearLastErrorCallCount).toBe(20); // 2 calls * 10 evaluations
|
|
365
|
-
} finally {
|
|
366
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
describe('Error State Documentation', () => {
|
|
372
|
-
it('demonstrates that error state is local to each evaluation', async () => {
|
|
373
|
-
// This test serves as documentation for the fix to ERR-2592
|
|
374
|
-
const mockMarshal = vi.fn(() => 4);
|
|
375
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'success' }));
|
|
376
|
-
const errorStates: number[] = [];
|
|
377
|
-
let currentError = 0;
|
|
378
|
-
let evaluationCount = 0;
|
|
379
|
-
|
|
380
|
-
const decision = new CompiledDecision({
|
|
381
|
-
wasm: createMockWasm(),
|
|
382
|
-
schemaHash: 123n,
|
|
383
|
-
marshal: mockMarshal,
|
|
384
|
-
unmarshal: mockUnmarshal,
|
|
385
|
-
});
|
|
386
|
-
|
|
387
|
-
// Mock the WebAssembly.instantiate
|
|
388
|
-
vi.spyOn(WebAssembly, 'instantiate').mockImplementation(async (_module, _imports) => {
|
|
389
|
-
return createMockInstance({
|
|
390
|
-
clearLastErrorFn: () => {
|
|
391
|
-
currentError = 0; // Clear error
|
|
392
|
-
},
|
|
393
|
-
getLastErrorFn: () => {
|
|
394
|
-
errorStates.push(currentError);
|
|
395
|
-
return currentError;
|
|
396
|
-
},
|
|
397
|
-
evaluateFn: () => {
|
|
398
|
-
evaluationCount++;
|
|
399
|
-
// Simulate an error on first evaluation only
|
|
400
|
-
if (evaluationCount === 1) {
|
|
401
|
-
currentError = 1; // SCHEMA_MISMATCH
|
|
402
|
-
}
|
|
403
|
-
return 100;
|
|
404
|
-
},
|
|
405
|
-
});
|
|
406
|
-
});
|
|
407
|
-
|
|
408
|
-
try {
|
|
409
|
-
// First evaluation fails with error
|
|
410
|
-
await expect(decision.evaluate({ test: 1 })).rejects.toThrow();
|
|
411
|
-
|
|
412
|
-
// Second evaluation should see clean error state (0)
|
|
413
|
-
// This is the key fix: error state is cleared after first evaluation
|
|
414
|
-
await decision.evaluate({ test: 2 });
|
|
415
|
-
|
|
416
|
-
// Verify error state was cleared between evaluations
|
|
417
|
-
// errorStates[0] = first evaluation's error check (= 1)
|
|
418
|
-
// errorStates[1] = second evaluation's error check (should be 0)
|
|
419
|
-
expect(errorStates[0]).toBe(1); // First evaluation had error
|
|
420
|
-
expect(errorStates[1]).toBe(0); // Second evaluation sees clean state
|
|
421
|
-
} finally {
|
|
422
|
-
vi.spyOn(WebAssembly, 'instantiate').mockRestore();
|
|
423
|
-
}
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
});
|