[Tests] nvm_print_color_legend: fix the fast suite on GNU userlands

The `nvm unload` assertion failed every `fast` job on Linux
while passing on macOS,
and its shape made the cause impossible to read off the failure.
`set -e` aborts the command substitution
when `nvm unload` returns non-zero,
which leaves an empty string
that the assertion then reports as
"unload left nvm_print_color_legend defined".
Run the unload with `set +e` inside the subshell
and report its exit status next to the lookup,
so a failing unload can no longer be misread
as a function that survived it.

The accompanying `sed: couldn't flush stdout: Broken pipe`
came from the `grep -q` pipelines:
`grep -q` exits at its first match
and hands SIGPIPE to the `sed` feeding it,
which BSD sed swallows and GNU sed reports.
Match whole lines with `case` against the already-captured string instead,
which needs no pipe at all,
and capture `nvm --help` before stripping it
rather than piping it through two processes into `grep -q`.

Test stderr is now empty in sh, bash, dash, and zsh.
This commit is contained in:
Jordan Harband
2026-09-03 11:54:45 -07:00
parent ab83657ba6
commit 17f12a1207
+40 -8
View File
@@ -12,6 +12,21 @@ ESC="$(printf '\033')"
# escapes removed. That keeps these checks about structure and alignment only.
strip_colors() { command sed "s/${ESC}\[[0-9;]*m//g"; }
# Exact whole-line match against an already-captured string. Deliberately
# pipe-free: `grep -q` exits at its first match and hands SIGPIPE to whatever
# feeds it, which BSD sed swallows but GNU sed reports as "couldn't flush
# stdout", polluting the test's stderr.
contains_line () {
case "
${2}
" in
*"
${1}
"*) return 0 ;;
esac
return 1
}
command -v nvm_print_color_legend >/dev/null 2>&1 \
|| die 'nvm_print_color_legend is not defined'
@@ -24,13 +39,13 @@ PLAIN="$(nvm_echo "${OUTPUT}" | strip_colors)"
# the two labels are literal, and their indentation lines the legend up under
# the `nvm set-colors` entry in the help output
nvm_echo "${PLAIN}" | nvm_grep -qx ' Initial colors are:' \
contains_line ' Initial colors are:' "${PLAIN}" \
|| die "the 'Initial colors are:' label is missing or misaligned: ${PLAIN}"
nvm_echo "${PLAIN}" | nvm_grep -qx ' Color codes:' \
contains_line ' Color codes:' "${PLAIN}" \
|| die "the 'Color codes:' label is missing or misaligned: ${PLAIN}"
# the default-palette sample, indented one level deeper than its label
nvm_echo "${PLAIN}" | nvm_grep -qx ' bygre' \
contains_line ' bygre' "${PLAIN}" \
|| die "the initial-colors sample is missing or misaligned: ${PLAIN}"
# all eight rows of the code table, in order, each with both letter forms
@@ -44,16 +59,33 @@ for ROW in \
'k/K = black / bold black' \
'e/W = light grey / white' \
; do
nvm_echo "${PLAIN}" | nvm_grep -qx " ${ROW}" \
contains_line " ${ROW}" "${PLAIN}" \
|| die "color code row '${ROW}' is missing or misaligned: ${PLAIN}"
done
# the extracted function has to stay wired into the help output
nvm --help | strip_colors | nvm_grep -qx ' Color codes:' \
HELP_PLAIN="$(nvm --help | strip_colors)"
contains_line ' Color codes:' "${HELP_PLAIN}" \
|| die 'nvm --help no longer includes the color legend'
# and `nvm unload` has to clean it up, the way it does its sibling helpers
UNLOADED="$( (nvm unload >/dev/null 2>&1; command -v nvm_print_color_legend >/dev/null 2>&1 && echo present || echo gone) )"
[ "${UNLOADED}" = 'gone' ] || die 'nvm unload left nvm_print_color_legend defined'
# And `nvm unload` has to clean it up, the way it does its sibling helpers.
# `set +e` inside the subshell so a non-zero `nvm unload` cannot abort it before
# the lookup runs; its status is reported separately, so "unload failed" can
# never be misreported as "the function survived".
UNLOAD_OUT="$(
set +e
nvm unload >/dev/null 2>&1
# plain `echo`: `nvm unload` has just unset `nvm_echo`
echo "unload_rc=$?"
if command -v nvm_print_color_legend >/dev/null 2>&1; then
echo present
else
echo gone
fi
)"
case "${UNLOAD_OUT}" in
*gone*) : ;;
*) die "nvm unload did not remove nvm_print_color_legend (${UNLOAD_OUT})" ;;
esac
echo "nvm_print_color_legend: passed"