Skip to main content

✅ Familiar returns to deck on death

CategoryAbility
StatusPassing
Testtests/test_abilities_familiars.py::test_familiar_returns_to_deck_on_death

Regression: Familiars return to familiar_deck on death, not graveyard.

Preconditions

  • P1 owns Alecto (026_1) on the field in lane 0.

  • P1's familiar_deck does NOT contain "026_1" (it is in play).

  • P1's graveyard is empty.

  • P1's CP = 0.

  • Alecto has HP 7, damage 7 (fatally wounded).

Action

  • resolve_fatally_wounded(state, alecto)
state = make_game_state()
state.players[Side.PLAYER_1].familiar_deck = []
state.players[Side.PLAYER_1].cp = 0

alecto = make_familiar_demon("026_1", lane=0, owner=Side.PLAYER_1, damage=7)
state = place_demon(state, alecto)
alecto = state.demons[-1]

# Verify Alecto is fatally wounded

Expected Postconditions

  • Alecto removed from field.

  • "026_1" added to P1's familiar_deck.

  • "026_1" NOT in P1's graveyard.

  • P1 gains CP = 2 (Alecto's CP value).

Assertions

assert check_fatally_wounded(state, alecto), "Alecto should be fatally wounded (damage >= hp)."

new_state = resolve_fatally_wounded(state, alecto)

# Removed from field
assert all(d.unit_id != "026_1" for d in new_state.demons), \
"Alecto must not be on field after resolve_fatally_wounded."

# In familiar_deck
assert "026_1" in new_state.players[Side.PLAYER_1].familiar_deck, \
"Alecto should be in familiar_deck after death (not graveyard)."

# NOT in graveyard
assert "026_1" not in new_state.players[Side.PLAYER_1].graveyard, \
"Alecto must NOT be in graveyard — familiars go to familiar_deck."

# P1 gains CP = 2 (Alecto's cp value from FAMILIARS)
alecto_data = FAMILIARS["026_1"]
assert new_state.players[Side.PLAYER_1].cp == alecto_data.cp, (
f"P1 should gain CP = {alecto_data.cp} when Alecto dies. "
f"Got {new_state.players[Side.PLAYER_1].cp}."
)