hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/tests.sh
diff options
context:
space:
mode:
Diffstat (limited to 'tests.sh')
-rwxr-xr-xtests.sh139
1 files changed, 139 insertions, 0 deletions
diff --git a/tests.sh b/tests.sh
new file mode 100755
index 0000000..f860ae7
--- /dev/null
+++ b/tests.sh
@@ -0,0 +1,139 @@
+#!/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
+
+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 ]