From 1d59e9e2566f69d76a162bd22cce00e39536b2f1 Mon Sep 17 00:00:00 2001 From: Lixuanwang Date: Tue, 19 Aug 2025 08:29:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=84=9A=E6=9C=AC=EF=BC=8C?= =?UTF-8?q?=E5=A2=9E=E5=BC=BA=E8=BE=93=E5=87=BA=E6=88=AA=E6=96=AD=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/runit-single.sh | 31 ++++++++++++++++++++++--------- script/runit.sh | 33 ++++++++++++++++++++++----------- 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/script/runit-single.sh b/script/runit-single.sh index bfbbcdc..786986f 100644 --- a/script/runit-single.sh +++ b/script/runit-single.sh @@ -20,18 +20,19 @@ QEMU_RISCV64="qemu-riscv64" # --- 初始化变量 --- EXECUTE_MODE=false -IR_EXECUTE_MODE=false # 新增 +IR_EXECUTE_MODE=false CLEAN_MODE=false OPTIMIZE_FLAG="" SYSYC_TIMEOUT=30 -LLC_TIMEOUT=10 # 新增 +LLC_TIMEOUT=10 GCC_TIMEOUT=10 EXEC_TIMEOUT=30 MAX_OUTPUT_LINES=20 +MAX_OUTPUT_CHARS=1000 SY_FILES=() PASSED_CASES=0 FAILED_CASES_LIST="" -INTERRUPTED=false # 新增 +INTERRUPTED=false # ================================================================= # --- 函数定义 --- @@ -50,22 +51,31 @@ show_help() { echo " -gct N 设置 gcc 交叉编译超时为 N 秒 (默认: 10)。" echo " -et N 设置 qemu 自动化执行超时为 N 秒 (默认: 30)。" echo " -ml N, --max-lines N 当输出对比失败时,最多显示 N 行内容 (默认: 20)。" + echo " -mc N, --max-chars N 当输出对比失败时,最多显示 N 个字符 (默认: 1000)。" echo " -h, --help 显示此帮助信息并退出。" echo "" echo "可在任何时候按 Ctrl+C 来中断测试并显示当前已完成的测例总结。" } +# 显示文件内容并根据行数和字符数截断的函数 display_file_content() { local file_path="$1" local title="$2" local max_lines="$3" + local max_chars="$4" # 新增参数 if [ ! -f "$file_path" ]; then return; fi echo -e "$title" local line_count + local char_count line_count=$(wc -l < "$file_path") + char_count=$(wc -c < "$file_path") + if [ "$line_count" -gt "$max_lines" ]; then head -n "$max_lines" "$file_path" - echo -e "\e[33m[... 输出已截断,共 ${line_count} 行 ...]\e[0m" + echo -e "\e[33m[... 输出因行数过多 (共 ${line_count} 行) 而截断 ...]\e[0m" + elif [ "$char_count" -gt "$max_chars" ]; then + head -c "$max_chars" "$file_path" + echo -e "\n\e[33m[... 输出因字符数过多 (共 ${char_count} 字符) 而截断 ...]\e[0m" else cat "$file_path" fi @@ -131,6 +141,7 @@ while [[ "$#" -gt 0 ]]; do -gct) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then GCC_TIMEOUT="$2"; shift 2; else echo "错误: -gct 需要一个正整数参数。" >&2; exit 1; fi ;; -et) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then EXEC_TIMEOUT="$2"; shift 2; else echo "错误: -et 需要一个正整数参数。" >&2; exit 1; fi ;; -ml|--max-lines) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then MAX_OUTPUT_LINES="$2"; shift 2; else echo "错误: --max-lines 需要一个正整数参数。" >&2; exit 1; fi ;; + -mc|--max-chars) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then MAX_OUTPUT_CHARS="$2"; shift 2; else echo "错误: --max-chars 需要一个正整数参数。" >&2; exit 1; fi ;; -h|--help) show_help; exit 0 ;; -*) echo "未知选项: $1"; show_help; exit 1 ;; *) @@ -180,6 +191,8 @@ TOTAL_CASES=${#SY_FILES[@]} echo "SysY 单例测试运行器启动..." if [ -n "$OPTIMIZE_FLAG" ]; then echo "优化等级: ${OPTIMIZE_FLAG}"; fi echo "超时设置: sysyc=${SYSYC_TIMEOUT}s, llc=${LLC_TIMEOUT}s, gcc=${GCC_TIMEOUT}s, qemu=${EXEC_TIMEOUT}s" +echo "失败输出最大行数: ${MAX_OUTPUT_LINES}" +echo "失败输出最大字符数: ${MAX_OUTPUT_CHARS}" echo "" for sy_file in "${SY_FILES[@]}"; do @@ -260,8 +273,8 @@ for sy_file in "${SY_FILES[@]}"; do out_ok=1 if ! diff -q <(tr -d '[:space:]' < "${output_actual_file}") <(tr -d '[:space:]' < "${EXPECTED_STDOUT_FILE}") >/dev/null 2>&1; then echo -e "\e[31m 标准输出测试失败。\e[0m"; out_ok=0 - display_file_content "${EXPECTED_STDOUT_FILE}" " \e[36m--- 期望输出 ---\e[0m" "${MAX_OUTPUT_LINES}" - display_file_content "${output_actual_file}" " \e[36m--- 实际输出 ---\e[0m" "${MAX_OUTPUT_LINES}" + display_file_content "${EXPECTED_STDOUT_FILE}" " \e[36m--- 期望输出 ---\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" + display_file_content "${output_actual_file}" " \e[36m--- 实际输出 ---\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" fi if [ "$ret_ok" -eq 1 ] && [ "$out_ok" -eq 1 ]; then echo -e "\e[32m 返回码与标准输出测试成功。\e[0m"; else is_passed=0; fi @@ -271,8 +284,8 @@ for sy_file in "${SY_FILES[@]}"; do echo -e "\e[32m 标准输出测试成功。\e[0m" else echo -e "\e[31m 标准输出测试失败。\e[0m"; is_passed=0 - display_file_content "${output_reference_file}" " \e[36m--- 期望输出 ---\e[0m" "${MAX_OUTPUT_LINES}" - display_file_content "${output_actual_file}" " \e[36m--- 实际输出 ---\e[0m" "${MAX_OUTPUT_LINES}" + display_file_content "${output_reference_file}" " \e[36m--- 期望输出 ---\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" + display_file_content "${output_actual_file}" " \e[36m--- 实际输出 ---\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" fi fi else @@ -301,4 +314,4 @@ for sy_file in "${SY_FILES[@]}"; do done # --- 打印最终总结 --- -print_summary \ No newline at end of file +print_summary diff --git a/script/runit.sh b/script/runit.sh index e27c905..c090415 100644 --- a/script/runit.sh +++ b/script/runit.sh @@ -27,11 +27,12 @@ LLC_TIMEOUT=10 GCC_TIMEOUT=10 EXEC_TIMEOUT=30 MAX_OUTPUT_LINES=20 +MAX_OUTPUT_CHARS=1000 TEST_SETS=() TOTAL_CASES=0 PASSED_CASES=0 FAILED_CASES_LIST="" -INTERRUPTED=false # 新增:用于标记是否被中断 +INTERRUPTED=false # ================================================================= # --- 函数定义 --- @@ -53,6 +54,7 @@ show_help() { echo " -gct N 设置 gcc 交叉编译超时为 N 秒 (默认: 10)。" echo " -et N 设置 qemu 执行超时为 N 秒 (默认: 30)。" echo " -ml N, --max-lines N 当输出对比失败时,最多显示 N 行内容 (默认: 20)。" + echo " -mc N, --max-chars N 当输出对比失败时,最多显示 N 个字符 (默认: 1000)。" echo " -h, --help 显示此帮助信息并退出。" echo "" echo "注意: 默认行为 (无 -e 或 -eir) 是将 .sy 文件同时编译为 .s (汇编) 和 .ll (IR),不执行。" @@ -60,18 +62,25 @@ show_help() { } -# 显示文件内容并根据行数截断的函数 +# 显示文件内容并根据行数和字符数截断的函数 display_file_content() { local file_path="$1" local title="$2" local max_lines="$3" + local max_chars="$4" # 新增参数 if [ ! -f "$file_path" ]; then return; fi echo -e "$title" local line_count + local char_count line_count=$(wc -l < "$file_path") + char_count=$(wc -c < "$file_path") + if [ "$line_count" -gt "$max_lines" ]; then head -n "$max_lines" "$file_path" - echo -e "\e[33m[... 输出已截断,共 ${line_count} 行 ...]\e[0m" + echo -e "\e[33m[... 输出因行数过多 (共 ${line_count} 行) 而截断 ...]\e[0m" + elif [ "$char_count" -gt "$max_chars" ]; then + head -c "$max_chars" "$file_path" + echo -e "\n\e[33m[... 输出因字符数过多 (共 ${char_count} 字符) 而截断 ...]\e[0m" else cat "$file_path" fi @@ -151,6 +160,7 @@ while [[ "$#" -gt 0 ]]; do -gct) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then GCC_TIMEOUT="$2"; shift 2; else echo "错误: -gct 需要一个正整数参数。" >&2; exit 1; fi ;; -et) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then EXEC_TIMEOUT="$2"; shift 2; else echo "错误: -et 需要一个正整数参数。" >&2; exit 1; fi ;; -ml|--max-lines) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then MAX_OUTPUT_LINES="$2"; shift 2; else echo "错误: --max-lines 需要一个正整数参数。" >&2; exit 1; fi ;; + -mc|--max-chars) if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then MAX_OUTPUT_CHARS="$2"; shift 2; else echo "错误: --max-chars 需要一个正整数参数。" >&2; exit 1; fi ;; -h|--help) show_help; exit 0 ;; *) echo "未知选项: $1"; show_help; exit 1 ;; esac @@ -204,6 +214,7 @@ echo "运行模式: ${RUN_MODE_INFO}" echo "${TIMEOUT_INFO}" if ${EXECUTE_MODE} || ${IR_EXECUTE_MODE}; then echo "失败输出最大行数: ${MAX_OUTPUT_LINES}" + echo "失败输出最大字符数: ${MAX_OUTPUT_CHARS}" fi echo "" @@ -298,8 +309,8 @@ while IFS= read -r sy_file; do [ "$test_logic_passed" -eq 1 ] && echo -e "\e[32m 标准输出测试成功\e[0m" else echo -e "\e[31m 标准输出测试失败\e[0m" - display_file_content "${EXPECTED_STDOUT_FILE}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" - display_file_content "${output_actual_file_from_ir}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" + display_file_content "${EXPECTED_STDOUT_FILE}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" + display_file_content "${output_actual_file_from_ir}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" test_logic_passed=0 fi else @@ -308,8 +319,8 @@ while IFS= read -r sy_file; do echo -e "\e[32m 成功: 输出与参考输出匹配\e[0m" else echo -e "\e[31m 失败: 输出不匹配\e[0m" - display_file_content "${output_reference_file}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" - display_file_content "${output_actual_file_from_ir}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" + display_file_content "${output_reference_file}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" + display_file_content "${output_actual_file_from_ir}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" test_logic_passed=0 fi fi @@ -375,8 +386,8 @@ while IFS= read -r sy_file; do [ "$test_logic_passed" -eq 1 ] && echo -e "\e[32m 标准输出测试成功\e[0m" else echo -e "\e[31m 标准输出测试失败\e[0m" - display_file_content "${EXPECTED_STDOUT_FILE}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" - display_file_content "${output_actual_file_S}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" + display_file_content "${EXPECTED_STDOUT_FILE}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" + display_file_content "${output_actual_file_S}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" test_logic_passed=0 fi else @@ -385,8 +396,8 @@ while IFS= read -r sy_file; do echo -e "\e[32m 成功: 输出与参考输出匹配\e[0m" else echo -e "\e[31m 失败: 输出不匹配\e[0m" - display_file_content "${output_reference_file}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" - display_file_content "${output_actual_file_S}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" + display_file_content "${output_reference_file}" " \e[36m---------- 期望输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" + display_file_content "${output_actual_file_S}" " \e[36m---------- 实际输出 ----------\e[0m" "${MAX_OUTPUT_LINES}" "${MAX_OUTPUT_CHARS}" test_logic_passed=0 fi fi