201 lines
6.7 KiB
Python
201 lines
6.7 KiB
Python
# coding=utf-8
|
|
#
|
|
# Copyright (C) 2016 Richard White, rwhite8282@gmail.com
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
"""
|
|
An Inkscape frame extension test class.
|
|
"""
|
|
|
|
from __future__ import absolute_import, print_function, unicode_literals
|
|
|
|
import inkex
|
|
from frame import Frame
|
|
from inkex.tester import ComparisonMixin, InkscapeExtensionTestMixin, TestCase
|
|
|
|
|
|
class FrameTest(TestCase):
|
|
"""tests for the Frame extension"""
|
|
|
|
effect_class = Frame
|
|
|
|
@staticmethod
|
|
def get_frame(svg):
|
|
"""Find the frame in the document tree"""
|
|
return svg.getElement(
|
|
'//svg:g[@id="layer1"]//svg:rect[@inkscape:label="Frame"] | '
|
|
'//svg:g[@id="layer1"]//svg:ellipse[@inkscape:label="Frame"]'
|
|
)
|
|
|
|
def test_single_frame(self):
|
|
"""Test a simple frame."""
|
|
args = [
|
|
"--corner_radius=20",
|
|
"--fill_color=-16777124",
|
|
"--id=rect3006",
|
|
"--z_position=top",
|
|
"--stroke_color=255",
|
|
'--tab="stroke"',
|
|
"--width=10",
|
|
self.data_file("svg", "single_box.svg"),
|
|
]
|
|
uut = Frame()
|
|
uut.run(args)
|
|
new_frame = self.get_frame(uut.svg)
|
|
self.assertIsNotNone(new_frame)
|
|
self.assertEqual("{http://www.w3.org/2000/svg}rect", new_frame.tag)
|
|
new_frame_style = new_frame.attrib["style"].lower()
|
|
self.assertTrue(
|
|
"fill-opacity:0.36" in new_frame_style,
|
|
'Invalid fill-opacity in "' + new_frame_style + '".',
|
|
)
|
|
self.assertTrue(
|
|
"stroke:#000000" in new_frame_style,
|
|
'Invalid stroke in "' + new_frame_style + '".',
|
|
)
|
|
self.assertTrue(
|
|
"stroke-width:10.0" in new_frame_style,
|
|
'Invalid stroke-width in "' + new_frame_style + '".',
|
|
)
|
|
self.assertTrue(
|
|
"fill:#ff0000" in new_frame_style,
|
|
'Invalid fill in "' + new_frame_style + '".',
|
|
)
|
|
|
|
def test_single_frame_grouped(self):
|
|
"""Test a grouped frame"""
|
|
args = [
|
|
"--corner_radius=20",
|
|
"--fill_color=-16777124",
|
|
"--group=True",
|
|
"--id=rect3006",
|
|
"--z_position=top",
|
|
"--stroke_color=255",
|
|
'--tab="stroke"',
|
|
"--width=10",
|
|
self.data_file("svg", "single_box.svg"),
|
|
]
|
|
uut = Frame()
|
|
uut.run(args)
|
|
new_frame = self.get_frame(uut.svg)
|
|
self.assertIsNotNone(new_frame)
|
|
self.assertEqual("{http://www.w3.org/2000/svg}rect", new_frame.tag)
|
|
group = new_frame.getparent()
|
|
self.assertEqual("{http://www.w3.org/2000/svg}g", group.tag)
|
|
self.assertEqual("{http://www.w3.org/2000/svg}rect", group[0].tag)
|
|
self.assertEqual("{http://www.w3.org/2000/svg}rect", group[1].tag)
|
|
self.assertEqual("Frame", group[1].label)
|
|
|
|
def test_single_frame_clipped(self):
|
|
"""Test a clipped frame"""
|
|
uut = self.assertEffect(
|
|
"svg",
|
|
"single_box.svg",
|
|
clip=True,
|
|
corner_radius=20,
|
|
fill_color=-16777124,
|
|
id="rect3006",
|
|
stroke_color=255,
|
|
tab="stroke",
|
|
width=10,
|
|
)
|
|
new_frame = self.get_frame(uut.svg)
|
|
self.assertIsNotNone(new_frame)
|
|
self.assertEqual("{http://www.w3.org/2000/svg}rect", new_frame.tag)
|
|
orig = list(uut.svg.selection.values())[0]
|
|
self.assertEqual("url(#clipPath5815)", orig.get("clip-path"))
|
|
clip_path = uut.svg.getElement("//svg:defs/svg:clipPath")
|
|
self.assertEqual("{http://www.w3.org/2000/svg}clipPath", clip_path.tag)
|
|
|
|
def test_frame_split(self):
|
|
"""Test a frame that is split between bottom and top"""
|
|
args = [
|
|
"--type=ellipse",
|
|
"--fill_color=#AAA",
|
|
"--group=True",
|
|
"--id=rect3006",
|
|
"--z_position=split",
|
|
"--stroke_color=#F00",
|
|
"--offset_relative=-10",
|
|
"--width=2",
|
|
self.data_file("svg", "single_box.svg"),
|
|
]
|
|
uut = Frame()
|
|
uut.run(args)
|
|
new_frame = self.get_frame(uut.svg)
|
|
top_frame = new_frame.getparent()[2]
|
|
self.assertIsNotNone(new_frame)
|
|
self.assertIsInstance(new_frame, inkex.Ellipse)
|
|
self.assertIsInstance(new_frame.getparent(), inkex.Group)
|
|
self.assertIsInstance(new_frame.getparent()[1], inkex.Rectangle)
|
|
self.assertIsInstance(top_frame, inkex.Ellipse)
|
|
|
|
self.assertIn("stroke", top_frame.style)
|
|
self.assertNotIn("stroke", new_frame.style)
|
|
self.assertIn("fill", top_frame.style)
|
|
self.assertEqual(top_frame.style("fill"), None)
|
|
|
|
|
|
class TestFrameInOut(ComparisonMixin, TestCase):
|
|
"""Test some full runs of Frame"""
|
|
|
|
effect_class = Frame
|
|
comparisons = [
|
|
( # test relative offset
|
|
"--id=c2",
|
|
"--id=c1",
|
|
"--type=ellipse",
|
|
"--offset_relative=10",
|
|
"--fill_color=#AAA",
|
|
"--stroke_color=#F00",
|
|
"--z_position=split",
|
|
),
|
|
( # test absolute offset
|
|
"--id=c2",
|
|
"--id=c1",
|
|
"--type=ellipse",
|
|
"--offset_absolute=20",
|
|
"--fill_color=#AAA",
|
|
"--stroke_color=#F00",
|
|
"--z_position=split",
|
|
),
|
|
( # test asgroup
|
|
"--id=c2",
|
|
"--id=c1",
|
|
"--id=p1",
|
|
"--type=rect",
|
|
"--group=True",
|
|
"--asgroup=True",
|
|
"--offset_relative=-10",
|
|
"--fill_color=#AAA",
|
|
"--stroke_color=#F00",
|
|
"--z_position=bottom",
|
|
"--clip=True",
|
|
),
|
|
( # test text bbox querying
|
|
"--id=t3",
|
|
"--type=rect",
|
|
"--offset_relative=10",
|
|
"--fill_color=#AAA",
|
|
"--stroke_color=#F00",
|
|
"--z_position=split",
|
|
),
|
|
( # Test clip on a transformed element
|
|
"--id=u1",
|
|
"--fill_color=#AAA",
|
|
"--stroke_color=#F00",
|
|
"--clip=True",
|
|
),
|
|
]
|