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, "测试失败:清一色不带杠应该可以胡牌"