hachem.wtf
aboutsummaryrefslogtreecommitdiff
path: root/tests.sh
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-10-13 01:02:42 +0200
committerhachem <im@hachem.wtf>2026-10-13 01:02:42 +0200
commit346d8bc24babeed3a112895ec34aab0074b4a78b (patch)
tree2c476ce32c2b1939fcd7dcc747315b7378eaa02e /tests.sh
parent0c4716968a6ad336324af15df158db66db3f651f (diff)
feat: refactor defaultsHEADmain
Diffstat (limited to 'tests.sh')
-rwxr-xr-xtests.sh127
1 files changed, 109 insertions, 18 deletions
diff --git a/tests.sh b/tests.sh
index adafa50..04b523f 100755
--- a/tests.sh
+++ b/tests.sh
@@ -25,10 +25,10 @@ build_run()
case $bs in
make)
( cd "$dir" && make ) >/dev/null 2>&1
- "$dir/bin/$name" 2>&1 ;;
+ "$dir/$name" 2>&1 ;;
premake)
( cd "$dir" && premake5 gmake2 && make ) >/dev/null 2>&1
- "$dir/bin/$name" 2>&1 ;;
+ "$dir/$name" 2>&1 ;;
cmake)
( cd "$dir" && cmake -B build && cmake --build build ) >/dev/null 2>&1
"$dir/build/$name" 2>&1 ;;
@@ -46,7 +46,7 @@ check()
label=$1 bs=$2 name=$3
shift 3
- if ! ( cd "$work" && "$mkproj" --no-git -b "$bs" "$@" "$name" ) >/dev/null 2>&1
+ if ! ( cd "$work" && "$mkproj" -b "$bs" "$@" "$name" ) >/dev/null 2>&1
then
bad "$label (generate)"
return
@@ -77,7 +77,7 @@ check_lib()
{
bs=$1 name=$2
- if ! ( cd "$work" && "$mkproj" --no-git -b "$bs" -k lib "$name" ) >/dev/null 2>&1
+ if ! ( cd "$work" && "$mkproj" -b "$bs" -k lib "$name" ) >/dev/null 2>&1
then
bad "$bs / lib (generate)"
return
@@ -89,19 +89,41 @@ check_lib()
fi
}
+check_shared()
+{
+ bs=$1 name=$2
+
+ if ! ( cd "$work" && "$mkproj" -b "$bs" -k shared "$name" ) >/dev/null 2>&1
+ then
+ bad "$bs / shared (generate)"
+ return
+ fi
+
+ lib_build "$bs" "$work/$name"
+
+ if find "$work/$name" \( -name "lib$name.so" -o -name "lib$name.dylib" \) | grep -q .
+ then ok "$bs / shared"
+ else bad "$bs / shared (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)"
+"$mkproj" --completions bash | bash -n 2>/dev/null && ok "--completions bash" || bad "--completions bash"
+"$mkproj" --completions zsh | zsh -n 2>/dev/null && ok "--completions zsh" || bad "--completions zsh"
+"$mkproj" --completions fish >/dev/null 2>&1 && ok "--completions fish" || bad "--completions fish"
+"$mkproj" --completions tcsh >/dev/null 2>&1 && bad "--completions rejects unknown" || ok "--completions rejects unknown"
+( cd "$work" && "$mkproj" --lang=cpp eqform ) >/dev/null 2>&1 &&
+ [ -f "$work/eqform/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
+ if ( cd "$work" && "$mkproj" "$badname" ) >/dev/null 2>&1
then bad "rejects [$badname]"
else ok "rejects [$badname]"
fi
@@ -118,32 +140,101 @@ for bs in make cmake meson premake xmake; do
check "$bs / c" "$bs" "t_${bs}_c"
check "$bs / cpp" "$bs" "t_${bs}_cpp" -l cpp
- check "$bs / flat" "$bs" "t_${bs}_flat" --flat
+ check "$bs / src" "$bs" "t_${bs}_src" --src src
[ "$(uname)" = Darwin ] && check "$bs / objc" "$bs" "t_${bs}_objc" -l objc
check_lib "$bs" "t_${bs}_lib"
+ check_shared "$bs" "t${bs}sh"
done
if [ "$(uname)" = Darwin ] && have nasm; then
- check "nasm / make" make t_nasm -l nasm
+ # native nasm is x86-64; it links here but only runs under Rosetta, so
+ # check the binary builds rather than requiring it to run.
+ ( cd "$work" && "$mkproj" -l nasm t_nasm ) >/dev/null 2>&1 &&
+ ( cd "$work/t_nasm" && make ) >/dev/null 2>&1 &&
+ [ -x "$work/t_nasm/t_nasm" ] && ok "nasm / make (build)" || bad "nasm / make (build)"
else
skip "nasm (needs macOS + nasm)"
fi
+if have swiftc; then
+ ( cd "$work" && "$mkproj" -l swift t_swift ) >/dev/null 2>&1 &&
+ build_run make "$work/t_swift" t_swift | grep -q 'type shi' &&
+ ok "swift / make" || bad "swift / make"
+else
+ skip "swift (no swiftc)"
+fi
+
+if have rustc; then
+ ( cd "$work" && "$mkproj" -l crust t_crust ) >/dev/null 2>&1 &&
+ build_run make "$work/t_crust" t_crust | grep -q 'type shi' &&
+ ok "crust / make" || bad "crust / make"
+else
+ skip "crust (no rustc)"
+fi
+
+# swift and crust are make-only, executables-only, no -std / clang-format
+( cd "$work" && "$mkproj" -l swift -b cmake sc ) >/dev/null 2>&1 && bad "swift rejects cmake" || ok "swift rejects cmake"
+( cd "$work" && "$mkproj" -l crust -k lib cl ) >/dev/null 2>&1 && bad "crust rejects lib" || ok "crust rejects lib"
+( cd "$work" && "$mkproj" -l swift -k shared ssh ) >/dev/null 2>&1 && bad "swift rejects shared" || ok "swift rejects shared"
+( cd "$work" && "$mkproj" --docker -k lib dl ) >/dev/null 2>&1 && bad "--docker rejects lib" || ok "--docker rejects lib"
+( cd "$work" && "$mkproj" -l swift --style ss ) >/dev/null 2>&1 && bad "swift rejects --style" || ok "swift rejects --style"
+( cd "$work" && "$mkproj" --bin . dotbin ) >/dev/null 2>&1 && bad "--bin . rejected" || ok "--bin . rejected"
+( cd "$work" && "$mkproj" --bin .. dotdot ) >/dev/null 2>&1 && bad "--bin .. rejected" || ok "--bin .. rejected"
+( cd "$work" && "$mkproj" --bin-int / slashint ) >/dev/null 2>&1 && bad "--bin-int / rejected" || ok "--bin-int / rejected"
+( cd "$work" && "$mkproj" --single -b cmake scm ) >/dev/null 2>&1 && bad "--single rejects cmake" || ok "--single rejects cmake"
+( cd "$work" && "$mkproj" --single -l swift sws ) >/dev/null 2>&1 && bad "--single rejects swift" || ok "--single rejects swift"
+( cd "$work" && "$mkproj" --single -k lib slib ) >/dev/null 2>&1 && bad "--single rejects lib" || ok "--single rejects lib"
+
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
+( cd "$work" && "$mkproj" --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
+( cd "$work" && MKPROJ_BUILD=cmake "$mkproj" envdef ) >/dev/null 2>&1
[ -f "$work/envdef/CMakeLists.txt" ] && ok "MKPROJ_BUILD env default" || bad "MKPROJ_BUILD env default"
-( cd "$work" && "$mkproj" --no-git --docker dok ) >/dev/null 2>&1
+( cd "$work" && "$mkproj" --docker dok ) >/dev/null 2>&1
[ -f "$work/dok/Dockerfile" ] && [ -f "$work/dok/.dockerignore" ] && ok "--docker files" || bad "--docker files"
-( cd "$work" && "$mkproj" --no-git --docker -l nasm dok_nasm ) >/dev/null 2>&1
+( cd "$work" && "$mkproj" --docker -l nasm dok_nasm ) >/dev/null 2>&1
[ -f "$work/dok_nasm/Dockerfile" ] && grep -q 'elf64' "$work/dok_nasm/Makefile" && ok "--docker nasm targets elf64" || bad "--docker nasm targets elf64"
-( cd "$work" && "$mkproj" --no-git --docker -l objc dok_objc ) >/dev/null 2>&1 && bad "--docker rejects objc" || ok "--docker rejects objc"
+( cd "$work" && "$mkproj" --docker -l objc dok_objc ) >/dev/null 2>&1 && bad "--docker rejects objc" || ok "--docker rejects objc"
+( cd "$work" && "$mkproj" rootbin ) >/dev/null 2>&1 &&
+ ( cd "$work/rootbin" && make ) >/dev/null 2>&1 &&
+ [ -x "$work/rootbin/rootbin" ] && ok "binary at root (default)" || bad "binary at root (default)"
+( cd "$work" && "$mkproj" --no-root norootbin ) >/dev/null 2>&1 &&
+ ( cd "$work/norootbin" && make ) >/dev/null 2>&1 &&
+ [ -x "$work/norootbin/bin/norootbin" ] && ok "--no-root binary in bin/" || bad "--no-root binary in bin/"
+( cd "$work" && "$mkproj" --git gitted ) >/dev/null 2>&1
+[ -d "$work/gitted/.git" ] && [ -f "$work/gitted/.gitignore" ] && ok "--git repo + .gitignore" || bad "--git repo + .gitignore"
+[ -f "$work/rootbin/.gitignore" ] && bad "no git/.gitignore by default" || ok "no git/.gitignore by default"
+( cd "$work" && "$mkproj" --single singlep ) >/dev/null 2>&1 &&
+ ( cd "$work/singlep" && make ) >/dev/null 2>&1 &&
+ [ -x "$work/singlep/singlep" ] && ok "--single builds" || bad "--single builds"
+grep -q 'OBJ :=' "$work/singlep/Makefile" 2>/dev/null && bad "--single has no object dir" || ok "--single has no object dir"
+grep -q 'rm -f singlep' "$work/singlep/Makefile" 2>/dev/null && ok "--single clean is rm -f binary" || bad "--single clean is rm -f binary"
+( cd "$work" && "$mkproj" --no-validation noval ) >/dev/null 2>&1
+{ ! grep -q 'check:' "$work/noval/Makefile" && ! grep -q 'fsanitize' "$work/noval/Makefile"; } 2>/dev/null && ok "--no-validation drops check + sanitizers" || bad "--no-validation drops check + sanitizers"
+( cd "$work" && "$mkproj" --style styled ) >/dev/null 2>&1
+[ -f "$work/styled/.clang-format" ] && [ -f "$work/styled/.editorconfig" ] && ok "--style files" || bad "--style files"
+if have clang-format; then
+ ( cd "$work/styled" && clang-format --style=file --dry-run --Werror main.c ) >/dev/null 2>&1 && ok "--style stub conforms" || bad "--style stub conforms"
+fi
+( cd "$work" && "$mkproj" --style -l nasm sn ) >/dev/null 2>&1 && bad "--style rejects nasm" || ok "--style rejects nasm"
+( cd "$work" && "$mkproj" runt ) >/dev/null 2>&1 &&
+ ( cd "$work/runt" && make run ) 2>/dev/null | grep -q 'type shi' && ok "make run" || bad "make run"
+( cd "$work" && "$mkproj" --ci cit ) >/dev/null 2>&1
+[ -f "$work/cit/.github/workflows/ci.yml" ] && ok "--ci workflow" || bad "--ci workflow"
+grep -q 'ubuntu-latest' "$work/cit/.github/workflows/ci.yml" 2>/dev/null && ok "--ci c runs on ubuntu" || bad "--ci c runs on ubuntu"
+( cd "$work" && "$mkproj" --ci -l swift cis ) >/dev/null 2>&1
+grep -q 'macos-latest' "$work/cis/.github/workflows/ci.yml" 2>/dev/null && ok "--ci swift runs on macos" || bad "--ci swift runs on macos"
+( cd "$work" && "$mkproj" --src source srcdir ) >/dev/null 2>&1 &&
+ [ -f "$work/srcdir/source/main.c" ] &&
+ ( cd "$work/srcdir" && make ) >/dev/null 2>&1 &&
+ [ -x "$work/srcdir/srcdir" ] && ok "--src custom source dir" || bad "--src custom source dir"
+mkdir -p "$work/inplace"
+( cd "$work/inplace" && "$mkproj" . ) >/dev/null 2>&1 &&
+ [ -f "$work/inplace/main.c" ] && [ -f "$work/inplace/Makefile" ] &&
+ ( cd "$work/inplace" && make ) >/dev/null 2>&1 &&
+ [ -x "$work/inplace/inplace" ] && ok "mkproj . (in place)" || bad "mkproj . (in place)"
+( cd "$work/inplace" && "$mkproj" . ) >/dev/null 2>&1 && bad "in place refuses to clobber" || ok "in place refuses to clobber"
echo
printf '%d passed, %d failed\n' "$pass" "$fail"