File: test_515b_fonts_shapefiles.py

package info (click to toggle)
ezdxf 1.4.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 104,528 kB
  • sloc: python: 182,341; makefile: 116; lisp: 20; ansic: 4
file content (137 lines) | stat: -rw-r--r-- 4,615 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#  Copyright (c) 2023, Manfred Moitzi
#  License: MIT License

import pytest
from ezdxf.math import BoundingBox2d
from ezdxf.fonts import fonts


@pytest.fixture(scope="module", autouse=True)
def check_shape_files_available():
    if not fonts.font_manager.has_font("txt.shx"):
        pytest.skip(reason="required shapefile fonts are not available")


def test_get_font_family_for_shx_files():
    font_face = fonts.font_manager.get_font_face("txt.shx")
    assert font_face.family == "txt"


def test_get_font_family_for_shp_files():
    font_face = fonts.font_manager.get_font_face("txt.shp")
    assert font_face.family == "txt"


def test_get_font_style_for_shx_files():
    font_face = fonts.font_manager.get_font_face("txt.shx")
    assert font_face.style == ".shx"
    # Same weight and width for all shapefile fonts, because this information is not
    # included in the font definition file.
    assert font_face.weight_str == "Normal"
    assert font_face.width_str == "Medium"


def test_best_match_for_shape_files():
    font_face = fonts.find_best_match(family="iso")
    assert font_face.style == ".shx"

    font_face = fonts.find_best_match(family="iso", style=".shp")
    assert font_face.style == ".shp"

    font_face = fonts.find_best_match(family="iso", style=".lff")
    assert font_face.style == ".lff"


def test_width_value_influences_the_best_match_for_shape_files():
    # Note: the width property is used to prioritize font types:
    # 1st .shx; 2nd: .shp; 3rd: .lff
    font_face = fonts.find_best_match(family="iso", width=5)
    assert font_face.filename == "ISO.shx"
    assert font_face.style == ".shx"

    font_face = fonts.find_best_match(family="iso", width=6)
    assert font_face.style == ".shp"

    font_face = fonts.find_best_match(family="iso", width=7)
    assert font_face.style == ".lff"


class TestShapeFileFont:
    @pytest.fixture(scope="class")
    def shx(self):
        return fonts.make_font("txt.shx", 2.5)

    def test_space_width(self, shx):
        assert shx.space_width() == pytest.approx(2.5)

    def test_text_width(self, shx):
        assert shx.text_width("1234") == pytest.approx(9.1666666666)

    def test_text_width_ex(self, shx):
        assert shx.text_width_ex("1234", cap_height=3, width_factor=2) == pytest.approx(
            22
        )

    def test_text_path(self, shx):
        box = BoundingBox2d(shx.text_path("1234").control_vertices())
        assert box.size.x == pytest.approx(9.166666666)
        assert box.size.y == pytest.approx(2.5)

    def test_text_path_ex(self, shx):
        box = BoundingBox2d(
            shx.text_path_ex("1234", cap_height=3, width_factor=2).control_vertices()
        )
        assert box.size.x == pytest.approx(22)
        assert box.size.y == pytest.approx(3)


class TestGlyphCache:
    @pytest.fixture(scope="class")
    def cache(self):
        return fonts.font_manager.get_shapefile_glyph_cache("txt.shx")

    def test_get_glyphs(self, cache):
        glyph = cache.get_shape(ord("A"))
        box = BoundingBox2d(glyph.control_vertices())
        assert box.size.x == 6
        assert box.size.y == 6
        assert glyph is not cache.get_shape(ord("A")), "expected a copy"

    def test_get_advance_width(self, cache):
        glyph = cache.get_shape(ord("A"))
        assert glyph.end.x == 6  # last move_to defines the advance width
        assert cache.get_advance_width(ord("A")) == 6

    def test_get_space_width(self, cache):
        assert cache.space_width == 6

    def test_get_font_measurements(self, cache):
        fm = cache.font_measurements
        assert fm.cap_height == 6
        assert fm.baseline == 0
        assert fm.x_height == 4
        assert fm.descender_height == 2

    def test_path_for_unsupported_glyphs(self, cache):
        box = cache.get_shape(1234)
        assert len(box) == 5

    def test_spaces_are_measured(self, cache):
        assert cache.get_text_length("   ", cache.font_measurements.cap_height) == 18

    def test_spaces_are_not_rendered(self, cache):
        p = cache.get_text_glyph_paths("   ", cache.font_measurements.cap_height)
        assert len(p) == 0


def test_resolve_shx_font_name():
    assert fonts.resolve_shx_font_name("txt", order="s") == "txt.shx"
    assert fonts.resolve_shx_font_name("txt.shx", order="s") == "txt.shx"
    # txt_____.ttf is not available under test
    # prefer LibreCAD fonts:
    assert fonts.resolve_shx_font_name("txt", order="tls") == "standard.lff"
    assert fonts.resolve_shx_font_name("txt.shx", order="tls") == "standard.lff"


if __name__ == "__main__":
    pytest.main([__file__])