Files
Mortal-Rating/tests/test_config_modes.py
2026-07-13 17:03:41 +08:00

80 lines
2.3 KiB
Python

import pytest
from batchmortal.config import (
normalize_source_mode,
resolve_mode_config,
source_for_mode,
)
CONFIG = {
"mode": "mj",
"review_language": "zh-CN",
"mj": {
"nickname": "雀魂玩家",
"limit": 70,
"modes": "12",
},
"th": {
"nickname": "天凤玩家",
"limit": 10,
"modes": "4p-south",
},
}
def test_mj_and_th_sections_are_selected_exclusively():
mode, source, selected = resolve_mode_config(CONFIG)
assert (mode, source) == ("mj", "majsoul")
assert selected["nickname"] == "雀魂玩家"
assert selected["modes"] == "12"
mode, source, selected = resolve_mode_config(CONFIG, requested_mode="th")
assert (mode, source) == ("th", "tenhou")
assert selected["nickname"] == "天凤玩家"
assert selected["modes"] == "4p-south"
def test_numeric_and_long_source_aliases_remain_supported():
assert normalize_source_mode(0) == "mj"
assert normalize_source_mode(1) == "th"
assert normalize_source_mode("majsoul") == "mj"
assert normalize_source_mode("tenhou") == "th"
assert source_for_mode("th") == "tenhou"
def test_normalize_source_mode_defaults_to_mj_for_none():
assert normalize_source_mode(None) == "mj"
@pytest.mark.parametrize("value", ["foo", 2])
def test_normalize_source_mode_rejects_unsupported_values(value):
with pytest.raises(ValueError, match="Unsupported source mode"):
normalize_source_mode(value)
def test_legacy_source_config_is_still_readable():
mode, source, selected = resolve_mode_config(
{
"source": "tenhou",
"nickname": "旧配置玩家",
"tenhou_modes": "4p",
}
)
assert (mode, source) == ("th", "tenhou")
assert selected["nickname"] == "旧配置玩家"
assert selected["modes"] == "4p"
def test_conflicting_config_selectors_are_rejected():
with pytest.raises(ValueError, match="both 'mode' and legacy 'source'"):
resolve_mode_config({"mode": "mj", "source": "tenhou"})
with pytest.raises(ValueError, match="both 'mode' and legacy 'source'"):
resolve_mode_config({"mode": "mj", "source": "majsoul"})
def test_source_section_must_be_a_mapping():
with pytest.raises(ValueError, match="section 'th'"):
resolve_mode_config({"mode": "th", "th": "not-a-mapping"})