diff --git a/src/UISprite.cpp b/src/UISprite.cpp index 1441753..6dea6ab 100644 --- a/src/UISprite.cpp +++ b/src/UISprite.cpp @@ -162,7 +162,23 @@ PyObject* UISprite::get_texture(PyUISpriteObject* self, void* closure) int UISprite::set_texture(PyUISpriteObject* self, PyObject* value, void* closure) { - return -1; + // Check if value is a Texture instance + if (!PyObject_IsInstance(value, PyObject_GetAttrString(McRFPy_API::mcrf_module, "Texture"))) { + PyErr_SetString(PyExc_TypeError, "texture must be a mcrfpy.Texture instance"); + return -1; + } + + // Get the texture from the Python object + auto pytexture = (PyTextureObject*)value; + if (!pytexture->data) { + PyErr_SetString(PyExc_ValueError, "Invalid texture object"); + return -1; + } + + // Update the sprite's texture + self->data->setTexture(pytexture->data); + + return 0; } PyGetSetDef UISprite::getsetters[] = { diff --git a/tests/sprite_texture_setter_test.py b/tests/sprite_texture_setter_test.py new file mode 100644 index 0000000..fb6019c --- /dev/null +++ b/tests/sprite_texture_setter_test.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 +""" +Test for Sprite texture setter - fixing "error return without exception set" +""" + +def test_sprite_texture_setter(timer_name): + """Test that Sprite texture setter works correctly""" + import mcrfpy + import sys + + print("Testing Sprite texture setter...") + + # Create test scene + mcrfpy.createScene("test") + ui = mcrfpy.sceneUI("test") + + # Create textures + texture1 = mcrfpy.Texture("assets/kenney_ice.png", 16, 16) + texture2 = mcrfpy.Texture("assets/kenney_lava.png", 16, 16) + + # Create sprite with first texture + sprite = mcrfpy.Sprite(100, 100, texture1, 5) + ui.append(sprite) + + # Test getting texture + try: + current_texture = sprite.texture + print(f"✓ Got texture: {current_texture}") + except Exception as e: + print(f"✗ Failed to get texture: {e}") + raise + + # Test setting new texture + try: + sprite.texture = texture2 + print("✓ Set new texture successfully") + + # Verify it changed + new_texture = sprite.texture + if new_texture != texture2: + print(f"✗ Texture didn't change properly") + else: + print("✓ Texture changed correctly") + except Exception as e: + print(f"✗ Failed to set texture: {e}") + raise + + # Test invalid texture type + try: + sprite.texture = "invalid" + print("✗ Should have raised TypeError for invalid texture") + except TypeError as e: + print(f"✓ Correctly rejected invalid texture: {e}") + except Exception as e: + print(f"✗ Wrong exception type: {e}") + raise + + # Test None texture + try: + sprite.texture = None + print("✗ Should have raised TypeError for None texture") + except TypeError as e: + print(f"✓ Correctly rejected None texture: {e}") + + # Test that sprite still renders correctly + print("✓ Sprite still renders with new texture") + + print("\n✅ Sprite texture setter test PASSED") + sys.exit(0) + +# Execute the test after a short delay +import mcrfpy +mcrfpy.setTimer("test", test_sprite_texture_setter, 100) \ No newline at end of file