# Testing Guide This guide covers the testing framework for YAZE, including test organization, execution, and the GUI automation system. --- ## Test Organization Tests are organized by purpose and dependencies: ``` test/ ├── unit/ # Isolated component tests │ ├── core/ # Core functionality (asar, hex utils) │ ├── cli/ # Command-line interface tests │ ├── emu/ # Emulator component tests │ ├── gfx/ # Graphics system (tiles, palettes) │ ├── gui/ # GUI widget tests │ ├── rom/ # ROM data structure tests │ └── zelda3/ # Game-specific logic tests ├── integration/ # Component interaction tests │ ├── ai/ # AI agent tests │ ├── editor/ # Editor integration tests │ └── zelda3/ # ROM-dependent integration tests ├── e2e/ # End-to-end GUI workflow tests │ ├── rom_dependent/ # E2E tests requiring a ROM │ └── zscustomoverworld/ # ZSCustomOverworld upgrade tests ├── benchmarks/ # Performance benchmarks ├── mocks/ # Mock objects └── assets/ # Test data and patches ``` --- ## Test Categories | Category | Purpose | Dependencies | Speed | |----------|---------|--------------|-------| | **Unit** | Test individual classes/functions | None | Fast | | **Integration** | Test component interactions | May require ROM | Medium | | **E2E** | Simulate user workflows | GUI + ROM | Slow | | **Benchmarks** | Measure performance | None | Variable | **ROM policy**: GitHub CI does not run ROM-dependent tests. Run them locally with `YAZE_ENABLE_ROM_TESTS=ON` and `YAZE_TEST_ROM_*` paths. Use `YAZE_SKIP_ROM_TESTS=1` to force-skip ROM suites. ### Unit Tests Fast, isolated tests with no external dependencies. Run in CI on every commit. ### Integration Tests Test module interactions (e.g., `asar` wrapper with `Rom` class). Some require a ROM file. ### E2E Tests GUI-driven tests using ImGui Test Engine. Validate complete user workflows. ### Benchmarks Performance measurement for critical paths. Run manually or in specialized CI jobs. --- ## Running Tests > See the [Build and Test Quick Reference](../build/quick-reference.md) for full command reference. ### Using yaze_test Executable ```bash # Build cmake --build build --target yaze_test # Run all tests ./build/bin/yaze_test # Run by category ./build/bin/yaze_test --unit ./build/bin/yaze_test --integration ./build/bin/yaze_test --e2e --show-gui # Run ROM-dependent tests ./build/bin/yaze_test --rom-dependent --rom-vanilla /path/to/alttp_vanilla.sfc # Run by pattern ./build/bin/yaze_test "*Asar*" # Show all options ./build/bin/yaze_test --help ``` ### Using CTest ```bash # Configure with ROM tests cmake --preset mac-dev -DYAZE_TEST_ROM_VANILLA_PATH=/path/to/alttp_vanilla.sfc # Build cmake --build --preset mac-dev --target yaze_test # Run tests ctest --preset dev # Stable tests ctest --preset all # All tests ``` ROM-dependent CTest suites are local-only and will be skipped when ROMs are not configured. --- ## Writing Tests Place tests based on their purpose: | Test Type | File Location | |-----------|---------------| | Unit test for `MyClass` | `test/unit/my_class_test.cc` | | Integration with ROM | `test/integration/my_class_rom_test.cc` | | UI workflow test | `test/e2e/my_class_workflow_test.cc` | --- ## E2E GUI Testing The E2E framework uses ImGui Test Engine for UI automation. ### Key Files | File | Purpose | |------|---------| | `test/yaze_test.cc` | Main test runner with GUI initialization | | `test/e2e/framework_smoke_test.cc` | Infrastructure verification | | `test/e2e/canvas_selection_test.cc` | Canvas interaction tests | | `test/e2e/dungeon_editor_tests.cc` | Dungeon editor UI tests | | `test/test_utils.h` | Helper functions (LoadRomInTest, OpenEditorInTest) | ### Running GUI Tests ```bash # Run all E2E tests with visible GUI ./build/bin/yaze_test --e2e --show-gui # Run specific test ./build/bin/yaze_test --show-gui --gtest_filter="*DungeonEditorSmokeTest" ``` ### AI Integration UI elements are registered with stable IDs for programmatic access via `z3ed`: - `z3ed gui discover` - List available widgets - `z3ed gui click` - Interact with widgets - `z3ed agent test replay` - Replay recorded tests See the [z3ed CLI Guide](../usage/z3ed-cli.md) for more details.