diff --git a/examples/test.sh b/examples/test.sh new file mode 100755 index 0000000..e582929 --- /dev/null +++ b/examples/test.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +set -e + +function usage { + cat <<-EOF +USAGE + + $0 [-dgGhv] [-f focus-string] [-s seed] + +OPTIONS + + -h print this message + + -b run make under scan-build static analyzer + + -d run tests in a debugger (either lldb or gdb) + + -g run tests with valgrind's memcheck tool + + -G run tests with valgrind's memcheck tool, including a full leak check + + -v run tests with verbose output + + -f run only tests whose description contain the given string + + -s set the seed used to control random behavior + + -z pipe tests' stderr to \`dot(1)\` to render an SVG log + + +EOF +} + +profile= +leak_check=no +mode=normal +verbose= +args=() +target=tests +export BUILDTYPE=Test +cmd="out/${BUILDTYPE}/${target}" +run_scan_build= + +if [ "$(uname -s)" == "Darwin" ]; then + export LINK="clang++ -fsanitize=address" +fi + +while getopts "bdf:s:gGhpvS" option; do + case ${option} in + h) + usage + exit + ;; + d) + mode=debug + ;; + g) + mode=valgrind + ;; + G) + mode=valgrind + leak_check=full + ;; + p) + profile=true + ;; + f) + args+=("--only=${OPTARG}") + ;; + v) + verbose=true + ;; + s) + export TREE_SITTER_SEED=${OPTARG} + ;; + S) + mode=SVG + ;; + b) + run_scan_build=true + ;; + esac +done + +if [[ -n $verbose ]]; then + args+=("--reporter=spec") +else + args+=("--reporter=singleline") +fi + +if [[ -n "$run_scan_build" ]]; then + . script/util/scan-build.sh + scan_build make -j2 $target +else + make -j2 $target +fi +args=${args:-""} + +if [[ -n $profile ]]; then + export CPUPROFILE=/tmp/${target}-$(date '+%s').prof +fi + +case ${mode} in + valgrind) + valgrind \ + --suppressions=./script/util/valgrind.supp \ + --dsymutil=yes \ + --leak-check=${leak_check} \ + $cmd "${args[@]}" 2>&1 | \ + grep --color -E '\w+_tests?.cc:\d+|$' + ;; + + debug) + if which -s lldb; then + lldb $cmd -- "${args[@]}" + elif which -s gdb; then + gdb $cmd -- "${args[@]}" + else + echo "No debugger found" + exit 1 + fi + ;; + + SVG) + echo "" > index.html + $cmd "${args[@]}" 2> >(grep -v 'Assertion failed' | dot -Tsvg >> index.html) + echo "Wrote index.html" + ;; + + normal) + time $cmd "${args[@]}" + ;; +esac + +if [[ -n $profile ]]; then + pprof $cmd $CPUPROFILE +fi