def test_recursion_detection(): """Recursion detection.""" root = Node("root") s0 = Node("sub0", parent=root) Node("sub0B", parent=s0) s0a = Node("sub0A", parent=s0) # try recursion assert root.parent is None try: root.parent = root except LoopError as exc: eq_(str(exc), "Cannot set parent. Node('/root') cannot be parent of itself.") assert root.parent is None else: assert False assert root.parent is None try: root.parent = s0a except LoopError as exc: eq_(str(exc), ("Cannot set parent. Node('/root') is parent of Node('/root/sub0/sub0A').")) assert root.parent is None else: assert False assert s0.parent is root try: s0.parent = s0a except LoopError as exc: eq_(str(exc), ("Cannot set parent. Node('/root/sub0') is parent of Node('/root/sub0/sub0A').")) assert s0.parent is root else: assert False
def test_parent_child(): """A tree parent and child attributes.""" root = Node("root") s0 = Node("sub0", parent=root) s0b = Node("sub0B", parent=s0) s0a = Node("sub0A", parent=s0) s1 = Node("sub1", parent=root) s1a = Node("sub1A", parent=s1) s1b = Node("sub1B", parent=s1) s1c = Node("sub1C", parent=s1) s1ca = Node("sub1Ca", parent=s1c) eq_(root.parent, None) eq_(root.children, tuple([s0, s1])) eq_(s0.parent, root) eq_(s0.children, tuple([s0b, s0a])) eq_(s0b.parent, s0) eq_(s0b.children, tuple()) eq_(s0a.parent, s0) eq_(s0a.children, tuple()) eq_(s1.parent, root) eq_(s1.children, tuple([s1a, s1b, s1c])) eq_(s1a.parent, s1) eq_(s1a.children, tuple()) eq_(s1b.parent, s1) eq_(s1b.children, tuple()) eq_(s1c.parent, s1) eq_(s1c.children, tuple([s1ca])) eq_(s1ca.parent, s1c) eq_(s1ca.children, tuple()) # change parent s1ca.parent = s0 eq_(root.parent, None) eq_(root.children, tuple([s0, s1])) eq_(s0.parent, root) eq_(s0.children, tuple([s0b, s0a, s1ca])) eq_(s0b.parent, s0) eq_(s0b.children, tuple()) eq_(s0a.parent, s0) eq_(s0a.children, tuple()) eq_(s1.parent, root) eq_(s1.children, tuple([s1a, s1b, s1c])) eq_(s1a.parent, s1) eq_(s1a.children, tuple()) eq_(s1b.parent, s1) eq_(s1b.children, tuple()) eq_(s1c.parent, s1) eq_(s1c.children, tuple()) eq_(s1ca.parent, s0) eq_(s1ca.children, tuple()) # break tree into two s1.parent = None eq_(root.parent, None) eq_(root.children, tuple([s0])) eq_(s0.parent, root) eq_(s0.children, tuple([s0b, s0a, s1ca])) eq_(s0b.parent, s0) eq_(s0b.children, tuple()) eq_(s0a.parent, s0) eq_(s0a.children, tuple()) eq_(s1.parent, None) eq_(s1.children, tuple([s1a, s1b, s1c])) eq_(s1a.parent, s1) eq_(s1a.children, tuple()) eq_(s1b.parent, s1) eq_(s1b.children, tuple()) eq_(s1c.parent, s1) eq_(s1c.children, tuple()) eq_(s1ca.parent, s0) eq_(s1ca.children, tuple()) # set to the same s1b.parent = s1 eq_(root.parent, None) eq_(root.children, tuple([s0])) eq_(s0.parent, root) eq_(s0.children, tuple([s0b, s0a, s1ca])) eq_(s0b.parent, s0) eq_(s0b.children, tuple()) eq_(s0a.parent, s0) eq_(s0a.children, tuple()) eq_(s1.parent, None) eq_(s1.children, tuple([s1a, s1b, s1c])) eq_(s1a.parent, s1) eq_(s1a.children, tuple()) eq_(s1b.parent, s1) eq_(s1b.children, tuple()) eq_(s1c.parent, s1) eq_(s1c.children, tuple()) eq_(s1ca.parent, s0) eq_(s1ca.children, tuple())