继续按 align-linuxcnc 约束:补 unary 和参数读取源码错误覆盖
结论:覆盖 LinuxCNC interp_read.cc 中 read_operation_unary() 未知词分支、read_parameter_setting() 缺少等号和 read_real_value() 空值错误;未扩展 smoke。 验证:./test-linuxcnc-source-link.sh;./test-native.sh。
This commit is contained in:
@@ -212,7 +212,7 @@ This matrix tracks LinuxCNC feature coverage for the web/WASM simulator. A featu
|
||||
| Cutter compensation | covered for tool-table `G41/G42 D...` and explicit-radius `G41.1/G42.1/G40` through LinuxCNC native/source backends | `tests/gcode/linuxcnc_cutter_comp.ngc` |
|
||||
| Probe moves `G38.2/G38.3/G38.4/G38.5` | covered as distinct probe events with LinuxCNC `probe_type` preserved through smoke, native, and source-linked paths | `tests/gcode/linuxcnc_probe_no_error.ngc` |
|
||||
| O-word subroutines, calls, and control flow | covered for numeric and named `O... sub/call/return/endsub` plus `if`/`elseif`/`else`, `while`, `repeat`, `do`/`while`, `break`, and `continue` through LinuxCNC file mode; smoke parser also covers named `O<name>` sub/call/return/endsub and loop-control forms | `tests/gcode/smoke_oword_subprogram.ngc`, `tests/gcode/linuxcnc_named_oword_subprogram.ngc`, `tests/gcode/linuxcnc_oword_control_flow.ngc` |
|
||||
| Parameter expressions and operators | covered for parameter references, source-linked `mod`, `**`, logical, and relational operator precedence, plus LinuxCNC divide-by-zero, negative-power, malformed `ATAN[]/[]`, unary operation, `read_operation()` binary-operation prefix, unknown operation, and unclosed-expression error paths from `interp_read.cc`/`interp_execute.cc` | `tests/gcode/linuxcnc_parameter_expression_assignment.ngc`, `tests/gcode/linuxcnc_expression_operators.ngc`, `tests/gcode/linuxcnc_divide_by_zero_error.ngc`, `tests/gcode/linuxcnc_negative_power_error.ngc`, `tests/gcode/linuxcnc_atan_missing_slash_error.ngc`, `tests/gcode/linuxcnc_atan_missing_bracket_error.ngc`, `tests/gcode/linuxcnc_unary_missing_bracket_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_word_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_a_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_e_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_g_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_l_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_m_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_n_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_o_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_x_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_operation_error.ngc`, `tests/gcode/linuxcnc_unclosed_expression_error.ngc` |
|
||||
| Parameter expressions and operators | covered for parameter references, source-linked `mod`, `**`, logical, and relational operator precedence, plus LinuxCNC parameter-setting syntax, divide-by-zero, negative-power, malformed `ATAN[]/[]`, unary operation syntax, `read_operation_unary()` unknown-word branches, `read_operation()` binary-operation prefix, unknown operation, and unclosed-expression error paths from `interp_read.cc`/`interp_execute.cc` | `tests/gcode/linuxcnc_parameter_expression_assignment.ngc`, `tests/gcode/linuxcnc_parameter_missing_equal_error.ngc`, `tests/gcode/linuxcnc_parameter_missing_value_error.ngc`, `tests/gcode/linuxcnc_expression_operators.ngc`, `tests/gcode/linuxcnc_divide_by_zero_error.ngc`, `tests/gcode/linuxcnc_negative_power_error.ngc`, `tests/gcode/linuxcnc_atan_missing_slash_error.ngc`, `tests/gcode/linuxcnc_atan_missing_bracket_error.ngc`, `tests/gcode/linuxcnc_unary_missing_bracket_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_c_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_e_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_f_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_l_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_r_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_s_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_t_word_error.ngc`, `tests/gcode/linuxcnc_unary_unknown_default_word_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_a_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_e_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_g_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_l_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_m_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_n_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_o_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_x_operation_error.ngc`, `tests/gcode/linuxcnc_binary_unknown_operation_error.ngc`, `tests/gcode/linuxcnc_unclosed_expression_error.ngc` |
|
||||
| Word reader validation | source-linked LinuxCNC reader errors covered for negative `F/G/H/L/M/S/T` values and repeated `F/H/L/S/T/X/Y/Z` words from `interp_read.cc` | `tests/gcode/linuxcnc_negative_f_word_error.ngc`, `tests/gcode/linuxcnc_negative_g_code_error.ngc`, `tests/gcode/linuxcnc_negative_h_word_error.ngc`, `tests/gcode/linuxcnc_negative_l_word_error.ngc`, `tests/gcode/linuxcnc_negative_m_code_error.ngc`, `tests/gcode/linuxcnc_negative_s_word_error.ngc`, `tests/gcode/linuxcnc_negative_t_word_error.ngc`, `tests/gcode/linuxcnc_multiple_f_words_error.ngc`, `tests/gcode/linuxcnc_multiple_h_words_error.ngc`, `tests/gcode/linuxcnc_multiple_l_words_error.ngc`, `tests/gcode/linuxcnc_multiple_s_words_error.ngc`, `tests/gcode/linuxcnc_multiple_t_words_error.ngc`, `tests/gcode/linuxcnc_multiple_x_words_error.ngc`, `tests/gcode/linuxcnc_multiple_y_words_error.ngc`, `tests/gcode/linuxcnc_multiple_z_words_error.ngc` |
|
||||
| Broader canned cycles `G73`, `G74`, `G82`-`G89` | partially covered: `G73`, `G74`, `G82`, `G83`, `G84`, `G85`, `G86`, `G87`, `G88`, `G89`; smoke parser maps supported cycles across `G17/G18/G19`, including LinuxCNC's special non-XY `G74/G84` tapping argument order and `G87` plane-specific `I/J/K` mapping; native/source regressions now check non-XY `G74/G84/G86/G87/G88` sequences | `tests/gcode/linuxcnc_canned_cycles_extended.ngc`, `tests/gcode/linuxcnc_canned_cycle_planes.ngc`, smoke API regression |
|
||||
| Full source-level wasm build | covered for the current wasm-safe RS274 source set, with remaining work focused on broadening browser-hostile dependency replacement and feature coverage | `./build-wasm.sh`, `test-linuxcnc-wasm-runtime-link.sh`, `test-web-wasm-node-smoke.sh`, `test-web-wasm-browser-smoke.sh` |
|
||||
|
||||
@@ -559,6 +559,24 @@ if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
|
||||
echo "expected linuxcnc_readonly_named_parameter_assign_error.ngc to fail" >&2
|
||||
exit 1
|
||||
fi
|
||||
# Source basis: LinuxCNC src/emc/rs274ngc/interp_read.cc
|
||||
# read_parameter_setting() requires '=' after the parameter index, and
|
||||
# read_real_value() requires a real value after '='.
|
||||
parameter_setting_error_cases=(
|
||||
"linuxcnc_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_source_dump" "tests/gcode/$fixture.ngc" \
|
||||
>"$output_dir/cnc_sim_linuxcnc_source_$fixture.json" 2>"$output_dir/cnc_sim_linuxcnc_source_$fixture.err"; then
|
||||
echo "expected $fixture.ngc to fail" >&2
|
||||
exit 1
|
||||
fi
|
||||
grep -q "$expected" "$output_dir/cnc_sim_linuxcnc_source_$fixture.err"
|
||||
done
|
||||
if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
|
||||
"$build_dir/linuxcnc_rs274_source_dump" tests/gcode/linuxcnc_negative_sqrt_error.ngc \
|
||||
>"$output_dir/cnc_sim_linuxcnc_source_negative_sqrt_error.json" 2>"$output_dir/cnc_sim_linuxcnc_source_negative_sqrt_error.err"; then
|
||||
@@ -619,14 +637,28 @@ if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
|
||||
fi
|
||||
grep -q "Left bracket missing after unary operation name" \
|
||||
"$output_dir/cnc_sim_linuxcnc_source_unary_missing_bracket_error.err"
|
||||
if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
|
||||
"$build_dir/linuxcnc_rs274_source_dump" tests/gcode/linuxcnc_unary_unknown_word_error.ngc \
|
||||
>"$output_dir/cnc_sim_linuxcnc_source_unary_unknown_word_error.json" 2>"$output_dir/cnc_sim_linuxcnc_source_unary_unknown_word_error.err"; then
|
||||
echo "expected linuxcnc_unary_unknown_word_error.ngc to fail" >&2
|
||||
unary_unknown_word_error_cases=(
|
||||
"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"
|
||||
)
|
||||
for case in "${unary_unknown_word_error_cases[@]}"; do
|
||||
fixture=${case%%|*}
|
||||
expected=${case#*|}
|
||||
if CNC_SIM_RS274_FILE_MODE=1 CNC_SIM_RS274_VAR="$var_file" \
|
||||
"$build_dir/linuxcnc_rs274_source_dump" "tests/gcode/$fixture.ngc" \
|
||||
>"$output_dir/cnc_sim_linuxcnc_source_$fixture.json" 2>"$output_dir/cnc_sim_linuxcnc_source_$fixture.err"; then
|
||||
echo "expected $fixture.ngc to fail" >&2
|
||||
exit 1
|
||||
fi
|
||||
grep -q "Unknown word starting with a" \
|
||||
"$output_dir/cnc_sim_linuxcnc_source_unary_unknown_word_error.err"
|
||||
fi
|
||||
grep -q "$expected" "$output_dir/cnc_sim_linuxcnc_source_$fixture.err"
|
||||
done
|
||||
# Source basis: LinuxCNC src/emc/rs274ngc/interp_read.cc
|
||||
# read_operation() rejects unknown binary operation names by prefix,
|
||||
# unknown operation characters, and expressions that reach end-of-line
|
||||
|
||||
1
tests/gcode/linuxcnc_parameter_missing_equal_error.ngc
Normal file
1
tests/gcode/linuxcnc_parameter_missing_equal_error.ngc
Normal file
@@ -0,0 +1 @@
|
||||
#1
|
||||
1
tests/gcode/linuxcnc_parameter_missing_value_error.ngc
Normal file
1
tests/gcode/linuxcnc_parameter_missing_value_error.ngc
Normal file
@@ -0,0 +1 @@
|
||||
#1 =
|
||||
2
tests/gcode/linuxcnc_unary_unknown_c_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_c_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = CZZ[1]
|
||||
G1 X#1 F100
|
||||
@@ -0,0 +1,2 @@
|
||||
#1 = BZZ[1]
|
||||
G1 X#1 F100
|
||||
2
tests/gcode/linuxcnc_unary_unknown_e_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_e_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = EZZ[1]
|
||||
G1 X#1 F100
|
||||
2
tests/gcode/linuxcnc_unary_unknown_f_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_f_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = FZZ[1]
|
||||
G1 X#1 F100
|
||||
2
tests/gcode/linuxcnc_unary_unknown_l_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_l_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = LZZ[1]
|
||||
G1 X#1 F100
|
||||
2
tests/gcode/linuxcnc_unary_unknown_r_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_r_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = RZZ[1]
|
||||
G1 X#1 F100
|
||||
2
tests/gcode/linuxcnc_unary_unknown_s_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_s_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = SZZ[1]
|
||||
G1 X#1 F100
|
||||
2
tests/gcode/linuxcnc_unary_unknown_t_word_error.ngc
Normal file
2
tests/gcode/linuxcnc_unary_unknown_t_word_error.ngc
Normal file
@@ -0,0 +1,2 @@
|
||||
#1 = TZZ[1]
|
||||
G1 X#1 F100
|
||||
Reference in New Issue
Block a user