| from __future__ import print_function, absolute_import, division |
| |
| from fontTools.misc.py23 import * |
| from fontTools.pens.recordingPen import RecordingPen |
| from fontTools.svgLib.path import shapes |
| from fontTools.misc import etree |
| import pytest |
| |
| |
| @pytest.mark.parametrize( |
| "svg_xml, expected_path", |
| [ |
| # path: direct passthrough |
| ( |
| "<path d='I love kittens'/>", |
| "I love kittens" |
| ), |
| # path no @d |
| ( |
| "<path duck='Mallard'/>", |
| None |
| ), |
| # rect: minimal valid example |
| ( |
| "<rect width='1' height='1'/>", |
| "M0,0 H1 V1 H0 V0 z", |
| ), |
| # rect: sharp corners |
| ( |
| "<rect x='10' y='11' width='17' height='11'/>", |
| "M10,11 H27 V22 H10 V11 z", |
| ), |
| # 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", |
| ), |
| # polygon |
| ( |
| "<polygon points='30,10 50,30 10,30'/>", |
| "M30,10 50,30 10,30 z" |
| ), |
| # circle, minimal valid example |
| ( |
| "<circle r='1'/>", |
| "M-1,0 A1,1 0 1 1 1,0 A1,1 0 1 1 -1,0" |
| ), |
| # circle |
| ( |
| "<circle cx='600' cy='200' r='100'/>", |
| "M500,200 A100,100 0 1 1 700,200 A100,100 0 1 1 500,200" |
| ), |
| # 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" |
| ) |
| ] |
| ) |
| def test_el_to_path(svg_xml, expected_path): |
| pb = shapes.PathBuilder() |
| pb.add_path_from_element(etree.fromstring(svg_xml)) |
| if expected_path: |
| expected = [expected_path] |
| else: |
| expected = [] |
| assert pb.paths == expected |