LovecaSim / engine /tests /mechanics /test_order_deck.py
trioskosmos's picture
Upload folder using huggingface_hub
bb3fbf9 verified
import pytest
from engine.game.game_state import GameState, Phase
from engine.models.ability import Effect, EffectType, TargetType
@pytest.fixture
def game_state():
state = GameState()
state.players[0].main_deck = list(range(10)) # [0, 1, 2, ..., 9] (9 is top)
state.phase = Phase.MAIN
state.current_player = 0
return state
def test_shuffle_deck_top_3(game_state):
print("\n--- Testing Shuffle Top 3 ---")
state = game_state
p0 = state.players[0]
# [0, 1, ..., 9] -> 0 is Top
original_deck = p0.main_deck.copy()
# Effect: Order Deck (Shuffle Top 3)
effect = Effect(
effect_type=EffectType.ORDER_DECK,
value=3,
target=TargetType.PLAYER,
params={"shuffle": True, "position": "top"},
)
# Apply effect manually
state.pending_effects.append(effect)
state._resolve_pending_effect(0)
new_deck = p0.main_deck
print(f"Original: {original_deck}")
print(f"New: {new_deck}")
# Verify length unchanged
assert len(new_deck) == 10
# Verify bottom 7 are unchanged (indices 3 to 9)
assert new_deck[3:] == original_deck[3:]
# Verify top 3 are the same set of cards (indices 0 to 2)
# Original top 3: [0, 1, 2]
assert set(new_deck[:3]) == set(original_deck[:3])
def test_shuffle_deck_bottom_3(game_state):
print("\n--- Testing Shuffle Top 3 to Bottom ---")
state = game_state
p0 = state.players[0]
# Reset deck
p0.main_deck = list(range(10))
original_deck = p0.main_deck.copy() # [0..9]
top_cards_set = {0, 1, 2}
# Effect: Shuffle Top 3 and place on bottom
effect = Effect(
effect_type=EffectType.ORDER_DECK,
value=3,
target=TargetType.PLAYER,
params={"shuffle": True, "position": "bottom"},
)
state.pending_effects.append(effect)
state._resolve_pending_effect(0)
new_deck = p0.main_deck
print(f"Original: {original_deck}")
print(f"New: {new_deck}")
# Verify length
assert len(new_deck) == 10
# The top 3 from original should now be at the bottom (indices -3 to end)
bottom_3 = new_deck[-3:]
assert set(bottom_3) == top_cards_set
# The rest should be shifted up
# Original [3..9] should be at [0..6]
assert new_deck[:-3] == original_deck[3:]
def test_order_rearrange(game_state):
print("\n--- Testing Rearrange (No Shuffle) ---")
state = game_state
p0 = state.players[0]
p0.main_deck = list(range(10))
# Effect: Look at top 3, rearrange
effect = Effect(
effect_type=EffectType.ORDER_DECK,
value=3,
target=TargetType.PLAYER,
params={"shuffle": False, "position": "top"},
)
state.pending_effects.append(effect)
state._resolve_pending_effect(0)
# Expectation: Should trigger SELECT_ORDER choice
if state.pending_choices:
print("SUCCESS: Choice triggered for rearranging!")
choice = state.pending_choices[0]
print(f"Choice: {choice}")
assert choice[0] == "SELECT_ORDER"
assert len(choice[1]["cards"]) == 3
# Simulate selection (picking index 0 recursively)
# 1. Pick first card
state._handle_choice(700 + 0) # Assuming SELECT_ORDER uses 700+ base
# 2. Pick next card (index 0 of remaining)
if state.pending_choices:
state._handle_choice(700 + 0)
# 3. Pick last card
if state.pending_choices:
state._handle_choice(700 + 0)
# Deck should be restored
assert len(p0.main_deck) == 10
else:
print("FAILURE: No choice triggered. Effect was a no-op.")
pytest.fail("Rearrange should trigger choice")