# -*- coding: utf-8 -*- """ This module contains a class for running tests on components. These tests include adding them to a scene, renaming, reparenting, etc. """ import unittest import maya.cmds as cmds import artv2.components.base_components.rig_asset as rig_asset import artv2.components.root as root import artv2.components.biped_leg as leg import artv2.utilities.component_utilities as component_utils import artv2.components.hinge as hinge import artv2.utilities.rigging_utilities as rigging_utils class Basic_Component_Tests(unittest.TestCase): """ Class containing tests for rig module creation and manipulation. """ def _create_asset(self): new_asset = rig_asset.RigAsset() self.assertEquals(new_asset.name, "asset") self.assertEquals(new_asset.network_node, "asset_metadata") return new_asset def test_create_component_twice(self): self._create_asset() # twice of the same instance root_inst = root.Root() with self.assertRaises(RuntimeError): root_inst._create_component("", "") # and twice of the same class leg_inst1 = leg.BipedLeg("l") with self.assertRaises(RuntimeError): leg_inst2 = leg.BipedLeg("l") # however, this should pass leg_inst2 = leg.BipedLeg("r") self.assertNotEquals(leg_inst1, leg_inst2) def test_create_building_components(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg(prefix="l") self.assertEquals(l_leg_inst._unique_name, "l_leg") mover_name = component_utils.find_associated_mover_from_joint("l_thigh") self.assertEquals(mover_name, "l_leg_thigh_mover") mover_name = component_utils.find_associated_mover_from_joint("l_thigh_twist_01") self.assertEquals(mover_name, "l_leg_thigh_twist_01_mover_offset") self.assertEquals(len(l_leg_inst.joint_mover.get_created_joints()), 5) def test_parenting(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.parent = "root" self.assertEquals(l_leg_inst._unique_name, "l_leg") leg_inst = leg.BipedLeg(prefix="test") leg_inst.parent = "root" network_node = leg_inst.network_node self.assertEquals(leg_inst._unique_name, "test_leg") # try adding thigh twists l_leg_inst.num_thigh_twists = 2 l_leg_inst.num_calf_twists = 2 cmds.setAttr("test_leg_thigh_mover.tz", -40) leg_inst.parent = "l_thigh_twist_02" # then remove twists, which should result in the leg_inst having its parent set to root l_leg_inst.num_thigh_twists = 1 l_leg_inst.num_calf_twists = 1 inst = leg.BipedLeg(network_node=network_node) self.assertEquals(inst.parent, "root") def test_renaming_component_dependencies(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.parent = "root" l_leg_inst.num_thigh_twists = 2 r_leg_inst = leg.BipedLeg(prefix="r") r_leg_inst.parent = "l_thigh_twist_02" cmds.setAttr("r_leg_thigh_mover.tz", -40) r_leg_inst.suffix = "r" l_leg_inst.prefix = None l_leg_inst.suffix = "l" self.assertEquals(cmds.getAttr(r_leg_inst.network_node + ".parentComponentBone"), "thigh_twist_02_l") def test_invalid_names(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.parent = "root" with self.assertRaises(RuntimeError): l_leg_inst.prefix = "123abcABC" l_leg_inst.prefix = "aBc123" mover_grp = cmds.listConnections(l_leg_inst.network_node + ".mover_grp")[0] self.assertEquals(mover_grp, "aBc123_leg_thigh_mover_grp") with self.assertRaises(RuntimeError): l_leg_inst.prefix = "l-side" def test_deleting_locked_nodes(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg(prefix="l") l_leg_inst.parent = "root" mover_grp = cmds.listConnections(l_leg_inst.network_node + ".mover_grp")[0] cmds.select(mover_grp, hi=True) selection = cmds.ls(sl=True) num_nodes = len(selection) with self.assertRaises(RuntimeError): cmds.delete() selection = cmds.ls(sl=True) new_num_nodes = len(selection) self.assertEquals(num_nodes, new_num_nodes) # change number of thigh twists which should unlock movers l_leg_inst.num_thigh_twists = 2 # then try deleting again, which should still be okay as long as the nodes are re-locked. cmds.select(mover_grp, hi=True) selection = cmds.ls(sl=True) num_nodes = len(selection) with self.assertRaises(RuntimeError): cmds.delete() selection = cmds.ls(sl=True) new_num_nodes = len(selection) self.assertEquals(num_nodes, new_num_nodes) def test_accessing_instances(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg(prefix="l") network_node = l_leg_inst.network_node access_inst = leg.BipedLeg(network_node=network_node) self.assertEquals(l_leg_inst.prefix, access_inst.prefix) self.assertEquals(l_leg_inst.network_node, access_inst.network_node) self.assertEquals(access_inst.prefix, "l_") def test_renaming_with_conflicts(self): self._create_asset() root_inst = root.Root() self.assertEquals(root_inst._unique_name, "master") l_leg_inst = leg.BipedLeg() l_leg_inst.prefix = "l" r_leg_inst = leg.BipedLeg() with self.assertRaises(RuntimeError): r_leg_inst.prefix = "l" r_leg_inst.prefix = "r" with self.assertRaises(RuntimeError): leg.BipedLeg(prefix="r") l_leg_inst.suffix = "test" r_leg_inst.suffix = "test" with self.assertRaises(RuntimeError): r_leg_inst.prefix = "l" with self.assertRaises(RuntimeError): leg.BipedLeg(prefix="l", suffix="test") access_inst = leg.BipedLeg(network_node="l_leg_test_metadata") self.assertEquals(access_inst.prefix, "l_") self.assertEquals(access_inst.suffix, "_test") def test_delete_root(self): self._create_asset() root_inst = root.Root() leg_inst = leg.BipedLeg(prefix="l") leg_inst.parent = "root" with self.assertRaises(RuntimeError): root_inst.delete() leg_inst.delete() root_inst.delete() self.assertEquals(cmds.objExists("master_metadata"), False) def test_rename_joint(self): self._create_asset() root.Root() leg_inst = leg.BipedLeg(prefix="l") leg_inst.parent = "root" hinge_inst = hinge.Hinge(prefix="l") hinge_inst.parent = "l_foot" data = component_utils.get_joint_labels(leg_inst.network_node) offset_mover = data.get("foot")[2] leg_inst.rename_joint("l_ankle", "l_foot", offset_mover) self.assertEquals(offset_mover.created_joint.get(), "l_ankle") self.assertEquals(offset_mover.connected_joint.connections()[0].nodeName(), "l_leg_foot") self.assertEquals(hinge_inst.parent, "l_ankle") data = component_utils.get_joint_labels(hinge_inst.network_node) offset_mover = data.get("middle")[2] with self.assertRaises(RuntimeError): hinge_inst.rename_joint("l_ankle", "l_middle", offset_mover) def test_build_skeleton(self): self._create_asset() root.Root() leg_inst = leg.BipedLeg(prefix="l") leg_inst.parent = "root" hinge_inst = hinge.Hinge(prefix="l") hinge_inst.parent = "l_foot" data = component_utils.get_joint_labels(leg_inst.network_node) offset_mover = data.get("foot")[2] leg_inst.rename_joint("l_ankle", "l_foot", offset_mover) rigging_utils.build_skeleton() self.assertEquals(cmds.objExists("l_thigh"), True) self.assertEquals(cmds.objExists("l_calf"), True) self.assertEquals(cmds.objExists("l_ankle"), True) self.assertEquals(cmds.objExists("l_ball"), True) self.assertEquals(cmds.objExists("root"), True)