hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/tests.sh
blob: 98b30fb25f0e70b9db91b823272987ee1ec1cf57 (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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#!/bin/sh

set -u

root=$(cd "$(dirname "$0")" && pwd)
mkproj=${MKPROJ:-$root/mkproj}
work=$root/tests
rm -rf "$work"
mkdir -p "$work"
trap 'rm -rf "$work"' EXIT

pass=0
fail=0

ok()   { pass=$((pass + 1)); printf '  ok    %s\n' "$1"; }
bad()  { fail=$((fail + 1)); printf '  FAIL  %s\n' "$1"; }
skip() { printf '  skip  %s\n' "$1"; }

have() { command -v "$1" >/dev/null 2>&1; }

build_run()
{
    bs=$1 dir=$2 name=$3

    case $bs in
        make)
            ( cd "$dir" && make ) >/dev/null 2>&1
            "$dir/bin/$name" 2>&1 ;;
        premake)
            ( cd "$dir" && premake5 gmake2 && make ) >/dev/null 2>&1
            "$dir/bin/$name" 2>&1 ;;
        cmake)
            ( cd "$dir" && cmake -B build && cmake --build build ) >/dev/null 2>&1
            "$dir/build/$name" 2>&1 ;;
        meson)
            ( cd "$dir" && meson setup build && meson compile -C build ) >/dev/null 2>&1
            "$dir/build/$name" 2>&1 ;;
        xmake)
            ( cd "$dir" && xmake -y ) >/dev/null 2>&1
            ( cd "$dir" && xmake run ) 2>&1 ;;
    esac
}

check()
{
    label=$1 bs=$2 name=$3
    shift 3

    if ! ( cd "$work" && "$mkproj" --no-git -b "$bs" "$@" "$name" ) >/dev/null 2>&1
    then
        bad "$label (generate)"
        return
    fi

    if build_run "$bs" "$work/$name" "$name" | grep -q 'type shi'
    then
        ok "$label"
    else
        bad "$label (build/run)"
    fi
}

lib_build()
{
    bs=$1 dir=$2

    case $bs in
        make)    ( cd "$dir" && make ) >/dev/null 2>&1 ;;
        premake) ( cd "$dir" && premake5 gmake2 && make ) >/dev/null 2>&1 ;;
        cmake)   ( cd "$dir" && cmake -B build && cmake --build build ) >/dev/null 2>&1 ;;
        meson)   ( cd "$dir" && meson setup build && meson compile -C build ) >/dev/null 2>&1 ;;
        xmake)   ( cd "$dir" && xmake -y ) >/dev/null 2>&1 ;;
    esac
}

check_lib()
{
    bs=$1 name=$2

    if ! ( cd "$work" && "$mkproj" --no-git -b "$bs" -k lib "$name" ) >/dev/null 2>&1
    then
        bad "$bs / lib (generate)"
        return
    fi

    if lib_build "$bs" "$work/$name"
    then ok "$bs / lib"
    else bad "$bs / lib (build)"
    fi
}

echo "mkproj test harness ($mkproj)"
echo

echo "cli:"
"$mkproj" --version >/dev/null 2>&1 && ok "--version" || bad "--version"
"$mkproj" --help    >/dev/null 2>&1 && ok "--help"    || bad "--help"
( cd "$work" && "$mkproj" --no-git --lang=cpp eqform ) >/dev/null 2>&1 &&
    [ -f "$work/eqform/src/main.cpp" ] && ok "--lang=cpp (=form)" || bad "--lang=cpp (=form)"

echo
echo "name validation (these must be rejected):"
for badname in "bad name" "a/b" ".." "" 'x") evil('; do
    if ( cd "$work" && "$mkproj" --no-git "$badname" ) >/dev/null 2>&1
    then bad "rejects [$badname]"
    else ok  "rejects [$badname]"
    fi
done

echo
echo "build matrix:"
for bs in make cmake meson premake xmake; do
    tool=$bs
    [ "$bs" = premake ] && tool=premake5

    if ! have "$tool"; then skip "$bs (no $tool)"; continue; fi
    if [ "$bs" = meson ] && ! have ninja; then skip "meson (no ninja)"; continue; fi

    check "$bs / c"    "$bs" "t_${bs}_c"
    check "$bs / cpp"  "$bs" "t_${bs}_cpp"  -l cpp
    check "$bs / flat" "$bs" "t_${bs}_flat" --flat
    [ "$(uname)" = Darwin ] && check "$bs / objc" "$bs" "t_${bs}_objc" -l objc
    check_lib "$bs" "t_${bs}_lib"
done

if [ "$(uname)" = Darwin ] && have nasm; then
    check "nasm / make" make t_nasm -l nasm
else
    skip "nasm (needs macOS + nasm)"
fi

echo
echo "generated files:"
( cd "$work" && "$mkproj" --no-git clangd_on ) >/dev/null 2>&1
[ -f "$work/clangd_on/compile_flags.txt" ] && ok "compile_flags.txt generated" || bad "compile_flags.txt generated"
( cd "$work" && "$mkproj" --no-git --no-clangd clangd_off ) >/dev/null 2>&1
[ -f "$work/clangd_off/compile_flags.txt" ] && bad "--no-clangd skips compile_flags.txt" || ok "--no-clangd skips compile_flags.txt"
( cd "$work" && "$mkproj" --no-git --license mit lic_mit ) >/dev/null 2>&1
grep -q 'MIT License' "$work/lic_mit/LICENSE" 2>/dev/null && ok "--license mit" || bad "--license mit"
( cd "$work" && MKPROJ_BUILD=cmake "$mkproj" --no-git envdef ) >/dev/null 2>&1
[ -f "$work/envdef/CMakeLists.txt" ] && ok "MKPROJ_BUILD env default" || bad "MKPROJ_BUILD env default"

echo
printf '%d passed, %d failed\n' "$pass" "$fail"
[ "$fail" -eq 0 ]