Claude-skill-registry-data 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.

install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry-data
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry-data "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/lorcana-test-generation" ~/.claude/skills/majiayu000-claude-skill-registry-data-lorcana-test-generation && rm -rf "$T"
manifest: data/lorcana-test-generation/SKILL.md
source content

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

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