testmark-bash

Check handles in one function, for parse and readers alike.

commit 0ad96a7762d9284e92ad005998b73a767a6d9f90 · parent 21fc89340d · browse this tree
Ximianth, 2026-10-23 14:47:18 UTC

Readers now report a handle that can't be one as invalid, as parse does, rather than as unknown.
diff --git a/lib/testmark/document.bash b/lib/testmark/document.bash
index 6424f0f..ade7b8e 100644
--- a/lib/testmark/document.bash
+++ b/lib/testmark/document.bash
@@ -19,16 +19,21 @@ _testmark_err() {
 	>&2 printf 'testmark: %s\n' "$1"
 }
 
+## Fails with a message unless $1 is a valid handle, and so safe to use in a variable name.
+_testmark_handle() {
+	[[ $1 =~ ^[A-Za-z0-9_]+$ ]] || {
+		_testmark_err "invalid handle \"$1\": must match [A-Za-z0-9_]+"
+		return 1
+	}
+}
+
 _testmark_parse() {
 	(($# == 2)) || {
 		_testmark_err "usage: testmark_parse HANDLE FILE"
 		return 1
 	}
 	local h=$1 file=$2
-	[[ $h =~ ^[A-Za-z0-9_]+$ ]] || {
-		_testmark_err "invalid handle \"$h\": must match [A-Za-z0-9_]+"
-		return 1
-	}
+	_testmark_handle "$h" || return 1
 	unset -v "_testmark_lines_$h" "_testmark_start_$h" "_testmark_end_$h" "_testmark_info_$h" "_testmark_names_$h" "_testmark_pid_$h"
 	# A directory would read as zero lines, so it's rejected here.
 	[[ -f $file && -r $file ]] || {
@@ -112,7 +117,8 @@ _testmark_parse() {
 
 ## Fails with a message unless $1 is the handle of a parsed document.
 _testmark_doc() {
-	[[ $1 =~ ^[A-Za-z0-9_]+$ && -v _testmark_pid_$1 ]] || {
+	_testmark_handle "$1" || return 1
+	[[ -v _testmark_pid_$1 ]] || {
 		_testmark_err "unknown handle \"$1\""
 		return 1
 	}
diff --git a/tests/test-api.sh b/tests/test-api.sh
index deecb4a..91be24a 100755
--- a/tests/test-api.sh
+++ b/tests/test-api.sh
@@ -114,7 +114,7 @@ for name in "${names[@]}"; do
 	expect_eq "name $name" "$(testmark_body h "$name")" "body of $name"
 done
 expect_fail "an unknown name with shell syntax" 'testmark: h: no hunk named "$(>pwned3)"' testmark_body h '$(>pwned3)'
-expect_fail "a handle with shell syntax" 'testmark: unknown handle "h[$(>pwned4)]"' testmark_body 'h[$(>pwned4)]' x
+expect_fail "a handle with shell syntax" 'testmark: invalid handle "h[$(>pwned4)]": must match [A-Za-z0-9_]+' testmark_body 'h[$(>pwned4)]' x
 expect_eq "nothing was executed" "$(echo pwned*)" "pwned*"
 
 exit "$RESULT"