Exemple #1
0
    def test_write_read(self):
        expected = Texture(name="TestName")

        expected.texture_info = TextureInfo(attributes=555,
                                            animation_type=33,
                                            frame_count=63,
                                            frame_rate=16.0)

        self.assertEqual(12, expected.texture_info.size_in_bytes())
        self.assertEqual(37, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_TEXTURE, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Texture.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.name, actual.name)

        self.assertEqual(expected.texture_info.attributes,
                         actual.texture_info.attributes)
        self.assertEqual(expected.texture_info.animation_type,
                         actual.texture_info.animation_type)
        self.assertEqual(expected.texture_info.frame_count,
                         actual.texture_info.frame_count)
        self.assertEqual(expected.texture_info.frame_rate,
                         actual.texture_info.frame_rate)
Exemple #2
0
    def test_write_read(self):
        expected = HLod()
        expected.header = HLodHeader(version=Version(major=3, minor=2),
                                     lod_count=3,
                                     model_name="TestModelName",
                                     hierarchy_name="TestHieraName")
        expected.lod_array = HLodArray()

        self.assertEqual(40, expected.header.size_in_bytes())

        expected.lod_array.header = HLodArrayHeader(model_count=2,
                                                    max_screen_size=5442)

        self.assertEqual(8, expected.lod_array.header.size_in_bytes())

        sub_object1 = HLodSubObject(bone_index=3, name="SubObjectNumber1")

        self.assertEqual(36, sub_object1.size_in_bytes())

        sub_object2 = HLodSubObject(bone_index=44, name="SubObjectNumber2")

        self.assertEqual(36, sub_object2.size_in_bytes())

        expected.lod_array.sub_objects.append(sub_object1)
        expected.lod_array.sub_objects.append(sub_object2)

        self.assertEqual(160, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_HLOD, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = HLod.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.lod_count, actual.header.lod_count)
        self.assertEqual(expected.header.model_name, actual.header.model_name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)

        self.assertEqual(expected.lod_array.header.model_count,
                         actual.lod_array.header.model_count)
        self.assertEqual(expected.lod_array.header.max_screen_size,
                         actual.lod_array.header.max_screen_size)

        self.assertEqual(len(expected.lod_array.sub_objects),
                         len(actual.lod_array.sub_objects))

        self.assertEqual(expected.lod_array.sub_objects[0].bone_index,
                         actual.lod_array.sub_objects[0].bone_index)
        self.assertEqual(expected.lod_array.sub_objects[0].name,
                         actual.lod_array.sub_objects[0].name)

        self.assertEqual(expected.lod_array.sub_objects[1].bone_index,
                         actual.lod_array.sub_objects[1].bone_index)
        self.assertEqual(expected.lod_array.sub_objects[1].name,
                         actual.lod_array.sub_objects[1].name)
    def test_write_read(self):
        expected = Box()
        expected.version = Version(major=5, minor=22)
        expected.box_type = 3
        expected.collision_types = 64
        expected.name = "TestBoxxx"
        expected.color = RGBA(r=125, g=110, b=55, a=244)
        expected.center = Vector((1.0, 2.0, 3.0))
        expected.extend = Vector((4.0, 5.0, 6.0))

        self.assertEqual(68, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, _) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_BOX, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Box.read(io_stream)
        self.assertEqual(expected.version.major, actual.version.major)
        self.assertEqual(expected.version.minor, actual.version.minor)
        self.assertEqual(expected.box_type, actual.box_type)
        self.assertEqual(expected.collision_types, actual.collision_types)
        self.assertEqual(expected.name, actual.name)
        self.assertEqual(expected.color, actual.color)

        self.assertEqual(expected.center.x, actual.center.x)
        self.assertEqual(expected.center.y, actual.center.y)
        self.assertEqual(expected.center.z, actual.center.z)

        self.assertEqual(expected.extend.x, actual.extend.x)
        self.assertEqual(expected.extend.y, actual.extend.y)
        self.assertEqual(expected.extend.z, actual.extend.z)
    def test_write_read_minimal(self):
        expected = Hierarchy(pivots=[], pivot_fixups=[])
        expected.header = HierarchyHeader(version=Version(major=4, minor=1),
                                          name="HieraHeader",
                                          num_pivots=33,
                                          center_pos=Vector((2.0, 3.0, 1.0)))

        self.assertEqual(36, expected.header.size_in_bytes())

        pivot1 = HierarchyPivot(name="Roottransform",
                                parent_id=-1,
                                translation=Vector((22.0, 33.0, 1.0)),
                                euler_angles=Vector((1.0, 12.0, -2.0)),
                                rotation=Quaternion((1.0, -0.1, -0.2, -0.3)))

        self.assertEqual(60, pivot1.size_in_bytes())
        expected.pivots.append(pivot1)

        self.assertEqual(112, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_HIERARCHY, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Hierarchy.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.num_pivots, actual.header.num_pivots)
        self.assertEqual(expected.header.center_pos, actual.header.center_pos)

        self.assertEqual(len(expected.pivots), len(actual.pivots))
    def test_write_read(self):
        expected = Hierarchy(pivots=[], pivot_fixups=[])
        expected.header = HierarchyHeader(version=Version(major=4, minor=1),
                                          name="HieraHeader",
                                          num_pivots=33,
                                          center_pos=Vector((2.0, 3.0, 1.0)))

        self.assertEqual(36, expected.header.size_in_bytes())

        pivot1 = HierarchyPivot(name="Roottransform",
                                parent_id=-1,
                                translation=Vector((22.0, 33.0, 1.0)),
                                euler_angles=Vector((1.0, 12.0, -2.0)),
                                rotation=Quaternion((1.0, -0.1, -0.2, -0.3)))

        self.assertEqual(60, pivot1.size_in_bytes())
        expected.pivots.append(pivot1)

        pivot2 = HierarchyPivot(name="Spine",
                                parent_id=0,
                                translation=Vector((-22.0, -33.0, -1.0)),
                                euler_angles=Vector((-1.0, -12.0, 2.0)),
                                rotation=Quaternion((-1.0, 0.1, 0.2, 0.3)))

        self.assertEqual(60, pivot2.size_in_bytes())
        expected.pivots.append(pivot2)

        for _ in range(64):
            expected.pivot_fixups.append(Vector((-1.0, -2.0, -3.0)))

        self.assertEqual(948, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_HIERARCHY, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Hierarchy.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.num_pivots, actual.header.num_pivots)
        self.assertEqual(expected.header.center_pos, actual.header.center_pos)

        self.assertEqual(len(expected.pivots), len(actual.pivots))

        for i, piv in enumerate(expected.pivots):
            act = actual.pivots[i]
            self.assertEqual(piv.name, act.name)
            self.assertEqual(piv.parent_id, act.parent_id)
            self.assertEqual(piv.translation, act.translation)
            self.assertEqual(piv.euler_angles, act.euler_angles)
            self.assertEqual(piv.rotation, act.rotation)

        self.assertEqual(len(expected.pivot_fixups), len(actual.pivot_fixups))

        for i, fix in enumerate(expected.pivot_fixups):
            self.assertEqual(fix, actual.pivot_fixups[i])
Exemple #6
0
def read_chunk_array(self, io_stream, chunk_end, type_, read_func):
    result = []

    while io_stream.tell() < chunk_end:
        (chunk_type, chunk_size, subchunk_end) = read_chunk_head(io_stream)

        if chunk_type == type_:
            result.append(read_func(self, io_stream, subchunk_end))
        else:
            skip_unknown_chunk(self, io_stream, chunk_type, chunk_size)
    return result
Exemple #7
0
    def test_minimal_write_read(self):
        expected = Texture(name="TestName")

        self.assertEqual(17, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_TEXTURE, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Texture.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.name, actual.name)
    def test_write_read_minimal(self):
        expected = CompressedAnimation(time_coded_channels=[],
                                       adaptive_delta_channels=[],
                                       time_coded_bit_channels=[],
                                       motion_channels=[])

        expected.header = CompressedAnimationHeader(version=Version(major=4,
                                                                    minor=1),
                                                    name="CompAniHead",
                                                    hierarchy_name="HieraName",
                                                    num_frames=155,
                                                    frame_rate=300,
                                                    flavor=0)

        self.assertEqual(44, expected.header.size_in_bytes())
        self.assertEqual(52, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_COMPRESSED_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = CompressedAnimation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)
        self.assertEqual(expected.header.flavor, actual.header.flavor)

        self.assertEqual(len(expected.time_coded_channels),
                         len(actual.time_coded_channels))
        self.assertEqual(len(expected.adaptive_delta_channels),
                         len(actual.adaptive_delta_channels))
        self.assertEqual(len(expected.time_coded_bit_channels),
                         len(actual.time_coded_bit_channels))
        self.assertEqual(len(expected.motion_channels),
                         len(actual.motion_channels))
    def test_write_read_minimal(self):
        expected = ShaderMaterial()
        expected.header = ShaderMaterialHeader(number=55,
                                               type_name="headerType",
                                               reserver=99)

        self.assertEqual(223, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_SHADER_MATERIAL, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = ShaderMaterial.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.number, actual.header.number)
        self.assertEqual(expected.header.type_name, actual.header.type_name)
        self.assertEqual(expected.header.reserved, actual.header.reserved)

        self.assertEqual(len(expected.properties), len(actual.properties))
    def test_write_read(self):
        expected = ShaderMaterial()
        expected.header = ShaderMaterialHeader(number=55,
                                               type_name="headerType",
                                               reserver=99)

        self.assertEqual(37, expected.header.size_in_bytes())

        prop1 = ShaderMaterialProperty(type=1,
                                       name="prop1",
                                       num_chars=44,
                                       value="test")

        expected.properties.append(prop1)

        prop2 = ShaderMaterialProperty(type=2,
                                       name="prop2",
                                       num_chars=44,
                                       value=3.14)

        expected.properties.append(prop2)

        prop3 = ShaderMaterialProperty(type=4,
                                       name="prop3",
                                       num_chars=44,
                                       value=Vector((1.0, 2.0, 3.0)))

        expected.properties.append(prop3)

        prop4 = ShaderMaterialProperty(type=5,
                                       name="prop4",
                                       num_chars=44,
                                       value=RGBA(r=3, g=1, b=22, a=133))

        expected.properties.append(prop4)

        prop5 = ShaderMaterialProperty(type=6,
                                       name="prop5",
                                       num_chars=44,
                                       value=1234)

        expected.properties.append(prop5)

        prop6 = ShaderMaterialProperty(type=7,
                                       name="prop6",
                                       num_chars=44,
                                       value=255)

        expected.properties.append(prop6)

        self.assertEqual(223, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_SHADER_MATERIAL, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = ShaderMaterial.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.number, actual.header.number)
        self.assertEqual(expected.header.type_name, actual.header.type_name)
        self.assertEqual(expected.header.reserved, actual.header.reserved)

        self.assertEqual(len(expected.properties), len(actual.properties))

        for i, prop in enumerate(expected.properties):
            self.assertEqual(prop.type, actual.properties[i].type)
            self.assertEqual(prop.name, actual.properties[i].name)
            self.assertEqual(prop.num_chars, actual.properties[i].num_chars)
            self.assertAlmostEqual(prop.value, actual.properties[i].value, 5)
    def test_write_read_minimal(self):
        expected = Mesh(
            header=MeshHeader(),
            user_text="",
            verts=[],
            normals=[],
            vert_infs=[],
            triangles=[],
            shade_ids=[],
            mat_info=None,
            shaders=[],
            vert_materials=[],
            textures=[],
            shader_materials=[],
            material_pass=None,
            aabbtree=None)

        self.assertEqual(116, expected.header.size_in_bytes())
        self.assertEqual(148, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunk_type, chunk_size, subchunk_end) = read_chunk_head(io_stream)

        self.assertEqual(W3D_CHUNK_MESH, chunk_type)
        self.assertEqual(expected.size_in_bytes(), chunk_size)

        actual = Mesh.read(self, io_stream, subchunk_end)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.attrs, actual.header.attrs)
        self.assertEqual(expected.header.mesh_name, actual.header.mesh_name)
        self.assertEqual(expected.header.container_name, actual.header.container_name)
        self.assertEqual(expected.header.face_count, actual.header.face_count)
        self.assertEqual(expected.header.vert_count, actual.header.vert_count)
        self.assertEqual(expected.header.matl_count, actual.header.matl_count)
        self.assertEqual(expected.header.damage_stage_count, actual.header.damage_stage_count)
        self.assertEqual(expected.header.sort_level, actual.header.sort_level)
        self.assertEqual(expected.header.prelit_version, actual.header.prelit_version)
        self.assertEqual(expected.header.future_count, actual.header.future_count)
        self.assertEqual(expected.header.vert_channel_flags, actual.header.vert_channel_flags)
        self.assertEqual(expected.header.face_channel_falgs, actual.header.face_channel_falgs)
        self.assertEqual(expected.header.min_corner, actual.header.min_corner)
        self.assertEqual(expected.header.max_corner, actual.header.max_corner)
        self.assertEqual(expected.header.sph_center, actual.header.sph_center)
        self.assertEqual(expected.header.sph_radius, actual.header.sph_radius)

        self.compare_list(expected.verts, actual.verts)
        self.compare_list(expected.normals, actual.normals)
        self.compare_list(expected.vert_infs, actual.vert_infs)
        self.compare_list(expected.triangles, actual.triangles)
        self.compare_list(expected.shade_ids, actual.shade_ids)

        self.assertEqual(expected.mat_info, actual.mat_info)
        self.assertEqual(len(expected.shaders), len(actual.shaders))
        self.assertEqual(len(expected.vert_materials), len(actual.vert_materials))
        self.assertEqual(len(expected.textures), len(actual.textures))
        self.assertEqual(len(expected.shader_materials), len(actual.shader_materials))
        self.assertEqual(expected.material_pass, actual.material_pass)
        self.assertEqual(expected.aabbtree, actual.aabbtree)
    def test_write_read(self):
        expected = Mesh(
            header=MeshHeader(),
            user_text="TestUserText",
            verts=[],
            normals=[],
            vert_infs=[],
            triangles=[],
            shade_ids=[],
            mat_info=MaterialInfo(),
            shaders=[MeshShader(), MeshShader(), MeshShader()],
            vert_materials=[VertexMaterial(), VertexMaterial(), VertexMaterial()],
            textures=[Texture(), Texture(), Texture(), Texture()],
            shader_materials=[ShaderMaterial(), ShaderMaterial()],
            material_pass=MaterialPass(),
            aabbtree=MeshAABBTree())

        self.assertEqual(116, expected.header.size_in_bytes())

        for i in range(332):
            expected.verts.append(Vector((0.0, 2.0, -1.2)))
            expected.normals.append(Vector((0.0, 1.0, 0.0)))
            expected.vert_infs.append(MeshVertexInfluence())
            expected.triangles.append(MeshTriangle())
            expected.shade_ids.append(i)

        self.assertEqual(23347, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunk_type, chunk_size, subchunk_end) = read_chunk_head(io_stream)

        self.assertEqual(W3D_CHUNK_MESH, chunk_type)
        self.assertEqual(expected.size_in_bytes(), chunk_size)

        actual = Mesh.read(self, io_stream, subchunk_end)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.attrs, actual.header.attrs)
        self.assertEqual(expected.header.mesh_name, actual.header.mesh_name)
        self.assertEqual(expected.header.container_name, actual.header.container_name)
        self.assertEqual(expected.header.face_count, actual.header.face_count)
        self.assertEqual(expected.header.vert_count, actual.header.vert_count)
        self.assertEqual(expected.header.matl_count, actual.header.matl_count)
        self.assertEqual(expected.header.damage_stage_count, actual.header.damage_stage_count)
        self.assertEqual(expected.header.sort_level, actual.header.sort_level)
        self.assertEqual(expected.header.prelit_version, actual.header.prelit_version)
        self.assertEqual(expected.header.future_count, actual.header.future_count)
        self.assertEqual(expected.header.vert_channel_flags, actual.header.vert_channel_flags)
        self.assertEqual(expected.header.face_channel_falgs, actual.header.face_channel_falgs)
        self.assertEqual(expected.header.min_corner, actual.header.min_corner)
        self.assertEqual(expected.header.max_corner, actual.header.max_corner)
        self.assertEqual(expected.header.sph_center, actual.header.sph_center)
        self.assertEqual(expected.header.sph_radius, actual.header.sph_radius)

        self.compare_list(expected.verts, actual.verts)
        self.compare_list(expected.normals, actual.normals)
        self.assertEqual(len(expected.vert_infs), len(actual.vert_infs))
        self.assertEqual(len(expected.triangles), len(actual.triangles))
        self.assertEqual(len(expected.shade_ids), len(actual.shade_ids))

        self.assertEqual(len(expected.shaders), len(actual.shaders))
        self.assertEqual(len(expected.vert_materials), len(actual.vert_materials))
        self.assertEqual(len(expected.textures), len(actual.textures))
        self.assertEqual(len(expected.shader_materials), len(actual.shader_materials))
Exemple #13
0
    def test_write_read(self):
        expected = Animation()
        expected.header = AnimationHeader(version=Version(major=4, minor=1),
                                          name="AniHeader",
                                          hierarchy_name="HieraName",
                                          num_frames=155,
                                          frame_rate=300)

        self.assertEqual(44, expected.header.size_in_bytes())

        x_channel = AnimationChannel(first_frame=1,
                                     last_frame=33,
                                     vector_len=1,
                                     type=3,
                                     pivot=33,
                                     unknown=123,
                                     data=[])

        for i in range(55):
            x_channel.data.append(2.0)

        expected.channels.append(x_channel)

        q_channel = AnimationChannel(first_frame=1,
                                     last_frame=33,
                                     vector_len=4,
                                     type=6,
                                     pivot=33,
                                     unknown=123,
                                     data=[])

        for i in range(55):
            q_channel.data.append(Quaternion((1.0, 2.0, 3.0, 4.0)))

        expected.channels.append(q_channel)

        self.assertEqual(1192, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = Animation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)

        self.assertEqual(len(expected.channels), len(actual.channels))

        for i, chan in enumerate(expected.channels):
            act = actual.channels[i]
            self.assertEqual(chan.first_frame, act.first_frame)
            self.assertEqual(chan.last_frame, act.last_frame)
            self.assertEqual(chan.vector_len, act.vector_len)
            self.assertEqual(chan.type, act.type)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.unknown, act.unknown)

            self.assertEqual(len(chan.data), len(act.data))

            for j, d in enumerate(chan.data):
                self.assertEqual(d, act.data[j])
    def test_write_read_adaptive_delta(self):
        expected = CompressedAnimation(time_coded_channels=[],
                                       adaptive_delta_channels=[],
                                       time_coded_bit_channels=[],
                                       motion_channels=[])

        expected.header = CompressedAnimationHeader(version=Version(major=4,
                                                                    minor=1),
                                                    name="CompAniHead",
                                                    hierarchy_name="HieraName",
                                                    num_frames=155,
                                                    frame_rate=300,
                                                    flavor=1)

        self.assertEqual(44, expected.header.size_in_bytes())

        (ad_y_channel,
         ad_q_channel) = self.get_adaptive_delta_channels(num_bits=4)

        for _ in range(46):
            expected.adaptive_delta_channels.append(ad_y_channel)
            expected.adaptive_delta_channels.append(ad_q_channel)

        self.assertEqual(4974, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        self.assertEqual(4982, io_stream.tell())
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_COMPRESSED_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = CompressedAnimation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)
        self.assertEqual(expected.header.flavor, actual.header.flavor)

        self.assertEqual(len(expected.adaptive_delta_channels),
                         len(actual.adaptive_delta_channels))

        for i, chan in enumerate(expected.adaptive_delta_channels):
            act = actual.adaptive_delta_channels[i]
            self.assertEqual(chan.num_time_codes, act.num_time_codes)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.vector_len, act.vector_len)
            self.assertEqual(chan.type, act.type)
            self.assertEqual(chan.scale, act.scale)

            self.assertEqual(chan.data.initial_value, act.data.initial_value)
            self.assertEqual(chan.data.bit_count, act.data.bit_count)

            self.assertEqual(len(chan.data.delta_blocks),
                             len(act.data.delta_blocks))

            for j, block in enumerate(chan.data.delta_blocks):
                current = act.data.delta_blocks[j]
                self.assertEqual(block.vector_index, current.vector_index)
                self.assertEqual(block.block_index, current.block_index)

                self.assertEqual(len(block.delta_bytes),
                                 len(current.delta_bytes))
                for k, byt in enumerate(block.delta_bytes):
                    self.assertEqual(int(byt), int(current.delta_bytes[k]))
    def test_write_read(self):
        expected = CompressedAnimation(time_coded_channels=[],
                                       adaptive_delta_channels=[],
                                       time_coded_bit_channels=[],
                                       motion_channels=[])

        expected.header = CompressedAnimationHeader(version=Version(major=4,
                                                                    minor=1),
                                                    name="CompAniHead",
                                                    hierarchy_name="HieraName",
                                                    num_frames=155,
                                                    frame_rate=300,
                                                    flavor=0)

        self.assertEqual(44, expected.header.size_in_bytes())

        # TimeCodedChannels

        tc_channel = TimeCodedAnimationChannel(num_time_codes=55,
                                               pivot=4,
                                               vector_len=4,
                                               type=6,
                                               time_codes=[])

        tc_datum = TimeCodedDatum(time_code=34,
                                  non_interpolated=True,
                                  value=Quaternion((0.1, -2.0, -0.3, 2.0)))

        for _ in range(tc_channel.num_time_codes):
            tc_channel.time_codes.append(tc_datum)

        for _ in range(31):
            expected.time_coded_channels.append(tc_channel)

        # TimeCodedBitChannels

        tcb_channel = TimeCodedBitChannel(num_time_codes=55,
                                          pivot=52,
                                          type=0,
                                          default_value=12,
                                          time_codes=[])

        tcb_datum = TimeCodedBitDatum(time_code=1, value=True)

        for _ in range(tcb_channel.num_time_codes):
            tcb_channel.time_codes.append(tcb_datum)

        for _ in range(31):
            expected.time_coded_bit_channels.append(tcb_channel)

        # MotionChannels

        m_channel_tc = MotionChannel(delta_type=0,
                                     vector_len=1,
                                     type=0,
                                     num_time_codes=55,
                                     pivot=182,
                                     data=[])

        datum = TimeCodedDatum(time_code=3, value=2.0)

        for _ in range(m_channel_tc.num_time_codes):
            m_channel_tc.data.append(datum)

        expected.motion_channels.append(m_channel_tc)

        m_channel_ad_y_4 = MotionChannel(delta_type=1,
                                         vector_len=1,
                                         type=2,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_y_4 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=-1.0,
            data=self.get_adaptive_delta_data(2, 4,
                                              m_channel_ad_y_4.num_time_codes))

        m_channel_ad_y_4.data = m_ad_y_4

        expected.motion_channels.append(m_channel_ad_y_4)

        m_channel_ad_q_4 = MotionChannel(delta_type=1,
                                         vector_len=4,
                                         type=6,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_q_4 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=Quaternion((3.0, 2.0, 0.1, -1.9)),
            data=self.get_adaptive_delta_data(6, 4,
                                              m_channel_ad_q_4.num_time_codes))

        m_channel_ad_q_4.data = m_ad_q_4

        expected.motion_channels.append(m_channel_ad_q_4)

        m_channel_ad_y_8 = MotionChannel(delta_type=2,
                                         vector_len=1,
                                         type=2,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_y_8 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=-1.0,
            data=self.get_adaptive_delta_data(2, 8,
                                              m_channel_ad_y_8.num_time_codes))

        m_channel_ad_y_8.data = m_ad_y_8

        expected.motion_channels.append(m_channel_ad_y_8)

        m_channel_ad_q_8 = MotionChannel(delta_type=2,
                                         vector_len=4,
                                         type=6,
                                         num_time_codes=55,
                                         pivot=182,
                                         data=[])

        m_ad_q_8 = AdaptiveDeltaMotionAnimationChannel(
            scale=4.0,
            initial_value=Quaternion((3.0, 2.0, 0.1, -1.9)),
            data=self.get_adaptive_delta_data(6, 8,
                                              m_channel_ad_q_8.num_time_codes))

        m_channel_ad_q_8.data = m_ad_q_8

        expected.motion_channels.append(m_channel_ad_q_8)

        self.assertEqual(42842, expected.size_in_bytes())

        io_stream = io.BytesIO()
        expected.write(io_stream)
        io_stream = io.BytesIO(io_stream.getvalue())

        (chunkType, chunkSize, chunkEnd) = read_chunk_head(io_stream)
        self.assertEqual(W3D_CHUNK_COMPRESSED_ANIMATION, chunkType)
        self.assertEqual(expected.size_in_bytes(), chunkSize)

        actual = CompressedAnimation.read(self, io_stream, chunkEnd)
        self.assertEqual(expected.header.version, actual.header.version)
        self.assertEqual(expected.header.name, actual.header.name)
        self.assertEqual(expected.header.hierarchy_name,
                         actual.header.hierarchy_name)
        self.assertEqual(expected.header.num_frames, actual.header.num_frames)
        self.assertEqual(expected.header.frame_rate, actual.header.frame_rate)
        self.assertEqual(expected.header.flavor, actual.header.flavor)

        self.assertEqual(len(expected.time_coded_channels),
                         len(actual.time_coded_channels))
        self.assertEqual(len(expected.time_coded_bit_channels),
                         len(actual.time_coded_bit_channels))

        for i, chan in enumerate(expected.time_coded_channels):
            act = actual.time_coded_channels[i]
            self.assertEqual(chan.num_time_codes, act.num_time_codes)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.vector_len, act.vector_len)
            self.assertEqual(chan.type, act.type)

            self.assertEqual(len(chan.time_codes), len(act.time_codes))

            for j, time_code in enumerate(chan.time_codes):
                self.assertEqual(time_code.time_code,
                                 act.time_codes[j].time_code)
                self.assertAlmostEqual(time_code.value,
                                       act.time_codes[j].value, 5)

        for i, chan in enumerate(expected.time_coded_bit_channels):
            act = actual.time_coded_bit_channels[i]
            self.assertEqual(chan.num_time_codes, act.num_time_codes)
            self.assertEqual(chan.pivot, act.pivot)
            self.assertEqual(chan.type, act.type)
            self.assertAlmostEqual(chan.default_value, act.default_value, 5)

            self.assertEqual(len(chan.time_codes), len(act.time_codes))

            for j, time_code in enumerate(chan.time_codes):
                self.assertEqual(time_code.time_code,
                                 act.time_codes[j].time_code)
                self.assertAlmostEqual(time_code.value,
                                       act.time_codes[j].value, 5)