xref: /Universal-ctags/misc/packcc/tests/test.sh (revision 94b93df2fbd992696312d0e8dbb9b272275f27aa)
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