forked from NUDT-compiler/nudt-compiler-cpp
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.
93 lines
2.0 KiB
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"
|