Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions tests/hand_calculating/tests_aotenjou.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from tests.utils_for_tests import _make_hand_config, _make_meld, _string_to_136_tile


def test_aotenjou_hands() -> None:
def test_aotenjou_kokushi_ron() -> None:
hand = HandCalculator()

tiles = TilesConverter.string_to_136_array(sou="119", man="19", pin="19", honors="1234567")
Expand All @@ -24,6 +24,10 @@ def test_aotenjou_hands() -> None:
assert len(result.yaku) == 1
assert result.cost["main"] == 7864400


def test_aotenjou_open_hand_with_honor_melds() -> None:
hand = HandCalculator()

tiles = TilesConverter.string_to_136_array(man="234", honors="11122233344")
win_tile = _string_to_136_tile(man="2")
melds = [
Expand All @@ -44,6 +48,10 @@ def test_aotenjou_hands() -> None:
assert len(result.yaku) == 4
assert result.cost["main"] + result.cost["additional"] == 83886200


def test_aotenjou_all_honors_with_meld() -> None:
hand = HandCalculator()

tiles = TilesConverter.string_to_136_array(honors="11122233444777")
win_tile = _string_to_136_tile(honors="2")
melds = [
Expand All @@ -63,7 +71,9 @@ def test_aotenjou_hands() -> None:
assert len(result.yaku) == 6
assert result.cost["main"] + result.cost["additional"] == 1717986918400

# monster hand for fun

def test_aotenjou_monster_hand() -> None:
hand = HandCalculator()

tiles = TilesConverter.string_to_136_array(honors="111133555566667777")
win_tile = _string_to_136_tile(honors="3")
Expand Down Expand Up @@ -334,7 +344,7 @@ def test_aotenjou_kokushi_tsumo() -> None:
hand = HandCalculator()

tiles = TilesConverter.string_to_136_array(sou="19", pin="19", man="19", honors="12345677")
win_tile = TilesConverter.string_to_136_array(honors="7")[0]
win_tile = _string_to_136_tile(honors="7")

result = hand.estimate_hand_value(
tiles,
Expand All @@ -353,7 +363,7 @@ def test_aotenjou_kokushi_with_dora() -> None:
hand = HandCalculator()

tiles = TilesConverter.string_to_136_array(sou="19", pin="19", man="19", honors="12345677")
win_tile = TilesConverter.string_to_136_array(honors="7")[0]
win_tile = _string_to_136_tile(honors="7")

# 8m indicator makes 9m a dora; kokushi hand includes 9m
dora_indicators = TilesConverter.string_to_136_array(man="8")
Expand All @@ -377,7 +387,7 @@ def test_aotenjou_kokushi_with_ura_dora() -> None:

# kokushi with riichi and ura dora in aotenjou scoring
tiles = TilesConverter.string_to_136_array(sou="19", pin="19", man="19", honors="12345677")
win_tile = TilesConverter.string_to_136_array(honors="7")[0]
win_tile = _string_to_136_tile(honors="7")

ura_dora_indicators = TilesConverter.string_to_136_array(man="8")
result = hand.estimate_hand_value(
Expand Down
53 changes: 21 additions & 32 deletions tests/hand_calculating/tests_fu_calculation.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import pytest

from mahjong.constants import EAST
from mahjong.hand_calculating.fu import FuCalculator
from mahjong.hand_calculating.hand import HandCalculator
Expand Down Expand Up @@ -151,24 +153,19 @@ def test_tsumo_hand_and_not_pinfu() -> None:
assert fu == 30


def test_penchan_fu() -> None:
@pytest.mark.parametrize(
("tiles_string", "win_tile_string"),
[
pytest.param("123456m12456s55p", "3s", id="12_wait"),
pytest.param("123456m34589s55p", "7s", id="89_wait"),
],
)
def test_penchan_fu(tiles_string: str, win_tile_string: str) -> None:
fu_calculator = FuCalculator()
config = HandConfig()

# 1-2-... wait
tiles = TilesConverter.string_to_136_array(sou="12456", man="123456", pin="55")
win_tile = _string_to_136_tile(sou="3")
hand = _hand(TilesConverter.to_34_array([*tiles, win_tile]))

fu_details, fu = fu_calculator.calculate_fu(hand, win_tile, _get_win_group(hand, win_tile), config)
assert len(fu_details) == 2
assert {"fu": 30, "reason": FuCalculator.BASE} in fu_details
assert {"fu": 2, "reason": FuCalculator.PENCHAN} in fu_details
assert fu == 40

# ...-8-9 wait
tiles = TilesConverter.string_to_136_array(sou="34589", man="123456", pin="55")
win_tile = _string_to_136_tile(sou="7")
tiles = TilesConverter.one_line_string_to_136_array(tiles_string)
win_tile = TilesConverter.one_line_string_to_136_array(win_tile_string)[0]
hand = _hand(TilesConverter.to_34_array([*tiles, win_tile]))

fu_details, fu = fu_calculator.calculate_fu(hand, win_tile, _get_win_group(hand, win_tile), config)
Expand All @@ -193,29 +190,21 @@ def test_kanchan_fu() -> None:
assert fu == 40


def test_valued_pair_fu() -> None:
@pytest.mark.parametrize(
("valued_tiles", "expected_fu", "expected_reason"),
[
pytest.param([EAST], 2, FuCalculator.VALUED_PAIR, id="single"),
pytest.param([EAST, EAST], 4, FuCalculator.DOUBLE_VALUED_PAIR, id="double"),
],
)
def test_valued_pair_fu(valued_tiles: list[int], expected_fu: int, expected_reason: str) -> None:
fu_calculator = FuCalculator()
config = HandConfig()

tiles = TilesConverter.string_to_136_array(sou="12378", man="123456", honors="11")
win_tile = _string_to_136_tile(sou="6")
hand = _hand(TilesConverter.to_34_array([*tiles, win_tile]))

valued_tiles = [EAST]
fu_details, fu = fu_calculator.calculate_fu(
hand,
win_tile,
_get_win_group(hand, win_tile),
config,
valued_tiles=valued_tiles,
)
assert len(fu_details) == 2
assert {"fu": 30, "reason": FuCalculator.BASE} in fu_details
assert {"fu": 2, "reason": FuCalculator.VALUED_PAIR} in fu_details
assert fu == 40

# double valued pair
valued_tiles = [EAST, EAST]
fu_details, fu = fu_calculator.calculate_fu(
hand,
win_tile,
Expand All @@ -225,7 +214,7 @@ def test_valued_pair_fu() -> None:
)
assert len(fu_details) == 2
assert {"fu": 30, "reason": FuCalculator.BASE} in fu_details
assert {"fu": 4, "reason": FuCalculator.DOUBLE_VALUED_PAIR} in fu_details
assert {"fu": expected_fu, "reason": expected_reason} in fu_details
assert fu == 40


Expand Down
85 changes: 35 additions & 50 deletions tests/hand_calculating/tests_hand_dividing.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,50 +11,45 @@ def _string(hand: list[list[int]]) -> list[str]:
return [TilesConverter.to_one_line_string([x * 4 for x in set_item]) for set_item in hand]


def test_simple_hand_dividing() -> None:
hand = HandDivider()

tiles_34 = TilesConverter.string_to_34_array(man="234567", sou="23455", honors="777")
result = hand.divide_hand(tiles_34)
assert len(result) == 1
assert _string(result[0]) == ["234m", "567m", "234s", "55s", "777z"]


def test_second_simple_hand_dividing() -> None:
hand = HandDivider()

tiles_34 = TilesConverter.string_to_34_array(man="123", pin="123", sou="123", honors="11222")
result = hand.divide_hand(tiles_34)
assert len(result) == 1
assert _string(result[0]) == ["123m", "123p", "123s", "11z", "222z"]


def test_hand_with_pairs_dividing() -> None:
hand = HandDivider()

tiles_34 = TilesConverter.string_to_34_array(man="23444", pin="344556", sou="333")
result = hand.divide_hand(tiles_34)
@pytest.mark.parametrize(
("tiles_string", "expected"),
[
pytest.param("234567m23455s777z", ["234m", "567m", "234s", "55s", "777z"], id="simple"),
pytest.param("123m123p123s11222z", ["123m", "123p", "123s", "11z", "222z"], id="simple_all_suits"),
pytest.param("23444m344556p333s", ["234m", "44m", "345p", "456p", "333s"], id="with_pairs"),
pytest.param("111123666789s11z", ["111s", "123s", "666s", "789s", "11z"], id="one_suit"),
],
)
def test_single_hand_dividing(tiles_string: str, expected: list[str]) -> None:
tiles_34 = TilesConverter.one_line_string_to_34_array(tiles_string)
result = HandDivider.divide_hand(tiles_34)
assert len(result) == 1
assert _string(result[0]) == ["234m", "44m", "345p", "456p", "333s"]
assert _string(result[0]) == expected


def test_one_suit_hand_dividing() -> None:
hand = HandDivider()

tiles_34 = TilesConverter.string_to_34_array(man="11122233388899")
result = hand.divide_hand(tiles_34)
@pytest.mark.parametrize(
("tiles_string", "expected_first", "expected_second"),
[
pytest.param(
"11122233388899m",
["111m", "222m", "333m", "888m", "99m"],
["123m", "123m", "123m", "888m", "99m"],
id="one_suit",
),
pytest.param(
"112233m99p445566s",
["11m", "22m", "33m", "99p", "44s", "55s", "66s"],
["123m", "123m", "99p", "456s", "456s"],
id="chitoitsu_like",
),
],
)
def test_multiple_hand_dividing(tiles_string: str, expected_first: list[str], expected_second: list[str]) -> None:
tiles_34 = TilesConverter.one_line_string_to_34_array(tiles_string)
result = HandDivider.divide_hand(tiles_34)
assert len(result) == 2
assert _string(result[0]) == ["111m", "222m", "333m", "888m", "99m"]
assert _string(result[1]) == ["123m", "123m", "123m", "888m", "99m"]


def test_second_one_suit_hand_dividing() -> None:
hand = HandDivider()

tiles_34 = TilesConverter.string_to_34_array(sou="111123666789", honors="11")
result = hand.divide_hand(tiles_34)
assert len(result) == 1
assert _string(result[0]) == ["111s", "123s", "666s", "789s", "11z"]
assert _string(result[0]) == expected_first
assert _string(result[1]) == expected_second


def test_third_one_suit_hand_dividing() -> None:
Expand All @@ -70,16 +65,6 @@ def test_third_one_suit_hand_dividing() -> None:
assert _string(result[0]) == ["234p", "789p", "789p", "789p", "22z"]


def test_chitoitsu_like_hand_dividing() -> None:
hand = HandDivider()

tiles_34 = TilesConverter.string_to_34_array(man="112233", pin="99", sou="445566")
result = hand.divide_hand(tiles_34)
assert len(result) == 2
assert _string(result[0]) == ["11m", "22m", "33m", "99p", "44s", "55s", "66s"]
assert _string(result[1]) == ["123m", "123m", "99p", "456s", "456s"]


def test_fix_not_correct_kan_handling() -> None:
# Hand calculator crashed because it wasn't able to split hand

Expand Down
Loading