491a45dd43
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.1 KiB
3.1 KiB
name, description, argument-hint, disable-model-invocation
| name | description | argument-hint | disable-model-invocation |
|---|---|---|---|
| tdd | Test-Driven Development loop — write a failing test first, then the minimum code to pass it, then refactor. Repeat. | [feature description or function signature] | true |
Build the following using strict Test-Driven Development:
Feature: $ARGUMENTS
The TDD Cycle
Repeat this cycle for each behavior. Never skip steps.
Red: Write a Failing Test
- Write ONE test for the smallest next behavior (not the whole feature)
- The test must:
- Describe the behavior in its name:
should return 0 for empty cart - Use Arrange-Act-Assert structure
- Assert specific values, not vague truths
- Describe the behavior in its name:
- Run the test. It MUST fail. If it passes, either:
- The behavior already exists (skip to the next behavior)
- The test is wrong (it's not testing what you think — fix it)
- Verify the failure message makes sense — it should tell you what's missing
Green: Write the Minimum Code to Pass
- Write the simplest, most obvious code that makes the failing test pass
- Don't generalize. Don't make it elegant. Don't handle cases the test doesn't cover.
- Hardcoding is fine if only one test exists for that path — the next test will force generalization
- Run the test. It MUST pass. If it doesn't, fix the code (not the test — the test defined the behavior)
- Run ALL tests. Nothing previously passing should break.
Refactor: Clean Up Without Changing Behavior
- Look for: duplication, unclear names, functions doing too much, magic values
- Make ONE improvement at a time
- Run ALL tests after each change. If anything breaks, undo immediately.
- Stop refactoring when the code is clean enough — don't gold-plate
Choosing What to Test Next
Work from simple to complex:
- Degenerate cases — null input, empty collection, zero
- Happy path — the simplest valid input
- Variations — different valid inputs that exercise different branches
- Edge cases — boundary values, max sizes, special characters
- Error cases — invalid input, failures, exceptions
- Integration — how this connects to the rest of the system
Each test should require a small code change. If you need to write more than ~10 lines of production code to pass a test, the test is too big — split it.
Rules
- Never write production code without a failing test that demands it.
- Never write more than one failing test at a time. One red → green → refactor cycle at a time.
- The test drives the design. If the code is hard to test, the design is wrong — change the design, not the test approach.
- Don't mock what you own. If you need to mock your own code to test it, the code needs restructuring.
- Commit after each green+refactor cycle. Small, passing, meaningful commits.
Output
After each cycle, briefly state:
- Test: what behavior was added
- Code: what changed to make it pass
- Refactor: what was cleaned up (or "none needed")
When the feature is complete, provide a summary of all behaviors covered and any gaps that would need integration or manual testing.