1
0
mirror of https://github.com/sstephenson/bats.git synced 2024-12-26 14:39:46 +01:00
bats/libexec/bats-exec-test

197 lines
3.7 KiB
Plaintext
Raw Normal View History

2011-12-28 19:40:14 +01:00
#!/usr/bin/env bash
set -e
set -E
set -T
2011-12-28 19:40:14 +01:00
BATS_COUNT_ONLY=""
if [ "$1" = "-c" ]; then
BATS_COUNT_ONLY=1
shift
fi
2011-12-28 19:40:14 +01:00
BATS_TEST_FILENAME="$1"
if [ -z "$BATS_TEST_FILENAME" ]; then
echo "usage: bats-exec <filename>" >&2
exit 1
elif [ ! -f "$BATS_TEST_FILENAME" ]; then
echo "bats: $BATS_TEST_FILENAME does not exist" >&2
2011-12-28 19:40:14 +01:00
exit 1
else
shift
fi
BATS_TEST_DIRNAME="$(dirname "$BATS_TEST_FILENAME")"
BATS_TEST_NAMES=()
load() {
local filename="$BATS_TEST_DIRNAME/$1.bash"
[ -f "$filename" ] || {
echo "bats: $filename does not exist" >&2
exit 1
}
2011-12-28 19:40:14 +01:00
source "$BATS_TEST_DIRNAME/$1.bash"
}
2011-12-28 23:21:48 +01:00
run() {
local e E T
2011-12-28 23:21:48 +01:00
[[ ! "$-" =~ e ]] || e=1
[[ ! "$-" =~ E ]] || E=1
[[ ! "$-" =~ T ]] || T=1
2011-12-28 23:21:48 +01:00
set +e
set +E
set +T
2011-12-28 23:21:48 +01:00
output="$("$@" 2>&1)"
status="$?"
2011-12-29 01:45:05 +01:00
IFS=$'\n' lines=($output)
2011-12-28 23:21:48 +01:00
[ -z "$e" ] || set -e
[ -z "$E" ] || set -E
[ -z "$T" ] || set -T
2011-12-28 23:21:48 +01:00
}
2011-12-28 19:40:14 +01:00
setup() {
true
}
teardown() {
true
}
skip() {
BATS_TEST_SKIPPED=${1:-1}
BATS_TEST_COMPLETED=1
exit 0
}
bats_test_begin() {
2011-12-28 19:40:14 +01:00
BATS_TEST_DESCRIPTION="$1"
setup
2011-12-28 19:40:14 +01:00
}
bats_test_function() {
local test_name="$1"
BATS_TEST_NAMES["${#BATS_TEST_NAMES[@]}"]="$test_name"
}
bats_debug_trap() {
if [ "$BASH_SOURCE" != "$1" ]; then
BATS_LINE_NUMBER="$BATS_LINE_NUMBER_"
BATS_LINE_NUMBER_="$2"
fi
}
bats_error_trap() {
trap - debug
}
bats_teardown_trap() {
trap bats_exit_trap exit
teardown >>"$BATS_OUT" 2>&1
bats_exit_trap
}
2011-12-28 19:40:14 +01:00
bats_exit_trap() {
local status
local skipped
2011-12-28 23:21:48 +01:00
trap - err exit
skipped=""
if [ -n "$BATS_TEST_SKIPPED" ]; then
skipped=" # skip"
if [ "1" != "$BATS_TEST_SKIPPED" ]; then
skipped+=" ($BATS_TEST_SKIPPED)"
fi
fi
2011-12-28 19:40:14 +01:00
if [ -z "$BATS_TEST_COMPLETED" ]; then
echo "not ok $BATS_TEST_NUMBER $BATS_TEST_DESCRIPTION" >&3
echo "# (in test file $BATS_TEST_FILENAME, line $BATS_LINE_NUMBER)" >&3
sed -e "s/^/# /" < "$BATS_OUT" >&3
status=1
2011-12-28 19:40:14 +01:00
else
echo "ok ${BATS_TEST_NUMBER}${skipped} ${BATS_TEST_DESCRIPTION}" >&3
status=0
2011-12-28 19:40:14 +01:00
fi
rm -f "$BATS_OUT"
exit "$status"
2011-12-28 19:40:14 +01:00
}
bats_perform_tests() {
echo "1..$#"
test_number=1
2011-12-29 02:14:10 +01:00
status=0
2011-12-28 19:40:14 +01:00
for test_name in "$@"; do
2011-12-29 02:14:10 +01:00
"$0" "$BATS_TEST_FILENAME" "$test_name" "$test_number" || status=1
2011-12-28 19:40:14 +01:00
test_number=$(($test_number + 1))
done
2011-12-29 02:14:10 +01:00
exit "$status"
2011-12-28 19:40:14 +01:00
}
bats_perform_test() {
BATS_TEST_NAME="$1"
if [ "$(type -t "$BATS_TEST_NAME" || true)" = "function" ]; then
BATS_TEST_NUMBER="$2"
if [ -z "$BATS_TEST_NUMBER" ]; then
echo "1..1"
BATS_TEST_NUMBER="1"
fi
BATS_TEST_COMPLETED=""
BATS_ERROR_LINE=""
trap "bats_debug_trap \"\$BASH_SOURCE\" \$LINENO" debug
trap "bats_error_trap" err
trap "bats_teardown_trap" exit
"$BATS_TEST_NAME" >>"$BATS_OUT" 2>&1
2011-12-28 19:40:14 +01:00
BATS_TEST_COMPLETED=1
else
echo "bats: unknown test name \`$BATS_TEST_NAME'" >&2
exit 1
fi
}
if [ -z "$TMPDIR" ]; then
BATS_TMPDIR="/tmp"
else
BATS_TMPDIR="${TMPDIR%/}"
fi
BATS_TMPNAME="$BATS_TMPDIR/bats.$$"
BATS_PARENT_TMPNAME="$BATS_TMPDIR/bats.$PPID"
BATS_OUT="${BATS_TMPNAME}.out"
2012-04-09 06:13:58 +02:00
bats_preprocess_source() {
BATS_TEST_SOURCE="${BATS_TMPNAME}.src"
tr -d '\r' < "$BATS_TEST_FILENAME" | bats-preprocess > "$BATS_TEST_SOURCE"
2012-04-09 06:13:58 +02:00
trap bats_cleanup_preprocessed_source err exit
trap "bats_cleanup_preprocessed_source; exit 1" int
}
2012-04-09 06:13:58 +02:00
bats_cleanup_preprocessed_source() {
rm -f "$BATS_TEST_SOURCE"
}
bats_evaluate_preprocessed_source() {
if [ -z "$BATS_TEST_SOURCE" ]; then
BATS_TEST_SOURCE="${BATS_PARENT_TMPNAME}.src"
fi
source "$BATS_TEST_SOURCE"
}
exec 3<&1
2011-12-28 19:40:14 +01:00
if [ "$#" -eq 0 ]; then
2012-04-09 06:13:58 +02:00
bats_preprocess_source
bats_evaluate_preprocessed_source
if [ -n "$BATS_COUNT_ONLY" ]; then
echo "${#BATS_TEST_NAMES[@]}"
else
bats_perform_tests "${BATS_TEST_NAMES[@]}"
fi
2011-12-28 19:40:14 +01:00
else
2012-04-09 06:13:58 +02:00
bats_evaluate_preprocessed_source
2011-12-28 19:40:14 +01:00
bats_perform_test "$@"
fi