423 lines
11 KiB
Bash
Executable File
423 lines
11 KiB
Bash
Executable File
#!/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 roms/alttp_vanilla.sfc
|
|
$0 roms/alttp_vanilla.sfc --generate-report --cleanup
|
|
$0 /path/to/alttp_vanilla.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_VANILLA="$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_VANILLA="$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_VANILLA="$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 "$@"
|