xref: /aosp_15_r20/external/fonttools/Tests/varLib/builder_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1from fontTools.varLib.builder import buildVarData
2import pytest
3
4
5@pytest.mark.parametrize(
6    "region_indices, items, expected_num_shorts",
7    [
8        ([], [], 0),
9        ([0], [[1]], 0),
10        ([0], [[128]], 1),
11        ([0, 1, 2], [[128, 1, 2], [3, -129, 5], [6, 7, 8]], 2),
12        ([0, 1, 2], [[0, 128, 2], [3, 4, 5], [6, 7, -129]], 3),
13        ([0], [[32768]], 0x8001),
14        ([0, 1, 2], [[32768, 1, 2], [3, -129, 5], [6, 7, 8]], 0x8001),
15        ([0, 1, 2], [[32768, 1, 2], [3, -32769, 5], [6, 7, 8]], 0x8002),
16        ([0, 1, 2], [[0, 32768, 2], [3, 4, 5], [6, 7, -32769]], 0x8003),
17    ],
18    ids=[
19        "0_regions_0_deltas",
20        "1_region_1_uint8",
21        "1_region_1_short",
22        "3_regions_2_shorts_ordered",
23        "3_regions_2_shorts_unordered",
24        "1_region_1_long",
25        "3_regions_1_long_ordered",
26        "3_regions_2_longs_ordered",
27        "3_regions_2_longs_unordered",
28    ],
29)
30def test_buildVarData_no_optimize(region_indices, items, expected_num_shorts):
31    data = buildVarData(region_indices, items, optimize=False)
32
33    assert data.ItemCount == len(items)
34    assert data.NumShorts == expected_num_shorts
35    assert data.VarRegionCount == len(region_indices)
36    assert data.VarRegionIndex == region_indices
37    assert data.Item == items
38
39
40@pytest.mark.parametrize(
41    [
42        "region_indices",
43        "items",
44        "expected_num_shorts",
45        "expected_regions",
46        "expected_items",
47    ],
48    [
49        (
50            [0, 1, 2],
51            [[0, 1, 2], [3, 4, 5], [6, 7, 8]],
52            0,
53            [0, 1, 2],
54            [[0, 1, 2], [3, 4, 5], [6, 7, 8]],
55        ),
56        (
57            [0, 1, 2],
58            [[0, 128, 2], [3, 4, 5], [6, 7, 8]],
59            1,
60            [1, 0, 2],
61            [[128, 0, 2], [4, 3, 5], [7, 6, 8]],
62        ),
63        (
64            [0, 1, 2],
65            [[0, 1, 128], [3, 4, 5], [6, -129, 8]],
66            2,
67            [1, 2, 0],
68            [[1, 128, 0], [4, 5, 3], [-129, 8, 6]],
69        ),
70        (
71            [0, 1, 2],
72            [[128, 1, -129], [3, 4, 5], [6, 7, 8]],
73            2,
74            [0, 2, 1],
75            [[128, -129, 1], [3, 5, 4], [6, 8, 7]],
76        ),
77        (
78            [0, 1, 2],
79            [[0, 1, 128], [3, -129, 5], [256, 7, 8]],
80            3,
81            [0, 1, 2],
82            [[0, 1, 128], [3, -129, 5], [256, 7, 8]],
83        ),
84        (
85            [0, 1, 2],
86            [[0, 128, 2], [0, 4, 5], [0, 7, 8]],
87            1,
88            [1, 2],
89            [[128, 2], [4, 5], [7, 8]],
90        ),
91        (
92            [0, 1, 2],
93            [[0, 32768, 2], [3, 4, 5], [6, 7, 8]],
94            0x8001,
95            [1, 0, 2],
96            [[32768, 0, 2], [4, 3, 5], [7, 6, 8]],
97        ),
98        (
99            [0, 1, 2],
100            [[0, 1, 32768], [3, 4, 5], [6, -32769, 8]],
101            0x8002,
102            [1, 2, 0],
103            [[1, 32768, 0], [4, 5, 3], [-32769, 8, 6]],
104        ),
105        (
106            [0, 1, 2],
107            [[32768, 1, -32769], [3, 4, 5], [6, 7, 8]],
108            0x8002,
109            [0, 2, 1],
110            [[32768, -32769, 1], [3, 5, 4], [6, 8, 7]],
111        ),
112        (
113            [0, 1, 2],
114            [[0, 1, 32768], [3, -32769, 5], [65536, 7, 8]],
115            0x8003,
116            [0, 1, 2],
117            [[0, 1, 32768], [3, -32769, 5], [65536, 7, 8]],
118        ),
119        (
120            [0, 1, 2],
121            [[0, 32768, 2], [0, 4, 5], [0, 7, 8]],
122            0x8001,
123            [1, 2],
124            [[32768, 2], [4, 5], [7, 8]],
125        ),
126    ],
127    ids=[
128        "0/3_shorts_no_reorder",
129        "1/3_shorts_reorder",
130        "2/3_shorts_reorder",
131        "2/3_shorts_same_row_reorder",
132        "3/3_shorts_no_reorder",
133        "1/3_shorts_1/3_zeroes",
134        "1/3_longs_reorder",
135        "2/3_longs_reorder",
136        "2/3_longs_same_row_reorder",
137        "3/3_longs_no_reorder",
138        "1/3_longs_1/3_zeroes",
139    ],
140)
141def test_buildVarData_optimize(
142    region_indices, items, expected_num_shorts, expected_regions, expected_items
143):
144    data = buildVarData(region_indices, items, optimize=True)
145
146    assert data.ItemCount == len(items)
147    assert data.NumShorts == expected_num_shorts
148    assert data.VarRegionCount == len(expected_regions)
149    assert data.VarRegionIndex == expected_regions
150    assert data.Item == expected_items
151
152
153if __name__ == "__main__":
154    import sys
155
156    sys.exit(pytest.main(sys.argv))
157