Files
Claude-Code-Game-Studios/CCGS Skill Testing Framework/skills/utility/test-helpers.md
T
DonchitosandClaude Opus 5.5 b21fa0f7f2 Release 1.1.2 — the default path works end to end
Fix release for 1.1.1: the minimal path end to end, engine commands that
run on Godot, Unity and Unreal, hook warnings you can see, and verdicts
that say when they could not check. Details in CHANGELOG.md; upgrade
steps in UPGRADING.md (v1.1.1 → v1.1.2).

Fixes #67
Fixes #131

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WuJn2FdynEybfL5KC697nJ
2026-09-29 21:32:19 +10:00

225 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Skill Test Spec: /test-helpers
## Skill Summary
`/test-helpers [system-name | all | scaffold]` generates test helper files in
the engine's **helper root** — the only place its test runner compiles them:
`tests/helpers/` on Godot, `Assets/Tests/EditMode/Helpers/` on Unity (inside the
`EditModeTests` assembly), `Source/<Module>/Private/Tests/Helpers/` on Unreal. It
writes base assertion and factory helpers (`scaffold`), and a
`[helper root]/[system]_factory.[ext]` per system built from that system's GDD
(`[system-name]` or `all`). No argument runs `scaffold` when no helpers exist,
else `all`. It reads `engine.name`, `engine.language` and `testing.framework`
from `project.yaml` (falling back to `technical-preferences.md`), samples up to
5 existing test files for house style, and section-greps the GDD (Formulas,
Edge Cases, Detailed Rules/Design) rather than reading it whole.
Helpers must assert through the configured framework's API — never bare
`assert()` — and must not extend the framework's test-suite base class. If the
framework's assertion API cannot be confirmed, the skill says so and generates
no helper. It never overwrites an existing helper: it skips it with a message.
After presenting the file list it asks "May I write these helper files to
`[helper root]`?". No director gates apply. Verdict: COMPLETE when helper files
are created.
---
## Static Assertions (Structural)
Checked against the SKILL.md by `/skill-test spec` — no fixture needed.
- [ ] Has required frontmatter fields: `name`, `description`, `argument-hint`, `user-invocable`, `allowed-tools`
- [ ] Has ≥2 phase headings
- [ ] Contains verdict keyword: COMPLETE
- [ ] Contains "May I write" collaborative protocol language before writing helpers
- [ ] Has a next-step handoff (Next Steps: `/test-setup`, `/dev-story`, `/skill-test`)
---
## Director Gate Checks
None. `/test-helpers` is a scaffolding utility. No director gates apply.
---
## Test Cases
### Case 1: Happy Path — Player helper generated for Godot/GDScript
**Fixture:**
- `project.yaml` has `engine.name: Godot`, `engine.language: GDScript`,
`testing.framework: gdUnit4`; `addons/gdUnit4/` is installed, so its
assertion API can be confirmed from the project
- `tests/unit/player/player_movement_test.gd` exists
- `design/gdd/player.md` has a Formulas section bounding health to 0–100
- No existing files in `tests/helpers/`; the user approves the write
**Input:** `/test-helpers player`
**Expected behavior:**
1. Skill reads engine, language and framework; samples the existing test file
2. Skill greps `design/gdd/player.md` for the Formulas / Edge Cases / Detailed
Rules headings instead of reading it whole
3. Skill drafts `tests/helpers/player_factory.gd`: a `class_name` helper that
`extends RefCounted`, static `make_*` factories with default parameters,
bound constants commented as coming from the GDD, and a header line
"Based on: design/gdd/player.md"
4. Every assertion goes through gdUnit4's confirmed API — no bare `assert()`,
no `FAIL_IF` placeholder
5. Skill presents the file list and asks "May I write these helper files to `tests/helpers/`?"
6. Files written on approval; verdict COMPLETE, followed by the per-engine usage note
**Assertions:**
- [ ] Generated helper is GDScript at `tests/helpers/player_factory.gd`
- [ ] Bound constants trace to the GDD's Formulas section (not invented values)
- [ ] Helper extends `RefCounted`, not the test-suite base class, and uses no Autoload/singleton
- [ ] No bare `assert()` and no unresolved `FAIL_IF` reaches the file
- [ ] Verdict is COMPLETE
---
### Case 2: Engine Not Configured — Stops with /setup-engine
**Fixture:**
- `project.yaml` has no `engine` block; `technical-preferences.md` shows
`[TO BE CONFIGURED]` for Engine
**Input:** `/test-helpers player`
**Expected behavior:**
1. Skill checks `project.yaml`, then `technical-preferences.md` — no engine in either
2. Skill outputs: "Engine not configured. Run `/setup-engine` first."
3. Skill stops — no test scan, no draft, no write
**Assertions:**
- [ ] The message states the engine is not configured
- [ ] `/setup-engine` is named as the prerequisite
- [ ] No write tool is called
- [ ] Verdict is not COMPLETE (nothing was created)
---
### Case 3: Helper Already Exists — Skipped, never overwritten
**Fixture:**
- Godot/GDScript/gdUnit4 configured as in Case 1
- `tests/helpers/game_assertions.gd` already exists with hand-written additions
- `tests/helpers/game_factory.gd` and `tests/helpers/scene_runner_helper.gd` do
not exist; the user approves the write
**Input:** `/test-helpers scaffold`
**Expected behavior:**
1. Skill drafts the Godot base helpers only — `game_assertions.gd`,
`game_factory.gd` and `scene_runner_helper.gd`; no system-specific helpers in
`scaffold` mode
2. Skill asks "May I write these helper files to `tests/helpers/`?"
3. The two missing files, `tests/helpers/game_factory.gd` and
`tests/helpers/scene_runner_helper.gd`, are created
4. For the existing file, skill reports: "Skipping `tests/helpers/game_assertions.gd`
— already exists. Remove the file manually if you want it regenerated."
5. Verdict COMPLETE
**Assertions:**
- [ ] `scaffold` mode generates no `[system]_factory` helper
- [ ] The existing `game_assertions.gd` is left byte-for-byte unchanged
- [ ] The skip message names the existing file and how to regenerate it
- [ ] Only the two missing files are written; Verdict is COMPLETE
---
### Case 4: Framework Assertion API Unconfirmed — No helper generated
**Fixture:**
- `project.yaml` has `engine.name: Godot`, `engine.language: GDScript`;
`testing.framework` is absent and `technical-preferences.md` shows no Framework
- No `addons/gdUnit4/` and no existing test files to learn the API from
**Input:** `/test-helpers scaffold`
**Expected behavior:**
1. Skill cannot confirm which assertion call registers a failure with the runner
2. Skill says so, and generates no helper rather than guessing a form such as
`assert_that`, `assert_eq`, `assert_true` or a bare `assert()`
3. No "May I write" is asked and nothing is written
**Assertions:**
- [ ] The skill states it cannot confirm the framework's assertion API
- [ ] No helper file is written
- [ ] No guessed assertion form (and no `FAIL_IF` placeholder) is presented as ready to write
- [ ] Verdict is not COMPLETE
---
### Case 5: Director Gate Check — No gate; test-helpers is a scaffolding utility
**Fixture:**
- Engine and framework configured as in Case 1, no existing helpers
**Input:** `/test-helpers player`
**Expected behavior:**
1. Skill generates and writes the helper file
2. No director agents are spawned
3. No gate IDs appear in output
**Assertions:**
- [ ] No director gate is invoked
- [ ] No gate skip messages appear
- [ ] Verdict is COMPLETE without any gate check
---
### Case 6: Unity — Helpers under the engine's test root
**Fixture:**
- `project.yaml` has `engine.name: Unity`, `engine.language: C#`,
`testing.framework: NUnit`; `com.unity.test-framework` is in
`Packages/manifest.json`, so NUnit's assertion API can be confirmed from the
installed package
- `/test-setup` has created `Assets/Tests/EditMode/EditModeTests.asmdef`
- No helpers exist yet; the user approves the write
**Input:** `/test-helpers scaffold`
**Expected behavior:**
1. The helper root is `Assets/Tests/EditMode/Helpers/` — inside the
`EditModeTests` assembly, where Unity compiles it
2. Skill drafts `GameAssertions.cs` and `GameFactory.cs` for that folder,
asserting through NUnit's `Assert`
3. Skill asks "May I write these helper files to `Assets/Tests/EditMode/Helpers/`?"
4. Files written on approval; the usage note says to reference the test assembly;
verdict COMPLETE
**Assertions:**
- [ ] Helpers are written under `Assets/Tests/EditMode/Helpers/`
- [ ] Nothing is written under `tests/helpers/` — outside `Assets/`, Unity never compiles it
- [ ] The "May I write" ask names the Unity helper root
- [ ] Verdict is COMPLETE
---
## Protocol Compliance
- [ ] Reads engine, language and test framework before generating any helper
- [ ] Writes helpers only to the engine's helper root (`tests/helpers/`, `Assets/Tests/EditMode/Helpers/` or `Source/<Module>/Private/Tests/Helpers/`)
- [ ] Section-greps the GDD for system helpers (numbered headings such as `## 4. Formulas` included); constants trace to its Formulas section
- [ ] Godot signal asserts keep their flag in a Dictionary the lambda mutates and connect a variadic lambda (`func(...args)`) — a captured `bool` never changes in the caller, and a one-argument lambda fails on any other signal
- [ ] Asserts only through the configured framework — never bare `assert()` — and generates nothing when that API cannot be confirmed
- [ ] Helpers never extend the framework's test-suite base class
- [ ] Never overwrites an existing helper; reports the skip instead
- [ ] Asks "May I write" before any file is created
- [ ] Verdict is COMPLETE when helper files are written
---
## Coverage Notes
- `all` mode (one factory per system with test files) follows Case 1 per system;
not separately tested.
- Unreal helper generation (`Source/<Module>/Private/Tests/Helpers/`) follows
Case 6's pattern for its own helper root; not separately tested. Nor is a
Unity project whose PlayMode tests need the helpers too (the skill asks before
creating a shared `TestHelpers.asmdef`).
- A requested system with no GDD is not tested; the skill does not define that path.