1*e1fe3e4aSElliott Hughesfrom fontTools.varLib.instancer import solver 2*e1fe3e4aSElliott Hughesfrom fontTools.varLib.instancer import NormalizedAxisTripleAndDistances 3*e1fe3e4aSElliott Hughesimport pytest 4*e1fe3e4aSElliott Hughes 5*e1fe3e4aSElliott Hughes 6*e1fe3e4aSElliott Hughesclass RebaseTentTest(object): 7*e1fe3e4aSElliott Hughes @pytest.mark.parametrize( 8*e1fe3e4aSElliott Hughes "tent, axisRange, expected", 9*e1fe3e4aSElliott Hughes [ 10*e1fe3e4aSElliott Hughes # Case 1: # Pin at default 11*e1fe3e4aSElliott Hughes pytest.param((0, 1, 1), (0.0, 0.0, 0.0), []), 12*e1fe3e4aSElliott Hughes # Case 1: 13*e1fe3e4aSElliott Hughes pytest.param((0.3, 0.5, 0.8), (0.1, 0.2, 0.3), []), 14*e1fe3e4aSElliott Hughes # Pin axis 15*e1fe3e4aSElliott Hughes pytest.param( 16*e1fe3e4aSElliott Hughes (0, 1, 1), 17*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.5), 18*e1fe3e4aSElliott Hughes [ 19*e1fe3e4aSElliott Hughes (0.5, None), 20*e1fe3e4aSElliott Hughes ], 21*e1fe3e4aSElliott Hughes ), 22*e1fe3e4aSElliott Hughes # Case 2: 23*e1fe3e4aSElliott Hughes pytest.param( 24*e1fe3e4aSElliott Hughes (0, 1, 1), 25*e1fe3e4aSElliott Hughes (-1, 0, 0.5), 26*e1fe3e4aSElliott Hughes [ 27*e1fe3e4aSElliott Hughes (0.5, (0, 1, 1)), 28*e1fe3e4aSElliott Hughes ], 29*e1fe3e4aSElliott Hughes ), 30*e1fe3e4aSElliott Hughes # Case 2: 31*e1fe3e4aSElliott Hughes pytest.param( 32*e1fe3e4aSElliott Hughes (0, 1, 1), 33*e1fe3e4aSElliott Hughes (-1, 0, 0.75), 34*e1fe3e4aSElliott Hughes [ 35*e1fe3e4aSElliott Hughes (0.75, (0, 1, 1)), 36*e1fe3e4aSElliott Hughes ], 37*e1fe3e4aSElliott Hughes ), 38*e1fe3e4aSElliott Hughes # 39*e1fe3e4aSElliott Hughes # Without gain: 40*e1fe3e4aSElliott Hughes # 41*e1fe3e4aSElliott Hughes # Case 3 42*e1fe3e4aSElliott Hughes pytest.param( 43*e1fe3e4aSElliott Hughes (0, 0.2, 1), 44*e1fe3e4aSElliott Hughes (-1, 0, 0.8), 45*e1fe3e4aSElliott Hughes [ 46*e1fe3e4aSElliott Hughes (1, (0, 0.25, 1)), 47*e1fe3e4aSElliott Hughes (0.25, (0.25, 1, 1)), 48*e1fe3e4aSElliott Hughes ], 49*e1fe3e4aSElliott Hughes ), 50*e1fe3e4aSElliott Hughes # Case 3 boundary 51*e1fe3e4aSElliott Hughes pytest.param( 52*e1fe3e4aSElliott Hughes (0, 0.4, 1), 53*e1fe3e4aSElliott Hughes (-1, 0, 0.5), 54*e1fe3e4aSElliott Hughes [ 55*e1fe3e4aSElliott Hughes (1, (0, 0.8, 1)), 56*e1fe3e4aSElliott Hughes (2.5 / 3, (0.8, 1, 1)), 57*e1fe3e4aSElliott Hughes ], 58*e1fe3e4aSElliott Hughes ), 59*e1fe3e4aSElliott Hughes # Case 4 60*e1fe3e4aSElliott Hughes pytest.param( 61*e1fe3e4aSElliott Hughes (0, 0.25, 1), 62*e1fe3e4aSElliott Hughes (-1, 0, 0.4), 63*e1fe3e4aSElliott Hughes [ 64*e1fe3e4aSElliott Hughes (1, (0, 0.625, 1)), 65*e1fe3e4aSElliott Hughes (0.8, (0.625, 1, 1)), 66*e1fe3e4aSElliott Hughes ], 67*e1fe3e4aSElliott Hughes ), 68*e1fe3e4aSElliott Hughes pytest.param( 69*e1fe3e4aSElliott Hughes (0.25, 0.3, 1.05), 70*e1fe3e4aSElliott Hughes (0, 0.2, 0.4), 71*e1fe3e4aSElliott Hughes [ 72*e1fe3e4aSElliott Hughes (1, (0.25, 0.5, 1)), 73*e1fe3e4aSElliott Hughes (2.6 / 3, (0.5, 1, 1)), 74*e1fe3e4aSElliott Hughes ], 75*e1fe3e4aSElliott Hughes ), 76*e1fe3e4aSElliott Hughes # Case 4 boundary 77*e1fe3e4aSElliott Hughes pytest.param( 78*e1fe3e4aSElliott Hughes (0.25, 0.5, 1), 79*e1fe3e4aSElliott Hughes (0, 0.25, 0.5), 80*e1fe3e4aSElliott Hughes [ 81*e1fe3e4aSElliott Hughes (1, (0, 1, 1)), 82*e1fe3e4aSElliott Hughes ], 83*e1fe3e4aSElliott Hughes ), 84*e1fe3e4aSElliott Hughes # 85*e1fe3e4aSElliott Hughes # With gain: 86*e1fe3e4aSElliott Hughes # 87*e1fe3e4aSElliott Hughes # Case 3a/1neg 88*e1fe3e4aSElliott Hughes pytest.param( 89*e1fe3e4aSElliott Hughes (0.0, 0.5, 1), 90*e1fe3e4aSElliott Hughes (0, 0.5, 1), 91*e1fe3e4aSElliott Hughes [ 92*e1fe3e4aSElliott Hughes (1, None), 93*e1fe3e4aSElliott Hughes (-1, (0, 1, 1)), 94*e1fe3e4aSElliott Hughes (-1, (-1, -1, 0)), 95*e1fe3e4aSElliott Hughes ], 96*e1fe3e4aSElliott Hughes ), 97*e1fe3e4aSElliott Hughes pytest.param( 98*e1fe3e4aSElliott Hughes (0.0, 0.5, 1), 99*e1fe3e4aSElliott Hughes (0, 0.5, 0.75), 100*e1fe3e4aSElliott Hughes [ 101*e1fe3e4aSElliott Hughes (1, None), 102*e1fe3e4aSElliott Hughes (-0.5, (0, 1, 1)), 103*e1fe3e4aSElliott Hughes (-1, (-1, -1, 0)), 104*e1fe3e4aSElliott Hughes ], 105*e1fe3e4aSElliott Hughes ), 106*e1fe3e4aSElliott Hughes pytest.param( 107*e1fe3e4aSElliott Hughes (0.0, 0.5, 1), 108*e1fe3e4aSElliott Hughes (0, 0.25, 0.8), 109*e1fe3e4aSElliott Hughes [ 110*e1fe3e4aSElliott Hughes (0.5, None), 111*e1fe3e4aSElliott Hughes (0.5, (0, 0.45454545, 0.9090909090)), 112*e1fe3e4aSElliott Hughes (-0.1, (0.9090909090, 1.0, 1.0)), 113*e1fe3e4aSElliott Hughes (-0.5, (-1, -1, 0)), 114*e1fe3e4aSElliott Hughes ], 115*e1fe3e4aSElliott Hughes ), 116*e1fe3e4aSElliott Hughes # Case 3a/1neg 117*e1fe3e4aSElliott Hughes pytest.param( 118*e1fe3e4aSElliott Hughes (0.0, 0.5, 2), 119*e1fe3e4aSElliott Hughes (0.2, 0.5, 0.8), 120*e1fe3e4aSElliott Hughes [ 121*e1fe3e4aSElliott Hughes (1, None), 122*e1fe3e4aSElliott Hughes (-0.2, (0, 1, 1)), 123*e1fe3e4aSElliott Hughes (-0.6, (-1, -1, 0)), 124*e1fe3e4aSElliott Hughes ], 125*e1fe3e4aSElliott Hughes ), 126*e1fe3e4aSElliott Hughes # Case 3a/1neg 127*e1fe3e4aSElliott Hughes pytest.param( 128*e1fe3e4aSElliott Hughes (0.0, 0.5, 2), 129*e1fe3e4aSElliott Hughes (0.2, 0.5, 1), 130*e1fe3e4aSElliott Hughes [ 131*e1fe3e4aSElliott Hughes (1, None), 132*e1fe3e4aSElliott Hughes (-1 / 3, (0, 1, 1)), 133*e1fe3e4aSElliott Hughes (-0.6, (-1, -1, 0)), 134*e1fe3e4aSElliott Hughes ], 135*e1fe3e4aSElliott Hughes ), 136*e1fe3e4aSElliott Hughes # Case 3 137*e1fe3e4aSElliott Hughes pytest.param( 138*e1fe3e4aSElliott Hughes (0, 0.5, 1), 139*e1fe3e4aSElliott Hughes (0.25, 0.25, 0.75), 140*e1fe3e4aSElliott Hughes [ 141*e1fe3e4aSElliott Hughes (0.5, None), 142*e1fe3e4aSElliott Hughes (0.5, (0, 0.5, 1.0)), 143*e1fe3e4aSElliott Hughes ], 144*e1fe3e4aSElliott Hughes ), 145*e1fe3e4aSElliott Hughes # Case 1neg 146*e1fe3e4aSElliott Hughes pytest.param( 147*e1fe3e4aSElliott Hughes (0.0, 0.5, 1), 148*e1fe3e4aSElliott Hughes (0, 0.25, 0.5), 149*e1fe3e4aSElliott Hughes [ 150*e1fe3e4aSElliott Hughes (0.5, None), 151*e1fe3e4aSElliott Hughes (0.5, (0, 1, 1)), 152*e1fe3e4aSElliott Hughes (-0.5, (-1, -1, 0)), 153*e1fe3e4aSElliott Hughes ], 154*e1fe3e4aSElliott Hughes ), 155*e1fe3e4aSElliott Hughes # Case 2neg 156*e1fe3e4aSElliott Hughes pytest.param( 157*e1fe3e4aSElliott Hughes (0.05, 0.55, 1), 158*e1fe3e4aSElliott Hughes (0, 0.25, 0.5), 159*e1fe3e4aSElliott Hughes [ 160*e1fe3e4aSElliott Hughes (0.4, None), 161*e1fe3e4aSElliott Hughes (0.5, (0, 1, 1)), 162*e1fe3e4aSElliott Hughes (-0.4, (-1, -0.8, 0)), 163*e1fe3e4aSElliott Hughes (-0.4, (-1, -1, -0.8)), 164*e1fe3e4aSElliott Hughes ], 165*e1fe3e4aSElliott Hughes ), 166*e1fe3e4aSElliott Hughes # Case 2neg, other side 167*e1fe3e4aSElliott Hughes pytest.param( 168*e1fe3e4aSElliott Hughes (-1, -0.55, -0.05), 169*e1fe3e4aSElliott Hughes (-0.5, -0.25, 0), 170*e1fe3e4aSElliott Hughes [ 171*e1fe3e4aSElliott Hughes (0.4, None), 172*e1fe3e4aSElliott Hughes (0.5, (-1, -1, 0)), 173*e1fe3e4aSElliott Hughes (-0.4, (0, 0.8, 1)), 174*e1fe3e4aSElliott Hughes (-0.4, (0.8, 1, 1)), 175*e1fe3e4aSElliott Hughes ], 176*e1fe3e4aSElliott Hughes ), 177*e1fe3e4aSElliott Hughes # 178*e1fe3e4aSElliott Hughes # Misc corner cases 179*e1fe3e4aSElliott Hughes # 180*e1fe3e4aSElliott Hughes pytest.param( 181*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.5), 182*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.5), 183*e1fe3e4aSElliott Hughes [ 184*e1fe3e4aSElliott Hughes (1, None), 185*e1fe3e4aSElliott Hughes ], 186*e1fe3e4aSElliott Hughes ), 187*e1fe3e4aSElliott Hughes pytest.param( 188*e1fe3e4aSElliott Hughes (0.3, 0.5, 0.7), 189*e1fe3e4aSElliott Hughes (0.1, 0.5, 0.9), 190*e1fe3e4aSElliott Hughes [ 191*e1fe3e4aSElliott Hughes (1, None), 192*e1fe3e4aSElliott Hughes (-1, (0, 0.5, 1)), 193*e1fe3e4aSElliott Hughes (-1, (0.5, 1, 1)), 194*e1fe3e4aSElliott Hughes (-1, (-1, -0.5, 0)), 195*e1fe3e4aSElliott Hughes (-1, (-1, -1, -0.5)), 196*e1fe3e4aSElliott Hughes ], 197*e1fe3e4aSElliott Hughes ), 198*e1fe3e4aSElliott Hughes pytest.param( 199*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.5), 200*e1fe3e4aSElliott Hughes (0.25, 0.25, 0.5), 201*e1fe3e4aSElliott Hughes [ 202*e1fe3e4aSElliott Hughes (1, (1, 1, 1)), 203*e1fe3e4aSElliott Hughes ], 204*e1fe3e4aSElliott Hughes ), 205*e1fe3e4aSElliott Hughes pytest.param( 206*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.5), 207*e1fe3e4aSElliott Hughes (0.25, 0.35, 0.5), 208*e1fe3e4aSElliott Hughes [ 209*e1fe3e4aSElliott Hughes (1, (1, 1, 1)), 210*e1fe3e4aSElliott Hughes ], 211*e1fe3e4aSElliott Hughes ), 212*e1fe3e4aSElliott Hughes pytest.param( 213*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.55), 214*e1fe3e4aSElliott Hughes (0.25, 0.35, 0.5), 215*e1fe3e4aSElliott Hughes [ 216*e1fe3e4aSElliott Hughes (1, (1, 1, 1)), 217*e1fe3e4aSElliott Hughes ], 218*e1fe3e4aSElliott Hughes ), 219*e1fe3e4aSElliott Hughes pytest.param( 220*e1fe3e4aSElliott Hughes (0.5, 0.5, 1), 221*e1fe3e4aSElliott Hughes (0.5, 0.5, 1), 222*e1fe3e4aSElliott Hughes [ 223*e1fe3e4aSElliott Hughes (1, None), 224*e1fe3e4aSElliott Hughes (-1, (0, 1, 1)), 225*e1fe3e4aSElliott Hughes ], 226*e1fe3e4aSElliott Hughes ), 227*e1fe3e4aSElliott Hughes pytest.param( 228*e1fe3e4aSElliott Hughes (0.25, 0.5, 1), 229*e1fe3e4aSElliott Hughes (0.5, 0.5, 1), 230*e1fe3e4aSElliott Hughes [ 231*e1fe3e4aSElliott Hughes (1, None), 232*e1fe3e4aSElliott Hughes (-1, (0, 1, 1)), 233*e1fe3e4aSElliott Hughes ], 234*e1fe3e4aSElliott Hughes ), 235*e1fe3e4aSElliott Hughes pytest.param( 236*e1fe3e4aSElliott Hughes (0, 0.2, 1), 237*e1fe3e4aSElliott Hughes (0, 0, 0.5), 238*e1fe3e4aSElliott Hughes [ 239*e1fe3e4aSElliott Hughes (1, (0, 0.4, 1)), 240*e1fe3e4aSElliott Hughes (0.625, (0.4, 1, 1)), 241*e1fe3e4aSElliott Hughes ], 242*e1fe3e4aSElliott Hughes ), 243*e1fe3e4aSElliott Hughes # https://github.com/fonttools/fonttools/issues/3139 244*e1fe3e4aSElliott Hughes pytest.param( 245*e1fe3e4aSElliott Hughes (0, 0.5, 1), 246*e1fe3e4aSElliott Hughes (-1, 0.25, 1), 247*e1fe3e4aSElliott Hughes [ 248*e1fe3e4aSElliott Hughes (0.5, None), 249*e1fe3e4aSElliott Hughes (0.5, (0.0, 1 / 3, 2 / 3)), 250*e1fe3e4aSElliott Hughes (-0.5, (2 / 3, 1, 1)), 251*e1fe3e4aSElliott Hughes (-0.5, (-1, -0.2, 0)), 252*e1fe3e4aSElliott Hughes (-0.5, (-1, -1, -0.2)), 253*e1fe3e4aSElliott Hughes ], 254*e1fe3e4aSElliott Hughes ), 255*e1fe3e4aSElliott Hughes # Dirac delta at new default. Fancy! 256*e1fe3e4aSElliott Hughes pytest.param( 257*e1fe3e4aSElliott Hughes (0.5, 0.5, 0.5), 258*e1fe3e4aSElliott Hughes (0, 0.5, 1), 259*e1fe3e4aSElliott Hughes [ 260*e1fe3e4aSElliott Hughes (1, None), 261*e1fe3e4aSElliott Hughes (-1, (0, 0.0001220703, 1)), 262*e1fe3e4aSElliott Hughes (-1, (0.0001220703, 1, 1)), 263*e1fe3e4aSElliott Hughes (-1, (-1, -0.0001220703, 0)), 264*e1fe3e4aSElliott Hughes (-1, (-1, -1, -0.0001220703)), 265*e1fe3e4aSElliott Hughes ], 266*e1fe3e4aSElliott Hughes ), 267*e1fe3e4aSElliott Hughes # https://github.com/fonttools/fonttools/issues/3177 268*e1fe3e4aSElliott Hughes pytest.param( 269*e1fe3e4aSElliott Hughes (0, 1, 1), 270*e1fe3e4aSElliott Hughes (-1, -0.5, +1, 1, 1), 271*e1fe3e4aSElliott Hughes [ 272*e1fe3e4aSElliott Hughes (1.0, (1 / 3, 1.0, 1.0)), 273*e1fe3e4aSElliott Hughes ], 274*e1fe3e4aSElliott Hughes ), 275*e1fe3e4aSElliott Hughes pytest.param( 276*e1fe3e4aSElliott Hughes (0, 1, 1), 277*e1fe3e4aSElliott Hughes (-1, -0.5, +1, 2, 1), 278*e1fe3e4aSElliott Hughes [ 279*e1fe3e4aSElliott Hughes (1.0, (0.5, 1.0, 1.0)), 280*e1fe3e4aSElliott Hughes ], 281*e1fe3e4aSElliott Hughes ), 282*e1fe3e4aSElliott Hughes # https://github.com/fonttools/fonttools/issues/3291 283*e1fe3e4aSElliott Hughes pytest.param( 284*e1fe3e4aSElliott Hughes (0.6, 0.7, 0.8), 285*e1fe3e4aSElliott Hughes (-1, 0.2, +1, 1, 1), 286*e1fe3e4aSElliott Hughes [ 287*e1fe3e4aSElliott Hughes (1.0, (0.5, 0.625, 0.75)), 288*e1fe3e4aSElliott Hughes ], 289*e1fe3e4aSElliott Hughes ), 290*e1fe3e4aSElliott Hughes ], 291*e1fe3e4aSElliott Hughes ) 292*e1fe3e4aSElliott Hughes def test_rebaseTent(self, tent, axisRange, expected): 293*e1fe3e4aSElliott Hughes axisRange = NormalizedAxisTripleAndDistances(*axisRange) 294*e1fe3e4aSElliott Hughes 295*e1fe3e4aSElliott Hughes sol = solver.rebaseTent(tent, axisRange) 296*e1fe3e4aSElliott Hughes 297*e1fe3e4aSElliott Hughes a = pytest.approx 298*e1fe3e4aSElliott Hughes expected = [ 299*e1fe3e4aSElliott Hughes (a(scalar), (a(v[0]), a(v[1]), a(v[2])) if v is not None else None) 300*e1fe3e4aSElliott Hughes for scalar, v in expected 301*e1fe3e4aSElliott Hughes ] 302*e1fe3e4aSElliott Hughes 303*e1fe3e4aSElliott Hughes assert sol == expected, (tent, axisRange) 304