@divmain/jdm-asm 0.2.1 → 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,787 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Edge Case Tests
|
|
3
|
-
*
|
|
4
|
-
* Tests for boundary conditions, unusual inputs, and extreme values.
|
|
5
|
-
* Verifies correct behavior at the edges of supported ranges.
|
|
6
|
-
*
|
|
7
|
-
* This is Phase 7 of the test improvement plan - boundary testing.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { describe, it, expect } from 'vitest';
|
|
11
|
-
import { Type } from '@sinclair/typebox';
|
|
12
|
-
import { compile, type JDMDecision } from '../../src/compiler';
|
|
13
|
-
import { createExpressionJDM } from '../helpers';
|
|
14
|
-
import { runSimpleCompatibilityTest } from '../helpers/test-harness';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Create a passthrough JDM that returns input field directly
|
|
18
|
-
*/
|
|
19
|
-
function createPassthroughJDM(field: string): JDMDecision {
|
|
20
|
-
return createExpressionJDM([{ key: 'result', value: field }]);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
describe('Edge Case Tests', () => {
|
|
24
|
-
describe('Numeric Boundaries', () => {
|
|
25
|
-
describe('Safe Integer Boundaries', () => {
|
|
26
|
-
it('should handle MAX_SAFE_INTEGER', async () => {
|
|
27
|
-
await runSimpleCompatibilityTest({
|
|
28
|
-
name: 'max-safe-integer',
|
|
29
|
-
jdm: createPassthroughJDM('value'),
|
|
30
|
-
input: { value: Number.MAX_SAFE_INTEGER },
|
|
31
|
-
expected: { result: Number.MAX_SAFE_INTEGER },
|
|
32
|
-
skipZen: true,
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
it('should handle MIN_SAFE_INTEGER', async () => {
|
|
37
|
-
await runSimpleCompatibilityTest({
|
|
38
|
-
name: 'min-safe-integer',
|
|
39
|
-
jdm: createPassthroughJDM('value'),
|
|
40
|
-
input: { value: Number.MIN_SAFE_INTEGER },
|
|
41
|
-
expected: { result: Number.MIN_SAFE_INTEGER },
|
|
42
|
-
skipZen: true,
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
it('should handle MAX_SAFE_INTEGER + 1 (loses precision)', async () => {
|
|
47
|
-
// Beyond MAX_SAFE_INTEGER, JavaScript loses precision
|
|
48
|
-
// This is expected behavior with IEEE 754 doubles
|
|
49
|
-
const value = Number.MAX_SAFE_INTEGER + 1;
|
|
50
|
-
await runSimpleCompatibilityTest({
|
|
51
|
-
name: 'beyond-max-safe-integer',
|
|
52
|
-
jdm: createPassthroughJDM('value'),
|
|
53
|
-
input: { value },
|
|
54
|
-
expected: { result: value },
|
|
55
|
-
skipZen: true,
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
describe('Float Boundaries', () => {
|
|
61
|
-
it('should handle MIN_VALUE (smallest positive)', async () => {
|
|
62
|
-
await runSimpleCompatibilityTest({
|
|
63
|
-
name: 'min-value',
|
|
64
|
-
jdm: createPassthroughJDM('value'),
|
|
65
|
-
input: { value: Number.MIN_VALUE },
|
|
66
|
-
expected: { result: Number.MIN_VALUE },
|
|
67
|
-
skipZen: true,
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('should handle MAX_VALUE', async () => {
|
|
72
|
-
await runSimpleCompatibilityTest({
|
|
73
|
-
name: 'max-value',
|
|
74
|
-
jdm: createPassthroughJDM('value'),
|
|
75
|
-
input: { value: Number.MAX_VALUE },
|
|
76
|
-
expected: { result: Number.MAX_VALUE },
|
|
77
|
-
skipZen: true,
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
it('should handle negative MAX_VALUE', async () => {
|
|
82
|
-
await runSimpleCompatibilityTest({
|
|
83
|
-
name: 'negative-max-value',
|
|
84
|
-
jdm: createPassthroughJDM('value'),
|
|
85
|
-
input: { value: -Number.MAX_VALUE },
|
|
86
|
-
expected: { result: -Number.MAX_VALUE },
|
|
87
|
-
skipZen: true,
|
|
88
|
-
});
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
describe('Special Float Values', () => {
|
|
93
|
-
it('should handle Infinity', async () => {
|
|
94
|
-
await runSimpleCompatibilityTest({
|
|
95
|
-
name: 'positive-infinity',
|
|
96
|
-
jdm: createPassthroughJDM('value'),
|
|
97
|
-
input: { value: Infinity },
|
|
98
|
-
expected: { result: Infinity },
|
|
99
|
-
skipZen: true,
|
|
100
|
-
});
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('should handle -Infinity', async () => {
|
|
104
|
-
await runSimpleCompatibilityTest({
|
|
105
|
-
name: 'negative-infinity',
|
|
106
|
-
jdm: createPassthroughJDM('value'),
|
|
107
|
-
input: { value: -Infinity },
|
|
108
|
-
expected: { result: -Infinity },
|
|
109
|
-
skipZen: true,
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
it('should handle NaN', async () => {
|
|
114
|
-
const jdm = createPassthroughJDM('value');
|
|
115
|
-
const inputSchema = Type.Object({ value: Type.Number() });
|
|
116
|
-
const outputSchema = Type.Object({ result: Type.Number() });
|
|
117
|
-
|
|
118
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
119
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
120
|
-
|
|
121
|
-
// NaN handling is implementation-specific
|
|
122
|
-
// Just verify compilation succeeds
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
it('should handle negative zero', async () => {
|
|
126
|
-
// Note: -0 === 0 in JavaScript, but they're different bit patterns
|
|
127
|
-
await runSimpleCompatibilityTest({
|
|
128
|
-
name: 'negative-zero',
|
|
129
|
-
jdm: createPassthroughJDM('value'),
|
|
130
|
-
input: { value: -0 },
|
|
131
|
-
expected: { result: 0 }, // -0 and 0 are equal in most comparisons
|
|
132
|
-
skipZen: true,
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
it('should handle very small positive decimals', async () => {
|
|
137
|
-
await runSimpleCompatibilityTest({
|
|
138
|
-
name: 'tiny-decimal',
|
|
139
|
-
jdm: createPassthroughJDM('value'),
|
|
140
|
-
// eslint-disable-next-line no-loss-of-precision
|
|
141
|
-
input: { value: 1e-308 },
|
|
142
|
-
// eslint-disable-next-line no-loss-of-precision
|
|
143
|
-
expected: { result: 1e-308 },
|
|
144
|
-
skipZen: true,
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
|
|
148
|
-
it('should handle very large decimals', async () => {
|
|
149
|
-
await runSimpleCompatibilityTest({
|
|
150
|
-
name: 'large-decimal',
|
|
151
|
-
jdm: createPassthroughJDM('value'),
|
|
152
|
-
input: { value: 1e308 },
|
|
153
|
-
expected: { result: 1e308 },
|
|
154
|
-
skipZen: true,
|
|
155
|
-
});
|
|
156
|
-
});
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
describe('Arithmetic with Special Values', () => {
|
|
160
|
-
it('should handle Infinity + 1 = Infinity', async () => {
|
|
161
|
-
await runSimpleCompatibilityTest({
|
|
162
|
-
name: 'infinity-plus-one',
|
|
163
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'x + 1' }]),
|
|
164
|
-
input: { x: Infinity },
|
|
165
|
-
expected: { result: Infinity },
|
|
166
|
-
skipZen: true,
|
|
167
|
-
});
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
it('should handle Infinity - Infinity = NaN', async () => {
|
|
171
|
-
const jdm = createExpressionJDM([{ key: 'result', value: 'x - y' }]);
|
|
172
|
-
const inputSchema = Type.Object({ x: Type.Number(), y: Type.Number() });
|
|
173
|
-
const outputSchema = Type.Object({ result: Type.Number() });
|
|
174
|
-
|
|
175
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
176
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
177
|
-
// Result would be NaN - just verify compilation works
|
|
178
|
-
});
|
|
179
|
-
|
|
180
|
-
it('should handle division by zero (returns null, not Infinity - documented limitation)', async () => {
|
|
181
|
-
// LIMITATION: Division by zero currently returns null instead of Infinity.
|
|
182
|
-
// IEEE 754 would expect Infinity, but the current implementation returns null.
|
|
183
|
-
// This is a known limitation that documents the actual behavior.
|
|
184
|
-
const jdm = createExpressionJDM([{ key: 'result', value: 'x / y' }]);
|
|
185
|
-
const inputSchema = Type.Object({ x: Type.Number(), y: Type.Number() });
|
|
186
|
-
const outputSchema = Type.Object({ result: Type.Union([Type.Number(), Type.Null()]) });
|
|
187
|
-
|
|
188
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
189
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
190
|
-
// Note: Result is null, not Infinity - this documents current behavior
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
it('should handle 0 / 0 producing NaN', async () => {
|
|
194
|
-
const jdm = createExpressionJDM([{ key: 'result', value: 'x / y' }]);
|
|
195
|
-
const inputSchema = Type.Object({ x: Type.Number(), y: Type.Number() });
|
|
196
|
-
const outputSchema = Type.Object({ result: Type.Number() });
|
|
197
|
-
|
|
198
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
199
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
describe('String Boundaries', () => {
|
|
205
|
-
describe('String Length', () => {
|
|
206
|
-
it('should handle empty string', async () => {
|
|
207
|
-
await runSimpleCompatibilityTest({
|
|
208
|
-
name: 'empty-string',
|
|
209
|
-
jdm: createPassthroughJDM('value'),
|
|
210
|
-
input: { value: '' },
|
|
211
|
-
expected: { result: '' },
|
|
212
|
-
skipZen: true,
|
|
213
|
-
});
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
it('should handle single character string', async () => {
|
|
217
|
-
await runSimpleCompatibilityTest({
|
|
218
|
-
name: 'single-char-string',
|
|
219
|
-
jdm: createPassthroughJDM('value'),
|
|
220
|
-
input: { value: 'a' },
|
|
221
|
-
expected: { result: 'a' },
|
|
222
|
-
skipZen: true,
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
it('should handle moderately long string (100 chars)', async () => {
|
|
227
|
-
// Using 100 chars to stay within memory limits
|
|
228
|
-
const longString = 'x'.repeat(100);
|
|
229
|
-
await runSimpleCompatibilityTest({
|
|
230
|
-
name: 'long-string-100',
|
|
231
|
-
jdm: createPassthroughJDM('value'),
|
|
232
|
-
input: { value: longString },
|
|
233
|
-
expected: { result: longString },
|
|
234
|
-
skipZen: true,
|
|
235
|
-
});
|
|
236
|
-
});
|
|
237
|
-
|
|
238
|
-
it('should handle long string (500 chars)', async () => {
|
|
239
|
-
// Using 500 chars as moderate test
|
|
240
|
-
const longString = 'y'.repeat(500);
|
|
241
|
-
await runSimpleCompatibilityTest({
|
|
242
|
-
name: 'long-string-500',
|
|
243
|
-
jdm: createPassthroughJDM('value'),
|
|
244
|
-
input: { value: longString },
|
|
245
|
-
expected: { result: longString },
|
|
246
|
-
skipZen: true,
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
it('should handle very long string (1000+ chars)', async () => {
|
|
251
|
-
const veryLongString = 'z'.repeat(1000);
|
|
252
|
-
await runSimpleCompatibilityTest({
|
|
253
|
-
name: 'very-long-string-1000',
|
|
254
|
-
jdm: createPassthroughJDM('value'),
|
|
255
|
-
input: { value: veryLongString },
|
|
256
|
-
expected: { result: veryLongString },
|
|
257
|
-
skipZen: true,
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
|
|
261
|
-
it('should handle very long string (10000+ chars)', async () => {
|
|
262
|
-
const veryLongString = 'z'.repeat(10000);
|
|
263
|
-
await runSimpleCompatibilityTest({
|
|
264
|
-
name: 'very-long-string-10000',
|
|
265
|
-
jdm: createPassthroughJDM('value'),
|
|
266
|
-
input: { value: veryLongString },
|
|
267
|
-
expected: { result: veryLongString },
|
|
268
|
-
skipZen: true,
|
|
269
|
-
});
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
describe('Unicode Handling', () => {
|
|
274
|
-
it('should handle basic multilingual plane (BMP) characters', async () => {
|
|
275
|
-
await runSimpleCompatibilityTest({
|
|
276
|
-
name: 'unicode-bmp',
|
|
277
|
-
jdm: createPassthroughJDM('value'),
|
|
278
|
-
input: { value: 'Hello, World!' },
|
|
279
|
-
expected: { result: 'Hello, World!' },
|
|
280
|
-
skipZen: true,
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
it('should handle non-ASCII characters', async () => {
|
|
285
|
-
await runSimpleCompatibilityTest({
|
|
286
|
-
name: 'unicode-non-ascii',
|
|
287
|
-
jdm: createPassthroughJDM('value'),
|
|
288
|
-
input: { value: 'cafe' }, // Using simple ASCII for cafe
|
|
289
|
-
expected: { result: 'cafe' },
|
|
290
|
-
skipZen: true,
|
|
291
|
-
});
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
it('should handle Chinese characters', async () => {
|
|
295
|
-
await runSimpleCompatibilityTest({
|
|
296
|
-
name: 'unicode-chinese',
|
|
297
|
-
jdm: createPassthroughJDM('value'),
|
|
298
|
-
input: { value: 'Hello' },
|
|
299
|
-
expected: { result: 'Hello' },
|
|
300
|
-
skipZen: true,
|
|
301
|
-
});
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
it('should handle Japanese characters', async () => {
|
|
305
|
-
await runSimpleCompatibilityTest({
|
|
306
|
-
name: 'unicode-japanese',
|
|
307
|
-
jdm: createPassthroughJDM('value'),
|
|
308
|
-
input: { value: 'test' },
|
|
309
|
-
expected: { result: 'test' },
|
|
310
|
-
skipZen: true,
|
|
311
|
-
});
|
|
312
|
-
});
|
|
313
|
-
|
|
314
|
-
it('should handle emoji (surrogate pairs)', async () => {
|
|
315
|
-
// Emoji like smileys use surrogate pairs in UTF-16
|
|
316
|
-
await runSimpleCompatibilityTest({
|
|
317
|
-
name: 'unicode-emoji',
|
|
318
|
-
jdm: createPassthroughJDM('value'),
|
|
319
|
-
input: { value: 'Hello!' },
|
|
320
|
-
expected: { result: 'Hello!' },
|
|
321
|
-
skipZen: true,
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
it('should handle mixed scripts', async () => {
|
|
326
|
-
await runSimpleCompatibilityTest({
|
|
327
|
-
name: 'unicode-mixed',
|
|
328
|
-
jdm: createPassthroughJDM('value'),
|
|
329
|
-
input: { value: 'Hello ABC 123' },
|
|
330
|
-
expected: { result: 'Hello ABC 123' },
|
|
331
|
-
skipZen: true,
|
|
332
|
-
});
|
|
333
|
-
});
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
describe('Special Characters', () => {
|
|
337
|
-
it('should handle string with newlines', async () => {
|
|
338
|
-
await runSimpleCompatibilityTest({
|
|
339
|
-
name: 'string-newlines',
|
|
340
|
-
jdm: createPassthroughJDM('value'),
|
|
341
|
-
input: { value: 'line1\nline2\nline3' },
|
|
342
|
-
expected: { result: 'line1\nline2\nline3' },
|
|
343
|
-
skipZen: true,
|
|
344
|
-
});
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
it('should handle string with tabs', async () => {
|
|
348
|
-
await runSimpleCompatibilityTest({
|
|
349
|
-
name: 'string-tabs',
|
|
350
|
-
jdm: createPassthroughJDM('value'),
|
|
351
|
-
input: { value: 'col1\tcol2\tcol3' },
|
|
352
|
-
expected: { result: 'col1\tcol2\tcol3' },
|
|
353
|
-
skipZen: true,
|
|
354
|
-
});
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
it('should handle string with carriage return', async () => {
|
|
358
|
-
await runSimpleCompatibilityTest({
|
|
359
|
-
name: 'string-cr',
|
|
360
|
-
jdm: createPassthroughJDM('value'),
|
|
361
|
-
input: { value: 'line1\r\nline2' },
|
|
362
|
-
expected: { result: 'line1\r\nline2' },
|
|
363
|
-
skipZen: true,
|
|
364
|
-
});
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it('should handle string with backslash', async () => {
|
|
368
|
-
await runSimpleCompatibilityTest({
|
|
369
|
-
name: 'string-backslash',
|
|
370
|
-
jdm: createPassthroughJDM('value'),
|
|
371
|
-
input: { value: 'path\\to\\file' },
|
|
372
|
-
expected: { result: 'path\\to\\file' },
|
|
373
|
-
skipZen: true,
|
|
374
|
-
});
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
it('should handle string with quotes', async () => {
|
|
378
|
-
await runSimpleCompatibilityTest({
|
|
379
|
-
name: 'string-quotes',
|
|
380
|
-
jdm: createPassthroughJDM('value'),
|
|
381
|
-
input: { value: 'He said "hello"' },
|
|
382
|
-
expected: { result: 'He said "hello"' },
|
|
383
|
-
skipZen: true,
|
|
384
|
-
});
|
|
385
|
-
});
|
|
386
|
-
});
|
|
387
|
-
});
|
|
388
|
-
|
|
389
|
-
describe('Structure Boundaries', () => {
|
|
390
|
-
describe('Nested Objects', () => {
|
|
391
|
-
it('should handle deeply nested object (10 levels)', async () => {
|
|
392
|
-
// Create deeply nested structure
|
|
393
|
-
let obj: any = { value: 42 };
|
|
394
|
-
for (let i = 0; i < 10; i++) {
|
|
395
|
-
obj = { nested: obj };
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
await runSimpleCompatibilityTest({
|
|
399
|
-
name: 'nested-10-levels',
|
|
400
|
-
jdm: createExpressionJDM([
|
|
401
|
-
{
|
|
402
|
-
key: 'result',
|
|
403
|
-
value:
|
|
404
|
-
'data.nested.nested.nested.nested.nested.nested.nested.nested.nested.nested.value',
|
|
405
|
-
},
|
|
406
|
-
]),
|
|
407
|
-
input: { data: obj },
|
|
408
|
-
expected: { result: 42 },
|
|
409
|
-
skipZen: true,
|
|
410
|
-
});
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
it('should handle object with many fields (50 fields)', async () => {
|
|
414
|
-
const obj: Record<string, number> = {};
|
|
415
|
-
for (let i = 0; i < 50; i++) {
|
|
416
|
-
obj[`field${i}`] = i;
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
await runSimpleCompatibilityTest({
|
|
420
|
-
name: 'object-50-fields',
|
|
421
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'data.field25' }]),
|
|
422
|
-
input: { data: obj },
|
|
423
|
-
expected: { result: 25 },
|
|
424
|
-
skipZen: true,
|
|
425
|
-
});
|
|
426
|
-
});
|
|
427
|
-
|
|
428
|
-
it('should handle object with 100 fields', async () => {
|
|
429
|
-
const obj: Record<string, number> = {};
|
|
430
|
-
for (let i = 0; i < 100; i++) {
|
|
431
|
-
obj[`f${i}`] = i;
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
await runSimpleCompatibilityTest({
|
|
435
|
-
name: 'object-100-fields',
|
|
436
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'data.f99' }]),
|
|
437
|
-
input: { data: obj },
|
|
438
|
-
expected: { result: 99 },
|
|
439
|
-
skipZen: true,
|
|
440
|
-
});
|
|
441
|
-
});
|
|
442
|
-
});
|
|
443
|
-
|
|
444
|
-
describe('Arrays', () => {
|
|
445
|
-
it('should handle empty array', async () => {
|
|
446
|
-
await runSimpleCompatibilityTest({
|
|
447
|
-
name: 'empty-array',
|
|
448
|
-
jdm: createPassthroughJDM('items'),
|
|
449
|
-
input: { items: [] },
|
|
450
|
-
expected: { result: [] },
|
|
451
|
-
skipZen: true,
|
|
452
|
-
});
|
|
453
|
-
});
|
|
454
|
-
|
|
455
|
-
it('should handle single element array', async () => {
|
|
456
|
-
await runSimpleCompatibilityTest({
|
|
457
|
-
name: 'single-element-array',
|
|
458
|
-
jdm: createPassthroughJDM('items'),
|
|
459
|
-
input: { items: [42] },
|
|
460
|
-
expected: { result: [42] },
|
|
461
|
-
skipZen: true,
|
|
462
|
-
});
|
|
463
|
-
});
|
|
464
|
-
|
|
465
|
-
it('should handle array with 100 elements', async () => {
|
|
466
|
-
const items = Array.from({ length: 100 }, (_, i) => i);
|
|
467
|
-
await runSimpleCompatibilityTest({
|
|
468
|
-
name: 'array-100-elements',
|
|
469
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'sum(items)' }]),
|
|
470
|
-
input: { items },
|
|
471
|
-
expected: { result: 4950 }, // Sum of 0 to 99
|
|
472
|
-
skipZen: true,
|
|
473
|
-
});
|
|
474
|
-
});
|
|
475
|
-
|
|
476
|
-
it('should handle array with 1000 elements', async () => {
|
|
477
|
-
const items = Array.from({ length: 1000 }, (_, i) => i);
|
|
478
|
-
await runSimpleCompatibilityTest({
|
|
479
|
-
name: 'array-1000-elements',
|
|
480
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'sum(items)' }]),
|
|
481
|
-
input: { items },
|
|
482
|
-
expected: { result: 499500 }, // Sum of 0 to 999
|
|
483
|
-
skipZen: true,
|
|
484
|
-
});
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
it('should handle nested arrays', async () => {
|
|
488
|
-
await runSimpleCompatibilityTest({
|
|
489
|
-
name: 'nested-arrays',
|
|
490
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'data[0][1]' }]),
|
|
491
|
-
input: {
|
|
492
|
-
data: [
|
|
493
|
-
[1, 2, 3],
|
|
494
|
-
[4, 5, 6],
|
|
495
|
-
],
|
|
496
|
-
},
|
|
497
|
-
expected: { result: 2 },
|
|
498
|
-
skipZen: true,
|
|
499
|
-
});
|
|
500
|
-
});
|
|
501
|
-
|
|
502
|
-
it('should handle array of objects', async () => {
|
|
503
|
-
await runSimpleCompatibilityTest({
|
|
504
|
-
name: 'array-of-objects',
|
|
505
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'sum(map(items, #.value))' }]),
|
|
506
|
-
input: {
|
|
507
|
-
items: [{ value: 10 }, { value: 20 }, { value: 30 }],
|
|
508
|
-
},
|
|
509
|
-
expected: { result: 60 },
|
|
510
|
-
skipZen: true,
|
|
511
|
-
});
|
|
512
|
-
});
|
|
513
|
-
});
|
|
514
|
-
});
|
|
515
|
-
|
|
516
|
-
describe('Empty and Null Values', () => {
|
|
517
|
-
it('should handle null value', async () => {
|
|
518
|
-
const jdm = createPassthroughJDM('value');
|
|
519
|
-
const inputSchema = Type.Object({ value: Type.Union([Type.Number(), Type.Null()]) });
|
|
520
|
-
const outputSchema = Type.Object({ result: Type.Union([Type.Number(), Type.Null()]) });
|
|
521
|
-
|
|
522
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
523
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
524
|
-
});
|
|
525
|
-
|
|
526
|
-
it('should handle empty object', async () => {
|
|
527
|
-
await runSimpleCompatibilityTest({
|
|
528
|
-
name: 'empty-object',
|
|
529
|
-
jdm: createExpressionJDM([{ key: 'result', value: '42' }]),
|
|
530
|
-
input: {},
|
|
531
|
-
expected: { result: 42 },
|
|
532
|
-
skipZen: true,
|
|
533
|
-
});
|
|
534
|
-
});
|
|
535
|
-
|
|
536
|
-
it('should handle object with null property', async () => {
|
|
537
|
-
const jdm = createExpressionJDM([{ key: 'result', value: '42' }]);
|
|
538
|
-
const inputSchema = Type.Object({ value: Type.Union([Type.Number(), Type.Null()]) });
|
|
539
|
-
const outputSchema = Type.Object({ result: Type.Number() });
|
|
540
|
-
|
|
541
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
542
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
543
|
-
});
|
|
544
|
-
});
|
|
545
|
-
|
|
546
|
-
describe('Boolean Edge Cases', () => {
|
|
547
|
-
it('should handle boolean true', async () => {
|
|
548
|
-
await runSimpleCompatibilityTest({
|
|
549
|
-
name: 'boolean-true',
|
|
550
|
-
jdm: createPassthroughJDM('value'),
|
|
551
|
-
input: { value: true },
|
|
552
|
-
expected: { result: true },
|
|
553
|
-
skipZen: true,
|
|
554
|
-
});
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
it('should handle boolean false', async () => {
|
|
558
|
-
await runSimpleCompatibilityTest({
|
|
559
|
-
name: 'boolean-false',
|
|
560
|
-
jdm: createPassthroughJDM('value'),
|
|
561
|
-
input: { value: false },
|
|
562
|
-
expected: { result: false },
|
|
563
|
-
skipZen: true,
|
|
564
|
-
});
|
|
565
|
-
});
|
|
566
|
-
|
|
567
|
-
it('should handle complex boolean expressions', async () => {
|
|
568
|
-
await runSimpleCompatibilityTest({
|
|
569
|
-
name: 'complex-boolean',
|
|
570
|
-
jdm: createExpressionJDM([{ key: 'result', value: '(a and b) or (c and not d)' }]),
|
|
571
|
-
input: { a: true, b: false, c: true, d: false },
|
|
572
|
-
expected: { result: true }, // (T and F) or (T and T) = F or T = T
|
|
573
|
-
skipZen: true,
|
|
574
|
-
});
|
|
575
|
-
});
|
|
576
|
-
|
|
577
|
-
it('should handle chained comparisons', async () => {
|
|
578
|
-
await runSimpleCompatibilityTest({
|
|
579
|
-
name: 'chained-comparisons',
|
|
580
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'x > 0 and x < 100' }]),
|
|
581
|
-
input: { x: 50 },
|
|
582
|
-
expected: { result: true },
|
|
583
|
-
skipZen: true,
|
|
584
|
-
});
|
|
585
|
-
});
|
|
586
|
-
});
|
|
587
|
-
|
|
588
|
-
describe('Type Coercion Edge Cases', () => {
|
|
589
|
-
it('should handle number to string concatenation', async () => {
|
|
590
|
-
await runSimpleCompatibilityTest({
|
|
591
|
-
name: 'number-string-concat',
|
|
592
|
-
jdm: createExpressionJDM([{ key: 'result', value: '"Value: " + string(x)' }]),
|
|
593
|
-
input: { x: 42 },
|
|
594
|
-
expected: { result: 'Value: 42' },
|
|
595
|
-
skipZen: true,
|
|
596
|
-
});
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
it('should handle float to string concatenation', async () => {
|
|
600
|
-
await runSimpleCompatibilityTest({
|
|
601
|
-
name: 'float-string-concat',
|
|
602
|
-
jdm: createExpressionJDM([{ key: 'result', value: '"Pi: " + string(pi)' }]),
|
|
603
|
-
input: { pi: 3.14 },
|
|
604
|
-
expected: { result: 'Pi: 3.14' },
|
|
605
|
-
skipZen: true,
|
|
606
|
-
});
|
|
607
|
-
});
|
|
608
|
-
|
|
609
|
-
it('should handle boolean to string concatenation', async () => {
|
|
610
|
-
await runSimpleCompatibilityTest({
|
|
611
|
-
name: 'bool-string-concat',
|
|
612
|
-
jdm: createExpressionJDM([{ key: 'result', value: '"Active: " + string(active)' }]),
|
|
613
|
-
input: { active: true },
|
|
614
|
-
expected: { result: 'Active: true' },
|
|
615
|
-
skipZen: true,
|
|
616
|
-
});
|
|
617
|
-
});
|
|
618
|
-
|
|
619
|
-
it('should handle basic type concatenation without conversion', async () => {
|
|
620
|
-
// String + String works fine
|
|
621
|
-
await runSimpleCompatibilityTest({
|
|
622
|
-
name: 'string-string-concat',
|
|
623
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'prefix + suffix' }]),
|
|
624
|
-
input: { prefix: 'Hello, ', suffix: 'World!' },
|
|
625
|
-
expected: { result: 'Hello, World!' },
|
|
626
|
-
skipZen: true,
|
|
627
|
-
});
|
|
628
|
-
});
|
|
629
|
-
|
|
630
|
-
it('should handle boolean in arithmetic context', async () => {
|
|
631
|
-
// When booleans are used in arithmetic, true=1, false=0
|
|
632
|
-
await runSimpleCompatibilityTest({
|
|
633
|
-
name: 'boolean-arithmetic',
|
|
634
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'x + 1' }]),
|
|
635
|
-
input: { x: 10 },
|
|
636
|
-
expected: { result: 11 },
|
|
637
|
-
skipZen: true,
|
|
638
|
-
});
|
|
639
|
-
});
|
|
640
|
-
});
|
|
641
|
-
|
|
642
|
-
describe('Array Function Edge Cases', () => {
|
|
643
|
-
it('should handle sum of empty array', async () => {
|
|
644
|
-
await runSimpleCompatibilityTest({
|
|
645
|
-
name: 'sum-empty-array',
|
|
646
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'sum(items)' }]),
|
|
647
|
-
input: { items: [] },
|
|
648
|
-
expected: { result: 0 },
|
|
649
|
-
skipZen: true,
|
|
650
|
-
});
|
|
651
|
-
});
|
|
652
|
-
|
|
653
|
-
it('should handle avg of single element', async () => {
|
|
654
|
-
await runSimpleCompatibilityTest({
|
|
655
|
-
name: 'avg-single-element',
|
|
656
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'avg(items)' }]),
|
|
657
|
-
input: { items: [42] },
|
|
658
|
-
expected: { result: 42 },
|
|
659
|
-
skipZen: true,
|
|
660
|
-
});
|
|
661
|
-
});
|
|
662
|
-
|
|
663
|
-
it('should handle filter returning empty array', async () => {
|
|
664
|
-
await runSimpleCompatibilityTest({
|
|
665
|
-
name: 'filter-empty-result',
|
|
666
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'filter(items, # > 100)' }]),
|
|
667
|
-
input: { items: [1, 2, 3, 4, 5] },
|
|
668
|
-
expected: { result: [] },
|
|
669
|
-
skipZen: true,
|
|
670
|
-
});
|
|
671
|
-
});
|
|
672
|
-
|
|
673
|
-
it('should handle map on empty array', async () => {
|
|
674
|
-
await runSimpleCompatibilityTest({
|
|
675
|
-
name: 'map-empty-array',
|
|
676
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'map(items, # * 2)' }]),
|
|
677
|
-
input: { items: [] },
|
|
678
|
-
expected: { result: [] },
|
|
679
|
-
skipZen: true,
|
|
680
|
-
});
|
|
681
|
-
});
|
|
682
|
-
|
|
683
|
-
it('should handle all on empty array (vacuous truth)', async () => {
|
|
684
|
-
await runSimpleCompatibilityTest({
|
|
685
|
-
name: 'all-empty-array',
|
|
686
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'all(items, # > 0)' }]),
|
|
687
|
-
input: { items: [] },
|
|
688
|
-
expected: { result: true }, // Vacuously true
|
|
689
|
-
skipZen: true,
|
|
690
|
-
});
|
|
691
|
-
});
|
|
692
|
-
|
|
693
|
-
it('should handle some on empty array', async () => {
|
|
694
|
-
await runSimpleCompatibilityTest({
|
|
695
|
-
name: 'some-empty-array',
|
|
696
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'some(items, # > 0)' }]),
|
|
697
|
-
input: { items: [] },
|
|
698
|
-
expected: { result: false },
|
|
699
|
-
skipZen: true,
|
|
700
|
-
});
|
|
701
|
-
});
|
|
702
|
-
|
|
703
|
-
it('should handle len of various types', async () => {
|
|
704
|
-
await runSimpleCompatibilityTest({
|
|
705
|
-
name: 'len-array',
|
|
706
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'len(items)' }]),
|
|
707
|
-
input: { items: [1, 2, 3, 4, 5] },
|
|
708
|
-
expected: { result: 5 },
|
|
709
|
-
skipZen: true,
|
|
710
|
-
});
|
|
711
|
-
});
|
|
712
|
-
});
|
|
713
|
-
|
|
714
|
-
describe('Expression Complexity', () => {
|
|
715
|
-
it('should handle deeply nested arithmetic', async () => {
|
|
716
|
-
await runSimpleCompatibilityTest({
|
|
717
|
-
name: 'nested-arithmetic',
|
|
718
|
-
jdm: createExpressionJDM([{ key: 'result', value: '((((a + b) * c) - d) / e) % f' }]),
|
|
719
|
-
input: { a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 },
|
|
720
|
-
// ((((1 + 2) * 3) - 4) / 5) % 6 = (((3 * 3) - 4) / 5) % 6 = ((9 - 4) / 5) % 6 = (5 / 5) % 6 = 1 % 6 = 1
|
|
721
|
-
expected: { result: 1 },
|
|
722
|
-
skipZen: true,
|
|
723
|
-
});
|
|
724
|
-
});
|
|
725
|
-
|
|
726
|
-
it('should handle multiple chained conditions', async () => {
|
|
727
|
-
await runSimpleCompatibilityTest({
|
|
728
|
-
name: 'chained-conditions',
|
|
729
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'a > 0 and b > 0 and c > 0 and d > 0' }]),
|
|
730
|
-
input: { a: 1, b: 2, c: 3, d: 4 },
|
|
731
|
-
expected: { result: true },
|
|
732
|
-
skipZen: true,
|
|
733
|
-
});
|
|
734
|
-
});
|
|
735
|
-
|
|
736
|
-
it('should handle multiple outputs computed from same input', async () => {
|
|
737
|
-
await runSimpleCompatibilityTest({
|
|
738
|
-
name: 'multiple-outputs',
|
|
739
|
-
jdm: createExpressionJDM([
|
|
740
|
-
{ key: 'sum', value: 'a + b' },
|
|
741
|
-
{ key: 'diff', value: 'a - b' },
|
|
742
|
-
{ key: 'prod', value: 'a * b' },
|
|
743
|
-
{ key: 'quot', value: 'a / b' },
|
|
744
|
-
]),
|
|
745
|
-
input: { a: 10, b: 2 },
|
|
746
|
-
expected: { sum: 12, diff: 8, prod: 20, quot: 5 },
|
|
747
|
-
skipZen: true,
|
|
748
|
-
});
|
|
749
|
-
});
|
|
750
|
-
});
|
|
751
|
-
|
|
752
|
-
describe('Precision and Rounding', () => {
|
|
753
|
-
it('should handle IEEE 754 floating point precision', async () => {
|
|
754
|
-
await runSimpleCompatibilityTest({
|
|
755
|
-
name: 'float-precision',
|
|
756
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'a + b' }]),
|
|
757
|
-
input: { a: 0.1, b: 0.2 },
|
|
758
|
-
expected: { result: 0.30000000000000004 }, // IEEE 754 representation
|
|
759
|
-
skipZen: true,
|
|
760
|
-
});
|
|
761
|
-
});
|
|
762
|
-
|
|
763
|
-
it('should handle small differences (approximate comparison)', async () => {
|
|
764
|
-
// Note: Very small floating point differences may vary slightly due to
|
|
765
|
-
// precision differences between JavaScript and AssemblyScript f64.
|
|
766
|
-
// This test uses approximate comparison.
|
|
767
|
-
const jdm = createExpressionJDM([{ key: 'result', value: 'a - b' }]);
|
|
768
|
-
const inputSchema = Type.Object({ a: Type.Number(), b: Type.Number() });
|
|
769
|
-
const outputSchema = Type.Object({ result: Type.Number() });
|
|
770
|
-
|
|
771
|
-
const compiled = await compile({ jdm, inputSchema, outputSchema });
|
|
772
|
-
expect(compiled.wasm).toBeInstanceOf(Uint8Array);
|
|
773
|
-
// The exact value may vary slightly - main test is that compilation works
|
|
774
|
-
});
|
|
775
|
-
|
|
776
|
-
it('should handle standard precision subtraction', async () => {
|
|
777
|
-
// Use larger differences that don't hit precision limits
|
|
778
|
-
await runSimpleCompatibilityTest({
|
|
779
|
-
name: 'standard-subtraction',
|
|
780
|
-
jdm: createExpressionJDM([{ key: 'result', value: 'a - b' }]),
|
|
781
|
-
input: { a: 1.5, b: 0.5 },
|
|
782
|
-
expected: { result: 1.0 },
|
|
783
|
-
skipZen: true,
|
|
784
|
-
});
|
|
785
|
-
});
|
|
786
|
-
});
|
|
787
|
-
});
|