scopedvr-map-editor/tests/run_identitaet.sh

94 lines
3.8 KiB
Bash
Executable file

#!/usr/bin/env bash
# Identitäts-Vertrag (Karte t_1da96275 — „Editor-Playtest-Physik = Quest 3
# identisch"): dieselbe Probe-Map läuft durch
# A) Editor-Playtest (KolliderBau + PlaytestBody im SubViewport)
# B) Quest-Client (SvmapWorld + TestmapPlayer, im CLIENT-Projekt)
# Beide drucken `IDENT <name>=<wert>`-Zeilen; der Runner verlangt, dass die
# Zeilen IDENTISCH sind (gleiche Block/Walk-Entscheidungen in beiden Welten)
# und dass beide Suiten ihre Soll-Erwartungen erfüllen (Exit 0).
#
# Environment:
# GODOT Godot-Binary (Default: $HOME/bin/godot4, dann $PATH)
# SVR_CLIENT_DIR Client-Projektordner (Default: ../scopedvr-client neben
# diesem Repo — erkannt an project.godot)
# Exit 0 = Identität bestätigt.
set -u
if [ -n "${GODOT:-}" ]; then :
elif [ -x "$HOME/bin/godot4" ]; then
GODOT="$HOME/bin/godot4"
elif command -v godot4 >/dev/null 2>&1; then
GODOT=$(command -v godot4)
else
echo "FAIL: Kein Godot gefunden — GODOT=<pfad> setzen." >&2
exit 1
fi
EDITOR_DIR="$(cd "$(dirname "$0")/.." && pwd)"
# Client-Projekt finden: Env gewinnt, sonst Nachbar-Klon des Editors.
CLIENT_DIR="${SVR_CLIENT_DIR:-}"
if [ -z "$CLIENT_DIR" ]; then
for cand in "$EDITOR_DIR/../scopedvr-client" "$EDITOR_DIR/client"; do
if [ -f "$cand/project.godot" ]; then CLIENT_DIR="$cand"; break; fi
done
fi
if [ -z "$CLIENT_DIR" ] || [ ! -f "$CLIENT_DIR/project.godot" ]; then
echo "FAIL: Client-Projekt nicht gefunden (SVR_CLIENT_DIR setzen)." >&2
exit 1
fi
export GODOT_SILENCE_ROOT_WARNING=1
LOGDIR="${SVR_IDENTITAET_LOGDIR:-/tmp/svr_identitaet_logs_$$}"
mkdir -p "$LOGDIR"
MAP="${SVR_IDENTITAET_MAP:-/tmp/svr_identitaet_probe.svmap}"
export SVR_IDENTITAET_MAP="$MAP"
fail=0
echo "== 0) Probe-Map erzeugen =="
"$GODOT" --headless --path "$EDITOR_DIR" -s res://tests/gen_identitaet_map.gd \
> "$LOGDIR/gen.log" 2>&1
if ! grep -q "^IDENT_MAP=" "$LOGDIR/gen.log"; then
echo "FAIL: Probe-Map nicht erzeugt (siehe $LOGDIR/gen.log)" >&2
cat "$LOGDIR/gen.log" >&2
exit 1
fi
echo "== 1) Import (beide Projekte) =="
"$GODOT" --headless --path "$EDITOR_DIR" --import > "$LOGDIR/import_editor.log" 2>&1
grep -E "Parse Error|SCRIPT ERROR" "$LOGDIR/import_editor.log" | head -5 >&2
"$GODOT" --headless --path "$CLIENT_DIR" --import > "$LOGDIR/import_client.log" 2>&1
grep -E "Parse Error|SCRIPT ERROR" "$LOGDIR/import_client.log" | head -5 >&2
echo "== 2) Editor-Playtest-Probe =="
"$GODOT" --headless --path "$EDITOR_DIR" -s res://tests/test_playtest_identitaet.gd \
> "$LOGDIR/editor.log" 2>&1
code=$?
grep -E "^IDENT [a-z_0-9]+=" "$LOGDIR/editor.log" > "$LOGDIR/editor.ident"
grep -E "ALL OK|FAILED" "$LOGDIR/editor.log" | tail -1
[ $code -ne 0 ] && fail=1 && echo "Editor-Suite rot (exit=$code):" >&2 && cat "$LOGDIR/editor.log" >&2
echo "== 3) Quest-Client-Probe =="
"$GODOT" --headless --path "$CLIENT_DIR" -s "$EDITOR_DIR/tests/test_identitaet_client.gd" \
> "$LOGDIR/client.log" 2>&1
code=$?
grep -E "^IDENT [a-z_0-9]+=" "$LOGDIR/client.log" > "$LOGDIR/client.ident"
grep -E "ALL OK|FAILED" "$LOGDIR/client.log" | tail -1
[ $code -ne 0 ] && fail=1 && echo "Client-Suite rot (exit=$code):" >&2 && cat "$LOGDIR/client.log" >&2
echo "== 4) Identitäts-Vergleich =="
n_editor=$(wc -l < "$LOGDIR/editor.ident")
n_client=$(wc -l < "$LOGDIR/client.ident")
if [ "$n_editor" -lt 6 ] || [ "$n_client" -lt 6 ]; then
echo "FAIL: Zu wenige IDENT-Zeilen (editor=$n_editor, client=$n_client) — Suiten sind gecrasht." >&2
tail -20 "$LOGDIR/editor.log" >&2
tail -20 "$LOGDIR/client.log" >&2
fail=1
elif diff -u "$LOGDIR/editor.ident" "$LOGDIR/client.ident" > "$LOGDIR/diff.txt"; then
echo "IDENTITAET OK: $n_editor Entscheidungen identisch."
else
echo "FAIL: Entscheidungen weichen ab:" >&2
cat "$LOGDIR/diff.txt" >&2
fail=1
fi
[ $fail -eq 0 ] && echo "Logs: $LOGDIR" && exit 0
echo "Logs: $LOGDIR"
exit 1