Files
rapidocr/python/tests/test_rtl_dependency.py

71 lines
2.3 KiB
Python

# -*- encoding: utf-8 -*-
# @Author: SWHL
# @Contact: liekkaskono@163.com
import builtins
import sys
import types
from pathlib import Path
from types import SimpleNamespace
import pytest
root_dir = Path(__file__).resolve().parent.parent
sys.path.append(str(root_dir))
from rapidocr.ch_ppocr_rec import main as rec_main
from rapidocr.utils import utils
from rapidocr.utils.model_resolver import normalize_lang
from rapidocr.utils.typings import EngineType, LangRec
def test_validate_rtl_dependency_reports_extra(monkeypatch):
original_import = builtins.__import__
def missing_bidi(name, *args, **kwargs):
if name.startswith("bidi"):
raise ModuleNotFoundError("No module named 'bidi'")
return original_import(name, *args, **kwargs)
monkeypatch.setattr(builtins, "__import__", missing_bidi)
with pytest.raises(ModuleNotFoundError, match=r"rapidocr\[rtl\]"):
utils.validate_rtl_dependency()
def test_reorder_bidi_for_display_uses_bidi_algorithm(monkeypatch):
bidi_module = types.ModuleType("bidi")
algorithm_module = types.ModuleType("bidi.algorithm")
algorithm_module.get_display = lambda text: text[::-1]
bidi_module.algorithm = algorithm_module
monkeypatch.setitem(sys.modules, "bidi", bidi_module)
monkeypatch.setitem(sys.modules, "bidi.algorithm", algorithm_module)
assert utils.reorder_bidi_for_display(("abc", "123")) == ("cba", "321")
def test_arabic_dependency_is_checked_before_engine_initialization(monkeypatch):
engine_called = False
def fail_get_engine(_engine_type):
nonlocal engine_called
engine_called = True
raise AssertionError(
"engine initialization must happen after dependency validation"
)
def missing_dependency():
raise ModuleNotFoundError("RTL dependency is missing")
monkeypatch.setattr(rec_main, "get_engine", fail_get_engine)
monkeypatch.setattr(rec_main, "validate_rtl_dependency", missing_dependency)
cfg = SimpleNamespace(lang_type=LangRec.ARABIC, engine_type=EngineType.ONNXRUNTIME)
with pytest.raises(ModuleNotFoundError, match="RTL dependency is missing"):
rec_main.TextRecognizer(cfg)
assert engine_called is False
def test_arabic_enum_is_normalized_for_rtl_detection():
assert normalize_lang(LangRec.ARABIC) in rec_main.RTL_LANGS