gabiwzx's picture
refactor: 五层架构重构 M1-M8 完成
1c66cf8
Raw
History Blame Contribute Delete
3.72 kB
"""Tests for features/pool.py."""
from __future__ import annotations
from werewolftown.features.pool import (
pool_known,
pool_remaining,
pool_scarcity_bonus,
scarcity_lambda,
)
from werewolftown.state.game_state import PlayerView
class TestPoolKnown:
def test_counts_built_hand_opponents(self, make_state):
state = make_state(
plots=frozenset({4, 5}),
built_on={4: "Happy", 5: "Happy"},
shops=("Happy", "猫天天"),
other_players={"浩宇": PlayerView(
name="浩宇", cash=50000,
plots=frozenset({10}),
shops=("猫天天", "猫天天"),
)},
)
known = pool_known(state)
assert known["Happy"] == 3 # 2 built + 1 hand
assert known["猫天天"] == 3 # 1 hand + 2 opp
def test_empty_state(self, make_state):
state = make_state()
assert pool_known(state) == {}
def test_only_my_shops(self, make_state):
state = make_state(shops=("Happy", "Happy", "云小宝"))
known = pool_known(state)
assert known["Happy"] == 2
assert known["云小宝"] == 1
class TestPoolRemaining:
def test_happy_pool_8_minus_3(self, make_state):
state = make_state(
built_on={4: "Happy", 5: "Happy"},
shops=("Happy",),
other_players={"浩宇": PlayerView(name="浩宇", cash=50000, plots=frozenset({10}), shops=("Happy",))},
)
# CARD_POOL["Happy"] = 8, known = 2 built + 1 hand + 1 opp = 4 → remaining = 4
assert pool_remaining(state, "Happy") == 4
def test_full_pool(self, make_state):
state = make_state()
assert pool_remaining(state, "Happy") == 8
def test_zero_when_all_known(self, make_state):
from werewolftown.state.game_state import PlayerView
# Happy pool=8, build 4 + hand 2 + opp 2 = 8
state = make_state(
built_on={4: "Happy", 5: "Happy", 6: "Happy", 8: "Happy"},
shops=("Happy", "Happy"),
other_players={"浩宇": PlayerView(name="浩宇", cash=50000, plots=frozenset({10}), shops=("Happy", "Happy"))},
)
assert pool_remaining(state, "Happy") == 0
class TestScarcityLambda:
def test_pool_le_1(self, make_state, cfg):
from werewolftown.state.game_state import PlayerView
# 7 Happy known → remaining=1
state = make_state(
built_on={4: "Happy", 5: "Happy", 6: "Happy", 8: "Happy", 9: "Happy"},
shops=("Happy",),
other_players={"浩宇": PlayerView(name="浩宇", cash=50000, plots=frozenset({10}), shops=("Happy",))},
)
lam = scarcity_lambda(state, "Happy", cfg)
assert lam == 0.55
def test_default_lambda(self, make_state, cfg):
state = make_state()
lam = scarcity_lambda(state, "Happy", cfg)
assert lam == 0.25
def test_r4_lambda(self, make_state, cfg):
state = make_state(round=4)
lam = scarcity_lambda(state, "Happy", cfg)
assert lam == 0.50
class TestPoolScarcityBonus:
def test_bonus_when_scarce(self, make_state, cfg):
from werewolftown.state.game_state import PlayerView
state = make_state(
built_on={4: "Happy", 5: "Happy", 6: "Happy", 8: "Happy", 9: "Happy"},
shops=("Happy",),
other_players={"浩宇": PlayerView(name="浩宇", cash=50000, plots=frozenset({10}), shops=("Happy",))},
)
assert pool_scarcity_bonus(state, "Happy", cfg) == 1.5
def test_no_bonus_when_abundant(self, make_state, cfg):
state = make_state()
assert pool_scarcity_bonus(state, "Happy", cfg) == 1.0