font
This commit is contained in:
77
tests/unit/utils/test_system_fonts.py
Normal file
77
tests/unit/utils/test_system_fonts.py
Normal file
@@ -0,0 +1,77 @@
|
||||
"""Tests for system font utilities."""
|
||||
|
||||
from types import ModuleType
|
||||
import importlib.util
|
||||
import pathlib
|
||||
import sys
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def system_module():
|
||||
"""Load the system utilities module without importing the addon __init__."""
|
||||
module_name = "src.utils.system"
|
||||
original = sys.modules.pop(module_name, None)
|
||||
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
module_name,
|
||||
pathlib.Path(__file__).resolve().parents[3] / "src" / "utils" / "system.py",
|
||||
)
|
||||
module = importlib.util.module_from_spec(spec)
|
||||
assert spec.loader is not None
|
||||
sys.modules[module_name] = module
|
||||
spec.loader.exec_module(module)
|
||||
try:
|
||||
yield module
|
||||
finally:
|
||||
if original is None:
|
||||
sys.modules.pop(module_name, None)
|
||||
else:
|
||||
sys.modules[module_name] = original
|
||||
|
||||
|
||||
def test_find_default_truetype_font_skips_fonts_without_latin(monkeypatch, system_module):
|
||||
"""Ensure selection skips fonts that produce unusable glyph metrics."""
|
||||
try:
|
||||
from PIL import ImageFont
|
||||
except ImportError:
|
||||
pytest.skip("Pillow not available in test environment")
|
||||
|
||||
def fake_system():
|
||||
return "Darwin"
|
||||
|
||||
monkeypatch.setattr(system_module.platform, "system", fake_system)
|
||||
|
||||
def fake_exists(path):
|
||||
return path in {"/bad/font.ttf", "/good/font.ttf"}
|
||||
|
||||
monkeypatch.setattr(system_module.os.path, "exists", fake_exists)
|
||||
|
||||
monkeypatch.setattr(
|
||||
system_module,
|
||||
"get_system_fonts",
|
||||
lambda: {"Bad": "/bad/font.ttf", "Good": "/good/font.ttf"},
|
||||
)
|
||||
|
||||
class FontStub:
|
||||
def __init__(self, path):
|
||||
self.path = path
|
||||
|
||||
def getbbox(self, text):
|
||||
if self.path == "/bad/font.ttf":
|
||||
if text == "H":
|
||||
return (0, 10, 40, 50)
|
||||
return (0, 0, 100, 200)
|
||||
if text == "H":
|
||||
return (0, 12, 36, 52)
|
||||
return (0, 20, 30, 48)
|
||||
|
||||
def fake_truetype(path, size):
|
||||
return FontStub(path)
|
||||
|
||||
monkeypatch.setattr(ImageFont, "truetype", fake_truetype)
|
||||
system_module._DEFAULT_FONT_CACHE = None
|
||||
|
||||
selected = system_module.find_default_truetype_font()
|
||||
assert selected == "/good/font.ttf"
|
||||
Reference in New Issue
Block a user