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