diff --git a/tests/README.md b/tests/README.md index b2baafb..55fff8a 100644 --- a/tests/README.md +++ b/tests/README.md @@ -30,9 +30,11 @@ need not match the order in `$region_highlight`. 4. Normally, tests fail if `$expected_region_highlight` and `$region_highlight` -have different numbers of elements. Tests may set `$expected_mismatch` to an -explanation string (like `$todo`) to avoid this and skip the cardinality check. -`$expected_mismatch` is set implicitly if the `$todo` component is present. +have different numbers of elements. To mark this check as expected to fail, +tests may set `$expected_mismatch` to an explanation string (like `$todo`); +this is useful when the only difference between actual and expected is that actual +has some additional, superfluous elements. This check is skipped if the +`$todo` component is present in any regular test point. **Note**: `$region_highlight` uses the same `"$i $j $style"` syntax but interprets the indexes differently. diff --git a/tests/test-highlighting.zsh b/tests/test-highlighting.zsh index ba508ac..9742612 100755 --- a/tests/test-highlighting.zsh +++ b/tests/test-highlighting.zsh @@ -120,6 +120,7 @@ run_test_internal() { # Load the data and prepare checking it. local BUFFER CURSOR MARK PENDING PREBUFFER REGION_ACTIVE WIDGET REPLY skip_test unsorted=0 local expected_mismatch + local skip_mismatch local -a expected_region_highlight region_highlight . "$srcdir"/"$1" @@ -155,11 +156,11 @@ run_test_internal() { local todo= if (( $+expected_highlight_zone[4] )); then todo="# TODO $expected_highlight_zone[4]" - : ${expected_mismatch:="cardinality check disabled whilst regular test points are expected to fail"} + skip_mismatch="cardinality check disabled whilst regular test points are expected to fail" fi if ! (( $+region_highlight[i] )); then print -r -- "not ok $i - unmatched expectation ($exp_start $exp_end $expected_highlight_zone[3])" \ - "${expected_mismatch:+"# TODO ${(qqq)expected_mismatch}"}" + "${skip_mismatch:+"# TODO ${(qqq)skip_mismatch}"}" continue fi local -a highlight_zone; highlight_zone=( ${(z)region_highlight[i]} ) @@ -183,18 +184,27 @@ run_test_internal() { unset desc done - if [[ -n $expected_mismatch ]]; then - tap_escape $expected_mismatch; expected_mismatch=$REPLY - print "ok $i - cardinality check" "# SKIP $expected_mismatch" + # If both $skip_mismatch and $expected_mismatch are set, that means the test + # has some XFail test points, _and_ explicitly sets $expected_mismatch as + # well. Explicit settings should have priority, so we ignore $skip_mismatch + # if $expected_mismatch is set. + if [[ -n $skip_mismatch && -z $expected_mismatch ]]; then + tap_escape $skip_mismatch; skip_mismatch=$REPLY + print "ok $i - cardinality check" "# SKIP $skip_mismatch" else + local todo + if [[ -n $expected_mismatch ]]; then + tap_escape $expected_mismatch; expected_mismatch=$REPLY + todo="# TODO $expected_mismatch" + fi if (( $#expected_region_highlight == $#region_highlight )); then - print -r -- "ok $i - cardinality check" + print -r -- "ok $i - cardinality check${todo:+ - }$todo" else local details details+="have $#expected_region_highlight expectations and $#region_highlight region_highlight entries: " details+="«$(typeset_p expected_region_highlight)» «$(typeset_p region_highlight)»" tap_escape $details; details=$REPLY - print -r -- "not ok $i - cardinality check - $details" + print -r -- "not ok $i - cardinality check - $details${todo:+ - }$todo" fi fi }