#!/usr/bin/env bash # run.sh — build and execute the calendar/ acceptance corpus. # # Each examples/.el is a self-contained El program with a fn main() # that prints a single deterministic result line. The runner compiles each # via the canonical native elc, links it against the shared C runtime, runs # it, and asserts the output matches the expected value. set -uo pipefail cd "$(dirname "$0")" EL_HOME="${EL_HOME:-$(cd ../.. && pwd)}" ELC="${EL_HOME}/dist/platform/elc" RUNTIME_DIR="${EL_HOME}/el-compiler/runtime" if [ ! -x "${ELC}" ]; then echo "elc not found at ${ELC}" >&2 exit 1 fi PASS=0 FAIL=0 FAILED_NAMES=() # run_runtime_case [] run_runtime_case() { local name="$1" local src="$2" local expected="$3" local mode="${4:-exact}" local out_c local out_bin out_c="$(mktemp -t cal_test.XXXXXX).c" out_bin="$(mktemp -t cal_test.XXXXXX)" if ! "${ELC}" "${src}" > "${out_c}" 2>/tmp/cal_test.elc.err; then echo "FAIL ${name} — elc emit failed:" cat /tmp/cal_test.elc.err | sed 's/^/ /' FAIL=$((FAIL+1)) FAILED_NAMES+=("${name}") rm -f "${out_c}" "${out_bin}" return fi if ! cc -O2 -I "${RUNTIME_DIR}" "${out_c}" "${RUNTIME_DIR}/el_runtime.c" \ -lcurl -lssl -lcrypto -lpthread -lm -o "${out_bin}" 2>/tmp/cal_test.cc.err; then echo "FAIL ${name} — cc failed:" cat /tmp/cal_test.cc.err | sed 's/^/ /' FAIL=$((FAIL+1)) FAILED_NAMES+=("${name}") rm -f "${out_c}" "${out_bin}" return fi local got got="$("${out_bin}" 2>&1 | tr -d '[:space:]')" if [ "${mode}" = "either" ]; then local ok=0 local IFS=',' for choice in ${expected}; do if [ "${got}" = "${choice}" ]; then ok=1; break; fi done if [ "${ok}" = "1" ]; then echo "PASS ${name} (got: ${got})" PASS=$((PASS+1)) else echo "FAIL ${name} expected one of {${expected}}, got: ${got}" FAIL=$((FAIL+1)) FAILED_NAMES+=("${name}") fi else if [ "${got}" = "${expected}" ]; then echo "PASS ${name}" PASS=$((PASS+1)) else echo "FAIL ${name} expected: ${expected}, got: ${got}" FAIL=$((FAIL+1)) FAILED_NAMES+=("${name}") fi fi rm -f "${out_c}" "${out_bin}" } echo "==> Running calendar/ acceptance corpus" echo run_runtime_case "earth-zone" examples/earth-zone.el "EDT" run_runtime_case "dst-spring-forward" examples/dst-spring-forward.el "03:30EDT" run_runtime_case "mars-calendar" examples/mars-calendar.el "1" run_runtime_case "cycle-30hr" examples/cycle-30hr.el "0.5" run_runtime_case "cycle-300yr" examples/cycle-300yr.el "0.01" run_runtime_case "no-cycle" examples/no-cycle.el "1" run_runtime_case "cross-calendar-comparison" examples/cross-calendar-comparison.el "1" run_runtime_case "local-date-arithmetic" examples/local-date-arithmetic.el "2026-6-4" run_runtime_case "rhythm-grounding" examples/rhythm-grounding.el "1778504400" run_runtime_case "rhythm-cycle-30hr" examples/rhythm-cycle-30hr.el "54000" echo echo "${PASS} passed, ${FAIL} failed" if [ "${FAIL}" -gt 0 ]; then echo "failed: ${FAILED_NAMES[*]}" exit 1 fi exit 0