aboutsummaryrefslogtreecommitdiff
path: root/Tests/misc/visitor_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/misc/visitor_test.py')
-rw-r--r--Tests/misc/visitor_test.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/Tests/misc/visitor_test.py b/Tests/misc/visitor_test.py
new file mode 100644
index 00000000..fe71e08f
--- /dev/null
+++ b/Tests/misc/visitor_test.py
@@ -0,0 +1,72 @@
+from fontTools.misc.visitor import Visitor
+import enum
+import pytest
+
+
+class E(enum.Enum):
+ E1 = 1
+ E2 = 2
+ E3 = 3
+
+class A:
+ def __init__(self):
+ self.a = 1
+ self.b = [2, 3]
+ self.c = {4: 5, 6: 7}
+ self._d = 8
+ self.e = E.E2
+ self.f = 10
+
+
+class B:
+ def __init__(self):
+ self.a = A()
+
+
+class TestVisitor(Visitor):
+ def __init__(self):
+ self.value = []
+
+ def _add(self, s):
+ self.value.append(s)
+
+ def visitLeaf(self, obj):
+ self._add(obj)
+ super().visitLeaf(obj)
+
+
+@TestVisitor.register(A)
+def visit(self, obj):
+ self._add("A")
+
+
+@TestVisitor.register_attrs([(A, "e")])
+def visit(self, obj, attr, value):
+ self._add(attr)
+ self._add(value)
+ return False
+
+
+@TestVisitor.register(B)
+def visit(self, obj):
+ self._add("B")
+ self.visitObject(obj)
+ return False
+
+
+@TestVisitor.register_attr(B, "a")
+def visit(self, obj, attr, value):
+ self._add("B a")
+
+
+class VisitorTest(object):
+ def test_visitor(self):
+ b = B()
+ visitor = TestVisitor()
+ visitor.visit(b)
+ assert visitor.value == ["B", "B a", "A", 1, 2, 3, 5, 7, "e", E.E2, 10]
+
+ visitor.value = []
+ visitor.defaultStop = True
+ visitor.visit(b)
+ assert visitor.value == ["B", "B a"]