@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,303 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime Schema Validation Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for runtime schema validation:
|
|
5
|
-
* - Loading generated validation code
|
|
6
|
-
* - Validating input data
|
|
7
|
-
* - Error messages with field paths
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect } from 'vitest';
|
|
11
|
-
import { generateValidationCode } from '../../../src/compiler/marshal-gen';
|
|
12
|
-
import { Type } from '@sinclair/typebox';
|
|
13
|
-
import { loadGeneratedValidation } from '../../../src/compiler/runtime';
|
|
14
|
-
|
|
15
|
-
describe('Runtime Schema Validation', () => {
|
|
16
|
-
it('should load generated validation code as executable function', async () => {
|
|
17
|
-
const schema = Type.Object({
|
|
18
|
-
name: Type.String(),
|
|
19
|
-
age: Type.Number(),
|
|
20
|
-
active: Type.Boolean(),
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const validationCode = generateValidationCode(schema);
|
|
24
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
25
|
-
|
|
26
|
-
expect(typeof validate).toBe('function');
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
it('should accept valid data that matches schema', async () => {
|
|
30
|
-
const schema = Type.Object({
|
|
31
|
-
name: Type.String(),
|
|
32
|
-
age: Type.Number(),
|
|
33
|
-
active: Type.Boolean(),
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
const validationCode = generateValidationCode(schema);
|
|
37
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
38
|
-
|
|
39
|
-
const validData = {
|
|
40
|
-
name: 'Alice',
|
|
41
|
-
age: 30,
|
|
42
|
-
active: true,
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
// Should not throw
|
|
46
|
-
expect(() => validate(validData)).not.toThrow();
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
it('should reject data with wrong type', async () => {
|
|
50
|
-
const schema = Type.Object({
|
|
51
|
-
name: Type.String(),
|
|
52
|
-
age: Type.Number(),
|
|
53
|
-
active: Type.Boolean(),
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const validationCode = generateValidationCode(schema);
|
|
57
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
58
|
-
|
|
59
|
-
const invalidData = {
|
|
60
|
-
name: 'Alice',
|
|
61
|
-
age: '30', // Should be number
|
|
62
|
-
active: true,
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
expect(() => validate(invalidData)).toThrow();
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('should reject data with missing required field', async () => {
|
|
69
|
-
const schema = Type.Object({
|
|
70
|
-
name: Type.String(),
|
|
71
|
-
age: Type.Number(),
|
|
72
|
-
active: Type.Boolean(),
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
const validationCode = generateValidationCode(schema);
|
|
76
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
77
|
-
|
|
78
|
-
const invalidData = {
|
|
79
|
-
name: 'Alice',
|
|
80
|
-
// age is missing
|
|
81
|
-
active: true,
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
expect(() => validate(invalidData)).toThrow();
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
it('should provide detailed error messages with field paths', async () => {
|
|
88
|
-
const schema = Type.Object({
|
|
89
|
-
user: Type.Object({
|
|
90
|
-
name: Type.String(),
|
|
91
|
-
age: Type.Number(),
|
|
92
|
-
}),
|
|
93
|
-
tags: Type.Array(Type.String()),
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
const validationCode = generateValidationCode(schema);
|
|
97
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
98
|
-
|
|
99
|
-
const invalidData = {
|
|
100
|
-
user: {
|
|
101
|
-
name: 'Alice',
|
|
102
|
-
age: '30', // Should be number
|
|
103
|
-
},
|
|
104
|
-
tags: ['tag1', 123], // Second element should be string
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
try {
|
|
108
|
-
validate(invalidData);
|
|
109
|
-
throw new Error('Expected validation to fail');
|
|
110
|
-
} catch (error) {
|
|
111
|
-
expect(error).toBeInstanceOf(Error);
|
|
112
|
-
const message = (error as Error).message;
|
|
113
|
-
// Error should include field paths
|
|
114
|
-
expect(message).toMatch(/Invalid input data/);
|
|
115
|
-
expect(message).toMatch(/user\.age|tags\/1/);
|
|
116
|
-
}
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
it('should handle nested object validation', async () => {
|
|
120
|
-
const schema = Type.Object({
|
|
121
|
-
customer: Type.Object({
|
|
122
|
-
name: Type.String(),
|
|
123
|
-
contact: Type.Object({
|
|
124
|
-
email: Type.String(),
|
|
125
|
-
phone: Type.Optional(Type.String()),
|
|
126
|
-
}),
|
|
127
|
-
}),
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
const validationCode = generateValidationCode(schema);
|
|
131
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
132
|
-
|
|
133
|
-
const validData = {
|
|
134
|
-
customer: {
|
|
135
|
-
name: 'Alice',
|
|
136
|
-
contact: {
|
|
137
|
-
email: 'alice@example.com',
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
};
|
|
141
|
-
|
|
142
|
-
const invalidData = {
|
|
143
|
-
customer: {
|
|
144
|
-
name: 'Alice',
|
|
145
|
-
contact: {
|
|
146
|
-
email: 123, // Should be string
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
expect(() => validate(validData)).not.toThrow();
|
|
152
|
-
expect(() => validate(invalidData)).toThrow();
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('should handle array validation', async () => {
|
|
156
|
-
const schema = Type.Object({
|
|
157
|
-
items: Type.Array(Type.Number()),
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
const validationCode = generateValidationCode(schema);
|
|
161
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
162
|
-
|
|
163
|
-
const validData = {
|
|
164
|
-
items: [1, 2, 3, 4],
|
|
165
|
-
};
|
|
166
|
-
|
|
167
|
-
const invalidData = {
|
|
168
|
-
items: [1, '2', 3, 4], // Second element should be number
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
expect(() => validate(validData)).not.toThrow();
|
|
172
|
-
expect(() => validate(invalidData)).toThrow();
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('should handle optional fields', async () => {
|
|
176
|
-
const schema = Type.Object({
|
|
177
|
-
name: Type.String(),
|
|
178
|
-
age: Type.Optional(Type.Number()),
|
|
179
|
-
email: Type.Optional(Type.String()),
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
const validationCode = generateValidationCode(schema);
|
|
183
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
184
|
-
|
|
185
|
-
const data1 = {
|
|
186
|
-
name: 'Alice',
|
|
187
|
-
};
|
|
188
|
-
|
|
189
|
-
const data2 = {
|
|
190
|
-
name: 'Bob',
|
|
191
|
-
age: 30,
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
const data3 = {
|
|
195
|
-
name: 'Carol',
|
|
196
|
-
email: 'carol@example.com',
|
|
197
|
-
};
|
|
198
|
-
|
|
199
|
-
expect(() => validate(data1)).not.toThrow();
|
|
200
|
-
expect(() => validate(data2)).not.toThrow();
|
|
201
|
-
expect(() => validate(data3)).not.toThrow();
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
it('should provide clear error messages for multiple validation errors', async () => {
|
|
205
|
-
const schema = Type.Object({
|
|
206
|
-
name: Type.String(),
|
|
207
|
-
age: Type.Number(),
|
|
208
|
-
email: Type.String(),
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
const validationCode = generateValidationCode(schema);
|
|
212
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
213
|
-
|
|
214
|
-
const invalidData = {
|
|
215
|
-
name: 123, // Should be string
|
|
216
|
-
age: '30', // Should be number
|
|
217
|
-
email: 456, // Should be string
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
try {
|
|
221
|
-
validate(invalidData);
|
|
222
|
-
throw new Error('Expected validation to fail');
|
|
223
|
-
} catch (error) {
|
|
224
|
-
expect(error).toBeInstanceOf(Error);
|
|
225
|
-
const message = (error as Error).message;
|
|
226
|
-
// Error should include multiple field paths
|
|
227
|
-
expect(message).toMatch(/Invalid input data/);
|
|
228
|
-
expect(message).toMatch(/name/);
|
|
229
|
-
expect(message).toMatch(/age/);
|
|
230
|
-
expect(message).toMatch(/email/);
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
describe('Acceptance Criteria for Ticket ja-fff6', () => {
|
|
235
|
-
it('AC1: Input type mismatches are caught', async () => {
|
|
236
|
-
const schema = Type.Object({
|
|
237
|
-
age: Type.Number(),
|
|
238
|
-
name: Type.String(),
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
const validationCode = generateValidationCode(schema);
|
|
242
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
243
|
-
|
|
244
|
-
const validInput = { age: 30, name: 'Alice' };
|
|
245
|
-
const invalidInput = { age: 'not a number', name: 'Alice' };
|
|
246
|
-
|
|
247
|
-
expect(() => validate(validInput)).not.toThrow();
|
|
248
|
-
expect(() => validate(invalidInput)).toThrow(/age/);
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
it('AC2: Missing required fields are reported', async () => {
|
|
252
|
-
const schema = Type.Object({
|
|
253
|
-
age: Type.Number(),
|
|
254
|
-
name: Type.String(),
|
|
255
|
-
email: Type.String(),
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
const validationCode = generateValidationCode(schema);
|
|
259
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
260
|
-
|
|
261
|
-
const invalidInput = { age: 30, name: 'Alice' }; // Missing email
|
|
262
|
-
|
|
263
|
-
try {
|
|
264
|
-
validate(invalidInput);
|
|
265
|
-
throw new Error('Expected validation to fail');
|
|
266
|
-
} catch (error) {
|
|
267
|
-
const message = (error as Error).message;
|
|
268
|
-
expect(message).toMatch(/Invalid input data/);
|
|
269
|
-
expect(message).toMatch(/email/);
|
|
270
|
-
}
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
it('AC3: Validation errors include field paths', async () => {
|
|
274
|
-
const schema = Type.Object({
|
|
275
|
-
level1: Type.Object({
|
|
276
|
-
level2: Type.Object({
|
|
277
|
-
value: Type.Number(),
|
|
278
|
-
}),
|
|
279
|
-
}),
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
const validationCode = generateValidationCode(schema);
|
|
283
|
-
const validate = await loadGeneratedValidation(validationCode);
|
|
284
|
-
|
|
285
|
-
const invalidInput = {
|
|
286
|
-
level1: {
|
|
287
|
-
level2: {
|
|
288
|
-
value: 'not a number',
|
|
289
|
-
},
|
|
290
|
-
},
|
|
291
|
-
};
|
|
292
|
-
|
|
293
|
-
try {
|
|
294
|
-
validate(invalidInput);
|
|
295
|
-
throw new Error('Expected validation to fail');
|
|
296
|
-
} catch (error) {
|
|
297
|
-
const message = (error as Error).message;
|
|
298
|
-
// Error should include the full field path
|
|
299
|
-
expect(message).toMatch(/level1/);
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
});
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
// src/compiler/__tests__/runtime.test.ts
|
|
2
|
-
// Tests for the CompiledDecision class and runtime support
|
|
3
|
-
|
|
4
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
-
import { CompiledDecision, RuntimeError, ensureMemory } from '../../../src/compiler/runtime';
|
|
6
|
-
|
|
7
|
-
describe('CompiledDecision', () => {
|
|
8
|
-
const mockWasm = new Uint8Array([
|
|
9
|
-
0x00,
|
|
10
|
-
0x61,
|
|
11
|
-
0x73,
|
|
12
|
-
0x6d,
|
|
13
|
-
0x01,
|
|
14
|
-
0x00,
|
|
15
|
-
0x00,
|
|
16
|
-
0x00, // WASM magic + version
|
|
17
|
-
]);
|
|
18
|
-
|
|
19
|
-
const mockMarshal = vi.fn(() => 4);
|
|
20
|
-
const mockUnmarshal = vi.fn(() => ({ result: 'test' }));
|
|
21
|
-
const mockValidate = vi.fn();
|
|
22
|
-
|
|
23
|
-
it('should create a CompiledDecision instance', () => {
|
|
24
|
-
const decision = new CompiledDecision({
|
|
25
|
-
wasm: mockWasm,
|
|
26
|
-
schemaHash: 123n,
|
|
27
|
-
marshal: mockMarshal,
|
|
28
|
-
unmarshal: mockUnmarshal,
|
|
29
|
-
validate: mockValidate,
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
expect(decision).toBeInstanceOf(CompiledDecision);
|
|
33
|
-
// Memory is null before first evaluation (lazy initialization)
|
|
34
|
-
expect(decision.getMemory()).toBeNull();
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
it('should throw RuntimeError if MARSHAL returns invalid pointer', async () => {
|
|
38
|
-
const invalidMarshal = vi.fn(() => 0); // Invalid pointer (must be >= 4)
|
|
39
|
-
|
|
40
|
-
const decision = new CompiledDecision({
|
|
41
|
-
wasm: mockWasm,
|
|
42
|
-
schemaHash: 123n,
|
|
43
|
-
marshal: invalidMarshal,
|
|
44
|
-
unmarshal: mockUnmarshal,
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
await expect(decision.evaluate({ test: 'value' })).rejects.toThrow(RuntimeError);
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
it('should fail on invalid mock WASM during evaluation', async () => {
|
|
51
|
-
const mockValidate = vi.fn((data) => {
|
|
52
|
-
if (!data || typeof data !== 'object') {
|
|
53
|
-
throw new Error('Invalid input');
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const decision = new CompiledDecision({
|
|
58
|
-
wasm: mockWasm,
|
|
59
|
-
schemaHash: 123n,
|
|
60
|
-
marshal: mockMarshal,
|
|
61
|
-
unmarshal: mockUnmarshal,
|
|
62
|
-
validate: mockValidate,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
// The mock WASM module doesn't export 'memory', so instantiation succeeds
|
|
66
|
-
// but the memory will be undefined, causing the instance check to fail.
|
|
67
|
-
// Note: Real validation testing requires a valid WASM module.
|
|
68
|
-
await expect(decision.evaluate({ test: 'value' })).rejects.toThrow();
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('should get memory stats', () => {
|
|
72
|
-
const decision = new CompiledDecision({
|
|
73
|
-
wasm: mockWasm,
|
|
74
|
-
schemaHash: 123n,
|
|
75
|
-
marshal: mockMarshal,
|
|
76
|
-
unmarshal: mockUnmarshal,
|
|
77
|
-
initialMemoryPages: 2,
|
|
78
|
-
maximumMemoryPages: 10,
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// Before initialization, current/used are 0
|
|
82
|
-
const stats = decision.getMemoryStats();
|
|
83
|
-
expect(stats.current).toBe(0); // Not initialized yet
|
|
84
|
-
expect(stats.maximum).toBe(65536 * 10); // 10 pages * 64KB
|
|
85
|
-
expect(stats.used).toBe(0);
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('should dispose of the instance', () => {
|
|
89
|
-
const decision = new CompiledDecision({
|
|
90
|
-
wasm: mockWasm,
|
|
91
|
-
schemaHash: 123n,
|
|
92
|
-
marshal: mockMarshal,
|
|
93
|
-
unmarshal: mockUnmarshal,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
decision.dispose();
|
|
97
|
-
expect(decision.getInstance()).toBe(null);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should throw RuntimeError when getInputBuffer called before initialization', () => {
|
|
101
|
-
const decision = new CompiledDecision({
|
|
102
|
-
wasm: mockWasm,
|
|
103
|
-
schemaHash: 123n,
|
|
104
|
-
marshal: mockMarshal,
|
|
105
|
-
unmarshal: mockUnmarshal,
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
// Memory is not initialized until evaluate() is called
|
|
109
|
-
expect(() => {
|
|
110
|
-
decision.getInputBuffer(1024);
|
|
111
|
-
}).toThrow(RuntimeError);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
it('should throw RuntimeError with correct error code when buffer cannot be obtained', () => {
|
|
115
|
-
const decision = new CompiledDecision({
|
|
116
|
-
wasm: mockWasm,
|
|
117
|
-
schemaHash: 123n,
|
|
118
|
-
marshal: mockMarshal,
|
|
119
|
-
unmarshal: mockUnmarshal,
|
|
120
|
-
initialMemoryPages: 1,
|
|
121
|
-
maximumMemoryPages: 1,
|
|
122
|
-
});
|
|
123
|
-
|
|
124
|
-
try {
|
|
125
|
-
decision.getInputBuffer(100000);
|
|
126
|
-
throw new Error('Should have thrown RuntimeError');
|
|
127
|
-
} catch (error) {
|
|
128
|
-
if (error instanceof RuntimeError) {
|
|
129
|
-
expect(error.code).toBe(5); // OUT_OF_MEMORY
|
|
130
|
-
} else {
|
|
131
|
-
throw error;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
describe('RuntimeError', () => {
|
|
138
|
-
it('should create a RuntimeError with message and code', () => {
|
|
139
|
-
const error = new RuntimeError('Test error', 1, { context: 'data' });
|
|
140
|
-
|
|
141
|
-
expect(error).toBeInstanceOf(Error);
|
|
142
|
-
expect(error.name).toBe('RuntimeError');
|
|
143
|
-
expect(error.message).toBe('Test error');
|
|
144
|
-
expect(error.code).toBe(1);
|
|
145
|
-
expect(error.context).toEqual({ context: 'data' });
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('should have default code -1 if not specified', () => {
|
|
149
|
-
const error = new RuntimeError('Test error');
|
|
150
|
-
expect(error.code).toBe(-1);
|
|
151
|
-
expect(error.context).toBeUndefined();
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
describe('ensureMemory', () => {
|
|
156
|
-
it('should not grow memory if required size is within current buffer', () => {
|
|
157
|
-
const memory = new WebAssembly.Memory({ initial: 1 }); // 64KB
|
|
158
|
-
const initialSize = memory.buffer.byteLength;
|
|
159
|
-
|
|
160
|
-
ensureMemory(memory, 60000); // Less than current size
|
|
161
|
-
|
|
162
|
-
expect(memory.buffer.byteLength).toBe(initialSize);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
it('should grow memory when required size exceeds current buffer', () => {
|
|
166
|
-
const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 }); // 64KB initial, max 640KB
|
|
167
|
-
const initialSize = memory.buffer.byteLength;
|
|
168
|
-
|
|
169
|
-
ensureMemory(memory, 80000); // More than 64KB, need 2 pages = 128KB
|
|
170
|
-
|
|
171
|
-
expect(memory.buffer.byteLength).toBeGreaterThan(initialSize);
|
|
172
|
-
expect(memory.buffer.byteLength).toBe(131072); // 2 pages * 64KB
|
|
173
|
-
});
|
|
174
|
-
|
|
175
|
-
it('should grow memory by exact required pages', () => {
|
|
176
|
-
const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 });
|
|
177
|
-
|
|
178
|
-
// Request 200KB - initial 64KB = 136KB needed, rounds up to 3 pages = 192KB added
|
|
179
|
-
// Total should be 256KB (4 pages)
|
|
180
|
-
ensureMemory(memory, 200000);
|
|
181
|
-
|
|
182
|
-
expect(memory.buffer.byteLength).toBe(262144); // 4 pages * 64KB
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it('should handle large memory growth requests', () => {
|
|
186
|
-
const memory = new WebAssembly.Memory({ initial: 1, maximum: 10 });
|
|
187
|
-
|
|
188
|
-
ensureMemory(memory, 500000); // 500KB request
|
|
189
|
-
|
|
190
|
-
expect(memory.buffer.byteLength).toBe(524288); // 8 pages * 64KB = 512KB
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('should throw error when memory cannot be grown beyond maximum', () => {
|
|
194
|
-
const memory = new WebAssembly.Memory({ initial: 1, maximum: 2 }); // Max 128KB
|
|
195
|
-
|
|
196
|
-
expect(() => {
|
|
197
|
-
ensureMemory(memory, 500000); // Request 500KB, but max is 128KB
|
|
198
|
-
}).toThrow(/Cannot grow WASM memory/);
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
it('should handle exact page boundary requests', () => {
|
|
202
|
-
const memory = new WebAssembly.Memory({ initial: 1, maximum: 5 });
|
|
203
|
-
|
|
204
|
-
// Request exactly 128KB (2 pages)
|
|
205
|
-
ensureMemory(memory, 131072);
|
|
206
|
-
|
|
207
|
-
expect(memory.buffer.byteLength).toBe(131072);
|
|
208
|
-
});
|
|
209
|
-
|
|
210
|
-
it('should not grow memory when required size equals current size', () => {
|
|
211
|
-
const memory = new WebAssembly.Memory({ initial: 2 }); // 128KB
|
|
212
|
-
const initialSize = memory.buffer.byteLength;
|
|
213
|
-
|
|
214
|
-
ensureMemory(memory, initialSize);
|
|
215
|
-
|
|
216
|
-
expect(memory.buffer.byteLength).toBe(initialSize);
|
|
217
|
-
});
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
// Note: Full integration tests for createCompiledDecision would be added
|
|
221
|
-
// in future tickets when we have actual functional WASM modules
|