✅ Sirens call moves exhausted at end of phase
| Category | Interaction |
| Status | Passing |
| Test | tests/test_abilities_complex.py::TestSitriSirensCall::test_sirens_call_moves_exhausted_at_end_of_phase |
Sitri uses Siren's Call, then the main phase ends.
Preconditions
-
P1 Main Phase, P1 has 3 AP
-
Lane 1: P1's Sitri (#092) — READIED
-
Lane 2: P1's Murmur (#002) — EXHAUSTED
-
Lane 0: P2's Duban (#001) — EXHAUSTED
Action
-
Sitri uses Siren's Call (1 AP, exhaust) at lane 1
-
end_main_phase resolves
from engine.abilities import execute_ability
from engine.turn_sequence import end_main_phase
sitri = make_demon("092", lane=1, owner=Side.PLAYER_1)
murmur = make_demon("002", lane=2, owner=Side.PLAYER_1, state=DemonState.EXHAUSTED)
duban = make_demon("001", lane=0, owner=Side.PLAYER_2, state=DemonState.EXHAUSTED)
state, placed = _make_state_with_demons(sitri, murmur, duban, ap=3)
sitri_p, murmur_p, duban_p = placed
# Step 1: Sitri uses Siren's Call
state = execute_ability(state, sitri_p, ability_idx=1)
# Step 2: End main phase
result = end_main_phase(state, Side.PLAYER_1)
murmur_after = next(d for d in result.demons if d.unit_id == "002")
duban_after = next(d for d in result.demons if d.unit_id == "001")
Expected Postconditions
-
Murmur: lane 1 (moved from 2 to Sitri's lane)
-
Duban: lane 1 (moved from 0 to Sitri's lane)
-
Sitri: lane 1 (already there, exhausted from Siren's Call)
Assertions
assert murmur_after.lane == 1, (
f"Exhausted Murmur should move to Sitri's lane (1). Got {murmur_after.lane}"
)
assert duban_after.lane == 1, (
f"Exhausted Duban should move to Sitri's lane (1). Got {duban_after.lane}"
)