142 lines
5.0 KiB
Python
142 lines
5.0 KiB
Python
from src.engine.chengdu_mahjong_state import ChengduMahjongState
|
|
from src.engine.hand import Hand
|
|
from src.engine.mahjong_tile import MahjongTile
|
|
|
|
|
|
def test_set_missing_suit():
|
|
"""测试设置缺门功能"""
|
|
state = ChengduMahjongState()
|
|
state.set_missing_suit(0, "条")
|
|
assert state.missing_suits[0] == "条", "测试失败:缺门设置为 '条' 后未正确更新"
|
|
state.set_missing_suit(1, "筒")
|
|
assert state.missing_suits[1] == "筒", "测试失败:缺门设置为 '筒' 后未正确更新"
|
|
state.set_missing_suit(2, "万")
|
|
assert state.missing_suits[2] == "万", "测试失败:缺门设置为 '万' 后未正确更新"
|
|
|
|
try:
|
|
state.set_missing_suit(0, "花")
|
|
except ValueError:
|
|
print("测试通过:设置无效缺门 '花' 抛出异常")
|
|
else:
|
|
raise AssertionError("测试失败:设置无效缺门 '花' 未抛出异常")
|
|
|
|
|
|
def test_can_win_with_pure_sequences():
|
|
"""测试纯顺子胡牌"""
|
|
hand = Hand()
|
|
# 添加牌到手牌中
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 1))
|
|
hand.add_tile(MahjongTile("筒", 2))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 4))
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 6))
|
|
hand.add_tile(MahjongTile("筒", 7))
|
|
hand.add_tile(MahjongTile("筒", 8))
|
|
hand.add_tile(MahjongTile("筒", 9))
|
|
hand.add_tile(MahjongTile("万", 3))
|
|
hand.add_tile(MahjongTile("万", 4))
|
|
hand.add_tile(MahjongTile("万", 5))
|
|
|
|
state = ChengduMahjongState()
|
|
state.hands[0] = hand
|
|
|
|
# 设置缺门为 "条",因为手牌中没有 "条"
|
|
missing_suit = "条"
|
|
print(f"\n,state.hand[0]: {state.hands[0]}")
|
|
|
|
# 调用 can_win 方法并断言胡牌
|
|
assert state.can_win(state.hands[0], missing_suit) == True, "测试失败:纯顺子应该可以胡牌"
|
|
|
|
|
|
def test_can_win_with_sequence_and_triplet():
|
|
"""测试顺子 + 刻子胡牌"""
|
|
hand = Hand()
|
|
# 添加牌到手牌中
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 4))
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 6))
|
|
hand.add_tile(MahjongTile("万", 3))
|
|
hand.add_tile(MahjongTile("万", 4))
|
|
hand.add_tile(MahjongTile("万", 5))
|
|
hand.add_tile(MahjongTile("万", 7))
|
|
hand.add_tile(MahjongTile("万", 8))
|
|
hand.add_tile(MahjongTile("万", 9))
|
|
|
|
state = ChengduMahjongState()
|
|
state.hands[0] = hand
|
|
|
|
# 设置缺门为 "条",因为手牌中没有 "条"
|
|
missing_suit = "条"
|
|
print(f"\n,state.hand[0]: {state.hands[0]}")
|
|
|
|
# 调用 can_win 方法并断言胡牌
|
|
assert state.can_win(state.hands[0], missing_suit) == True, "测试失败:顺子 + 刻子应该可以胡牌"
|
|
|
|
def test_can_win_with_triplets_and_pair():
|
|
"""测试刻子和对子胡牌"""
|
|
hand = Hand()
|
|
hand.add_tile(MahjongTile("条", 1))
|
|
hand.add_tile(MahjongTile("条", 2))
|
|
hand.add_tile(MahjongTile("条", 3))
|
|
hand.add_tile(MahjongTile("条", 1))
|
|
hand.add_tile(MahjongTile("条", 2))
|
|
hand.add_tile(MahjongTile("条", 3))
|
|
hand.add_tile(MahjongTile("条", 1))
|
|
hand.add_tile(MahjongTile("条", 2))
|
|
hand.add_tile(MahjongTile("条", 3))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 4))
|
|
hand.add_tile(MahjongTile("筒", 4))
|
|
|
|
state = ChengduMahjongState()
|
|
state.hands[0] = hand
|
|
|
|
# 设置缺门为 "万",因为手牌中没有 "万"
|
|
missing_suit = "万"
|
|
print(f"\n,state.hand[0]: {state.hands[0]}")
|
|
|
|
# 调用 can_win 方法并断言胡牌
|
|
assert state.can_win(state.hands[0], missing_suit) == True, "测试失败:刻子和对子应该可以胡牌"
|
|
|
|
|
|
def test_can_win_with_pure_one_suit():
|
|
"""测试清一色不带杠胡牌"""
|
|
hand = Hand()
|
|
# 添加牌到手牌中
|
|
hand.add_tile(MahjongTile("筒", 1))
|
|
hand.add_tile(MahjongTile("筒", 2))
|
|
hand.add_tile(MahjongTile("筒", 3))
|
|
hand.add_tile(MahjongTile("筒", 4))
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 6))
|
|
hand.add_tile(MahjongTile("筒", 7))
|
|
hand.add_tile(MahjongTile("筒", 8))
|
|
hand.add_tile(MahjongTile("筒", 9))
|
|
hand.add_tile(MahjongTile("筒", 4))
|
|
hand.add_tile(MahjongTile("筒", 5))
|
|
hand.add_tile(MahjongTile("筒", 6))
|
|
hand.add_tile(MahjongTile("筒", 9))
|
|
hand.add_tile(MahjongTile("筒", 9))
|
|
|
|
state = ChengduMahjongState()
|
|
state.hands[0] = hand
|
|
|
|
# 设置缺门为 "万",因为手牌中只有 "筒"
|
|
missing_suit = "万"
|
|
print(f"\n,state.hand[0]: {state.hands[0]}")
|
|
|
|
# 调用 can_win 方法并断言胡牌
|
|
assert state.can_win(state.hands[0], missing_suit) == True, "测试失败:清一色不带杠应该可以胡牌"
|
|
|
|
|