Apricot-S / majsoulrpa

A Robotic Process Automation (RPA) framework for Mahjong Soul (雀魂)
Other
21 stars 5 forks source link

fix: Liqi error dealing with aka dora #179

Closed smly closed 8 months ago

smly commented 8 months ago

立直時のエラーを解消するためのPRです。

エラー発生条件

赤ドラと対応する5の数牌が手牌にあり、かつこれらが立直時の打牌候補であるときに InvalidOperation 例外が発生します。 例外の発生場所は MatchPresentation_operate_liqi() 内の candidate_dapai_list に対するバリデーション処理です。

具体例として、以下の状態で例外が発生します。

shoupai = ["2m", "7m", "8m", "9m", "3p", "4p", "5p", "4s", "0s", "5s", "6s", "9s", "9s"]
zimopai = 1m
op = LiqiOperation(candidate_dapai_list=["0s"])
index = 9  # 5s

これは LiqiOperation インスタンスを作成するときに与えられるデータに赤ドラの 0s のみが data["combinations"]: list[str] として受け取り、5s が含まれていないために発生します。

実装

_common.py に赤ドラを対応する5の数牌に変換する関数 deaka() を定義し、これに適用したあとで candidate_dapai_list に対するバリデーション処理を実行するよう修正しました。

テストの追加

勝手ながら _operate_liqi() に対する単体テストを追加しましたがどうでしょうか? 今後単体テストを追加するしない、テストフレームワークやテスト方法など方針がありましたら指摘ください。

smly commented 8 months ago

この問題は、立直宣言牌候補に赤と黒の5が両方あるとき、APIには赤の方しか含まれていないために発生するという認識でよいですか?

はい、そうです。

testsディレクトリ直下にもinit.pyが必要ではありませんか?

tests ディレクトリ直下にテストコードがないため不要と判断しました。 基本的に __init__.py は不要です。test_presentation ディレクトリに __init__.py が配置されているのは、このディレクトリにテストコードがあり、ruff の implicit-namespace-package (INP001) を回避するためのものです。test_match.py に ruff: noqa: INP001 を追加することも選択肢ですが、将来的にテスト用の共通コード(複雑な Mock を作成する場合など)を配置する際、これを import させたい場合に必要になります。そのため test_presentation ディレクトリには __init__.py を配置させておく選択をしました。

以下のコードでテストを実行できることを確認しています。

❯ poetry run pytest --no-summary --no-header
================================== test session starts ===================================
collected 1 item                                                                         

tests/test_presentation/test_match.py .                                            [100%]

=================================== 1 passed in 0.98s ====================================
❯ file tests/test_presentation/__init__.py
tests/test_presentation/__init__.py: empty
❯ file tests/__init__.py
tests/__init__.py: cannot open `tests/__init__.py' (No such file or directory)

夜に用事があるため深夜あるいは明日以降に差分追加と返信をします。