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
(
"",
"I love kittens",
None
),
# path no @d
(
"",
None,
None
),
# line
(
'',
'M10,110 L50,150',
None
),
# line, decimal positioning
(
'',
'M10,110.2 L50.5,150.7',
None
),
# rect: minimal valid example
(
"",
"M0,0 H1 V1 H0 V0 z",
None
),
# rect: sharp corners
(
"",
"M10,11 H27 V22 H10 V11 z",
None
),
# rect: round corners
(
"",
"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
(
"",
"M11.5,16 H22.5 V18 H11.5 V16 z",
None
),
# rect: the one above plus a rotation
(
"",
"M11.5,16 H22.5 V18 H11.5 V16 z",
(0.7071, -0.7071, 0.7071, 0.7071, -7.0416, 16.9999)
),
# polygon
(
"",
"M30,10 50,30 10,30 z",
None
),
# polyline
(
"",
"M30,10 50,30 10,30",
None
),
# circle, minimal valid example
(
"",
"M-1,0 A1,1 0 1 1 1,0 A1,1 0 1 1 -1,0",
None
),
# circle
(
"",
"M500,200 A100,100 0 1 1 700,200 A100,100 0 1 1 500,200",
None
),
# circle, decimal positioning
(
"",
"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
(
'',
'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
(
'',
'M0,50 A100,50 0 1 1 200,50 A100,50 0 1 1 0,50',
None
),
# ellipse, decimal positioning
(
'',
'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
(
'',
'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