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