Files
five/tests/std_ch/run.sh
CharlesKWON 412351b67d feat(rtl): LIST/DISPLAY TO FILE — text output redirection
Wire up TO FILE for both LIST and DISPLAY: __dbList grows a 9th
parameter cFile, opens it (truncating any prior content) when non-
empty, and writes the formatted rows there via fmt.Fprintln. Default
behavior (no TO FILE) still goes to stdout.

std.ch gets two new rules placed *before* the regular LIST/DISPLAY
patterns so they win when TO FILE is present:

  LIST    [<v,...>] TO FILE <(f)> [OFF] [FOR] [WHILE] [NEXT] ...
  DISPLAY [<v,...>] TO FILE <(f)> [OFF] [FOR] [WHILE] [NEXT] ...

Open failure raises a clear *HbError ("LIST/DISPLAY TO FILE: cannot
create <path> — <syscall reason>") so callers know exactly what went
wrong instead of getting partial-or-empty output.

TO PRINTER stays rejected via __dbNotImpl — Five doesn't drive a
printer port. Test coverage: tests/std_ch/test_list_to_file.prg
exercises four shapes (full LIST, single-row DISPLAY, OFF + FOR with
explicit fields, and confirms TO PRINTER still raises). Wired into
the std.ch runner so the regression suite now stands at 14/14.

Gates green:
  go test ./...      : PASS
  FiveSql2 SQL:1999  : 43/43
  Harbour compat     : 56/56
  std.ch suite       : 14/14

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-01 08:15:32 +09:00

73 lines
1.8 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# std.ch regression runner. Build each PRG against the current Five
# compiler (caller's PWD must be the repo root) and execute it; non-zero
# exit or "FAIL"/"NOT REJECTED" in stdout marks the run as failed.
#
# This deliberately runs in a temp scratch directory so the DBF/NTX
# artifacts don't collide with each other across tests.
set -e
ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
FIVE="$ROOT/five"
if [ ! -x "$FIVE" ]; then
echo "five binary not found at $FIVE — run 'go build -o five ./cmd/five' first" >&2
exit 2
fi
TESTS=(
test_pp_stdch
test_count
test_sum_avg
test_sum_multi
test_copy
test_sort
test_list
test_list_to_file
test_total
test_join
test_update
test_set_deleted
test_unsupported
test_block_comma
)
work="$(mktemp -d)"
trap 'rm -rf "$work"' EXIT
pass=0
fail=0
for name in "${TESTS[@]}"; do
src="$ROOT/tests/std_ch/${name}.prg"
bin="$work/${name}"
if ! "$FIVE" build "$src" -o "$bin" >/dev/null 2>"$work/${name}.err"; then
echo "FAIL build $name"
cat "$work/${name}.err" | sed 's/^/ /'
fail=$((fail+1))
continue
fi
pushd "$work" >/dev/null
if ! out="$("$bin" 2>&1)"; then
echo "FAIL run $name"
echo "$out" | sed 's/^/ /'
fail=$((fail+1))
popd >/dev/null
continue
fi
popd >/dev/null
if echo "$out" | grep -qE 'FAIL|NOT REJECTED|expect.*got'; then
echo "FAIL assert $name"
echo "$out" | sed 's/^/ /'
fail=$((fail+1))
continue
fi
echo "PASS $name"
pass=$((pass+1))
done
echo
echo "================================================================"
echo " Results: $pass / $((pass+fail)) passed"
echo "================================================================"
[ $fail -eq 0 ]