def test_parent_set_invalid(self): """Setting parent with an invalid value.""" n = Node() with self.assertRaises(TypeError, msg="Initialising with an invalid value (a string) did not raise a TypeError."): n.parent = "spoon"
def test_parent_enforce_tree(self): """Prevention of cyclic parenting.""" # build test tree a = Node() b = Node(a) c1 = Node(b) c2 = Node(b) # test tree at different depths to confirm resursive check succeeds with self.assertRaises(ValueError, msg = "Illegal cyclic parenting (a -> a) did not raise an exception."): a.parent = a with self.assertRaises(ValueError, msg = "Illegal cyclic parenting (a -> b) did not raise an exception."): a.parent = b with self.assertRaises(ValueError, msg = "Illegal cyclic parenting (a -> c2) did not raise an exception."): a.parent = c2 with self.assertRaises(ValueError, msg = "Illegal cyclic parenting (b -> c1) did not raise an exception."): b.parent = c1
def test_parent_to_node_from_node(self): """Setting parent to a node from an initially parented state.""" # build initial tree a = Node() b1 = Node(a, translate(1,2,3)) b2 = Node(a, translate(2,4,6)) c = Node(b1, translate(10,20,30)) d1 = Node(c, translate(100,200,300)) d2 = Node(c, translate(200,400,600)) e = Node(d1, translate(1000,2000,3000)) # set c's parent to b2 c.parent = b2 # is parent correct? self.assertEqual(c.parent, b2, "Node parent is incorrect.") # is c in b1's child list? self.assertEqual(b1.children.count(c), 0, "Node was not removed from previous parents child list.") # is c in b2's child list? self.assertEqual(b2.children.count(c), 1, "Node was not added to new parents child list.") # is c.transform correct? self.assertTransformAlmostEqual(c.transform, translate(10,20,30), delta = 1e-14, msg = "Transform matrix should not have been modified by change of parent.") # is the root node correct? self.assertEqual(c.root, a, "Root node is incorrect.") # has the root transform been correctly propagated to the re-parented node and its children? self.assertTransformAlmostEqual(a._root_transform, AffineMatrix3D(), delta = 1e-14, msg ="Root node's root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(a._root_transform_inverse, AffineMatrix3D(), delta = 1e-14, msg ="Root node's inverse root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(b1._root_transform, translate(1,2,3), delta = 1e-14, msg = "Previous parent's root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(b1._root_transform_inverse, translate(1,2,3).inverse(), delta = 1e-14, msg = "Previous parent's inverse root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(b2._root_transform, translate(2,4,6), delta = 1e-14, msg = "Parent's root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(b2._root_transform_inverse, translate(2,4,6).inverse(), delta = 1e-14, msg = "Parent's inverse root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(c._root_transform, translate(12,24,36), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node.") self.assertTransformAlmostEqual(c._root_transform_inverse, translate(12,24,36).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node.") self.assertTransformAlmostEqual(d1._root_transform, translate(112,224,336), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node's 1st immediate child.") self.assertTransformAlmostEqual(d1._root_transform_inverse, translate(112,224,336).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node's 1st immediate child.") self.assertTransformAlmostEqual(d2._root_transform, translate(212,424,636), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node's 2nd immediate child.") self.assertTransformAlmostEqual(d2._root_transform_inverse, translate(212,424,636).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node's 2nd immediate child.") self.assertTransformAlmostEqual(e._root_transform, translate(1112,2224,3336), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node's distant children.") self.assertTransformAlmostEqual(e._root_transform_inverse, translate(1112,2224,3336).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node's distant children.")
def test_parent_to_none_from_node(self): """Unparenting a node.""" # build initial tree a = Node() b = Node(a, translate(1,2,3)) c = Node(b, translate(10,20,30)) d1 = Node(c, translate(100,200,300)) d2 = Node(c, translate(200,400,600)) e = Node(d1, translate(1000,2000,3000)) # set c's parent to None c.parent = None # is parent correct? self.assertEqual(c.parent, None, "Node parent is incorrect.") # is c in b's child list? self.assertEqual(b.children.count(c), 0, "Node was not removed from the previous parents child list.") # is c.transform correct? self.assertTransformAlmostEqual(c.transform, translate(10,20,30), delta = 1e-14, msg = "Transform matrix should not have been modified by change of parent.") # is the root node correct? self.assertEqual(c.root, c, "Root node is incorrect.") # has the root transform been correctly propagated to the re-parented node and its children? self.assertTransformAlmostEqual(a._root_transform, AffineMatrix3D(), delta = 1e-14, msg ="Root node's root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(a._root_transform_inverse, AffineMatrix3D(), delta = 1e-14, msg ="Root node's inverse root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(b._root_transform, translate(1,2,3), delta = 1e-14, msg = "Previous parent's root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(b._root_transform_inverse, translate(1,2,3).inverse(), delta = 1e-14, msg = "Previous parent's inverse root transform should not have been modified by change of parent.") self.assertTransformAlmostEqual(c._root_transform, AffineMatrix3D(), delta = 1e-14, msg ="Root transform is not correct for unparented node.") self.assertTransformAlmostEqual(c._root_transform_inverse, AffineMatrix3D(), delta = 1e-14, msg ="Inverse root transform is not correct for unparented node.") self.assertTransformAlmostEqual(d1._root_transform, translate(100,200,300), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node's 1st immediate child.") self.assertTransformAlmostEqual(d1._root_transform_inverse, translate(100,200,300).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node's 1st immediate child.") self.assertTransformAlmostEqual(d2._root_transform, translate(200,400,600), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node's 2nd immediate child.") self.assertTransformAlmostEqual(d2._root_transform_inverse, translate(200,400,600).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node's 2nd immediate child.") self.assertTransformAlmostEqual(e._root_transform, translate(1100,2200,3300), delta = 1e-14, msg = "Root transform has not correctly propagated to re-parented node's distant children.") self.assertTransformAlmostEqual(e._root_transform_inverse, translate(1100,2200,3300).inverse(), delta = 1e-14, msg = "Inverse root transform has not correctly propagated to re-parented node's distant children.")