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
|
# -*- coding: utf-8 -*-
from anytree import LoopError, Node, NodeMixin, PostOrderIter, PreOrderIter, TreeError
from .helper import assert_raises, eq_
def test_readonly_pre():
"""Read Only Use case, where Exceptions in _pre_{attach,detach} avoid modifications."""
class ReadonlyError(RuntimeError):
pass
class ReadonlyNode(Node):
_is_readonly = False
def _pre_attach(self, parent):
if self._is_readonly:
raise ReadonlyError()
def _pre_detach(self, parent):
if self._is_readonly:
raise ReadonlyError()
# construct and make readonly!
root = ReadonlyNode("root")
s0 = ReadonlyNode("sub0", parent=root)
s0b = ReadonlyNode("sub0B", parent=s0)
s0a = ReadonlyNode("sub0A", parent=s0)
s1 = ReadonlyNode("sub1", parent=root)
s1a = ReadonlyNode("sub1A", parent=s1)
s1b = ReadonlyNode("sub1B", parent=s1)
s1c = ReadonlyNode("sub1C", parent=s1)
s1ca = ReadonlyNode("sub1Ca", parent=s1c)
ReadonlyNode._is_readonly = True
def check():
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())
check()
with assert_raises(ReadonlyError, ""):
s1ca.parent = s0
check()
with assert_raises(ReadonlyError, ""):
s1ca.parent = None
check()
with assert_raises(ReadonlyError, ""):
s0.children = []
check()
|