• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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