Skip to content

Close two holes in the test guards - #960

Merged
saworbit merged 2 commits into
mainfrom
batch/tests-fixes
Oct 5, 2026
Merged

saworbit merged 2 commits into
mainfrom
batch/tests-fixes

Conversation

@saworbit

@saworbit saworbit commented Oct 4, 2026

Copy link
Copy Markdown
Owner

Summary

Two holes in the test guards, both P3.

  • tests/test_level_root_shims.gd reads a script built from source only when it is one """ block. It now refuses any other form. The two stand-ins that hid as joined strings, in the validation and entity I/O vocabulary tests, now use the real LevelRoot. Four other built scripts moved into blocks; the NavigationMesh mock in the bake tests builds its source from the caller's names, so it carries the marker. The tooltip stub uses follow_grid in place of grid_snap, which is a level setting.
  • tests/test_vibe_scenarios_load.gd now reads each root.name( and root.member.name( call in the vibe harness and asks a real level whether it has that name. Renaming validate_convexity at geometry.gd:76 fails it and names the file, line and method. GUT time is about 4s.

The new check found two scenarios that had stopped asking their question behind a has_method or has_signal check:

  • build-outdoors called root.create_default_spawn(), which lives on the spawn system, and looked for the spawn by a meta a DraftEntity does not carry. It now makes one and finds it with get_active_spawn().
  • save-as listened for hflevel_saved, which is hflevel_save_completed now. It counted no saves, so its check could never fire. It now counts three against three files.

Before / After Behavior

  • Before: a stand-in joined with + passed the guard, and a renamed level method in a scenario passed CI.
  • After: both fail CI and say where.

Related Issue

Fixes #957
Fixes #958

Checks

  • python tools/run_local_checks.py passes (21 passed, 4 not run here)
  • Each changed test file passes alone with -gselect, and the leak gate is clean on those logs
  • python tools/vibe/run_vibe.py build-outdoors save-as is clean before and after
  • run_vibe.py --selftest passes
  • CHANGELOG, CONTRIBUTING, DEVELOPMENT and the vibe README updated
  • git diff --check is clean

The stand-in guard reads only """ blocks, so two LevelRoot stand-ins joined with + passed all three rules. Both tests now use the real LevelRoot. Fixes #957.
A scenario's root is a Node3D and most systems are untyped, so loading the scripts could not see a renamed method. The check also found build-outdoors and save-as skipping their own question behind a has_method or has_signal check. Fixes #958.
@saworbit
saworbit enabled auto-merge (squash) October 4, 2026 23:56
@github-actions github-actions Bot added area: docs README, guides, spec, roadmap, changelog ci Workflows, contributor tooling, dependency pins tests The GUT suite and its fixtures labels Oct 4, 2026
@saworbit
saworbit merged commit 2691037 into main Oct 5, 2026
9 checks passed
@saworbit
saworbit deleted the batch/tests-fixes branch October 5, 2026 00:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: docs README, guides, spec, roadmap, changelog ci Workflows, contributor tooling, dependency pins tests The GUT suite and its fixtures

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[CI] Catch a vibe scenario calling a removed subsystem method [Tests] The stand-in guard cannot see a script built from joined strings

1 participant