diff --git a/scripts/validate.sh b/scripts/validate.sh index 130d555..0be67c6 100755 --- a/scripts/validate.sh +++ b/scripts/validate.sh @@ -2,7 +2,7 @@ set -euo pipefail # Lux Full Validation Script -# Runs all checks: Rust tests, package tests, type checking, formatting, linting. +# Runs all checks: Rust tests, package tests, type checking, example compilation. # Run after every committable change to ensure no regressions. # cd to repo root (directory containing this script's parent) @@ -11,6 +11,8 @@ cd "$SCRIPT_DIR/.." LUX="$(pwd)/target/release/lux" PACKAGES_DIR="$(pwd)/../packages" +PROJECTS_DIR="$(pwd)/projects" +EXAMPLES_DIR="$(pwd)/examples" RED='\033[0;31m' GREEN='\033[0;32m' CYAN='\033[0;36m' @@ -64,7 +66,6 @@ for pkg in path frontmatter xml rss markdown; do done # --- Project checks --- -PROJECTS_DIR="$(pwd)/projects" for proj_dir in "$PROJECTS_DIR"/*/; do proj=$(basename "$proj_dir") if [ -f "$proj_dir/main.lux" ]; then @@ -83,6 +84,123 @@ for proj_dir in "$PROJECTS_DIR"/*/; do done done +# === Compilation & Interpreter Checks === + +# --- Interpreter: examples --- +# Skip: http_api, http, http_router, http_server (network), postgres_demo (db), +# random, property_testing (Random effect), shell (Process), json (File I/O), +# file_io (File I/O), test_math, test_lists (Test effect), stress_shared_rc, +# test_rc_comparison (internal tests), modules/* (need cwd) +INTERP_SKIP="http_api http http_router http_server postgres_demo random property_testing shell json file_io test_math test_lists stress_shared_rc test_rc_comparison" +for f in "$EXAMPLES_DIR"/*.lux; do + name=$(basename "$f" .lux) + skip=false + for s in $INTERP_SKIP; do [ "$name" = "$s" ] && skip=true; done + $skip && continue + step "interpreter (examples/$name)" + if timeout 10 "$LUX" "$f" >/dev/null 2>&1; then ok; else fail; fi +done + +# --- Interpreter: examples/standard --- +# Skip: guessing_game (reads stdin) +for f in "$EXAMPLES_DIR"/standard/*.lux; do + [ -f "$f" ] || continue + name=$(basename "$f" .lux) + [ "$name" = "guessing_game" ] && continue + step "interpreter (standard/$name)" + if timeout 10 "$LUX" "$f" >/dev/null 2>&1; then ok; else fail; fi +done + +# --- Interpreter: examples/showcase --- +# Skip: task_manager (parse error in current version) +for f in "$EXAMPLES_DIR"/showcase/*.lux; do + [ -f "$f" ] || continue + name=$(basename "$f" .lux) + [ "$name" = "task_manager" ] && continue + step "interpreter (showcase/$name)" + if timeout 10 "$LUX" "$f" >/dev/null 2>&1; then ok; else fail; fi +done + +# --- Interpreter: projects --- +# Skip: guessing-game (Random), rest-api (HttpServer) +PROJ_INTERP_SKIP="guessing-game rest-api" +for proj_dir in "$PROJECTS_DIR"/*/; do + proj=$(basename "$proj_dir") + [ -f "$proj_dir/main.lux" ] || continue + skip=false + for s in $PROJ_INTERP_SKIP; do [ "$proj" = "$s" ] && skip=true; done + $skip && continue + step "interpreter (project: $proj)" + if timeout 10 "$LUX" "$proj_dir/main.lux" >/dev/null 2>&1; then ok; else fail; fi +done + +# --- JS compilation: examples --- +# Skip files that fail JS compilation (unsupported features) +JS_SKIP="http_api http http_router postgres_demo property_testing json test_lists test_rc_comparison" +for f in "$EXAMPLES_DIR"/*.lux; do + name=$(basename "$f" .lux) + skip=false + for s in $JS_SKIP; do [ "$name" = "$s" ] && skip=true; done + $skip && continue + step "compile JS (examples/$name)" + if "$LUX" compile "$f" --target js -o /tmp/lux_validate.js >/dev/null 2>&1; then ok; else fail; fi +done + +# --- JS compilation: examples/standard --- +# Skip: stdlib_demo (uses String.toUpper not in JS backend) +for f in "$EXAMPLES_DIR"/standard/*.lux; do + [ -f "$f" ] || continue + name=$(basename "$f" .lux) + [ "$name" = "stdlib_demo" ] && continue + step "compile JS (standard/$name)" + if "$LUX" compile "$f" --target js -o /tmp/lux_validate.js >/dev/null 2>&1; then ok; else fail; fi +done + +# --- JS compilation: examples/showcase --- +# Skip: task_manager (unsupported features) +for f in "$EXAMPLES_DIR"/showcase/*.lux; do + [ -f "$f" ] || continue + name=$(basename "$f" .lux) + [ "$name" = "task_manager" ] && continue + step "compile JS (showcase/$name)" + if "$LUX" compile "$f" --target js -o /tmp/lux_validate.js >/dev/null 2>&1; then ok; else fail; fi +done + +# --- JS compilation: projects --- +# Skip: json-parser, rest-api (unsupported features) +JS_PROJ_SKIP="json-parser rest-api" +for proj_dir in "$PROJECTS_DIR"/*/; do + proj=$(basename "$proj_dir") + [ -f "$proj_dir/main.lux" ] || continue + skip=false + for s in $JS_PROJ_SKIP; do [ "$proj" = "$s" ] && skip=true; done + $skip && continue + step "compile JS (project: $proj)" + if "$LUX" compile "$proj_dir/main.lux" --target js -o /tmp/lux_validate.js >/dev/null 2>&1; then ok; else fail; fi +done + +# --- C compilation: examples --- +# Only compile examples known to work with C backend +C_EXAMPLES="hello factorial pipelines tailcall jit_test" +for name in $C_EXAMPLES; do + f="$EXAMPLES_DIR/$name.lux" + [ -f "$f" ] || continue + step "compile C (examples/$name)" + if "$LUX" compile "$f" -o /tmp/lux_validate_bin >/dev/null 2>&1; then ok; else fail; fi +done + +# --- C compilation: examples/standard --- +C_STD_EXAMPLES="hello_world factorial fizzbuzz primes guessing_game" +for name in $C_STD_EXAMPLES; do + f="$EXAMPLES_DIR/standard/$name.lux" + [ -f "$f" ] || continue + step "compile C (standard/$name)" + if "$LUX" compile "$f" -o /tmp/lux_validate_bin >/dev/null 2>&1; then ok; else fail; fi +done + +# --- Cleanup --- +rm -f /tmp/lux_validate.js /tmp/lux_validate_bin + # --- Summary --- printf "\n${BOLD}═══ Validation Summary ═══${NC}\n" if [ $FAILED -eq 0 ]; then