def test_children(self): # Node children serializition node = OrderedNode(name='base') node['child'] = OrderedNode() node['child']['sub'] = OrderedNode() self.assertEqual(node.treerepr(), ('<class \'node.base.OrderedNode\'>: base\n' ' <class \'node.base.OrderedNode\'>: child\n' ' <class \'node.base.OrderedNode\'>: sub\n')) json_data = serialize(node) data = json.loads(json_data) self.assertEqual(list(data.keys()), ['__node__']) node_data = data['__node__'] self.assertEqual(list(sorted(node_data.keys())), ['children', 'class', 'name']) self.assertEqual(node_data['class'], 'node.base.OrderedNode') self.assertEqual(node_data['name'], 'base') self.assertEqual(len(node_data['children']), 1) node_data = node_data['children'][0]['__node__'] self.assertEqual(node_data['class'], 'node.base.OrderedNode') self.assertEqual(node_data['name'], 'child') self.assertEqual(len(node_data['children']), 1) node_data = node_data['children'][0]['__node__'] self.assertEqual(list(sorted(node_data.keys())), ['class', 'name']) self.assertEqual(node_data['class'], 'node.base.OrderedNode') self.assertEqual(node_data['name'], 'sub') node = deserialize(json_data) self.assertEqual(node.treerepr(), ('<class \'node.base.OrderedNode\'>: base\n' ' <class \'node.base.OrderedNode\'>: child\n' ' <class \'node.base.OrderedNode\'>: sub\n')) # Deserialize using given root node root = BaseNode(name='root') node = deserialize(json_data, root=root) self.assertEqual(root.treerepr(), ('<class \'node.base.BaseNode\'>: root\n' ' <class \'node.base.OrderedNode\'>: base\n' ' <class \'node.base.OrderedNode\'>: child\n' ' <class \'node.base.OrderedNode\'>: sub\n'))
def test_OrderedNode(self): self.assertEqual(OrderedNode.__bases__, (object, )) orderednode = OrderedNode() self.assertTrue( str(orderednode).startswith('<OrderedNode object \'None\' at')) fmtester = FullMappingTester(OrderedNode) fmtester.run() self.checkOutput( """\ ``__contains__``: OK ``__delitem__``: OK ``__getitem__``: OK ``__iter__``: OK ``__len__``: OK ``__setitem__``: OK ``clear``: OK ``copy``: OK ``get``: OK ``has_key``: OK ``items``: OK ``iteritems``: OK ``iterkeys``: OK ``itervalues``: OK ``keys``: OK ``pop``: OK ``popitem``: OK ``setdefault``: OK ``update``: OK ``values``: OK """, fmtester.combined) orderednode['child'] = OrderedNode() self.checkOutput( """\ <class 'node.base.OrderedNode'>: None __<class 'node.base.OrderedNode'>: child """, orderednode.treerepr(prefix='_')) unpickled = pickle.loads(pickle.dumps(orderednode)) self.checkOutput( """\ <class 'node.base.OrderedNode'>: None __<class 'node.base.OrderedNode'>: child """, unpickled.treerepr(prefix='_'))
def test_children_as_list(self): # Serialize list of nodes node = OrderedNode(name='base') node['child_1'] = OrderedNode() node['child_2'] = OrderedNode() self.assertEqual(node.treerepr(), ('<class \'node.base.OrderedNode\'>: base\n' ' <class \'node.base.OrderedNode\'>: child_1\n' ' <class \'node.base.OrderedNode\'>: child_2\n')) json_data = serialize(node.values()) data = json.loads(json_data) self.assertTrue(isinstance(data, list)) self.assertEqual(len(data), 2) node_data = data[0]['__node__'] self.assertEqual(list(sorted(node_data.keys())), ['class', 'name']) self.assertEqual(node_data['class'], 'node.base.OrderedNode') self.assertEqual(node_data['name'], 'child_1') node_data = data[1]['__node__'] self.assertEqual(list(sorted(node_data.keys())), ['class', 'name']) self.assertEqual(node_data['class'], 'node.base.OrderedNode') self.assertEqual(node_data['name'], 'child_2') # Deserialize list of nodes using given root node root = OrderedNode(name='root') nodes = deserialize(json_data, root=root) self.assertEqual(len(nodes), 2) self.check_output( """\ [<OrderedNode object 'child_1' at ...>, <OrderedNode object 'child_2' at ...>] """, str(nodes)) self.assertEqual(root.treerepr(), ('<class \'node.base.OrderedNode\'>: root\n' ' <class \'node.base.OrderedNode\'>: child_1\n' ' <class \'node.base.OrderedNode\'>: child_2\n'))
def test_copy(self): node = BaseNode() node['child'] = BaseNode() # Shallow copy of BaseNode copied_node = node.copy() self.checkOutput( """\ <class 'node.base.BaseNode'>: None __<class 'node.base.BaseNode'>: child """, copied_node.treerepr(prefix='_')) self.assertFalse(node is copied_node) self.assertTrue(node['child'] is copied_node['child']) copied_node = copy.copy(node) self.assertFalse(node is copied_node) self.assertTrue(node['child'] is copied_node['child']) # Deep copy of base node copied_node = node.deepcopy() self.checkOutput( """\ <class 'node.base.BaseNode'>: None __<class 'node.base.BaseNode'>: child """, copied_node.treerepr(prefix='_')) self.assertFalse(node is copied_node) self.assertFalse(node['child'] is copied_node['child']) copied_node = copy.deepcopy(node) self.assertFalse(node is copied_node) self.assertFalse(node['child'] is copied_node['child']) # Shallow copy of ordered node node = OrderedNode() node['child'] = OrderedNode() copied_node = node.copy() self.checkOutput( """\ <class 'node.base.OrderedNode'>: None __<class 'node.base.OrderedNode'>: child """, copied_node.treerepr(prefix='_')) self.assertFalse(node is copied_node) self.assertTrue(node['child'] is copied_node['child']) copied_node = copy.copy(node) self.assertFalse(node is copied_node) self.assertTrue(node['child'] is copied_node['child']) # Deep copy of ordered node node = OrderedNode() node['child'] = OrderedNode() copied_node = node.deepcopy() self.checkOutput( """\ <class 'node.base.OrderedNode'>: None __<class 'node.base.OrderedNode'>: child """, copied_node.treerepr(prefix='_')) self.assertFalse(node is copied_node) self.assertFalse(node['child'] is copied_node['child']) copied_node = copy.deepcopy(node) self.assertFalse(node is copied_node) self.assertFalse(node['child'] is copied_node['child'])
def test_INode(self): # XXX: make tester object for INode contract # XXX: decide wether ``aliases`` or ``aliaser`` (still dunno) should be # kept in base interface. # printtree mynode = create_tree(MyNode) self.checkOutput( """\ <class 'node.testing.env.MyNode'>: None __<class 'node.testing.env.MyNode'>: child_0 ____<class 'node.testing.env.MyNode'>: subchild_0 ____<class 'node.testing.env.MyNode'>: subchild_1 __<class 'node.testing.env.MyNode'>: child_1 ____<class 'node.testing.env.MyNode'>: subchild_0 ____<class 'node.testing.env.MyNode'>: subchild_1 __<class 'node.testing.env.MyNode'>: child_2 ____<class 'node.testing.env.MyNode'>: subchild_0 ____<class 'node.testing.env.MyNode'>: subchild_1 """, mynode.treerepr(prefix='_')) basenode = create_tree(BaseNode) self.checkOutput( """\ <class 'node.base.BaseNode'>: None __<class 'node.base.BaseNode'>: child_... ____<class 'node.base.BaseNode'>: subchild_... ____<class 'node.base.BaseNode'>: subchild_... __<class 'node.base.BaseNode'>: child_... ____<class 'node.base.BaseNode'>: subchild_... ____<class 'node.base.BaseNode'>: subchild_... __<class 'node.base.BaseNode'>: child_... ____<class 'node.base.BaseNode'>: subchild_... ____<class 'node.base.BaseNode'>: subchild_... """, basenode.treerepr(prefix='_')) orderednode = create_tree(OrderedNode) self.checkOutput( """\ <class 'node.base.OrderedNode'>: None __<class 'node.base.OrderedNode'>: child_0 ____<class 'node.base.OrderedNode'>: subchild_0 ____<class 'node.base.OrderedNode'>: subchild_1 __<class 'node.base.OrderedNode'>: child_1 ____<class 'node.base.OrderedNode'>: subchild_0 ____<class 'node.base.OrderedNode'>: subchild_1 __<class 'node.base.OrderedNode'>: child_2 ____<class 'node.base.OrderedNode'>: subchild_0 ____<class 'node.base.OrderedNode'>: subchild_1 """, orderednode.treerepr(prefix='_')) # path mynode.__name__ = 'root' self.assertEqual(mynode.path, ['root']) self.assertEqual(mynode['child_1']['subchild_1'].path, ['root', 'child_1', 'subchild_1']) basenode.__name__ = 'root' self.assertEqual(basenode.path, ['root']) self.assertEqual(basenode['child_1']['subchild_1'].path, ['root', 'child_1', 'subchild_1']) orderednode.__name__ = 'root' self.assertEqual(orderednode.path, ['root']) self.assertEqual(orderednode['child_1']['subchild_1'].path, ['root', 'child_1', 'subchild_1']) # root self.assertTrue(mynode['child_1']['subchild_1'].root is mynode) self.assertTrue(basenode['child_1']['subchild_1'].root is basenode) self.assertTrue( orderednode['child_1']['subchild_1'].root is orderednode) # allow_non_node_childs self.assertFalse(mynode.allow_non_node_childs) def non_node_childs_not_allowed(): mynode['foo'] = object() err = self.expectError(ValueError, non_node_childs_not_allowed) self.assertEqual(str(err), 'Non-node childs are not allowed.') def no_classes_as_values_allowed(): mynode['foo'] = object err = self.expectError(ValueError, no_classes_as_values_allowed) expected = 'It isn\'t allowed to use classes as values.' self.assertEqual(str(err), expected) mynode.allow_non_node_childs = True obj = mynode['foo'] = object() self.assertEqual(mynode['foo'], obj) del mynode['foo'] mynode.allow_non_node_childs = False self.assertFalse(basenode.allow_non_node_childs) def non_node_childs_not_allowed2(): basenode['foo'] = object() err = self.expectError(ValueError, non_node_childs_not_allowed2) self.assertEqual(str(err), 'Non-node childs are not allowed.') def no_classes_as_values_allowed2(): basenode['foo'] = object err = self.expectError(ValueError, no_classes_as_values_allowed2) expected = 'It isn\'t allowed to use classes as values.' self.assertEqual(str(err), expected) basenode.allow_non_node_childs = True obj = basenode['foo'] = object() self.assertEqual(basenode['foo'], obj) del basenode['foo'] basenode.allow_non_node_childs = False self.assertFalse(orderednode.allow_non_node_childs) def non_node_childs_not_allowed3(): orderednode['foo'] = object() err = self.expectError(ValueError, non_node_childs_not_allowed3) self.assertEqual(str(err), 'Non-node childs are not allowed.') def no_classes_as_values_allowed3(): orderednode['foo'] = object err = self.expectError(ValueError, no_classes_as_values_allowed3) expected = 'It isn\'t allowed to use classes as values.' self.assertEqual(str(err), expected) orderednode.allow_non_node_childs = True obj = orderednode['foo'] = object() self.assertEqual(orderednode['foo'], obj) del orderednode['foo'] orderednode.allow_non_node_childs = False # filteredvalues and filtereditervalues class IFilter(Interface): pass directlyProvides(mynode['child_2'], IFilter) self.assertEqual(list(mynode.filtereditervalues(IFilter)), [mynode['child_2']]) self.assertEqual(mynode.filteredvalues(IFilter), [mynode['child_2']]) noLongerProvides(mynode['child_2'], IFilter) self.assertEqual(list(mynode.filtereditervalues(IFilter)), []) self.assertEqual(mynode.filteredvalues(IFilter), []) directlyProvides(basenode['child_2'], IFilter) self.assertEqual(list(basenode.filtereditervalues(IFilter)), [basenode['child_2']]) self.assertEqual(basenode.filteredvalues(IFilter), [basenode['child_2']]) noLongerProvides(basenode['child_2'], IFilter) self.assertEqual(list(basenode.filtereditervalues(IFilter)), []) self.assertEqual(basenode.filteredvalues(IFilter), []) directlyProvides(orderednode['child_2'], IFilter) self.assertEqual(list(orderednode.filtereditervalues(IFilter)), [orderednode['child_2']]) self.assertEqual(orderednode.filteredvalues(IFilter), [orderednode['child_2']]) noLongerProvides(orderednode['child_2'], IFilter) self.assertEqual(list(orderednode.filtereditervalues(IFilter)), []) self.assertEqual(orderednode.filteredvalues(IFilter), []) # as_attribute_access myattrs = mynode.as_attribute_access() self.assertEqual(myattrs.__class__, AttributeAccess) self.assertEqual(myattrs.child_1, mynode['child_1']) myattrs.child_3 = MyNode() self.assertEqual(mynode['child_3'], myattrs.child_3) def no_classes_as_values_allowed4(): myattrs.child_4 = object err = self.expectError(ValueError, no_classes_as_values_allowed4) expected = 'It isn\'t allowed to use classes as values.' self.assertEqual(str(err), expected) baseattrs = basenode.as_attribute_access() self.assertEqual(baseattrs.__class__, AttributeAccess) self.assertEqual(baseattrs.child_1, basenode['child_1']) baseattrs.child_3 = BaseNode() self.assertEqual(basenode['child_3'], baseattrs.child_3) def no_classes_as_values_allowed5(): baseattrs.child_4 = object err = self.expectError(ValueError, no_classes_as_values_allowed5) expected = 'It isn\'t allowed to use classes as values.' self.assertEqual(str(err), expected) orderedattrs = orderednode.as_attribute_access() self.assertEqual(orderedattrs.__class__, AttributeAccess) self.assertEqual(orderedattrs.child_1, orderednode['child_1']) orderedattrs.child_3 = OrderedNode() self.assertEqual(orderednode['child_3'], orderedattrs.child_3) def no_classes_as_values_allowed6(): orderedattrs.child_4 = object err = self.expectError(ValueError, no_classes_as_values_allowed6) expected = 'It isn\'t allowed to use classes as values.' self.assertEqual(str(err), expected)