def setUp(self):
     self._skeleton = Skeleton(self._reader, 2)
class TestSkeleton(TestCase):

    @classmethod
    def setUpClass(cls):
        cls._reader = BVHReader('test_bvh_data.bvh')
        cls._reader.read()

    def setUp(self):
        self._skeleton = Skeleton(self._reader, 2)

    def test_frame_number(self):
        frame_number = 2
        self.assertEqual(self._skeleton._frame_number, frame_number)

    def test_root_name(self):
        name = 'Hips'
        self.assertEqual(self._skeleton._root.name, name)

    def test_root_transform_parent(self):
        transform_parent = mat4().identity()
        self.assertEqual(self._skeleton._root.transform_parent, transform_parent)

    def test_root_children_size(self):
        self.assertEqual(len(self._skeleton._root.children), 3)

    def test_root_children_names(self):
        names = ['Spine1', 'LeftUpLeg', 'RightUpLeg']
        children_names = [
            self._skeleton._root.children[0].name,
            self._skeleton._root.children[1].name,
            self._skeleton._root.children[2].name,
        ]
        self.assertEqual(children_names, names)

    def test_root_transform(self):
        transform = mat4(
            0, 1, 0, 0,
            0, 0, -1, 0,
            -1, 0, 0, 0,
            0, 0, 0, 1
        )

        TestUtility().assertAlmostEqual_mat4(transform, self._skeleton._root.transform, 12)

    def test_add_children_no_children(self):
        joint = Joint()
        children = []
        self._skeleton.add_children(joint, children)
        self.assertEqual(len(joint.children), 0)

    def test_add_children_multiple_children_len(self):
        self.assertEqual(len(self._skeleton._root.children), 3)

    def test_add_children_multiple_children_parent_transforms(self):
        expected_transforms = [
            self._skeleton._root.transform,
            self._skeleton._root.transform,
            self._skeleton._root.transform
        ]
        actual_transforms = [
            self._skeleton._root.children[0].transform_parent,
            self._skeleton._root.children[1].transform_parent,
            self._skeleton._root.children[2].transform_parent
        ]
        self.assertEqual(actual_transforms, expected_transforms)

    def test_add_children_parent_transform_nested(self):
        expected_transform = self._skeleton._root.children[0].transform
        actual_transform = self._skeleton._root.children[0].children[0].transform_parent
        self.assertEqual(actual_transform, expected_transform)

    def test_add_children_name_end_site(self):
        name = 'End Site'
        joint = self._skeleton._root.children[1].children[0]
        self.assertEqual(joint.name, name)

    def test_add_children_transform_nested(self):
        expected_transform = mat4(
            0, 0, 1, 0,
            1, 0, 0, 0,
            0, 1, 0, -3,
            0, 0, 0, 1
        )
        actual_transform = self._skeleton._root.children[1].children[0].transform
        TestUtility().assertAlmostEqual_mat4(actual_transform, expected_transform)