1from fontTools.misc.transform import Transform, Identity, Offset, Scale 2import math 3import pytest 4 5 6class TransformTest(object): 7 8 def test_examples(self): 9 t = Transform() 10 assert repr(t) == "<Transform [1 0 0 1 0 0]>" 11 assert t.scale(2) == Transform(2, 0, 0, 2, 0, 0) 12 assert t.scale(2.5, 5.5) == Transform(2.5, 0, 0, 5.5, 0, 0) 13 assert t.scale(2, 3).transformPoint((100, 100)) == (200, 300) 14 15 def test__init__(self): 16 assert Transform(12) == Transform(12, 0, 0, 1, 0, 0) 17 assert Transform(dx=12) == Transform(1, 0, 0, 1, 12, 0) 18 assert Transform(yx=12) == Transform(1, 0, 12, 1, 0, 0) 19 20 def test_transformPoints(self): 21 t = Transform(2, 0, 0, 3, 0, 0) 22 assert t.transformPoints( 23 [(0, 0), (0, 100), (100, 100), (100, 0)] 24 ) == [(0, 0), (0, 300), (200, 300), (200, 0)] 25 26 def test_transformVector(self): 27 t = Transform(2, 0, 0, 3, -10, 30) 28 assert t.transformVector((-4, 5)) == (-8, 15) 29 30 def test_transformVectors(self): 31 t = Transform(2, 0, 0, 3, -10, 30) 32 assert t.transformVectors([(-4, 5), (-6, 7)]) == [(-8, 15), (-12, 21)] 33 34 def test_translate(self): 35 t = Transform() 36 assert t.translate(20, 30) == Transform(1, 0, 0, 1, 20, 30) 37 38 def test_scale(self): 39 t = Transform() 40 assert t.scale(5) == Transform(5, 0, 0, 5, 0, 0) 41 assert t.scale(5, 6) == Transform(5, 0, 0, 6, 0, 0) 42 43 def test_rotate(self): 44 t = Transform() 45 assert t.rotate(math.pi / 2) == Transform(0, 1, -1, 0, 0, 0) 46 t = Transform() 47 assert t.rotate(-math.pi / 2) == Transform(0, -1, 1, 0, 0, 0) 48 t = Transform() 49 assert tuple(t.rotate(math.radians(30))) == pytest.approx( 50 tuple(Transform(0.866025, 0.5, -0.5, 0.866025, 0, 0))) 51 52 def test_skew(self): 53 t = Transform().skew(math.pi / 4) 54 assert tuple(t) == pytest.approx(tuple(Transform(1, 0, 1, 1, 0, 0))) 55 56 def test_transform(self): 57 t = Transform(2, 0, 0, 3, 1, 6) 58 assert t.transform((4, 3, 2, 1, 5, 6)) == Transform(8, 9, 4, 3, 11, 24) 59 60 def test_reverseTransform(self): 61 t = Transform(2, 0, 0, 3, 1, 6) 62 reverse_t = t.reverseTransform((4, 3, 2, 1, 5, 6)) 63 assert reverse_t == Transform(8, 6, 6, 3, 21, 15) 64 t = Transform(4, 3, 2, 1, 5, 6) 65 reverse_t = t.transform((2, 0, 0, 3, 1, 6)) 66 assert reverse_t == Transform(8, 6, 6, 3, 21, 15) 67 68 def test_inverse(self): 69 t = Transform().translate(2, 3).scale(4, 5) 70 assert t.transformPoint((10, 20)) == (42, 103) 71 it = t.inverse() 72 assert it.transformPoint((42, 103)) == (10.0, 20.0) 73 assert Transform().inverse() == Transform() 74 75 def test_toPS(self): 76 t = Transform().scale(2, 3).translate(4, 5) 77 assert t.toPS() == '[2 0 0 3 8 15]' 78 79 def test__ne__(self): 80 assert Transform() != Transform(2, 0, 0, 2, 0, 0) 81 82 def test__hash__(self): 83 t = Transform(12, 0, 0, 13, 0, 0) 84 d = {t: None} 85 assert t in d.keys() 86 87 def test__bool__(self): 88 assert not bool(Transform()) 89 assert Transform(2, 0, 0, 2, 0, 0) 90 assert Transform(1, 0, 0, 1, 1, 0) 91 92 def test__repr__(self): 93 assert repr(Transform(1, 2, 3, 4, 5, 6)) == '<Transform [1 2 3 4 5 6]>' 94 95 def test_Identity(self): 96 assert isinstance(Identity, Transform) 97 assert Identity == Transform(1, 0, 0, 1, 0, 0) 98 99 def test_Offset(self): 100 assert Offset() == Transform(1, 0, 0, 1, 0, 0) 101 assert Offset(1) == Transform(1, 0, 0, 1, 1, 0) 102 assert Offset(1, 2) == Transform(1, 0, 0, 1, 1, 2) 103 104 def test_Scale(self): 105 assert Scale(1) == Transform(1, 0, 0, 1, 0, 0) 106 assert Scale(2) == Transform(2, 0, 0, 2, 0, 0) 107 assert Scale(1, 2) == Transform(1, 0, 0, 2, 0, 0) 108