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