e7299b17e9
Stack installed: - netfox v1.35.3 (core + extras + noray + internals) - godot-jolt v0.16.0-stable Architecture: - Server: ENet transport (works headless, no netfox deps) - Client/Editor: netfox rollback (RollbackSynchronizer, TickInterpolator) New/modified: - docs/migration-netfox-plan.md — migration architecture - scripts/network/network_manager.gd — netfox-aware ENet fallback - scripts/network/player.gd — clean base player - client/characters/player_netfox.gd — rollback player w/ WeaponManager - client/characters/input/player_net_input.gd — BaseNetInput subclass - client/characters/character/fps_character_controller.gd — netfox input feed - client/weapons/ — weapon data, registry, TacticalWeaponHitscan, WeaponManager - client/scripts/round_replicator.gd — client-side round state bridge - server/scripts/round_manager.gd — improved state machine - server/scripts/plugin_api/plugin_manager.gd — refined plugin system - config: enemy_tag, ally_tag for meatball targeting Removed: old C++ SimulationServer GDExtension (replaced by netfox rollback)
125 lines
3.9 KiB
Bash
Executable File
125 lines
3.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# ═══════════════════════════════════════════════════════════════════════════
|
|
# Tactical Shooter — Netcode Bug Bash Test Runner
|
|
#
|
|
# Runs all test suites in headless Godot and reports results.
|
|
# Usage: ./tests/RUN_TESTS.sh
|
|
#
|
|
# Requirements:
|
|
# - Godot 4+ executable in PATH, or set GODOT_BIN env var
|
|
# ═══════════════════════════════════════════════════════════════════════════
|
|
|
|
set -euo pipefail
|
|
|
|
# Config
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
GODOT="${GODOT_BIN:-godot}"
|
|
|
|
# ANSI colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
CYAN='\033[0;36m'
|
|
NC='\033[0m' # No Color
|
|
BOLD='\033[1m'
|
|
|
|
TESTS=(
|
|
"test_anti_cheat.gd"
|
|
"test_net_sim.gd"
|
|
"test_rcon_edge_cases.gd"
|
|
)
|
|
|
|
PASS_COUNT=0
|
|
FAIL_COUNT=0
|
|
SKIP_COUNT=0
|
|
RESULTS=()
|
|
|
|
echo ""
|
|
echo -e "${CYAN}══════════════════════════════════════════════${NC}"
|
|
echo -e "${CYAN} Tactical Shooter — Netcode Bug Bash Runner${NC}"
|
|
echo -e "${CYAN}══════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
echo " Project: $PROJECT_DIR"
|
|
echo " Godot: $(which "$GODOT" 2>/dev/null || echo 'NOT FOUND')"
|
|
echo ""
|
|
|
|
# Check godot is available
|
|
if ! command -v "$GODOT" &>/dev/null; then
|
|
echo -e "${RED}ERROR: Godot executable '$GODOT' not found in PATH.${NC}"
|
|
echo " Set GODOT_BIN env var to the godot binary path, or install Godot."
|
|
echo ""
|
|
echo " Example:"
|
|
echo " export GODOT_BIN=/usr/local/bin/godot"
|
|
echo " $0"
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
# Run each test
|
|
for test_file in "${TESTS[@]}"; do
|
|
test_path="$SCRIPT_DIR/$test_file"
|
|
test_name="${test_file%.gd}"
|
|
|
|
if [ ! -f "$test_path" ]; then
|
|
echo -e "${YELLOW} [SKIP] $test_name — file not found${NC}"
|
|
SKIP_COUNT=$((SKIP_COUNT + 1))
|
|
RESULTS+=("SKIP|$test_name|file not found")
|
|
continue
|
|
fi
|
|
|
|
echo -e "${BOLD}Running: $test_name${NC}"
|
|
echo " $GODOT --headless --script $test_path"
|
|
echo ""
|
|
|
|
# Run the test — capture output and exit code
|
|
set +e
|
|
output=$("$GODOT" --headless --script "$test_path" 2>&1)
|
|
exit_code=$?
|
|
set -e
|
|
|
|
# Print output (indented)
|
|
echo "$output" | sed 's/^/ /'
|
|
|
|
if [ $exit_code -eq 0 ]; then
|
|
echo -e "${GREEN} ✓ PASS ($test_name)${NC}"
|
|
PASS_COUNT=$((PASS_COUNT + 1))
|
|
RESULTS+=("PASS|$test_name|")
|
|
else
|
|
# Extract failure info from output
|
|
fail_lines=$(echo "$output" | grep -c "\[FAIL\]" || true)
|
|
echo -e "${RED} ✗ FAIL ($test_name) — $fail_lines assertion(s) failed${NC}"
|
|
FAIL_COUNT=$((FAIL_COUNT + 1))
|
|
RESULTS+=("FAIL|$test_name|$fail_lines failures")
|
|
fi
|
|
|
|
echo ""
|
|
echo "──────────────────────────────────────"
|
|
echo ""
|
|
done
|
|
|
|
# Summary
|
|
echo ""
|
|
echo -e "${CYAN}══════════════════════════════════════════════${NC}"
|
|
echo -e "${CYAN} Test Run Complete${NC}"
|
|
echo -e "${CYAN}══════════════════════════════════════════════${NC}"
|
|
echo ""
|
|
|
|
for result in "${RESULTS[@]}"; do
|
|
IFS='|' read -r status name info <<< "$result"
|
|
case "$status" in
|
|
PASS) echo -e " ${GREEN}✓${NC} $name" ;;
|
|
FAIL) echo -e " ${RED}✗${NC} $name — $info" ;;
|
|
SKIP) echo -e " ${YELLOW}—${NC} $name ($info)" ;;
|
|
esac
|
|
done
|
|
|
|
echo ""
|
|
echo -e " ${BOLD}${GREEN}$PASS_COUNT passed${NC}, ${BOLD}${RED}$FAIL_COUNT failed${NC}, ${YELLOW}$SKIP_COUNT skipped${NC}"
|
|
echo ""
|
|
|
|
if [ $FAIL_COUNT -gt 0 ]; then
|
|
exit 1
|
|
fi
|
|
exit 0
|