xref: /aosp_15_r20/external/fonttools/Tests/misc/visitor_test.py (revision e1fe3e4ad2793916b15cccdc4a7da52a7e1dd0e9)
1from fontTools.misc.visitor import Visitor
2import enum
3import pytest
4
5
6class E(enum.Enum):
7    E1 = 1
8    E2 = 2
9    E3 = 3
10
11
12class A:
13    def __init__(self):
14        self.a = 1
15        self.b = [2, 3]
16        self.c = {4: 5, 6: 7}
17        self._d = 8
18        self.e = E.E2
19        self.f = 10
20
21
22class B:
23    def __init__(self):
24        self.a = A()
25
26
27class TestVisitor(Visitor):
28    def __init__(self):
29        self.value = []
30
31    def _add(self, s):
32        self.value.append(s)
33
34    def visitLeaf(self, obj):
35        self._add(obj)
36        super().visitLeaf(obj)
37
38
39@TestVisitor.register(A)
40def visit(self, obj):
41    self._add("A")
42
43
44@TestVisitor.register_attrs([(A, "e")])
45def visit(self, obj, attr, value):
46    self._add(attr)
47    self._add(value)
48    return False
49
50
51@TestVisitor.register(B)
52def visit(self, obj):
53    self._add("B")
54    self.visitObject(obj)
55    return False
56
57
58@TestVisitor.register_attr(B, "a")
59def visit(self, obj, attr, value):
60    self._add("B a")
61
62
63class VisitorTest(object):
64    def test_visitor(self):
65        b = B()
66        visitor = TestVisitor()
67        visitor.visit(b)
68        assert visitor.value == ["B", "B a", "A", 1, 2, 3, 5, 7, "e", E.E2, 10]
69
70        visitor.value = []
71        visitor.defaultStop = True
72        visitor.visit(b)
73        assert visitor.value == ["B", "B a"]
74