继续按 align-linuxcnc 约束:补参数表达式 native 覆盖,测试通过

结论:补齐 LinuxCNC interp_read.cc 参数读写、ATAN/unary/binary 表达式错误路径,以及 interp_execute.cc sqrt/divide/power 执行错误的 native 校验;./test-native.sh 与 ./test-linuxcnc-source-link.sh 均通过,未扩展 smoke。
This commit is contained in:
cnc
2026-06-02 23:56:34 +08:00
parent b7610d1b96
commit 4e3df07b8a
2 changed files with 120 additions and 1 deletions

View File

@@ -543,6 +543,125 @@ INI_FILE_NAME="$ini_named_parameter_file" CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS27
# Source basis: LinuxCNC src/emc/rs274ngc/interp_namedparams.cc lookup_named_param()
# and init_readonly_param() expose modal/unit/feed/spindle readonly parameters.
CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" "$build_dir/linuxcnc_rs274_dump" tests/gcode/linuxcnc_readonly_named_parameters.ngc >"$output_dir/cnc_sim_linuxcnc_readonly_named_parameters.json"
# Source basis: LinuxCNC src/emc/rs274ngc/interp_read.cc
# read_parameter_setting(), read_parameter(), read_real_value(),
# read_atan(), read_unary(), and read_operation() reject malformed
# parameter assignments, references, unary calls, and binary expressions.
CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" "$build_dir/linuxcnc_rs274_dump" tests/gcode/linuxcnc_parameter_expression_assignment.ngc >"$output_dir/cnc_sim_linuxcnc_parameter_expression_assignment.json"
CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" "$build_dir/linuxcnc_rs274_dump" tests/gcode/linuxcnc_expression_operators.ngc >"$output_dir/cnc_sim_linuxcnc_expression_operators.json"
if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
"$build_dir/linuxcnc_rs274_dump" tests/gcode/linuxcnc_readonly_named_parameter_assign_error.ngc \
>"$output_dir/cnc_sim_linuxcnc_readonly_named_parameter_assign_error.json" 2>"$output_dir/cnc_sim_linuxcnc_readonly_named_parameter_assign_error.err"; then
echo "expected linuxcnc_readonly_named_parameter_assign_error.ngc to fail" >&2
exit 1
fi
grep -Fq "Cannot assign to read-only parameter #<_line>" \
"$output_dir/cnc_sim_linuxcnc_readonly_named_parameter_assign_error.err"
parameter_setting_error_cases=(
"linuxcnc_parameter_missing_equal_error|Equal sign missing in parameter setting"
"linuxcnc_midline_parameter_missing_equal_error|Equal sign missing in parameter setting"
"linuxcnc_parameter_missing_value_error|No characters found in reading real value"
)
for case in "${parameter_setting_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
parameter_reader_error_cases=(
"linuxcnc_parameter_number_out_of_range_error|Parameter number out of range"
"linuxcnc_parameter_reference_out_of_range_error|Parameter number out of range"
"linuxcnc_non_integer_parameter_index_error|Non integer value for integer"
"linuxcnc_named_parameter_not_terminated_error|Named parameter not terminated"
"linuxcnc_no_real_value_error|No characters found in reading real value"
"linuxcnc_bad_number_format_error|bad number format (conversion failed) parsing '+'"
)
for case in "${parameter_reader_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_execute.cc
# execute_unary() and execute_binary1() reject invalid sqrt, divide, and
# power expression operators during read_real_expression().
expression_execute_error_cases=(
"linuxcnc_negative_sqrt_error|Negative argument to sqrt"
"linuxcnc_infinite_expression_error|Calculation resulted in 'infinity'"
"linuxcnc_divide_by_zero_error|Attempt to divide by zero"
"linuxcnc_negative_power_error|Attempt to raise negative to non integer power"
)
for case in "${expression_execute_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
atan_unary_error_cases=(
"linuxcnc_atan_missing_slash_error|Slash missing after first atan argument"
"linuxcnc_atan_missing_bracket_error|Left bracket missing after slash with atan"
"linuxcnc_unary_missing_bracket_error|Left bracket missing after unary operation name"
"linuxcnc_unary_unknown_word_error|Unknown word starting with a"
"linuxcnc_unary_unknown_c_word_error|Unknown word starting with c"
"linuxcnc_unary_unknown_e_word_error|Unknown word starting with e"
"linuxcnc_unary_unknown_f_word_error|Unknown word starting with f"
"linuxcnc_unary_unknown_l_word_error|Unknown word starting with l"
"linuxcnc_unary_unknown_r_word_error|Unknown word starting with r"
"linuxcnc_unary_unknown_s_word_error|Unknown word starting with s"
"linuxcnc_unary_unknown_t_word_error|Unknown word starting with t"
"linuxcnc_unary_unknown_default_word_error|Unknown word where unary operation could be"
"linuxcnc_top_level_bare_unary_error|Unknown word where unary operation could be"
"linuxcnc_midline_bare_unary_error|Unknown word where unary operation could be"
)
for case in "${atan_unary_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
binary_operation_error_cases=(
"linuxcnc_binary_unknown_a_operation_error|Unknown operation name starting with a"
"linuxcnc_binary_unknown_e_operation_error|Unknown operation name starting with e"
"linuxcnc_binary_unknown_g_operation_error|Unknown operation name starting with g"
"linuxcnc_binary_unknown_l_operation_error|Unknown operation name starting with l"
"linuxcnc_binary_unknown_m_operation_error|Unknown operation name starting with m"
"linuxcnc_binary_unknown_n_operation_error|Unknown operation name starting with n"
"linuxcnc_binary_unknown_o_operation_error|Unknown operation name starting with o"
"linuxcnc_binary_unknown_x_operation_error|Unknown operation name starting with x"
"linuxcnc_binary_unknown_operation_error|Unknown operation"
"linuxcnc_unclosed_expression_error|Unclosed expression"
)
for case in "${binary_operation_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
cp "$base_var_file" "$var_file"
CNC_SIM_RS274_VAR="$var_file" "$build_dir/linuxcnc_rs274_dump" tests/gcode/linuxcnc_coordinate_offsets.ngc >"$output_dir/cnc_sim_linuxcnc_coordinate_offsets.json"
cp "$base_var_file" "$var_file"