继续按 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:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user