This document provides a complete checklist of tests to perform before each release to prevent regressions.
-
Clean Install
- Remove any existing DevTools installation
- Delete
appdata/devtools_presets.txtif it exists - Start with a fresh Anomaly installation or MO2 profile
-
Test Save
- Have a save file ready in the Zone (not main menu)
- Preferably in a location with NPCs for AI-related testing
- Download the release zip
- In MO2: Click "Install Mod" → Select zip
- Verify MO2 extracts correctly (no nested folders)
- Enable mod in load order
- Launch game → Verify no crashes on main menu
- Extract zip manually
- Copy
gamedatafolder contents to Anomaly'sgamedata - Launch game → Verify no crashes on main menu
- Press F1 (or Ins) to open ImGui menu
- Navigate to DevTools menu
- Click Profiler → Window opens
- Click Logs → Window opens
- Both windows can be moved and resized
- Windows remember position after closing/reopening
- "Start Profiling" button visible
- "Module Browser" section expandable
- "Presets" section expandable
- "Flamegraph" section expandable
- Stats table area visible (empty initially)
- Expand "Module Browser"
- Click "Refresh" or wait for auto-discovery
- Verify module list populates (should see 100+ modules)
- Scroll through list → No crashes
- Type "actor" in search box
- Verify list filters to show only matching modules
- Clear search → Full list returns
- Type nonsense (e.g., "xyzabc") → List shows no results
- Check a single module checkbox (e.g.,
bind_stalker) - Verify it appears in "Selected Modules" count
- Click "Select All" (when no filter) → All modules selected
- Click "Deselect All" → All modules deselected
- Apply filter "bind_" → Click "Select Filtered" → Only filtered modules selected
- Select 3-5 modules (e.g.,
bind_stalker,axr_main,ui_inventory) - Click "Start Profiling"
- Button changes to "Stop Profiling"
- Play the game for 10-15 seconds (move around, open inventory)
- Stats table populates with function names and timing data
- Click "Stop Profiling"
- Stats stop updating (verify by waiting 5 seconds)
- Button returns to "Start Profiling"
- While profiling, verify columns show:
- Function name (format:
module.function) - Call count (increasing)
- Avg ms (reasonable values, not 0 or astronomical)
- Min/Max ms
- Total ms
- Function name (format:
- Sort by "Total ms" → Highest consumers at top
- Sort by "Calls" → Most called functions at top
- Stop profiling
- Start profiling again
- Verify stats reset and begin collecting fresh data
- No crashes or duplicate entries
- Check "Timed" checkbox next to Start button
- Enter duration (e.g., "5" seconds)
- Click "Start Profiling"
- Verify countdown timer shows "Auto-stop in X.Xs"
- Wait for timer to expire
- Verify profiling stops automatically
- Verify console shows "[DEVTOOLS] Timed profiling auto-stopped after 5s"
- Enable timed profiling with 30 seconds
- Start profiling
- Click "Stop Profiling" before timer expires
- Verify profiling stops immediately
- Verify timed mode checkbox is unchecked
- Select ALL modules and start profiling
- Wait for stats to populate (100+ functions)
- Click "50" button → Verify only 50 rows shown
- Click "100" button → Verify only 100 rows shown
- Click "200" button → Verify only 200 rows shown
- Click "All" button → Verify all rows shown
- Summary text shows "(showing top X)" when limited
- Start profiling with multiple modules
- Check "Minimal mode" checkbox
- Verify stats table is hidden
- Verify "(Minimal mode - table hidden for performance)" message appears
- Verify FPS is noticeably higher (~50 vs ~22)
- Uncheck "Minimal mode" → Table returns
- Start profiling
- Verify only 5 columns visible: Function, Calls, Avg, Max, Total
- Check "Show all columns"
- Verify 6 columns now visible (includes "Min" column)
- Uncheck → Min column hidden again
- Select 5+ modules
- In Presets section, type name:
test_preset - Click "Save"
- Verify preset appears in preset list
- Click "Deselect All" in Module Browser
- Click on
test_presetin preset list - Verify the same 5+ modules are now selected
- Click delete button (X) next to
test_preset - Verify preset is removed from list
- Re-save it for later tests
- Save a preset
- Quit game completely
- Restart game, load save
- Open Profiler → Verify preset still exists
- Select modules to profile
- Check "Profile on Load" checkbox
- Verify
_AUTOLOAD_preset is created/updated - Quit game
- Start game
- Load save (or start new game)
- Open Profiler window
- Verify profiling is already running (button shows "Stop Profiling")
- Verify stats are being collected
- Uncheck "Profile on Load"
- Quit and restart game
- Load save
- Open Profiler → Profiling should NOT be running
- Start profiling with several modules
- Expand "Flamegraph" section
- Click "Start Recording"
- Play game for 30+ seconds (do various actions)
- Click "Stop Recording"
- Verify "Samples: X" shows non-zero count
- Click "Export Flamegraph"
- Check
appdatafolder for.foldedfile - Open file in text editor → Verify format:
stack;frames count - File should have meaningful stack traces (not empty)
- Profile
axr_mainmodule - Record flamegraph during game activity
- Export and examine
.foldedfile - Verify callbacks show specific names like:
axr_main.make_callback/on_game_startaxr_main.make_callback/actor_on_update- (Not just generic
axr_main.make_callback)
- Do NOT enable flamegraph collection
- Verify "Export Flamegraph" button is grayed out
- Verify "(enable collection first)" hint shows
- Enable "Collect Data" checkbox
- Start and stop profiling (collect some data)
- Disable "Collect Data" checkbox
- Verify "Export Flamegraph" button is STILL enabled (has data to export)
- Click Export → Verify it works
- After export, verify button becomes grayed out again (data cleared)
- Click "Clear" button
- Verify samples count resets to 0
- Profile for 30+ seconds with stats accumulated
- Click "Export CSV"
- Check
appdatafolder for.csvfile - Open in Excel/text editor → Verify:
- Header row with column names
- Data rows with function stats
- No corrupted characters
- Click Logs in DevTools menu
- Log viewer window opens
- Default logs visible (system messages)
- Filter by severity (DEBUG, INFO, WARN, ERROR)
- Filter by category
- Clear filters → All logs visible
- Open game console (
~key) - Execute:
devtools_logging.log("INFO", "TEST", "Hello World") - Verify message appears in log viewer
- Open game console
- Execute:
devtools_profiler.start_timer("test_section") - Wait 2 seconds
- Execute:
devtools_profiler.end_timer("test_section") - Execute:
devtools_profiler.get_stats("test_section") - Verify output shows ~2000ms total time
- Profile several modules for 10 seconds
- Stop profiling
- Execute:
devtools_profiler.get_stats() - Verify summary prints (no crash, shows tracked function count)
- Select 50+ modules
- Start profiling
- Play for 30 seconds
- No stack overflow errors
- Stop profiling cleanly
- Click Start/Stop rapidly 10 times
- No crashes or stuck states
- Enable "Profile on Load"
- Travel to another level (via guide or walking)
- After load, verify profiling continues
- Stats reflect new level activity
- Start profiling
- Quicksave (F5)
- Continue profiling (no crash)
- Quickload (F9)
- Verify profiler state is consistent
- Add
_gandaxr_mainto preset - Enable "Profile on Load"
- Restart game and load save
- Check exported flamegraph for:
_g.start_game_callbackentriesaxr_main.on_game_startentries
- These indicate early script capture is working