[Tests] aliases: cover the regex-metachar cycle fix; clean up fixtures in teardown

The cycle scenarios all pass with the old grep-based detection too;
the bug the `case`-based detection actually fixes is resolved names interpolated into the grep pattern as regexes,
where resolving axb -> a.b falsely reported ∞ because the pattern `a.b` matches the seen name `axb`.
Pin both directions: the fixed false positive, and a genuine cycle through a metachar name.

Also correct the space-name scenario comment
(the old anchored grep passed that scenario; only token-delimited seen-storage would not),
and register every new fixture name in the suite teardown,
so a mid-test failure can not leak aliases into later tests.
This commit is contained in:
Jordan Harband
2026-07-09 15:58:41 -07:00
parent 0a9dead76d
commit ebada63259
2 changed files with 29 additions and 2 deletions
@@ -38,8 +38,8 @@ EXPECTED='∞'
rm -f '../../../alias/foo bar' '../../../alias/midway' rm -f '../../../alias/foo bar' '../../../alias/midway'
# Non-cycle through an alias name containing a space. # Non-cycle through an alias name containing a space.
# Token-based cycle detection would false-positive on this chain because # Guards the newline-delimited SEEN_ALIASES storage: with space- or
# 'bar' appears as a substring of the multi-token alias name 'foo bar'. # token-delimited storage, seen name 'foo bar' would falsely match 'bar'.
# Resolves: 'foo bar' -> 'midway' -> 'bar' -> 0.0.99 # Resolves: 'foo bar' -> 'midway' -> 'bar' -> 0.0.99
echo 'midway' > '../../../alias/foo bar' echo 'midway' > '../../../alias/foo bar'
echo 'bar' > '../../../alias/midway' echo 'bar' > '../../../alias/midway'
@@ -50,3 +50,25 @@ EXPECTED='v0.0.99'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for space-name chain, got >${ACTUAL}<" [ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for space-name chain, got >${ACTUAL}<"
rm -f '../../../alias/foo bar' '../../../alias/midway' '../../../alias/bar' rm -f '../../../alias/foo bar' '../../../alias/midway' '../../../alias/bar'
# Non-cycle through an alias name containing a regex metacharacter.
# Guards the literal `case` matching: the previous grep-based detection
# interpolated the resolved name into an anchored regex, so resolving 'axb'
# matched the seen name 'axb' against the pattern 'a.b' and falsely
# reported a cycle.
# Resolves: 'axb' -> 'a.b' -> 0.0.99
echo 'a.b' > '../../../alias/axb'
echo '0.0.99' > '../../../alias/a.b'
ACTUAL="$(nvm_resolve_alias axb)"
EXPECTED='v0.0.99'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for metachar-name chain, got >${ACTUAL}<"
# ... while a genuine cycle through a metachar name is still detected
echo 'axb' > '../../../alias/a.b'
ACTUAL="$(nvm_resolve_alias axb)"
EXPECTED='∞'
[ "${ACTUAL}" = "${EXPECTED}" ] || die "expected >${EXPECTED}< for metachar-name cycle, got >${ACTUAL}<"
rm -f '../../../alias/axb' '../../../alias/a.b'
+5
View File
@@ -17,3 +17,8 @@ rm -f "../../../alias/iojs"
rm -f "../../../alias/default" rm -f "../../../alias/default"
rm -f "../../../alias/test-blank-lines" rm -f "../../../alias/test-blank-lines"
rm -f "../../../alias/test-multi-lines" rm -f "../../../alias/test-multi-lines"
rm -f "../../../alias/test-edge-"* "../../../alias/test edge spaces"
rm -f "../../../alias/self" "../../../alias/link1" "../../../alias/link2" "../../../alias/link3"
rm -f "../../../alias/foo bar" "../../../alias/midway" "../../../alias/bar"
rm -f "../../../alias/hop1" "../../../alias/hop2" "../../../alias/hop3" "../../../alias/hop4"
rm -f "../../../alias/axb" "../../../alias/a.b"