From 875e2a75eae13298a36a9f631305a68e40653606 Mon Sep 17 00:00:00 2001 From: hachem Date: Sat, 12 Sep 2026 06:11:26 +0200 Subject: feat: add new options and xmake --- tests.sh | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100755 tests.sh (limited to 'tests.sh') 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 ] -- cgit v1.3