"""저부하(게임) 모드 토글이 실제로 모델에 반영되는지. 설정 화면에서 모드를 꺼도 이미 올라가 있는 int8 모델이 그대로 남으면 "껐는데 품질이 안 올라간다"가 된다. 반대로 켜도 float16 모델이 남으면 게임 프레임을 지키려던 목적이 통째로 무산된다. """ from __future__ import annotations from livesub.config import AppConfig from livesub.core.engine import TranslationEngine from livesub.models import ModelManager def make_engine(game_mode: bool, tmp_path) -> TranslationEngine: cfg = AppConfig() cfg.models.preload_on_start = False cfg.glossary.path = str(tmp_path / "glossary.json") cfg.performance.game_mode = game_mode return TranslationEngine(cfg) def test_manager_reflects_initial_game_mode(tmp_path): on = make_engine(True, tmp_path) off = make_engine(False, tmp_path) assert on.models.low_power is True assert off.models.low_power is False def test_toggling_game_mode_updates_manager(tmp_path): """설정에서 모드를 바꾸면 다음 시작 때 모델 사양이 따라와야 한다.""" engine = make_engine(True, tmp_path) assert "int8" in engine.models.effective_asr_spec().compute_type engine.config.performance.game_mode = False engine.sync_performance() assert engine.models.low_power is False assert engine.models.effective_asr_spec() == engine.models.tier.asr def test_toggling_back_on_restores_low_power_specs(tmp_path): engine = make_engine(False, tmp_path) engine.config.performance.game_mode = True engine.sync_performance() assert engine.models.low_power is True assert "int8" in engine.models.effective_asr_spec().compute_type def test_changed_mode_unloads_stale_models(tmp_path): """정밀도가 바뀌었으면 이미 올라간 모델을 반드시 내려야 한다.""" engine = make_engine(True, tmp_path) class FakeModel: def __init__(self): self.loaded = True self.unloaded = False def unload(self): self.unloaded = True self.loaded = False asr, mt = FakeModel(), FakeModel() engine.models._asr, engine.models._mt = asr, mt engine.config.performance.game_mode = False changed = engine.sync_performance() assert changed is True assert asr.unloaded and mt.unloaded assert engine.models._asr is None and engine.models._mt is None def test_unchanged_mode_keeps_models_loaded(tmp_path): """바뀐 게 없으면 굳이 내려서 재다운로드/재로딩을 유발하면 안 된다.""" engine = make_engine(True, tmp_path) class FakeModel: loaded = True def unload(self): raise AssertionError("바뀐 게 없는데 언로드하면 안 됩니다") engine.models._asr = FakeModel() engine.models._mt = FakeModel() assert engine.sync_performance() is False assert engine.models._asr is not None def test_int4_tier_is_not_downgraded_further(tmp_path): cfg = AppConfig() cfg.models.tier = "precision" manager = ModelManager(cfg.models, low_power=True) assert manager.effective_mt_spec().compute_type == "int4"