def test_calculate_suit_tiles_value_and_dora(): table = Table() table.dora_indicators = [string_to_136_tile(sou="9")] player = table.player table.has_aka_dora = False tile = string_to_136_tile(sou="1") option = DiscardOption(player, tile, 0, [], 0) assert option.valuation == (DiscardOption.DORA_VALUE + 110) # double dora table.dora_indicators = [ string_to_136_tile(sou="9"), string_to_136_tile(sou="9") ] tile = string_to_136_tile(sou="1") option = DiscardOption(player, tile, 0, [], 0) assert option.valuation == ((DiscardOption.DORA_VALUE * 2) + 110) # tile close to dora table.dora_indicators = [string_to_136_tile(sou="9")] tile = string_to_136_tile(sou="2") option = DiscardOption(player, tile, 0, [], 0) assert option.valuation == (DiscardOption.DORA_FIRST_NEIGHBOUR + 120) # tile not far away from dora table.dora_indicators = [string_to_136_tile(sou="9")] tile = string_to_136_tile(sou="3") option = DiscardOption(player, tile, 0, [], 0) assert option.valuation == (DiscardOption.DORA_SECOND_NEIGHBOUR + 140) # tile from other suit table.dora_indicators = [string_to_136_tile(sou="9")] tile = string_to_136_tile(man="3") option = DiscardOption(player, tile, 0, [], 0) assert option.valuation == 140
def test_choose_tanki_with_kabe(): _choose_tanki_with_kabe_helper( string_to_136_array(sou="119", pin="224477", man="5669"), [string_to_136_tile(sou="8")], string_to_136_tile(man="5"), "9m", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="119", pin="224477", man="5669"), [string_to_136_tile(man="8")], string_to_136_tile(man="5"), "9s", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="118", pin="224477", man="5668"), [string_to_136_tile(sou="7")], string_to_136_tile(man="5"), "8m", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="118", pin="224477", man="5668"), [string_to_136_tile(man="7")], string_to_136_tile(man="5"), "8s", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="117", pin="224477", man="1157"), [string_to_136_tile(sou="6"), string_to_136_tile(sou="9")], string_to_136_tile(man="5"), "7m", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="117", pin="224477", man="1157"), [string_to_136_tile(man="6"), string_to_136_tile(man="9")], string_to_136_tile(man="5"), "7s", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="116", pin="224477", man="1126"), [string_to_136_tile(sou="5"), string_to_136_tile(sou="7")], string_to_136_tile(man="2"), "6m", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="116", pin="224477", man="1126"), [string_to_136_tile(man="5"), string_to_136_tile(man="7")], string_to_136_tile(man="2"), "6s", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="115", pin="224477", man="1125"), [string_to_136_tile(sou="4"), string_to_136_tile(sou="6")], string_to_136_tile(man="2"), "5m", ) _choose_tanki_with_kabe_helper( string_to_136_array(sou="115", pin="224477", man="1125"), [string_to_136_tile(man="4"), string_to_136_tile(man="6")], string_to_136_tile(man="2"), "5s", )
def test_open_hand_and_discard_tiles_logic_advanced(): # we should choose between one of the ryanmens to discard # in this case - discard the one that leads us to atodzuke and has less tanyao ukeire # despite the fact that general ukeire is higher table = _make_table() table.add_discarded_tile(2, string_to_136_tile(pin="4"), False) table.add_discarded_tile(2, string_to_136_tile(pin="7"), False) table.add_discarded_tile(2, string_to_136_tile(sou="4"), False) table.add_discarded_tile(2, string_to_136_tile(sou="7"), False) tiles = string_to_136_array(man="236777", sou="56", pin="22256") table.player.init_hand(tiles) meld = make_meld(MeldPrint.PON, pin="222") table.player.add_called_meld(meld) tile = string_to_136_tile(man="6") table.player.draw_tile(tile) tile_to_discard, _ = table.player.discard_tile() assert tiles_to_string([tile_to_discard]) == "2m" or tiles_to_string( [tile_to_discard]) == "3m" # now same situation, but better ryanmen is no atodzuke table = _make_table() table.add_discarded_tile(2, string_to_136_tile(pin="4"), False) table.add_discarded_tile(2, string_to_136_tile(pin="7"), False) table.add_discarded_tile(2, string_to_136_tile(sou="4"), False) table.add_discarded_tile(2, string_to_136_tile(sou="7"), False) tiles = string_to_136_array(man="346777", sou="56", pin="22256") table.player.init_hand(tiles) meld = make_meld(MeldPrint.PON, pin="222") table.player.add_called_meld(meld) tile = string_to_136_tile(man="6") table.player.draw_tile(tile) tile_to_discard, _ = table.player.discard_tile() assert (tiles_to_string([tile_to_discard]) == "5s" or tiles_to_string([tile_to_discard]) == "6s" or tiles_to_string([tile_to_discard]) == "5p" or tiles_to_string([tile_to_discard]) == "6p") # now same situation as the first one, but ryanshanten table = _make_table() table.add_discarded_tile(2, string_to_136_tile(pin="4"), False) table.add_discarded_tile(2, string_to_136_tile(pin="7"), False) table.add_discarded_tile(2, string_to_136_tile(sou="4"), False) table.add_discarded_tile(2, string_to_136_tile(sou="7"), False) table.add_discarded_tile(2, string_to_136_tile(man="5"), False) table.add_discarded_tile(2, string_to_136_tile(man="8"), False) tiles = string_to_136_array(man="2367", sou="2356", pin="22256") table.player.init_hand(tiles) meld = make_meld(MeldPrint.PON, pin="222") table.player.add_called_meld(meld) tile = string_to_136_tile(man="8") table.player.draw_tile(tile) tile_to_discard, _ = table.player.discard_tile() assert (tiles_to_string([tile_to_discard]) == "2m" or tiles_to_string([tile_to_discard]) == "3m" or tiles_to_string([tile_to_discard]) == "2s" or tiles_to_string([tile_to_discard]) == "3s")
def test_kuikae_advanced(): # case 0: sanity check table = _make_table() table.add_dora_indicator(string_to_136_tile(pin="2")) tiles = string_to_136_array(man="234", sou="23456", pin="33359") table.player.init_hand(tiles) table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234")) # just force tanyao for the test table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO, table.player) _assert_tanyao(table.player) tile = string_to_136_array(sou="4444")[1] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is not None # case 1: allowed chi table = _make_table() table.add_dora_indicator(string_to_136_tile(pin="2")) tiles = string_to_136_array(man="234", sou="123456", pin="3335") table.player.init_hand(tiles) table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234")) # just force tanyao for the test table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO, table.player) _assert_tanyao(table.player) tile = string_to_136_array(sou="4444")[1] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is not None # case 2: another allowed chi table = _make_table() table.add_dora_indicator(string_to_136_tile(pin="2")) tiles = string_to_136_array(man="234", sou="123345", pin="3335") table.player.init_hand(tiles) table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234")) # just force tanyao for the test table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO, table.player) _assert_tanyao(table.player) tile = string_to_136_array(sou="4444")[1] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is not None # case 3: another allowed chi table = _make_table() table.add_dora_indicator(string_to_136_tile(pin="2")) tiles = string_to_136_array(man="234", sou="12345", pin="33355") table.player.init_hand(tiles) table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234")) # just force tanyao for the test table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO, table.player) _assert_tanyao(table.player) tile = string_to_136_array(sou="4444")[1] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is not None # case 4: useless chi, don't do that table = _make_table() table.add_dora_indicator(string_to_136_tile(pin="2")) tiles = string_to_136_array(man="234", sou="234567", pin="3335") table.player.init_hand(tiles) table.player.add_called_meld(make_meld(MeldPrint.CHI, man="234")) # just force tanyao for the test table.player.ai.current_strategy = TanyaoStrategy(BaseStrategy.TANYAO, table.player) _assert_tanyao(table.player) tile = string_to_136_array(sou="2222")[2] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is None tile = string_to_136_array(sou="5555")[2] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is None tile = string_to_136_array(sou="8888")[2] meld, _ = table.player.try_to_call_meld(tile, True) assert meld is None
def test_should_activate_strategy(): table = Table() player = table.player strategy = ChinitsuStrategy(BaseStrategy.CHINITSU, player) table.add_dora_indicator(string_to_136_tile(pin="1")) table.add_dora_indicator(string_to_136_tile(man="1")) table.add_dora_indicator(string_to_136_tile(sou="8")) tiles = string_to_136_array(sou="12355", man="34589", honors="1234") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False tiles = string_to_136_array(sou="12355", man="458", honors="112345") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # we shouldn't go for chinitsu if we have a valued pair or pon tiles = string_to_136_array(sou="111222578", man="8", honors="5556") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False tiles = string_to_136_array(sou="1112227788", man="7", honors="556") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # if we have a pon of non-valued honors, this is not chinitsu tiles = string_to_136_array(sou="1112224688", honors="2224") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # if we have just a pair of non-valued tiles, we can go for chinitsu # if we have 11 chinitsu tiles and it's early tiles = string_to_136_array(sou="11122234688", honors="224") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is True # if we have a complete set with dora, we shouldn't go for chinitsu tiles = string_to_136_array(sou="1112223688", pin="1239") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # even if the set may be interpreted as two forms tiles = string_to_136_array(sou="111223688", pin="23349") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # even if the set may be interpreted as two forms v2 tiles = string_to_136_array(sou="111223688", pin="23459") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # if we have a long form with dora, we shouldn't go for chinitsu tiles = string_to_136_array(sou="111223688", pin="23339") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # buf it it's just a ryanmen - no problem tiles = string_to_136_array(sou="1112223688", pin="238", man="9") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is True # we have three non-isolated doras in other suits, this is not chinitsu tiles = string_to_136_array(sou="111223688", man="22", pin="239") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # we have two non-isolated doras in other suits and no doras in our suit # this is not chinitsu tiles = string_to_136_array(sou="111223688", man="24", pin="249") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # we have two non-isolated doras in other suits and 1 shanten, not chinitsu tiles = string_to_136_array(sou="111222789", man="23", pin="239") player.init_hand(tiles) assert strategy.should_activate_strategy(player.tiles) is False # we don't want to open on 9th tile into chinitsu, but it's ok to # switch to chinitsu if we get in from the wall tiles = string_to_136_array(sou="11223578", man="57", pin="4669") player.init_hand(tiles) # plus one tile to open hand tiles = string_to_136_array(sou="112223578", man="57", pin="466") assert strategy.should_activate_strategy(tiles) is False # but now let's init hand with these tiles, we can now slowly move to chinitsu tiles = string_to_136_array(sou="112223578", man="57", pin="466") player.init_hand(tiles) assert strategy.should_activate_strategy(tiles) is True
def test_is_dora(): table = Table() table.init_round(0, 0, 0, 0, 0, []) table.dora_indicators = [string_to_136_tile(sou="1")] assert table.is_dora(string_to_136_tile(sou="2")) table.dora_indicators = [string_to_136_tile(sou="9")] assert table.is_dora(string_to_136_tile(sou="1")) table.dora_indicators = [string_to_136_tile(pin="9")] assert table.is_dora(string_to_136_tile(pin="1")) table.dora_indicators = [string_to_136_tile(man="9")] assert table.is_dora(string_to_136_tile(man="1")) table.dora_indicators = [string_to_136_tile(man="5")] assert table.is_dora(string_to_136_tile(man="6")) table.dora_indicators = [string_to_136_tile(honors="1")] assert table.is_dora(string_to_136_tile(honors="2")) table.dora_indicators = [string_to_136_tile(honors="2")] assert table.is_dora(string_to_136_tile(honors="3")) table.dora_indicators = [string_to_136_tile(honors="3")] assert table.is_dora(string_to_136_tile(honors="4")) table.dora_indicators = [string_to_136_tile(honors="4")] assert table.is_dora(string_to_136_tile(honors="1")) table.dora_indicators = [string_to_136_tile(honors="5")] assert table.is_dora(string_to_136_tile(honors="6")) table.dora_indicators = [string_to_136_tile(honors="6")] assert table.is_dora(string_to_136_tile(honors="7")) table.dora_indicators = [string_to_136_tile(honors="7")] assert table.is_dora(string_to_136_tile(honors="5")) table.dora_indicators = [string_to_136_tile(pin="1")] assert not table.is_dora(string_to_136_tile(sou="2")) table.has_open_tanyao = True # red five man assert table.is_dora(FIVE_RED_MAN) # red five pin assert table.is_dora(FIVE_RED_PIN) # red five sou assert table.is_dora(FIVE_RED_SOU)
def test_tile_danger_against_toitoi_threat(): table = Table() table.add_dora_indicator(string_to_136_tile(pin="1")) player = table.player enemy_seat = 1 table.add_called_meld(enemy_seat, make_meld(MeldPrint.PON, pin="222")) table.add_called_meld(enemy_seat, make_meld(MeldPrint.PON, honors="444")) table.add_called_meld(enemy_seat, make_meld(MeldPrint.PON, sou="999")) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="1"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="5"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="8"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="9"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="4"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="3"), False) table.add_dora_indicator(string_to_136_tile(pin="1")) threatening_players = table.player.ai.defence.get_threatening_players() assert len(threatening_players) == 1 assert threatening_players[0].enemy.seat == enemy_seat # let's make 2 man impossible to wait in toitoi table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False) tiles = string_to_136_array(man="11134", pin="1569", honors="2555") tile = string_to_136_tile(man="2") player.init_hand(tiles) player.draw_tile(tile) _assert_discard(player, enemy_seat, TileDanger.SAFE_AGAINST_THREATENING_HAND, man="2")
def test_tile_danger_matagi_suji_pattern(): enemy_seat = 1 table = _create_table(enemy_seat, discards=[], riichi_tile=string_to_136_tile(honors="7")) player = table.player tiles = string_to_136_array(man="11134", pin="1156", honors="255", sou="4") tile = string_to_136_tile(sou="5") player.init_hand(tiles) player.draw_tile(tile) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="6"), is_tsumogiri=False) table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="5"), is_tsumogiri=True) # it is too early for matagi check _assert_discard_not_equal(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="5") table.add_discarded_tile(enemy_seat, string_to_136_tile(honors="6"), is_tsumogiri=True) table.add_discarded_tile(enemy_seat, string_to_136_tile(honors="6"), is_tsumogiri=True) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="8"), is_tsumogiri=False) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="6"), is_tsumogiri=False) # 8s in discard, so 5s is not matagi suji _assert_discard_not_equal(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="5") # 4-7 is still matagi _assert_discard(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="4") table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="6"), is_tsumogiri=True) table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="6"), is_tsumogiri=False) # 4s is not matagi anymore, because 6p is latest discard from the hand _assert_discard_not_equal(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="4") table.add_discarded_tile(enemy_seat, string_to_136_tile(honors="6"), is_tsumogiri=True) # 4s is matagi again, because it is late stage and we are checking two latest discards from hand _assert_discard(player, enemy_seat, TileDanger.BONUS_MATAGI_SUJI, sou="4")
def test_calculate_second_level_ukeire(): """ There was a bug with 2356 form and second level ukeire """ table = Table() player = table.player table.add_dora_indicator(string_to_136_tile(man="2")) table.add_discarded_tile(1, string_to_136_tile(man="2"), False) table.add_discarded_tile(1, string_to_136_tile(pin="3"), False) table.add_discarded_tile(1, string_to_136_tile(pin="3"), False) tiles = string_to_136_array(man="34678", pin="2356", sou="4467") tile = string_to_136_tile(sou="8") player.init_hand(tiles) player.draw_tile(tile) discard_options, _ = player.ai.hand_builder.find_discard_options() tile = string_to_136_tile(man="4") discard_option = [ x for x in discard_options if x.tile_to_discard_34 == tile // 4 ][0] player.ai.hand_builder.calculate_second_level_ukeire(discard_option) assert discard_option.ukeire_second == 108 tile = string_to_136_tile(man="3") discard_option = [ x for x in discard_options if x.tile_to_discard_34 == tile // 4 ][0] player.ai.hand_builder.calculate_second_level_ukeire(discard_option) assert discard_option.ukeire_second == 108 tile = string_to_136_tile(pin="2") discard_option = [ x for x in discard_options if x.tile_to_discard_34 == tile // 4 ][0] player.ai.hand_builder.calculate_second_level_ukeire(discard_option) assert discard_option.ukeire_second == 96 tile = string_to_136_tile(pin="3") discard_option = [ x for x in discard_options if x.tile_to_discard_34 == tile // 4 ][0] player.ai.hand_builder.calculate_second_level_ukeire(discard_option) assert discard_option.ukeire_second == 96 tile = string_to_136_tile(pin="5") discard_option = [ x for x in discard_options if x.tile_to_discard_34 == tile // 4 ][0] player.ai.hand_builder.calculate_second_level_ukeire(discard_option) assert discard_option.ukeire_second == 96 tile = string_to_136_tile(pin="6") discard_option = [ x for x in discard_options if x.tile_to_discard_34 == tile // 4 ][0] player.ai.hand_builder.calculate_second_level_ukeire(discard_option) assert discard_option.ukeire_second == 96
def test_tile_danger_and_2_8_suji_tiles(): enemy_seat = 1 table = _create_table(enemy_seat, discards=[], riichi_tile=string_to_136_tile(honors="7")) player = table.player table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="4"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="5"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(sou="6"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="2"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="3"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="8"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(man="9"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="1"), False) table.add_discarded_tile(enemy_seat, string_to_136_tile(pin="7"), False) tiles = string_to_136_array(sou="2378", pin="4", man="56", honors="233555") tile = string_to_136_tile(honors="3") player.init_hand(tiles) player.draw_tile(tile) _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="2") _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="3") _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="7") _assert_discard(player, enemy_seat, TileDanger.SUJI, sou="8") _assert_discard(player, enemy_seat, TileDanger.SUJI, pin="4") _assert_discard(player, enemy_seat, TileDanger.SUJI, man="5") _assert_discard(player, enemy_seat, TileDanger.SUJI, man="6")
def test_choose_tanki_with_suji(): _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="19", pin="99", honors="2"), [string_to_136_tile(sou="6")], string_to_136_tile(honors="2"), "1s", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="19", pin="99", honors="2"), [string_to_136_tile(sou="4")], string_to_136_tile(honors="2"), "9s", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="2", pin="299", honors="2"), [string_to_136_tile(sou="5")], string_to_136_tile(honors="2"), "2p", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="2", pin="299", honors="2"), [string_to_136_tile(pin="5")], string_to_136_tile(honors="2"), "2s", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="3", pin="399", honors="2"), [string_to_136_tile(sou="6")], string_to_136_tile(honors="2"), "3p", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="3", pin="399", honors="2"), [string_to_136_tile(pin="6")], string_to_136_tile(honors="2"), "3s", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="4", pin="499", honors="2"), [string_to_136_tile(sou="1"), string_to_136_tile(sou="7")], string_to_136_tile(honors="2"), "4p", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="4", pin="499", honors="2"), [string_to_136_tile(pin="1"), string_to_136_tile(pin="7")], string_to_136_tile(honors="2"), "4s", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="5", pin="599", honors="2"), [string_to_136_tile(sou="2"), string_to_136_tile(sou="8")], string_to_136_tile(honors="2"), "5p", ) _choose_tanki_with_suji_helper( string_to_136_array(man="22336688", sou="5", pin="599", honors="2"), [string_to_136_tile(pin="2"), string_to_136_tile(pin="8")], string_to_136_tile(honors="2"), "5s", )
def test_is_dora_connector(): cases = [ { "dora_indicators": [string_to_136_tile(sou="5")], "dora_connectors": [string_to_136_tile(sou="4"), string_to_136_tile(sou="6")], }, { "dora_indicators": [string_to_136_tile(sou="5"), string_to_136_tile(sou="4")], "dora_connectors": [ string_to_136_tile(sou="3"), string_to_136_tile(sou="4"), string_to_136_tile(sou="5"), string_to_136_tile(sou="6"), ], }, { "dora_indicators": [string_to_136_tile(pin="1")], "dora_connectors": [ string_to_136_tile(pin="2"), ], }, { "dora_indicators": [string_to_136_tile(man="9")], "dora_connectors": [ string_to_136_tile(man="8"), ], }, { "dora_indicators": [string_to_136_tile(honors="1")], "dora_connectors": [], }, ] for case in cases: dora_connectors_34 = [x // 4 for x in case["dora_connectors"]] for tile_34 in range(0, 34): if tile_34 in dora_connectors_34: assert is_dora_connector(tile_34 * 4, case["dora_indicators"]) is True else: assert is_dora_connector(tile_34 * 4, case["dora_indicators"]) is False
def test_chose_right_set_to_open_hand_dora(): table = Table() table.has_open_tanyao = True table.has_aka_dora = False player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="7")) table.add_dora_indicator(string_to_136_tile(sou="1")) tiles = string_to_136_array(man="3456788", sou="245888") player.init_hand(tiles) tile = string_to_136_tile(sou="3") meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "234s" table = Table() table.has_open_tanyao = True table.has_aka_dora = False player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="7")) table.add_dora_indicator(string_to_136_tile(sou="4")) tiles = string_to_136_array(man="3456788", sou="245888") player.init_hand(tiles) tile = string_to_136_tile(sou="3") meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "345s" table = Table() table.has_open_tanyao = True table.has_aka_dora = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="7")) # 5 from string is always aka tiles = string_to_136_array(man="3456788", sou="240888") player.init_hand(tiles) tile = string_to_136_tile(sou="3") meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "340s" table = Table() table.has_open_tanyao = True table.has_aka_dora = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="7")) table.add_dora_indicator(string_to_136_tile(sou="1")) table.add_dora_indicator(string_to_136_tile(sou="4")) # double dora versus regular dora, we should keep double dora tiles = string_to_136_array(man="3456788", sou="245888") player.init_hand(tiles) tile = string_to_136_tile(sou="3") meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "345s"
def test_chose_right_set_to_open_hand(): """ Different test cases to open hand and chose correct set to open hand. Based on real examples of incorrect opened hands """ table = Table() table.has_open_tanyao = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(pin="2")) table.add_dora_indicator(string_to_136_tile(pin="3")) tiles = string_to_136_array(man="23455", pin="3445678", honors="1") tile = string_to_136_array(man="5555")[2] player.init_hand(tiles) meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.PON assert tiles_to_string(meld.tiles) == "555m" table = Table() player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="5")) tiles = string_to_136_array(man="335666", pin="22", sou="345", honors="55") player.init_hand(tiles) tile = string_to_136_tile(man="4") meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "345m" table = Table() table.has_open_tanyao = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="1")) table.add_dora_indicator(string_to_136_tile(man="4")) tiles = string_to_136_array(man="23557", pin="556788", honors="22") player.init_hand(tiles) tile = string_to_136_array(pin="5555")[2] meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.PON assert tiles_to_string(meld.tiles) == "555p" table = Table() table.has_open_tanyao = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="4")) table.add_dora_indicator(string_to_136_tile(pin="5")) tiles = string_to_136_array(man="35568", pin="234668", sou="28") player.init_hand(tiles) tile = string_to_136_tile(man="4") meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "345m" table = Table() table.has_open_tanyao = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="4")) table.add_dora_indicator(string_to_136_tile(pin="5")) tiles = string_to_136_array(man="34458", pin="234668", sou="28") player.init_hand(tiles) tile = string_to_136_array(man="4444")[2] meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "345m" table = Table() table.has_open_tanyao = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="7")) tiles = string_to_136_array(man="567888", pin="788", sou="3456") player.init_hand(tiles) tile = string_to_136_array(sou="4444")[1] meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "456s" tile = string_to_136_array(sou="5555")[1] meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "345s" table = Table() table.has_open_tanyao = True player = table.player # add 3 doras so we are sure to go for tanyao table.add_dora_indicator(string_to_136_tile(man="7")) tiles = string_to_136_array(man="567888", pin="788", sou="2345") player.init_hand(tiles) tile = string_to_136_array(sou="4444")[1] meld, _ = player.try_to_call_meld(tile, True) assert meld is not None assert meld.type == MeldPrint.CHI assert tiles_to_string(meld.tiles) == "234s"
def test_number_of_unverified_suji(): table = Table() enemy_seat = 2 table.add_called_riichi_step_one(enemy_seat) threatening_player = table.player.ai.defence.get_threatening_players()[0] assert threatening_player.number_of_unverified_suji == 18 table.add_discarded_tile(0, string_to_136_tile(sou="4"), True) assert threatening_player.number_of_unverified_suji == 16 table.add_discarded_tile(0, string_to_136_tile(sou="1"), True) table.add_discarded_tile(0, string_to_136_tile(sou="7"), True) assert threatening_player.number_of_unverified_suji == 16 table.add_discarded_tile(0, string_to_136_tile(sou="2"), True) assert threatening_player.number_of_unverified_suji == 15 table.add_discarded_tile(0, string_to_136_tile(sou="8"), True) assert threatening_player.number_of_unverified_suji == 14 table.add_discarded_tile(0, string_to_136_tile(sou="5"), True) assert threatening_player.number_of_unverified_suji == 14 table.add_discarded_tile(0, string_to_136_tile(sou="6"), True) assert threatening_player.number_of_unverified_suji == 12 table.add_discarded_tile(0, string_to_136_tile(man="4"), True) table.add_discarded_tile(0, string_to_136_tile(man="5"), True) table.add_discarded_tile(0, string_to_136_tile(man="6"), True) assert threatening_player.number_of_unverified_suji == 6 table.add_discarded_tile(0, string_to_136_tile(pin="1"), True) table.add_discarded_tile(0, string_to_136_tile(pin="7"), True) assert threatening_player.number_of_unverified_suji == 4 table.add_discarded_tile(0, string_to_136_tile(pin="5"), True) assert threatening_player.number_of_unverified_suji == 2 table.add_discarded_tile(0, string_to_136_tile(pin="6"), True) assert threatening_player.number_of_unverified_suji == 0