Add comprehensive YAZE Overworld Testing Guide and test scripts

- Introduced a detailed documentation guide for testing the YAZE overworld implementation, covering unit tests, integration tests, end-to-end tests, and golden data validation.
- Added a new script to orchestrate the complete testing workflow, including building the golden data extractor, running tests, and generating reports.
- Implemented new test files for end-to-end testing and integration testing, ensuring compatibility with ZScream logic and validating overworld data integrity.
- Enhanced the Overworld class with additional methods for expanded tile and entrance handling, improving test coverage and functionality.
This commit is contained in:
scawful
2025-09-28 21:47:22 -04:00
parent 18c739d630
commit c1902687c5
7 changed files with 2173 additions and 214 deletions

419
scripts/run_overworld_tests.sh Executable file
View File

@@ -0,0 +1,419 @@
#!/bin/bash
# =============================================================================
# YAZE Overworld Comprehensive Test Runner
# =============================================================================
#
# This script orchestrates the complete overworld testing workflow:
# 1. Builds the golden data extractor tool
# 2. Extracts golden data from vanilla and modified ROMs
# 3. Runs unit tests, integration tests, and E2E tests
# 4. Generates comprehensive test reports
# 5. Validates before/after edit states
#
# Usage: ./scripts/run_overworld_tests.sh [rom_path] [options]
#
# Options:
# --skip-build Skip building the golden data extractor
# --skip-golden-data Skip golden data extraction
# --skip-unit-tests Skip unit tests
# --skip-integration Skip integration tests
# --skip-e2e Skip E2E tests
# --generate-report Generate detailed test report
# --cleanup Clean up test files after completion
# =============================================================================
set -e # Exit on any error
# Configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
BUILD_DIR="$PROJECT_ROOT/build"
BIN_DIR="$BUILD_DIR/bin"
TEST_DIR="$PROJECT_ROOT/test"
# Default values
ROM_PATH=""
SKIP_BUILD=false
SKIP_GOLDEN_DATA=false
SKIP_UNIT_TESTS=false
SKIP_INTEGRATION=false
SKIP_E2E=false
GENERATE_REPORT=false
CLEANUP=false
# Test results
UNIT_TEST_RESULTS=""
INTEGRATION_TEST_RESULTS=""
E2E_TEST_RESULTS=""
GOLDEN_DATA_STATUS=""
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Helper functions
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
show_usage() {
cat << EOF
Usage: $0 [rom_path] [options]
Arguments:
rom_path Path to the ROM file to test with
Options:
--skip-build Skip building the golden data extractor
--skip-golden-data Skip golden data extraction
--skip-unit-tests Skip unit tests
--skip-integration Skip integration tests
--skip-e2e Skip E2E tests
--generate-report Generate detailed test report
--cleanup Clean up test files after completion
Examples:
$0 zelda3.sfc
$0 zelda3.sfc --generate-report --cleanup
$0 /path/to/rom.sfc --skip-unit-tests
EOF
}
parse_args() {
while [[ $# -gt 0 ]]; do
case $1 in
--skip-build)
SKIP_BUILD=true
shift
;;
--skip-golden-data)
SKIP_GOLDEN_DATA=true
shift
;;
--skip-unit-tests)
SKIP_UNIT_TESTS=true
shift
;;
--skip-integration)
SKIP_INTEGRATION=true
shift
;;
--skip-e2e)
SKIP_E2E=true
shift
;;
--generate-report)
GENERATE_REPORT=true
shift
;;
--cleanup)
CLEANUP=true
shift
;;
--help|-h)
show_usage
exit 0
;;
-*)
log_error "Unknown option: $1"
show_usage
exit 1
;;
*)
if [[ -z "$ROM_PATH" ]]; then
ROM_PATH="$1"
else
log_error "Multiple ROM paths specified"
exit 1
fi
shift
;;
esac
done
}
check_prerequisites() {
log_info "Checking prerequisites..."
# Check if we're in the right directory
if [[ ! -f "$PROJECT_ROOT/CMakeLists.txt" ]]; then
log_error "Not in YAZE project root directory"
exit 1
fi
# Check if build directory exists
if [[ ! -d "$BUILD_DIR" ]]; then
log_warning "Build directory not found. Run 'cmake --build build' first."
exit 1
fi
# Check if ROM path is provided
if [[ -z "$ROM_PATH" ]]; then
log_error "ROM path is required"
show_usage
exit 1
fi
# Check if ROM file exists
if [[ ! -f "$ROM_PATH" ]]; then
log_error "ROM file not found: $ROM_PATH"
exit 1
fi
log_success "Prerequisites check passed"
}
build_golden_data_extractor() {
if [[ "$SKIP_BUILD" == true ]]; then
log_info "Skipping golden data extractor build"
return
fi
log_info "Building golden data extractor..."
cd "$PROJECT_ROOT"
# Build the golden data extractor
if cmake --build "$BUILD_DIR" --target overworld_golden_data_extractor; then
log_success "Golden data extractor built successfully"
else
log_error "Failed to build golden data extractor"
exit 1
fi
}
extract_golden_data() {
if [[ "$SKIP_GOLDEN_DATA" == true ]]; then
log_info "Skipping golden data extraction"
return
fi
log_info "Extracting golden data from ROM..."
local golden_data_file="$TEST_DIR/golden_data/$(basename "$ROM_PATH" .sfc)_golden_data.h"
# Create golden data directory if it doesn't exist
mkdir -p "$(dirname "$golden_data_file")"
# Run the golden data extractor
if "$BIN_DIR/overworld_golden_data_extractor" "$ROM_PATH" "$golden_data_file"; then
log_success "Golden data extracted to: $golden_data_file"
GOLDEN_DATA_STATUS="SUCCESS: $golden_data_file"
else
log_error "Failed to extract golden data"
GOLDEN_DATA_STATUS="FAILED"
return 1
fi
}
run_unit_tests() {
if [[ "$SKIP_UNIT_TESTS" == true ]]; then
log_info "Skipping unit tests"
return
fi
log_info "Running unit tests..."
cd "$PROJECT_ROOT"
# Set environment variable for ROM path
export YAZE_TEST_ROM_PATH="$ROM_PATH"
# Run unit tests
if ctest --test-dir "$BUILD_DIR" --output-on-failure --verbose \
--tests-regex "overworld.*test|extract.*vanilla.*values"; then
log_success "Unit tests passed"
UNIT_TEST_RESULTS="PASSED"
else
log_error "Unit tests failed"
UNIT_TEST_RESULTS="FAILED"
return 1
fi
}
run_integration_tests() {
if [[ "$SKIP_INTEGRATION" == true ]]; then
log_info "Skipping integration tests"
return
fi
log_info "Running integration tests..."
cd "$PROJECT_ROOT"
# Set environment variable for ROM path
export YAZE_TEST_ROM_PATH="$ROM_PATH"
# Run integration tests
if ctest --test-dir "$BUILD_DIR" --output-on-failure --verbose \
--tests-regex "overworld.*integration"; then
log_success "Integration tests passed"
INTEGRATION_TEST_RESULTS="PASSED"
else
log_error "Integration tests failed"
INTEGRATION_TEST_RESULTS="FAILED"
return 1
fi
}
run_e2e_tests() {
if [[ "$SKIP_E2E" == true ]]; then
log_info "Skipping E2E tests"
return
fi
log_info "Running E2E tests..."
cd "$PROJECT_ROOT"
# Set environment variable for ROM path
export YAZE_TEST_ROM_PATH="$ROM_PATH"
# Run E2E tests
if ctest --test-dir "$BUILD_DIR" --output-on-failure --verbose \
--tests-regex "overworld.*e2e"; then
log_success "E2E tests passed"
E2E_TEST_RESULTS="PASSED"
else
log_error "E2E tests failed"
E2E_TEST_RESULTS="FAILED"
return 1
fi
}
generate_test_report() {
if [[ "$GENERATE_REPORT" != true ]]; then
return
fi
log_info "Generating test report..."
local report_file="$TEST_DIR/reports/overworld_test_report_$(date +%Y%m%d_%H%M%S).md"
# Create reports directory if it doesn't exist
mkdir -p "$(dirname "$report_file")"
cat > "$report_file" << EOF
# YAZE Overworld Test Report
**Generated:** $(date)
**ROM:** $ROM_PATH
**ROM Size:** $(stat -f%z "$ROM_PATH" 2>/dev/null || stat -c%s "$ROM_PATH") bytes
## Test Results Summary
| Test Category | Status | Details |
|---------------|--------|---------|
| Golden Data Extraction | $GOLDEN_DATA_STATUS | |
| Unit Tests | $UNIT_TEST_RESULTS | |
| Integration Tests | $INTEGRATION_TEST_RESULTS | |
| E2E Tests | $E2E_TEST_RESULTS | |
## Test Configuration
- Skip Build: $SKIP_BUILD
- Skip Golden Data: $SKIP_GOLDEN_DATA
- Skip Unit Tests: $SKIP_UNIT_TESTS
- Skip Integration: $SKIP_INTEGRATION
- Skip E2E: $SKIP_E2E
- Generate Report: $GENERATE_REPORT
- Cleanup: $CLEANUP
## ROM Information
EOF
# Add ROM header information if available
if command -v hexdump >/dev/null 2>&1; then
echo "### ROM Header" >> "$report_file"
echo '```' >> "$report_file"
hexdump -C "$ROM_PATH" | head -20 >> "$report_file"
echo '```' >> "$report_file"
fi
echo "" >> "$report_file"
echo "## Next Steps" >> "$report_file"
echo "" >> "$report_file"
echo "1. Review test results above" >> "$report_file"
echo "2. If tests failed, check the logs for details" >> "$report_file"
echo "3. Run individual test categories for debugging" >> "$report_file"
echo "4. Update golden data if ROM changes are expected" >> "$report_file"
log_success "Test report generated: $report_file"
}
cleanup_test_files() {
if [[ "$CLEANUP" != true ]]; then
return
fi
log_info "Cleaning up test files..."
# Remove test ROMs created during testing
find "$TEST_DIR" -name "test_*.sfc" -type f -delete 2>/dev/null || true
# Remove temporary golden data files
find "$TEST_DIR" -name "*_golden_data.h" -type f -delete 2>/dev/null || true
log_success "Test files cleaned up"
}
main() {
log_info "Starting YAZE Overworld Comprehensive Test Suite"
log_info "ROM Path: $ROM_PATH"
# Parse command line arguments
parse_args "$@"
# Check prerequisites
check_prerequisites
# Build golden data extractor
build_golden_data_extractor
# Extract golden data
extract_golden_data
# Run tests
run_unit_tests
run_integration_tests
run_e2e_tests
# Generate report
generate_test_report
# Cleanup
cleanup_test_files
# Final status
log_info "Test suite completed"
if [[ "$UNIT_TEST_RESULTS" == "PASSED" &&
"$INTEGRATION_TEST_RESULTS" == "PASSED" &&
"$E2E_TEST_RESULTS" == "PASSED" ]]; then
log_success "All tests passed!"
exit 0
else
log_error "Some tests failed. Check the results above."
exit 1
fi
}
# Run main function with all arguments
main "$@"