aboutsummaryrefslogtreecommitdiff
path: root/Tests/svgLib/path/shapes_test.py
blob: 24e3dd2eb86546cabd8c3ddd8509a7cce6f5b4e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from fontTools.svgLib.path import shapes
from fontTools.misc import etree
import pytest


@pytest.mark.parametrize(
    "svg_xml, expected_path, expected_transform",
    [
        # path: direct passthrough
        (
            "<path d='I love kittens'/>",
            "I love kittens",
            None
        ),
        # path no @d
        (
            "<path duck='Mallard'/>",
            None,
            None
        ),
        # line
        (
            '<line x1="10" x2="50" y1="110" y2="150"/>',
            'M10,110 L50,150',
            None
        ),
        # line, decimal positioning
        (
            '<line x1="10.0" x2="50.5" y1="110.2" y2="150.7"/>',
            'M10,110.2 L50.5,150.7',
            None
        ),
        # rect: minimal valid example
        (
            "<rect width='1' height='1'/>",
            "M0,0 H1 V1 H0 V0 z",
            None
        ),
        # rect: sharp corners
        (
            "<rect x='10' y='11' width='17' height='11'/>",
            "M10,11 H27 V22 H10 V11 z",
            None
        ),
        # rect: round corners
        (
            "<rect x='9' y='9' width='11' height='7' rx='2'/>",
            "M11,9 H18 A2,2 0 0 1 20,11 V14 A2,2 0 0 1 18,16 H11"
            " A2,2 0 0 1 9,14 V11 A2,2 0 0 1 11,9 z",
            None
        ),
        # rect: simple
        (
            "<rect x='11.5' y='16' width='11' height='2'/>",
            "M11.5,16 H22.5 V18 H11.5 V16 z",
            None
        ),
        # rect: the one above plus a rotation
        (
            "<rect x='11.5' y='16' transform='matrix(0.7071 -0.7071 0.7071 0.7071 -7.0416 16.9999)' width='11' height='2'/>",
            "M11.5,16 H22.5 V18 H11.5 V16 z",
            (0.7071, -0.7071, 0.7071, 0.7071, -7.0416, 16.9999)
        ),
        # polygon
        (
            "<polygon points='30,10 50,30 10,30'/>",
            "M30,10 50,30 10,30 z",
            None
        ),
        # polyline
        (
            "<polyline points='30,10 50,30 10,30'/>",
            "M30,10 50,30 10,30",
            None
        ),
        # circle, minimal valid example
        (
            "<circle r='1'/>",
            "M-1,0 A1,1 0 1 1 1,0 A1,1 0 1 1 -1,0",
            None
        ),
        # circle
        (
            "<circle cx='600' cy='200' r='100'/>",
            "M500,200 A100,100 0 1 1 700,200 A100,100 0 1 1 500,200",
            None
        ),
        # circle, decimal positioning
        (
            "<circle cx='12' cy='6.5' r='1.5'></circle>",
            "M10.5,6.5 A1.5,1.5 0 1 1 13.5,6.5 A1.5,1.5 0 1 1 10.5,6.5",
            None
        ),
        # circle, with transform
        (
            '<circle transform="matrix(0.9871 -0.1602 0.1602 0.9871 -7.525 8.6516)" cx="49.9" cy="51" r="14.3"/>',
            'M35.6,51 A14.3,14.3 0 1 1 64.2,51 A14.3,14.3 0 1 1 35.6,51',
            (0.9871, -0.1602, 0.1602, 0.9871, -7.525, 8.6516)
        ),
        # ellipse
        (
            '<ellipse cx="100" cy="50" rx="100" ry="50"/>',
            'M0,50 A100,50 0 1 1 200,50 A100,50 0 1 1 0,50',
            None
        ),
        # ellipse, decimal positioning
        (
            '<ellipse cx="100.5" cy="50" rx="10" ry="50.5"/>',
            'M90.5,50 A10,50.5 0 1 1 110.5,50 A10,50.5 0 1 1 90.5,50',
            None
        ),
        # ellipse, with transform
        (
            '<ellipse transform="matrix(0.9557 -0.2945 0.2945 0.9557 -14.7694 20.1454)" cx="59.5" cy="59.1" rx="30.9" ry="11.9"/>',
            'M28.6,59.1 A30.9,11.9 0 1 1 90.4,59.1 A30.9,11.9 0 1 1 28.6,59.1',
            (0.9557, -0.2945, 0.2945, 0.9557, -14.7694, 20.1454)
        ),
    ]
)
def test_el_to_path(svg_xml, expected_path, expected_transform):
    pb = shapes.PathBuilder()
    pb.add_path_from_element(etree.fromstring(svg_xml))
    if expected_path:
        expected_paths = [expected_path]
        expected_transforms = [expected_transform]
    else:
        expected_paths = []
        expected_transforms = []
    assert pb.paths == expected_paths
    assert pb.transforms == expected_transforms