From 9d7896ccc4345a7e6dac1c8cd7f932af64e25336 Mon Sep 17 00:00:00 2001 From: Mitchell Stokes Date: Tue, 31 Oct 2017 20:11:14 -0700 Subject: [PATCH] tests: Add simple NodePath tests using PyTest These tests were converted from the tests branch with some changes: * Convert from unittest to PyTest * Update code to use new API (LVector3 instead of Vec3, properties, etc.) --- tests/pgraph/test_nodepath.py | 81 +++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/pgraph/test_nodepath.py diff --git a/tests/pgraph/test_nodepath.py b/tests/pgraph/test_nodepath.py new file mode 100644 index 0000000000..a625533634 --- /dev/null +++ b/tests/pgraph/test_nodepath.py @@ -0,0 +1,81 @@ +def test_nodepath_empty(): + """Tests NodePath behavior for empty NodePaths.""" + from panda3d.core import NodePath + + empty = NodePath('np') + + assert empty.get_pos() == (0, 0, 0) + assert empty.get_hpr() == (0, 0, 0) + assert empty.get_scale() == (1, 1, 1) + +def test_nodepath_parent(): + """Tests NodePath.reparentTo().""" + from panda3d.core import NodePath + + np1 = NodePath('np') + np2 = NodePath('np') + + assert np1.parent is None + assert np2.parent is None + + np1.reparentTo(np2) + + assert np1.parent == np2 + assert np2.parent is None + +def test_nodepath_transform_changes(): + """Tests that NodePath applies transform changes to its managed node.""" + from panda3d.core import NodePath + + np = NodePath('np') + assert np.get_pos() == (0, 0, 0) + assert np.get_hpr() == (0, 0, 0) + assert np.get_scale() == (1, 1, 1) + + np.set_pos(1, 2, 3) + assert np.get_pos() == (1, 2, 3) + assert np.node().get_transform().get_pos() == (1, 2, 3) + +def test_nodepath_transform_composition(): + """Tests that NodePath composes transform states according to the path it holds.""" + from panda3d.core import PandaNode, NodePath, LPoint3, LVector3 + + # Create 3 PandaNodes, and give each some interesting transform state: + node1 = PandaNode('node1') + node2 = PandaNode('node2') + node3 = PandaNode('node3') + + node1.set_transform(node1.get_transform().set_pos(LPoint3(0, 0, 1)).set_hpr(LVector3(90, 0, -90))) + node2.set_transform(node2.get_transform().set_pos(LPoint3(0, 1, 0)).set_hpr(LVector3(180, 180, 0))) + node3.set_transform(node3.get_transform().set_pos(LPoint3(1, 0, 0)).set_hpr(LVector3(270, 0, 270))) + + # node3 is going to be attached under both node1 and node2 and we will + # hold a path both ways: + node1.add_child(node3) + node2.add_child(node3) + + assert len(node1.children) == 1 + assert len(node2.children) == 1 + assert len(node3.children) == 0 + assert len(node1.parents) == 0 + assert len(node2.parents) == 0 + assert len(node3.parents) == 2 + + # np1 is the path to node3 via node1: + np1 = NodePath(node1).children[0] + # np2 is the path to node3 via node2: + np2 = NodePath(node2).children[0] + + # Both should point to node3: + assert np1.node() == node3 + assert np2.node() == node3 + + # However if we ask for the net transform to node3, it should compose: + assert np1.get_transform(NodePath()) == node1.get_transform().compose(node3.get_transform()) + assert np2.get_transform(NodePath()) == node2.get_transform().compose(node3.get_transform()) + + # If we ask for np1 RELATIVE to np2, it should compose like so: + leg1 = node2.get_transform().compose(node3.get_transform()) + leg2 = node1.get_transform().compose(node3.get_transform()) + relative_transform = leg1.get_inverse().compose(leg2) + assert np1.get_transform(np2) == relative_transform