#!/bin/sh # tests/harness.sh - Minimal POSIX test harness for VX. # # Source this file at the top of each test script. It provides: # check_exit CMD EXPECTED_EXIT -- assert exit code # check_eq ACTUAL EXPECTED MSG -- assert string equality # check_file ACTUAL_FILE EXPECTED_FILE MSG -- assert file equality # check_grep PATTERN FILE MSG -- assert pattern in file # pass / fail / summary # # The test script must call summary() at the end. _pass=0 _fail=0 _harness_tmpdir="" # Resolve VX binary: prefer $VX env var, else ../builddir/vx from script dir if [ -z "$VX" ]; then _script_dir="$(cd "$(dirname "$0")" && pwd)" VX="${_script_dir}/../../builddir/vx" fi export VX setup_tmpdir() { _harness_tmpdir="$(mktemp -d)" cd "$_harness_tmpdir" || exit 1 } cleanup_tmpdir() { if [ -n "$_harness_tmpdir" ] && [ -d "$_harness_tmpdir" ]; then rm -rf "$_harness_tmpdir" fi } pass() { _pass=$((_pass + 1)) printf " PASS: %s\n" "$1" } fail() { _fail=$((_fail + 1)) printf " FAIL: %s\n" "$1" if [ -n "$2" ]; then printf " %s\n" "$2" fi } # check_exit "description" expected_exit command [args...] check_exit() { _desc="$1"; shift _expect="$1"; shift "$@" >/dev/null 2>&1 _got=$? if [ "$_got" -eq "$_expect" ]; then pass "$_desc" else fail "$_desc" "expected exit=$_expect, got exit=$_got" fi } # check_output "description" "expected_stdout" command [args...] check_output() { _desc="$1"; shift _expect="$1"; shift _got="$("$@" 2>/dev/null)" || true if [ "$_got" = "$_expect" ]; then pass "$_desc" else fail "$_desc" "expected: $(printf '%s' "$_expect" | head -c 200), got: $(printf '%s' "$_got" | head -c 200)" fi } # check_eq "got" "expected" "description" check_eq() { if [ "$1" = "$2" ]; then pass "$3" else fail "$3" "expected: $(printf '%s' "$2" | head -c 200), got: $(printf '%s' "$1" | head -c 200)" fi } # check_file actual_file expected_file "description" check_file() { if diff -q "$1" "$2" >/dev/null 2>&1; then pass "$3" else fail "$3" "files differ: $1 vs $2" fi } # check_grep pattern file "description" check_grep() { if grep -q "$1" "$2" 2>/dev/null; then pass "$3" else fail "$3" "pattern '$1' not found in $2" fi } summary() { cleanup_tmpdir _total=$((_pass + _fail)) echo "" printf "%s: %d passed, %d failed (of %d)\n" "$_test_name" "$_pass" "$_fail" "$_total" if [ "$_fail" -gt 0 ]; then exit 1 fi exit 0 }