1#!/usr/bin/env bash 2 3generate_bats() { 4 skip_all="" 5 if [ -f "$1/input.skip.peg" ]; then 6 skip_all=$'skip\n' 7 fi 8 cat <<EOF 9#!/usr/bin/env bats 10 11load "\$TESTDIR/utils.sh" 12 13@test "Testing $1 - generation" { 14 ${skip_all}test_generate 15} 16 17@test "Testing $1 - compilation" { 18 ${skip_all}test_compile 19} 20EOF 21 for input in "$1"/input*.txt; do 22 skip="$skip_all" 23 suffix="$(basename "${input/input-/}" .txt)" 24 if [[ "$suffix" =~ .skip ]]; then 25 skip=true 26 suffix="${suffix/.skip/}" 27 fi 28 if [ "$suffix" = "input" ]; then 29 suffix="" 30 else 31 suffix=" [$suffix]" 32 fi 33 echo "@test \"Testing $1 - run$suffix\" {" 34 [ "$skip" ] && echo " skip" 35 echo " run_for_input \"$input\"" 36 echo "}" 37 done 38} 39 40build() { 41 if [ -z "$PACKCC" ]; then 42 export PACKCC="$TESTDIR/packcc" 43 ${CC:-cc} --coverage -O0 -o "$PACKCC" $ROOTDIR/src/packcc.c 44 fi 45} 46 47clean() { 48 rm -f packcc{,.gcda,.gcno,.c.gcov} *.d/test.bats *.d/parser{,.c,.h} 49} 50 51main() { 52 set -e 53 54 export TESTDIR="$(cd "$(dirname "$0")" && pwd)" 55 export ROOTDIR="$TESTDIR/.." 56 57 cd "$TESTDIR" 58 clean 59 build 60 61 for DIR in *.d; do 62 # Do not generate test file if the directory already contains some 63 ls "$DIR"/*.bats &> /dev/null && continue 64 generate_bats "$DIR" > "$DIR/test.bats" 65 done 66 67 bats "$@" ./*.d 68 69 if [ -f "packcc.gcda" ]; then 70 echo "$(gcov packcc | grep "Lines executed") (see $TESTDIR/packcc.c.gcov for details)" 71 fi 72} 73 74main "$@" 75