| name | lorcana-test-generation |
| description | Generate basic happy-path tests for Lorcana card abilities. Tests verify ability behavior only - NO property validation tests. Use when implementing or updating card tests. Effects are tested separately in the engine. |
Lorcana Test Generation
Generate test files for Lorcana card definitions using LorcanaTestEngine.
When to Use
- User requests to generate tests for a card
- After card migration is complete
- User wants to update existing tests
- User asks to test a specific ability
Process
Input
Card File: Path to card definition (e.g., src/cards/001/characters/007-heihei-boat-snack.ts)
Workflow
Read Card Definition
- Load card file from
src/cards/001/ - Extract abilities array
- Load card file from
Identify Ability Types
- Keyword: Simple presence check
- Triggered: When/whenever triggers
- Activated: Cost → effect abilities
- Static: Continuous effects
Generate Tests (Interactive)
- For each ability: show template, ask for confirmation
- User can: generate, skip, or customize
- Compile confirmed tests into single file
Write Test File
- Create at same location as card:
{file}.test.ts - Use
LorcanaTestEngineandPLAYER_ONEfrom@tcg/lorcana/testing
- Create at same location as card:
Test Templates
Keyword Test
it("has [Keyword] keyword", () => {
const testEngine = new LorcanaTestEngine({ play: [cardUnderTest] });
const card = testEngine.getCardModel(cardUnderTest);
expect(card.hasKeyword()).toBe(true);
});
Triggered Test (When You Play)
it("triggers effect when played", () => {
const testEngine = new LorcanaTestEngine({ hand: [cardUnderTest] });
const before = testEngine.getZone("hand", PLAYER_ONE).length;
testEngine.playCard(cardUnderTest.id);
const after = testEngine.getZone("hand", PLAYER_ONE).length;
expect(after).toBe(before + 1); // Drew 1, played 1
});
Activated Test
it("activates ability when cost is paid", () => {
const testEngine = new LorcanaTestEngine({ play: [cardUnderTest] });
// Exert to activate
testEngine.quest(cardUnderTest.id);
const state = testEngine.getCardMeta(cardUnderTest.id);
expect(state?.state).toBe("exerted");
});
What NOT to Test
Do NOT test property values (cost, strength, willpower, lore, cardNumber, etc.) - these are data, not behavior.
Output Format
Test Generation Complete
========================
Card: [Name] - [Version]
File: src/cards/001/characters/xxx-name.test.ts
Tests Generated: X
- Keywords: Y
- Triggered: Z
- Activated: W
- Skipped: V
Run Tests: bun test src/cards/001/characters/xxx-name.test.ts
Example Session
> write-card-test 007-heihei-boat-snack
Reading card: src/cards/001/characters/007-heihei-boat-snack.ts
Found 1 ability
[Ability 1/1: Keyword - Support]
Test: hasSupport() verification
Generate test? (yes/no/customize) yes
✓ Test file created
File: src/cards/001/characters/007-heihei-boat-snack.test.ts
Run: bun test src/cards/001/characters/007-heihei-boat-snack.test.ts
Completion Report
Test Generation: Complete
========================
File: src/cards/001/characters/xxx-name.test.ts
Tests: X generated
Next Steps:
- Run: bun test src/cards/001/characters/xxx-name.test.ts
- Verify all tests pass
- Commit changes