From 485d46e075dd7c4205b67a5a2b08976f2dc8c047 Mon Sep 17 00:00:00 2001 From: Colin Basnett Date: Thu, 27 Nov 2025 13:45:32 -0800 Subject: [PATCH] Added typing casts to PSK import tests --- tests/psk_import_test.py | 43 ++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/tests/psk_import_test.py b/tests/psk_import_test.py index 10d9cc1..92918d3 100644 --- a/tests/psk_import_test.py +++ b/tests/psk_import_test.py @@ -1,6 +1,9 @@ import bpy import pytest +from typing import cast as typing_cast +from bpy.types import Mesh, Armature + SUZANNE_FILEPATH = 'tests/data/Suzanne.psk' SARGE_FILEPATH = 'tests/data/CS_Sarge_S0_Skelmesh.pskx' SLURP_MONSTER_AXE_FILEPATH = 'tests/data/Slurp_Monster_Axe_LOD0.psk' @@ -29,14 +32,14 @@ def test_psk_import_all(): assert armature_object is not None, "Armature object not found in the scene" assert len(armature_object.children) == 1, "Armature object should have one child" - armature_data = armature_object.data + armature_data = typing_cast(Armature, armature_object.data) assert len(armature_data.bones) == 1, "Armature should have one bone" mesh_object = bpy.data.objects.get('Suzanne.001', None) assert mesh_object is not None, "Mesh object not found in the scene" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert len(mesh_data.vertices) == 507 assert len(mesh_data.polygons) == 968 @@ -50,11 +53,11 @@ def test_psk_import_armature_only(): armature_object = bpy.data.objects.get('Suzanne', None) - assert armature_object.type == 'ARMATURE', "Armature object type should be ARMATURE" assert armature_object is not None, "Armature object not found in the scene" + assert armature_object.type == 'ARMATURE', "Armature object type should be ARMATURE" assert len(armature_object.children) == 0, "Armature object should have no children" - armature_data = armature_object.data + armature_data = typing_cast(Armature, armature_object.data) assert len(armature_data.bones) == 1, "Armature should have one bone" @@ -66,10 +69,10 @@ def test_psk_import_mesh_only(): ) == {'FINISHED'} mesh_object = bpy.data.objects.get('Suzanne', None) - assert mesh_object.type == 'MESH', "Mesh object type should be MESH" assert mesh_object is not None, "Mesh object not found in the scene" + assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert len(mesh_data.vertices) == 507 assert len(mesh_data.polygons) == 968 @@ -105,7 +108,7 @@ def test_psk_import_bone_length(): assert armature_object is not None, "Armature object not found in the scene" assert armature_object.type == 'ARMATURE', "Armature object type should be ARMATURE" - armature_data = armature_object.data + armature_data = typing_cast(Armature, armature_object.data) assert armature_data is not None, "Armature data not found in the scene" assert len(armature_data.bones) == 1, "Armature should have one bone" assert 'ROOT' in armature_data.bones, "Armature should have a bone named 'ROOT'" @@ -126,7 +129,7 @@ def test_psk_import_with_vertex_normals(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert mesh_data.has_custom_normals, "Mesh should have custom normals" @@ -142,7 +145,7 @@ def test_psk_import_without_vertex_normals(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert not mesh_data.has_custom_normals, "Mesh should not have custom normals" @@ -159,7 +162,7 @@ def test_psk_import_with_vertex_colors_srgba(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert len(mesh_data.color_attributes) == 1, "Mesh should have one vertex color layer" assert mesh_data.color_attributes[0].name == 'VERTEXCOLOR', "Vertex color layer should be named 'VERTEXCOLOR'" @@ -178,7 +181,7 @@ def test_psk_import_vertex_colors_linear(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert len(mesh_data.color_attributes) == 1, "Mesh should have one vertex color layer" assert mesh_data.color_attributes[0].name == 'VERTEXCOLOR', "Vertex color layer should be named 'VERTEXCOLOR'" @@ -196,7 +199,7 @@ def test_psk_import_without_vertex_colors(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert len(mesh_data.color_attributes) == 0, "Mesh should not have any vertex color layers" @@ -213,7 +216,7 @@ def test_psk_import_extra_uvs(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert len(mesh_data.uv_layers) == 2, "Mesh should have two UV layers" @@ -237,7 +240,7 @@ def test_psk_import_materials(): assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - mesh_data = mesh_object.data + mesh_data = typing_cast(Mesh, mesh_object.data) assert mesh_data is not None, "Mesh data not found in the scene" assert len(mesh_data.materials) == 4, "Mesh should have four materials" @@ -248,6 +251,7 @@ def test_psk_import_materials(): 'CS_Sarge_S0_MI' ) for i, material in enumerate(mesh_data.materials): + assert material is not None, f"Material {i} should not be None" assert material.name == material_names[i], f"Material {i} name should be {material_names[i]}" @@ -260,7 +264,9 @@ def test_psk_import_shape_keys(): mesh_object = bpy.data.objects.get('Slurp_Monster_Axe_LOD0', None) assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - assert mesh_object.data.shape_keys is not None, "Mesh object should have shape keys" + mesh_data = typing_cast(Mesh, mesh_object.data) + assert mesh_data is not None, "Mesh data should not be None" + assert mesh_data.shape_keys is not None, "Mesh object should have shape keys" shape_key_names = ( 'MORPH_BASE', @@ -270,7 +276,7 @@ def test_psk_import_shape_keys(): 'Blob02', 'Blob01', ) - shape_keys = mesh_object.data.shape_keys.key_blocks + shape_keys = mesh_data.shape_keys.key_blocks assert len(shape_keys) == 6, "Mesh object should have 6 shape keys" for i, shape_key in enumerate(shape_keys): assert shape_key.value == 0.0, f"Shape key {i} should have a value of 0.0" @@ -286,7 +292,10 @@ def test_psk_import_without_shape_keys(): mesh_object = bpy.data.objects.get('Slurp_Monster_Axe_LOD0', None) assert mesh_object is not None, "Mesh object not found in the scene" assert mesh_object.type == 'MESH', "Mesh object type should be MESH" - assert mesh_object.data.shape_keys is None, "Mesh object should not have shape keys" + + mesh_data = typing_cast(Mesh, mesh_object.data) + assert mesh_data is not None, "Mesh data should not be None" + assert mesh_data.shape_keys is None, "Mesh object should not have shape keys" def test_psk_import_with_invalid_faces():