summaryrefslogtreecommitdiff
path: root/test/test.sh
blob: a3e6ea9ee99978e6768342218679c96d79729de8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash
set -e
cd "$(dirname "$0")"
ulimit -s 4000000
export MALLOC_PERTURB_="$((2#01011001))"
shopt -s lastpipe
export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1

declare -A cppstandard
cppstandard["string/suffixArray.cpp"]="gnu++20"
cppstandard["other/pbs.cpp"]="gnu++20"
seedmacro=""
compilerflags="-O2"
debugflags="-O2 -fsanitize=address,undefined"

process_awk() {
    awk_file=$(realpath --relative-to="${PWD}" "${1}")
    cpp_file=${awk_file%.awk}
    folder=$(dirname $awk_file)
    #echo "$awk_file"
    mkdir -p "./awk/$folder"
    awk -f "$awk_file" < "../content/$cpp_file" > "./awk/$cpp_file"
}

test_file() {
    file=$(realpath --relative-to="${PWD}" "${1}")
    echo "$file:"

    echo "compiling with sanitizer..."
    std="gnu++17"
    if [[ -v cppstandard[$file] ]]; then
        std=${cppstandard[$file]}
    fi
    g++ -std=$std "$file" -I ./awk/ -I ../content/ $debugflags -Wall -Wextra -Wshadow -Werror -DSANITIZE $seedmacro
    echo "running with sanitizer..."
    timeout --foreground 90s ./a.out
    rm ./a.out

    echo "compiling -O2..."
    std="gnu++17"
    if [[ -v cppstandard[$file] ]]; then
        std=${cppstandard[$file]}
    fi
    g++ -std=$std "$file" -I ./awk/ -I ../content/ $compilerflags -Wall -Wextra -Wshadow -Werror $seedmacro
    echo "running -O2..."
    timeout --foreground 60s ./a.out
    echo ""
    rm ./a.out
}

list_missing() {
    declare -A ignore
    ignore["other/bitOps.cpp"]=1
    ignore["other/pragmas.cpp"]=1
    ignore["other/stuff.cpp"]=1
    ignore["other/timed.cpp"]=1
    ignore["tests/gcc5bug.cpp"]=1
    ignore["tests/precision.cpp"]=1
    ignore["tests/whitespace.cpp"]=1

    total=0
    missing=0

    if [[ ! -v $1 ]]; then
        echo "missing tests:"
    fi
    find ../content/ -type f -name '*.cpp' -print0 | sort -z | while read -d $'\0' file
    do
        total=$((total+1))
        file=${file#../content/}
        if [ ! -f "$file" ] && [[ ! -v ignore["$file"] ]]; then
            missing=$((missing+1))
            if [[ ! -v $1 ]]; then
                echo "  $file"
            fi
        fi
    done
    if [[ -v $1 ]]; then
        covered=$((total-missing))
        coverage=$((100*covered/total))
        echo "REQUIRED=$(( total < 4 ? 0 : total - 4 ))"
        echo "TOTAL=$total"
        echo "COVERED=$covered"
        echo "MISSING=$missing"
    fi
}

coverage() {
    list_missing 1
}

rm -rf ./awk/
find . -type f -path '*.awk' -print0 | sort -z | while read -d $'\0' file
do
    process_awk "$file"
done

if [ "$#" -ne 0 ]; then
    for arg in "$@"
    do
        if [[ $arg == "--awk" ]]; then
            echo "processed all awk files"
        elif [[ $arg == "--missing" ]]; then
            list_missing
        elif [[ $arg == "--coverage" ]]; then
            coverage
        elif [[ $arg == --seed=* ]]; then
            seedmacro="-DSEED=${arg:7}ll"
        elif [[ $arg == "--debug" ]]; then
            debugflags="-g -fsanitize=address,undefined"
        elif [ -d "$arg" ]; then
            dir=$(realpath --relative-to="${PWD}" "$arg")
            find . -type f -path "./${dir}/*.cpp" -not -path './awk/*' -print0 | sort -z | while read -d $'\0' file
            do
                test_file "$file"
            done
        elif [ -f "$arg" ]; then
            test_file "$arg"
        else
            echo "did not recognize: $arg"
            exit 1
        fi
    done
else
    find . -type f -path '*.cpp' -not -path './awk/*' -print0 | sort -z | while read -d $'\0' file
    do
        test_file "$file"
    done
    list_missing
fi