✅ Familiar returns to deck on death
| Category | Ability |
| Status | Passing |
| Test | tests/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}."
)