You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nudt-compiler-cpp/scripts/test_lab2_sema.sh

93 lines
2.0 KiB

#!/usr/bin/env bash
set -euo pipefail
mode="${1:-positive}"
log_dir="${2:-test/test_result/lab2_sema_logs}"
checker="./build-sema/sema_check"
if [[ ! -x "$checker" ]]; then
echo "未找到语义测试驱动: $checker" >&2
echo "请先准备 build-sema/sema_check。" >&2
exit 1
fi
mkdir -p "$log_dir"
case_files=()
expected_prefix=""
case "$mode" in
positive)
expected_prefix="OK"
case_files=(
"test/test_case/functional/simple_add.sy"
"test/test_case/functional/09_func_defn.sy"
"test/test_case/functional/25_scope3.sy"
"test/test_case/functional/29_break.sy"
"test/test_case/functional/05_arr_defn4.sy"
"test/test_case/functional/95_float.sy"
)
;;
negative)
expected_prefix="ERR"
case_files=(
"test/test_case/sema_negative/undef.sy"
"test/test_case/sema_negative/break.sy"
"test/test_case/sema_negative/ret.sy"
"test/test_case/sema_negative/call.sy"
)
;;
*)
echo "用法: $0 [positive|negative] [log_dir]" >&2
exit 1
;;
esac
if [[ ${#case_files[@]} -eq 0 ]]; then
echo "没有可执行的测试用例" >&2
exit 1
fi
for f in "${case_files[@]}"; do
if [[ ! -f "$f" ]]; then
echo "测试文件不存在: $f" >&2
exit 1
fi
done
all_ok=true
for f in "${case_files[@]}"; do
base="$(basename "${f%.sy}")"
log_file="$log_dir/${base}.sema.log"
echo "TEST $f -> $log_file"
set +e
"$checker" "$f" >"$log_file" 2>&1
status=$?
set -e
if ! grep -q "^${expected_prefix} $f$" "$log_file"; then
echo "FAIL $f (see $log_file)" >&2
all_ok=false
continue
fi
if [[ "$mode" == "positive" && $status -ne 0 ]]; then
echo "FAIL $f (expected success, see $log_file)" >&2
all_ok=false
continue
fi
if [[ "$mode" == "negative" && $status -eq 0 ]]; then
echo "FAIL $f (expected semantic error, see $log_file)" >&2
all_ok=false
continue
fi
done
if [[ "$all_ok" != true ]]; then
exit 1
fi
echo "ALL_SEMA_${mode^^}_OK (${#case_files[@]} cases) logs: $log_dir"