75 lines
3.3 KiB
Bash
Executable file
75 lines
3.3 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Self-contained build + test for src/game/design (plain g++, no CMake needed).
|
|
#
|
|
# tests/game_design/build_and_run.sh
|
|
#
|
|
# Always builds and runs the unit tests (hand-written mini catalog). When
|
|
# SOTS_DATA_DIR points at an extracted sots.gob tree AND SOTS_DESIGNS_JSON at
|
|
# the owner's stock_designs.json (designs decoded from real saves) it also
|
|
# runs the real-data test (every save design must validate, DOpts must equal
|
|
# applied_techs, tech gating must show exactly the hidden-rider warnings),
|
|
# dumps our findings per design and, if the reference validator is reachable
|
|
# (SOTS_DESIGN_RULES_DIR, default ~/sots-re/verify/design-rules), diffs them
|
|
# design by design with oracle/compare.py.
|
|
#
|
|
# Env: CXX (g++), PYTHON (python3), BUILD_DIR (tests/game_design/build),
|
|
# SOTS_DATA_DIR, SOTS_DESIGNS_JSON, SOTS_DESIGN_RULES_DIR.
|
|
set -euo pipefail
|
|
|
|
HERE=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
|
|
ROOT=$(cd "$HERE/../.." && pwd)
|
|
BUILD=${BUILD_DIR:-$HERE/build}
|
|
CXX=${CXX:-g++}
|
|
PYTHON=${PYTHON:-python3}
|
|
FLAGS=(-std=c++17 -O2 -Wall -Wextra -Wpedantic -Werror -I"$ROOT/src" -I"$HERE")
|
|
LIB=(
|
|
"$ROOT/src/mars/parse/blocks.cpp" "$ROOT/src/mars/parse/value.cpp"
|
|
"$ROOT/src/mars/text/value.cpp" "$ROOT/src/mars/text/flat_kv.cpp"
|
|
"$ROOT/src/mars/text/manifest.cpp" "$ROOT/src/mars/text/csv.cpp"
|
|
"$ROOT/src/game/data/common.cpp" "$ROOT/src/game/data/block.cpp"
|
|
"$ROOT/src/game/data/weapon.cpp" "$ROOT/src/game/data/shipsection.cpp"
|
|
"$ROOT/src/game/data/turrets.cpp" "$ROOT/src/game/data/techtree.cpp"
|
|
"$ROOT/src/game/data/strings.cpp" "$ROOT/src/game/data/catalog.cpp"
|
|
"$ROOT/src/game/design/design.cpp" "$ROOT/src/game/design/rules.cpp"
|
|
"$ROOT/src/game/design/stats.cpp" "$ROOT/src/game/design/defaults.cpp"
|
|
)
|
|
|
|
mkdir -p "$BUILD"
|
|
|
|
echo "== building unit tests"
|
|
"$CXX" "${FLAGS[@]}" "${LIB[@]}" "$HERE/test_main.cpp" "$HERE/mini_catalog.cpp" "$HERE/test_structure.cpp" \
|
|
"$HERE/test_banks.cpp" "$HERE/test_tech.cpp" "$HERE/test_stats.cpp" "$HERE/test_json.cpp" -o "$BUILD/unit_tests"
|
|
echo "== running unit tests"
|
|
"$BUILD/unit_tests"
|
|
|
|
if [ -z "${SOTS_DATA_DIR:-}" ] || [ -z "${SOTS_DESIGNS_JSON:-}" ]; then
|
|
echo "== SOTS_DATA_DIR / SOTS_DESIGNS_JSON not set: skipping real-data tests"
|
|
exit 0
|
|
fi
|
|
if [ ! -d "$SOTS_DATA_DIR" ]; then
|
|
echo "== SOTS_DATA_DIR=$SOTS_DATA_DIR is not a directory" >&2
|
|
exit 1
|
|
fi
|
|
if [ ! -f "$SOTS_DESIGNS_JSON" ]; then
|
|
echo "== SOTS_DESIGNS_JSON=$SOTS_DESIGNS_JSON is not a file" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "== building real-data tools"
|
|
"$CXX" "${FLAGS[@]}" "${LIB[@]}" "$HERE/stock_designs.cpp" "$HERE/realdata_test.cpp" -o "$BUILD/realdata_test"
|
|
"$CXX" "${FLAGS[@]}" "${LIB[@]}" "$HERE/stock_designs.cpp" "$HERE/dump_designs.cpp" -o "$BUILD/dump_designs"
|
|
|
|
echo "== real-data: every save design through the rules"
|
|
"$BUILD/realdata_test"
|
|
|
|
echo "== dumping findings"
|
|
"$BUILD/dump_designs" "$SOTS_DATA_DIR" "$SOTS_DESIGNS_JSON" "$BUILD/designs.json"
|
|
|
|
ORACLE=${SOTS_DESIGN_RULES_DIR:-$HOME/sots-re/verify/design-rules}
|
|
if [ ! -f "$ORACLE/design_rules.py" ]; then
|
|
echo "== reference validator not found at $ORACLE (set SOTS_DESIGN_RULES_DIR): skipping comparison"
|
|
exit 0
|
|
fi
|
|
echo "== comparing with the reference validator"
|
|
read -ra PY <<< "$PYTHON" # PYTHON may be a command with arguments ("uv run python3")
|
|
exec "${PY[@]}" "$HERE/oracle/compare.py" "$BUILD/designs.json" "$SOTS_DESIGNS_JSON" "$ORACLE"
|