xref: /aosp_15_r20/external/fonttools/Tests/varLib/stat_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1from pathlib import Path
2
3import pytest
4from fontTools.designspaceLib import DesignSpaceDocument
5from fontTools.designspaceLib.split import Range
6from fontTools.varLib.stat import getStatAxes, getStatLocations
7
8
9@pytest.fixture
10def datadir():
11    return Path(__file__).parent / "../designspaceLib/data"
12
13
14def test_getStatAxes(datadir):
15    doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
16
17    assert getStatAxes(
18        doc, {"Italic": 0, "Width": Range(50, 150), "Weight": Range(200, 900)}
19    ) == [
20        {
21            "values": [
22                {
23                    "flags": 0,
24                    "name": {
25                        "de": "Extraleicht",
26                        "en": "Extra Light",
27                        "fr": "Extra léger",
28                    },
29                    "nominalValue": 200.0,
30                    "rangeMaxValue": 250.0,
31                    "rangeMinValue": 200.0,
32                },
33                {
34                    "flags": 0,
35                    "name": {"en": "Light"},
36                    "nominalValue": 300.0,
37                    "rangeMaxValue": 350.0,
38                    "rangeMinValue": 250.0,
39                },
40                {
41                    "flags": 2,
42                    "name": {"en": "Regular"},
43                    "nominalValue": 400.0,
44                    "rangeMaxValue": 450.0,
45                    "rangeMinValue": 350.0,
46                },
47                {
48                    "flags": 0,
49                    "name": {"en": "Semi Bold"},
50                    "nominalValue": 600.0,
51                    "rangeMaxValue": 650.0,
52                    "rangeMinValue": 450.0,
53                },
54                {
55                    "flags": 0,
56                    "name": {"en": "Bold"},
57                    "nominalValue": 700.0,
58                    "rangeMaxValue": 850.0,
59                    "rangeMinValue": 650.0,
60                },
61                {
62                    "flags": 0,
63                    "name": {"en": "Black"},
64                    "nominalValue": 900.0,
65                    "rangeMaxValue": 900.0,
66                    "rangeMinValue": 850.0,
67                },
68                {
69                    "flags": 2,
70                    "name": {"en": "Regular"},
71                    "value": 400.0,
72                    "linkedValue": 700.0,
73                },
74                {
75                    "flags": 0,
76                    "name": {"en": "Bold"},
77                    "value": 700.0,
78                    "linkedValue": 400.0,
79                },
80            ],
81            "name": {"en": "Wéíght", "fa-IR": "قطر"},
82            "ordering": 2,
83            "tag": "wght",
84        },
85        {
86            "values": [
87                {"flags": 0, "name": {"en": "Condensed"}, "value": 50.0},
88                {"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
89                {"flags": 0, "name": {"en": "Wide"}, "value": 125.0},
90                {
91                    "flags": 0,
92                    "name": {"en": "Extra Wide"},
93                    "nominalValue": 150.0,
94                    "rangeMinValue": 150.0,
95                },
96            ],
97            "name": {"en": "Width", "fr": "Chasse"},
98            "ordering": 1,
99            "tag": "wdth",
100        },
101        {
102            "values": [
103                {"flags": 2, "linkedValue": 1.0, "name": {"en": "Roman"}, "value": 0.0},
104            ],
105            "name": {"en": "Italic"},
106            "ordering": 3,
107            "tag": "ital",
108        },
109    ]
110
111    assert getStatAxes(doc, {"Italic": 1, "Width": 100, "Weight": Range(400, 700)}) == [
112        {
113            "values": [
114                {
115                    "flags": 2,
116                    "name": {"en": "Regular"},
117                    "nominalValue": 400.0,
118                    "rangeMaxValue": 450.0,
119                    "rangeMinValue": 350.0,
120                },
121                {
122                    "flags": 0,
123                    "name": {"en": "Semi Bold"},
124                    "nominalValue": 600.0,
125                    "rangeMaxValue": 650.0,
126                    "rangeMinValue": 450.0,
127                },
128                {
129                    "flags": 0,
130                    "name": {"en": "Bold"},
131                    "nominalValue": 700.0,
132                    "rangeMaxValue": 850.0,
133                    "rangeMinValue": 650.0,
134                },
135                {
136                    "flags": 2,
137                    "name": {"en": "Regular"},
138                    "value": 400.0,
139                    "linkedValue": 700.0,
140                },
141                {
142                    "flags": 0,
143                    "name": {"en": "Bold"},
144                    "value": 700.0,
145                    "linkedValue": 400.0,
146                },
147            ],
148            "name": {"en": "Wéíght", "fa-IR": "قطر"},
149            "ordering": 2,
150            "tag": "wght",
151        },
152        {
153            "values": [
154                {"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
155            ],
156            "name": {"en": "Width", "fr": "Chasse"},
157            "ordering": 1,
158            "tag": "wdth",
159        },
160        {
161            "values": [
162                {"flags": 0, "name": {"en": "Italic"}, "value": 1.0},
163            ],
164            "name": {"en": "Italic"},
165            "ordering": 3,
166            "tag": "ital",
167        },
168    ]
169
170
171def test_getStatLocations(datadir):
172    doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
173
174    assert getStatLocations(
175        doc, {"Italic": 0, "Width": Range(50, 150), "Weight": Range(200, 900)}
176    ) == [
177        {
178            "flags": 0,
179            "location": {"ital": 0.0, "wdth": 50.0, "wght": 300.0},
180            "name": {"en": "Some Style", "fr": "Un Style"},
181        },
182    ]
183    assert getStatLocations(
184        doc, {"Italic": 1, "Width": Range(50, 150), "Weight": Range(200, 900)}
185    ) == [
186        {
187            "flags": 0,
188            "location": {"ital": 1.0, "wdth": 100.0, "wght": 700.0},
189            "name": {"en": "Other"},
190        },
191    ]
192