# file : tests/bash/testscript # license : MIT; see accompanying LICENSE file # Only native testing on non-Windows platforms # : dummy : if ($test.target == $build.host && $build.host.class != 'windows') { buildfile = true test.arguments = .include ../common.testscript +cat <<EOI >+build/bootstrap.build subprojects = sub.bash using test using install EOI +cat <<EOI >=build/root.build using bash test/bash{*}: install.subdirs = true exe{*}: test = true EOI # Setup a subproject that we can import a module from. # # Note: used by multiple tests so should be static. # +mkdir -p sub.bash/build +cat <<EOI >=sub.bash/build/bootstrap.build project = sub.bash using install EOI +cat <<EOI >=sub.bash/build/root.build using bash EOI +cat <<EOI >=sub.bash/build/export.build $out_root/ { include sub/ } export $src_root/sub/bash{foo} EOI +cat <<EOI >=sub.bash/buildfile ./: dir{*/ -build/} EOI +mkdir sub.bash/sub +cat <<EOI >=sub.bash/sub/foo.bash echo sub EOI +cat <<EOI >=sub.bash/sub/buildfile ./: bash{foo} EOI # This scopes creates the test/ subdirectory corresponding to our project in # the import path. A bit of a hack but the alternative would be creating a # project for each test. # : test : { : basics : { cat <<EOI >=hello.bash; function hello () { echo "Hello, $@!"; } EOI cat <<EOI >=hello.in; #!/usr/bin/env bash if [[ "$OSTYPE" == darwin* ]]; then function readlink () { if [ "$1" != -f ]; then command readlink "$@" else echo "$2" fi } fi @import test/basics/hello@ hello "$@" EOI cat <<EOI >=buildfile; exe{hello}: in{hello} bash{hello} exe{hello}: test.arguments = 'World' EOI $* test >'Hello, World!'; $* install config.install.root=tmp; tmp/bin/hello 'John' >'Hello, John!'; $* uninstall config.install.root=tmp; $* clean } : import : { cat <<EOI >=driver.in; #!/usr/bin/env bash if [[ "$OSTYPE" == darwin* ]]; then function readlink () { if [ "$1" != -f ]; then command readlink "$@" else echo "$2" fi } fi @import sub/foo@ EOI cat <<EOI >=buildfile; import mods = sub.bash%bash{foo} exe{driver}: in{driver} $mods EOI $* test >'sub'; $* install config.install.root=tmp; tmp/bin/driver >'sub'; $* uninstall config.install.root=tmp; $* clean } : recursive : { cat <<EOI >=test.bash.in; @import sub/foo@ EOI cat <<EOI >=driver.in; #!/usr/bin/env bash if [[ "$OSTYPE" == darwin* ]]; then function readlink () { if [ "$1" != -f ]; then command readlink "$@" else local r="$2" if test -L "$r"; then r="$(command readlink "$r")" if [[ "$r" != /* ]]; then r="$(dirname "$2")/$r" fi fi echo "$r" fi } fi @import test/recursive/test@ EOI cat <<EOI >=buildfile; import mods = sub.bash%bash{foo} exe{driver}: in{driver} bash{test} bash{test}: in{test} $mods EOI $* test >'sub'; $* install config.install.root=tmp; tmp/bin/driver >'sub'; # Test execution via symlink. # mkdir bin; ln -s ../tmp/bin/driver bin/driver; bin/driver >'sub'; # Test execution via PATH. # #@@ TODO: add $~/bin to the PATH environment variable. #driver >'sub'; $* uninstall config.install.root=tmp; $* clean } #\ : import-installed : { # Note that here we import the project as sub, not sub.bash in order # to avoid importing as a subproject. # cat <<EOI >=driver.in; #!/usr/bin/env bash @import sub/foo@ EOI cat <<EOI >=buildfile; import mods = sub%bash{foo} exe{driver}: in{driver} $mods EOI $* 'install(../../sub.bash/)' config.install.root=tmp; #@@ TODO: add $~/tmp/bin to the PATH environment variable. $* test clean >'sub'; $* clean; $* 'uninstall(../../sub.bash/)' config.install.root=tmp } #\ } }