summaryrefslogtreecommitdiffstats
path: root/share/extensions/tests/test_inkex_elements_selections.py
blob: b9d3d2c60cea9cd48e1ebc53517b82fe9fe4796a (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
131
132
133
134
#!/usr/bin/env python
# coding=utf-8
"""
Test all selection code.
"""

from inkex.elements import PathElement, Circle, Rectangle
from inkex.elements._selected import ElementList

from .test_inkex_elements_base import SvgTestCase
from inkex.utils import AbortExtension


class ElementListTestCase(SvgTestCase):
    """Test Element Selections"""

    def setUp(self):
        super().setUp()
        self.svg.selection.set("G", "B", "D", "F")

    def test_creation(self):
        """Creating an elementList"""
        empty = ElementList(self.svg)
        self.assertEqual(tuple(empty.ids), ())
        self.assertEqual(empty.first(), None)
        lst = ElementList(self.svg, "ABC")
        self.assertEqual(tuple(lst.ids), ("A", "B", "C"))

    def test_to_dict(self):
        """test dictionary compact"""
        self.assertEqual(tuple(self.svg.selection.id_dict()), ("G", "B", "D", "F"))

    def test_getitem(self):
        """Can get an item"""
        self.assertEqual(self.svg.selection["B"].xml_path, "/*/*[4]/*[1]")
        self.assertRaises(KeyError, self.svg.selection.__getitem__, "A")

    def test_svg_selection(self):
        """Setting an svg selection"""
        self.assertEqual(tuple(self.svg.selection.ids), ("G", "B", "D", "F"))

    def test_rendering_order(self):
        """Test paint order"""
        items = self.svg.selection.rendering_order()
        self.assertTrue(isinstance(items, ElementList))
        self.assertEqual(tuple(items.ids), ("B", "D", "F", "G"))

    def test_set_nothing(self):
        """Clear existing selection"""
        self.svg.selection.set()
        self.assertEqual(tuple(self.svg.selection), ())

    def test_set_ids(self):
        """Set a new selection element ids"""
        a_to_g = "ABCDEFG"
        self.svg.selection.set(*a_to_g)
        self.assertEqual(tuple(self.svg.selection.ids), tuple(a_to_g))

    def test_set_elements(self):
        """Set a new selection from element objects"""
        a_to_g = "ABCDEFG"
        self.svg.selection.set(*[self.svg.getElementById(eid) for eid in a_to_g])
        self.assertEqual(tuple(self.svg.selection.ids), tuple(a_to_g))
        self.assertRaises(ValueError, self.svg.selection.add, None)
        self.assertRaises(
            ValueError,
            self.svg.selection.__setitem__,
            "A",
            self.svg.getElementById("B"),
        )

    def test_set_xpath(self):
        """Set a new selection from xpath"""
        self.svg.selection.set("//svg:g")
        self.assertEqual(tuple(self.svg.selection.ids), tuple("ABCKL"))

    def test_set_invalid_ids(self):
        """Set invalid ids"""
        self.svg.selection.set("X", "Y", "Z", "A")
        self.assertEqual(tuple(self.svg.selection.ids), ("A",))

    def test_pop_items(self):
        """Can remove items from the ElementList"""
        selection = self.svg.selection
        self.assertEqual(tuple(selection.ids), ("G", "B", "D", "F"))
        ret = selection.pop()
        self.assertEqual(ret.get("id"), "F")
        self.assertEqual(tuple(selection.ids), ("G", "B", "D"))
        selection.pop(0)
        self.assertEqual(tuple(selection.ids), ("B", "D"))
        selection.pop("B")
        self.assertEqual(tuple(selection.ids), ("D",))
        self.assertRaises(KeyError, selection.pop, "B")
        selection.set(*"ABDFH")
        self.assertEqual(tuple(selection.ids), ("A", "B", "D", "F", "H"))
        selection.pop(selection.first())
        self.assertEqual(tuple(selection.ids), ("B", "D", "F", "H"))

    def test_filtering(self):
        """Create a sub-list of selected items"""
        selection = self.svg.descendants()
        new_list = selection.filter(PathElement)
        self.assertEqual(tuple(new_list.ids), ("path1", "D"))

    def test_filternonzero(self):
        """Filter and raise an AbortException if the list is empty"""
        selection = self.svg.descendants()
        new_list = selection.filter(PathElement)
        # default error message
        with self.assertRaisesRegex(AbortExtension, "Circle.*Rectangle"):
            new_list.filter_nonzero(Circle, Rectangle)
        # custom error message
        with self.assertRaisesRegex(AbortExtension, "test string"):
            new_list.filter_nonzero(Circle, error_msg="test string")
        self.assertEqual(new_list, selection.filter_nonzero(PathElement))

    def test_getting_recursively(self):
        """Create a list of children of the given type"""
        selection = self.svg.selection
        selection.set("B")
        self.assertEqual(tuple(selection.ids), ("B",))
        self.assertEqual(tuple(selection.get().ids), tuple("BCDEFGHIJ"))

    def test_get_bounding_box(self):
        """Selection can get a bounding box"""
        self.assertEqual(int(self.svg.selection.bounding_box().width), 540)
        self.assertEqual(int(self.svg.selection.bounding_box().height), 550)

    def test_selecting_weird_ids(self):
        """Selection can contain some chars"""
        selection = self.svg.selection
        self.svg.append(PathElement(id="#asdf"))
        selection.set("#asdf")
        self.assertEqual(tuple(selection.ids), ("#asdf",))