继续按 align-linuxcnc 约束:补块读取 native 覆盖,测试通过

结论:补齐 LinuxCNC interp_read.cc read_items()/read_one_item() 坏字符路径,以及 interp_check.cc check_m_codes() M 码数量错误的 native 校验;./test-native.sh 与 ./test-linuxcnc-source-link.sh 均通过,未扩展 smoke。
This commit is contained in:
cnc
2026-06-03 00:01:25 +08:00
parent 4e3df07b8a
commit 28aa1956b7
2 changed files with 44 additions and 1 deletions

View File

@@ -250,6 +250,49 @@ for case in "${gm_reader_error_cases[@]}"; do
grep -Fq "$expected" "$output_dir/cnc_sim_linuxcnc_$fixture.err"
done
# Source basis: LinuxCNC src/emc/rs274ngc/interp_read.cc
# read_items() only consumes a leading N word before item dispatch;
# read_one_item() then uses the default reader table from interp_array.cc
# and rejects unknown item-start characters, including middle-of-line or
# comment-prefixed N/O words, midline O-words, bracket expressions, naked
# numbers, and non-leading ATAN argument slashes.
bad_character_error_cases=(
"linuxcnc_bad_character_bang_error|Bad character '!' used"
"linuxcnc_bad_character_middle_n_word_error|Bad character 'n' used"
"linuxcnc_comment_prefixed_n_word_error|Bad character 'n' used"
"linuxcnc_comment_prefixed_spaced_n_word_error|Bad character 'n' used"
"linuxcnc_comment_prefixed_oword_error|Bad character 'o' used"
"linuxcnc_midline_numeric_oword_error|Bad character 'o' used"
"linuxcnc_midline_named_oword_error|Bad character 'o' used"
"linuxcnc_bad_character_top_left_bracket_error|Bad character '[' used"
"linuxcnc_bad_character_top_right_bracket_error|Bad character ']' used"
"linuxcnc_bad_character_midline_left_bracket_error|Bad character '[' used"
"linuxcnc_bad_character_midline_right_bracket_error|Bad character ']' used"
"linuxcnc_bad_character_top_number_error|Bad character '1' used"
"linuxcnc_top_level_bare_atan_error|Bad character '/' used"
"linuxcnc_midline_bare_atan_error|Bad character '/' used"
)
for case in "${bad_character_error_cases[@]}"; do
fixture=${case%%|*}
expected=${case#*|}
if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
"$build_dir/linuxcnc_rs274_dump" "tests/gcode/$fixture.ngc" \
>"$output_dir/cnc_sim_linuxcnc_$fixture.json" 2>"$output_dir/cnc_sim_linuxcnc_$fixture.err"; then
echo "expected $fixture.ngc to fail" >&2
exit 1
fi
grep -Fq "$expected" "$output_dir/cnc_sim_linuxcnc_$fixture.err"
done
# Source basis: LinuxCNC src/emc/rs274ngc/interp_check.cc
# check_m_codes() rejects blocks with more than MAX_EMS M-codes.
if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
"$build_dir/linuxcnc_rs274_dump" tests/gcode/linuxcnc_too_many_m_codes_error.ngc \
>"$output_dir/cnc_sim_linuxcnc_too_many_m_codes_error.json" 2>"$output_dir/cnc_sim_linuxcnc_too_many_m_codes_error.err"; then
echo "expected linuxcnc_too_many_m_codes_error.ngc to fail" >&2
exit 1
fi
grep -Fq "Too many m codes on line" \
"$output_dir/cnc_sim_linuxcnc_too_many_m_codes_error.err"
# Source basis: LinuxCNC src/emc/rs274ngc/interp_read.cc
# read_f()/read_g()/read_h()/read_l()/read_m()/read_s()/read_t()
# reject negative word values before command execution.
negative_word_error_cases=(