Skip to main content

✅ Sirens call moves exhausted at end of phase

CategoryInteraction
StatusPassing
Testtests/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

  1. Sitri uses Siren's Call (1 AP, exhaust) at lane 1

  2. 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}"
)