commit - 15f1a49a5f1b34c6d571fe2d4561b3005c418592
commit + db018202b88b529616efd0651f71681906c9036a
blob - ebd39c4f42ec24c30364eb06cbd987c5e20c9f57
blob + 8f4b89b2cb0c37849715682fd01092e41739bcca
--- exercise
+++ exercise
# the coroutine ends, the channel is closed and any event handler vanishes.
proc execute_test {job basedir path} {
global opts counters
+ set args {}
+ # Handle test arguments embedded in path after a colon.
+ if {[set i [string first : $path]] != -1} {
+ set args [string range $path [expr $i + 1] end]
+ set path [string range $path 0 [expr $i - 1]]
+ }
+
# Should the test result be integrated as a nested test suite?
set suite [string match $opts(-ps) [file tail $path]]
set scounters {}
if {[catch {
# Execute the test, attaching pipes to stdin and stdout.
- set pipe [open "|$exe 2>$errfile" r+]
+ set pipe [open "|$exe 2>$errfile $args" r+]
yield $pipe
# Consume the test's stdout. Ignore it for normal tests.
blob - 0a3258df7bafd9b42ec1f410698aca7f953052ab
blob + 2c8a581d832e54901f45054573dd4418110320eb
--- exercise.1
+++ exercise.1
.Sh DESCRIPTION
The
.Nm
-utility searches for and executes software (unit) tests in or below the
-current directory.
+utility searches for and executes software (unit) tests.
It displays a running status and passes any error messages to standard error.
.Pp
-If given a directory argument,
+Any
+.Ar path
+argument that refers to a directory
+is recursively searched for tests.
+Other arguments are executed as individual files.
+Executables should match one of the patterns
+.Pa *.t
+or
+.Pa *.ts
+(for test suites).
+.Pp
+If called without arguments,
.Nm
-searches for tests therein.
-If given a file argument, it executes it as a single test (or test suite).
-To be recognized as tests, files must match the pattern
-.Pa *.t .
-To be run as test suites (see below), files must match the pattern
-.Pa *.ts .
+searches the current directory.
.Pp
+Arguments can be passed to a test or test suite
+by embedding them in
+.Ar path
+after a colon
+.Sq ":" .
+Anything after the (first) colon is passed to the test command,
+split into arguments by white space.
+To avoid splitting an argument that contains spaces,
+surrounding double quotes must be embedded with it.
+.Pp
The options are as follows:
.Bl -tag -width Ds
.It Fl B Ar dir
.Nm
with some test (shell) script to execute and compares
the outcome to expectations.
+.Pp
+Calling a test suite with three arguments,
+the last of which contains a space character:
+.Bd -literal -offset Ds
+.Sy $ \c
+exercise foo/bar.ts:'a b "x y"'
+.Ed
+.Pp
+Note the use of (shell) single quotes to embed the necessary spaces and
+double quotes.
.
.Sh SEE ALSO
.Xr sh 1
blob - /dev/null
blob + f93352d27d024fdd90fb36d7e6ba2d951280154a (mode 755)
--- /dev/null
+++ tests/exercise/test/args.t
+#!/bin/sh
+
+export pth=$0.tst:foobar
+./assert-exercise $0 'run 1 ok 1 fail 0 error 0\n' '' <<-"EOF"
+ #!/bin/sh
+ if ! [ "$1" = "foobar" ]
+ then
+ echo "/$1/" >&2
+ fi
+EOF
+
+# test argument split on whitespace
+export pth=$0.tst:"foo bar"
+./assert-exercise $0 'run 1 ok 1 fail 0 error 0\n' '' <<-"EOF"
+ #!/bin/sh
+ if ! [ "$1" = "foo" -a "$2" = "bar" ]
+ then
+ echo "/$1/$2/" >&2
+ fi
+EOF
+
+# test argument containing whitespace in double quotes
+export pth=$0.tst:'"foo bar"'
+./assert-exercise $0 'run 1 ok 1 fail 0 error 0\n' '' <<-"EOF"
+ #!/bin/sh
+ if ! [ "$1" = "foo bar" ]
+ then
+ echo "/$1/" >&2
+ fi
+EOF
blob - 663923e2c024331d2519d136e27dd878eafc9597
blob + 6bb2d48c8644b823b71bddc72cc52af2181624b3
--- tests/helpers/assert-exercise
+++ tests/helpers/assert-exercise
# execute & compare
shift 3
unset EXERCISEDIR # clean environment
-env $env $exe "$@" $pth 1>$out 2>$err
+env $env $exe "$@" "$pth" 1>$out 2>$err
test "$?" = "127" && exit 127
diff -u $experr $err >&2 && \
diff -u $expout $out >&2