test(scripts): Add a script, which will help with generating and updating tests

This commit is contained in:
Benedikt Peetz 2024-03-26 17:12:51 +01:00
parent d48456d039
commit b85650e911
Signed by: bpeetz
GPG Key ID: A5E94010C3A642AD
1 changed files with 229 additions and 0 deletions

229
scripts/tests.sh Executable file
View File

@ -0,0 +1,229 @@
#!/usr/bin/env sh
# Parts of a shell library {{{
die() {
error "$1";
if [ -n "$2" ]; then
exit "$2";
else
exit 1;
fi
}
print() {
# The direct usage is intended as `print` is rather lowlevel
# shellcheck disable=2059
printf "$*";
};
println() {
# The direct usage is intended as `println` is rather lowlevel
# shellcheck disable=2059
printf "$*\n";
};
eprint() {
>&2 print "$@";
};
eprintln() {
>&2 println "$@";
};
if [ -n "$NO_COLOR" ];then
error() {
eprintln "==> ERROR:" "$*";
};
warning() {
eprintln "==> WARNING:" "$*";
};
debug() {
[ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln "==> [Debug:]" "$*";
};
debug2() {
[ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln " -> [Debug:]" "$*";
};
msg() {
eprintln "==>" "$*";
};
msg2() {
eprintln " ->" "$*";
};
prompt() {
eprint "..>" "$*";
};
else
# See https://stackoverflow.com/a/33206814 for ansi codes
error() {
eprintln "\033[1;91m==> ERROR:\033[0m" "\033[1;93m$*\033[0m";
};
warning() {
eprintln "\033[1;91m==> WARNING:\033[0m" "\033[1;93m$*\033[0m";
};
debug() {
[ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln "\033[1;94m==> [Debug:]\033[0m" "\033[1;93m$*\033[0m";
};
debug2() {
[ -n "$SHELL_LIBRARY_DEBUG" ] && eprintln "\033[1;94m -> [Debug:]\033[0m" "\033[1;93m$*\033[0m";
};
msg() {
eprintln "\033[1;96m==>\033[0m" "\033[1;93m$*\033[0m";
};
msg2() {
eprintln "\033[1;96m ->\033[0m" "\033[1;93m$*\033[0m";
};
prompt() {
eprint "\033[1;96m..>\033[0m" "\033[1;93m$*\033[0m";
};
fi
mktmp() {
ensure_tmp_dir;
mktemp -p "$SHELL_LIBRARY_TEMP_PREFIX_DIR";
}
ensure_tmp_dir() {
if ! [ -d "$SHELL_LIBRARY_TEMP_PREFIX_DIR" ];then
SHELL_LIBRARY_TEMP_PREFIX_DIR="$(mktemp -d)";
fi
};
# A new version of tmp, which allows you to specify the commandline args as normal
# arguments
tmp() {
if echo "$1" | grep -E ' ' -q; then
warn "Detected an old version of tmp, as there are spaces in the input string!"
fi
TEMP_DIR_WITH_DEL="$(mktmp)";
"$@" 1> "$TEMP_DIR_WITH_DEL";
echo "$TEMP_DIR_WITH_DEL";
};
# Takes a path to search as argument.
# Also takes further arguments as names to search for.
# Prints the path to a file, if a file matching the given name is found.
search_dir_for_file() {
[ -d "$1" ] || die "Arg $1 is not a directory";
directory="$1" && shift 1;
while read -r dir_entry; do
dir_entry_count=$((dir_entry_count + 1));
dir_entry_basename="$(basename "$dir_entry")";
for name in "$@";do
if [ "$name" = "$dir_entry_basename" ]; then
println "$dir_entry";
fi
done
done < "$(tmp fd . "$directory" --type file --max-depth 1)"
print "";
}
# Returns the path to the directory which contains all the specified files:
# `search_upward_files file1 file2 file3` returns a path containing file1 ...
search_upward_files() {
directory="$(pwd)";
final_directory="";
output="$(mktmp)";
while [ "$(wc -l < "$output")" = 0 ]; do
search_dir_for_file "$directory" "$@" > "$output";
directory="$(dirname "$directory")";
if [ "$directory" = "/" ]; then
warning "We bailed out, as there seems to be no directory containing $*";
final_directory="";
return;
fi
done
final_directory="$(dirname "$(head -n1 "$output")")";
print "$final_directory";
}
# }}}
help() {
cat << EOF
A test manager (for trixy integration tests)
USAGE:
./scripts/tests [OPTIONS] COMMAND
OPTIONS:
--help | -h
Display this help and exit.
COMMANDS:
update [TESTNAME]
Updates the 'expected.md' file of a test with TESTNAME, if
TESTNAME is blank, all tests are updated.
new TESTNAME
Generates a new test from the '.template' directory and drops
you into an editor for the 'input.tri' file.
It will also generate the 'expected.md' file, after you close
the editor.
ARGUMENTS:
TESTNAME | *([a-zA-Z0-9]) := [[ false ]]
The name of a test.
(The notation above is only really useful, when
the shell library is employed to generate
a completion script.)
EOF
}
ROOT_DIR="$(search_upward_files "Cargo.toml")";
new() {
test_name="$1";
test_dir="$ROOT_DIR/tests/$test_name";
[ -d "$test_dir" ] && die "$test_dir already exists, refusing to override"
cp --recursive "$ROOT_DIR/tests/.template" "$test_dir"
sed --in-place "s|template|$test_name|g" "$test_dir/main.rs"
editor="${EDITOR:-$VI}"
"$editor" "$test_dir/input.tri"
update "$test_name"
}
update() {
test_name="$1"
test_dir="$ROOT_DIR/tests/$test_name";
if [ -n "$test_name" ]; then
cargo run --features build-binary -- \
"$test_dir/input.tri" generate all --no-vendored \
> "$test_dir/expected.md"
else
fd . "$ROOT_DIR/tests" --type directory --max-depth=1 --exec basename | while read -r dir; do
msg2 "Updating $dir.."
update "$dir"
done
fi
}
for arg in "$@"; do
case "$arg" in
"--help" | "-h")
help;
exit 0;
;;
esac
done
case "$1" in
"update")
shift 1;
[ -n "$1" ] && test_name="$1"
update "$test_name";
;;
"new")
shift 1;
test_name="$1";
[ -z "$test_name" ] && die "You must specify a TESTNAME"
new "$test_name";
;;
esac
# vim: ft=sh