# Lorcana Test Generation

> 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.

- Skill: `majiayu000/lorcana-test-generation` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds add majiayu000/lorcana-test-generation`
- Raw SKILL.md: https://api.skillmd.com/api/skills/majiayu000/lorcana-test-generation/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: majiayu000 (https://skillmd.com/u/majiayu000)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/majiayu000/lorcana-test-generation

---


# 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

1. **Read Card Definition**
   - Load card file from `src/cards/001/`
   - Extract abilities array

2. **Identify Ability Types**
   - Keyword: Simple presence check
   - Triggered: When/whenever triggers
   - Activated: Cost → effect abilities
   - Static: Continuous effects

3. **Generate Tests (Interactive)**
   - For each ability: show template, ask for confirmation
   - User can: generate, skip, or customize
   - Compile confirmed tests into single file

4. **Write Test File**
   - Create at same location as card: `{file}.test.ts`
   - Use `LorcanaTestEngine` and `PLAYER_ONE` from `@tcg/lorcana/testing`

## Test Templates

### Keyword Test
```typescript
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)
```typescript
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
```typescript
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
```

