278 lines
10 KiB
Python
278 lines
10 KiB
Python
|
|
"""Integration tests for manage_texture tool."""
|
||
|
|
|
||
|
|
import pytest
|
||
|
|
import asyncio
|
||
|
|
from .test_helpers import DummyContext
|
||
|
|
import services.tools.manage_texture as manage_texture_mod
|
||
|
|
|
||
|
|
def run_async(coro):
|
||
|
|
"""Simple wrapper to run a coroutine synchronously."""
|
||
|
|
loop = asyncio.new_event_loop()
|
||
|
|
try:
|
||
|
|
asyncio.set_event_loop(loop)
|
||
|
|
return loop.run_until_complete(coro)
|
||
|
|
finally:
|
||
|
|
loop.close()
|
||
|
|
asyncio.set_event_loop(None)
|
||
|
|
|
||
|
|
async def noop_preflight(*args, **kwargs):
|
||
|
|
return None
|
||
|
|
|
||
|
|
class TestManageTextureIntegration:
|
||
|
|
"""Integration tests for texture management tool logic."""
|
||
|
|
|
||
|
|
def test_create_texture_with_color_array(self, monkeypatch):
|
||
|
|
"""Test creating a texture with RGB color array (0-255)."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["cmd"] = cmd
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Created texture"}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="create",
|
||
|
|
path="Assets/TestTextures/Red.png",
|
||
|
|
width=64,
|
||
|
|
height=64,
|
||
|
|
fill_color=[255, 0, 0, 255]
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
assert captured["params"]["fillColor"] == [255, 0, 0, 255]
|
||
|
|
|
||
|
|
def test_create_texture_with_normalized_color(self, monkeypatch):
|
||
|
|
"""Test creating a texture with normalized color (0.0-1.0)."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Created texture"}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="create",
|
||
|
|
path="Assets/TestTextures/Blue.png",
|
||
|
|
fill_color=[0.0, 0.0, 1.0, 1.0]
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
# Should be normalized to 0-255
|
||
|
|
assert captured["params"]["fillColor"] == [0, 0, 255, 255]
|
||
|
|
|
||
|
|
def test_create_sprite_with_pattern(self, monkeypatch):
|
||
|
|
"""Test creating a sprite with checkerboard pattern."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Created sprite", "data": {"asSprite": True}}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="create_sprite",
|
||
|
|
path="Assets/TestTextures/Checkerboard.png",
|
||
|
|
pattern="checkerboard",
|
||
|
|
as_sprite={
|
||
|
|
"pixelsPerUnit": 100.0,
|
||
|
|
"pivot": [0.5, 0.5]
|
||
|
|
}
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
assert captured["params"]["action"] == "create_sprite"
|
||
|
|
assert captured["params"]["pattern"] == "checkerboard"
|
||
|
|
assert captured["params"]["spriteSettings"]["pixelsPerUnit"] == 100.0
|
||
|
|
|
||
|
|
def test_create_texture_with_import_settings(self, monkeypatch):
|
||
|
|
"""Test creating a texture with import settings (conversion of snake_case to camelCase)."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Created texture"}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="create",
|
||
|
|
path="Assets/TestTextures/SpriteTexture.png",
|
||
|
|
import_settings={
|
||
|
|
"texture_type": "sprite",
|
||
|
|
"sprite_pixels_per_unit": 100,
|
||
|
|
"filter_mode": "point",
|
||
|
|
"wrap_mode": "clamp"
|
||
|
|
}
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
settings = captured["params"]["importSettings"]
|
||
|
|
assert settings["textureType"] == "Sprite"
|
||
|
|
assert settings["spritePixelsPerUnit"] == 100
|
||
|
|
assert settings["filterMode"] == "Point"
|
||
|
|
assert settings["wrapMode"] == "Clamp"
|
||
|
|
|
||
|
|
def test_texture_modify_params(self, monkeypatch):
|
||
|
|
"""Test texture modify parameter conversion."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Modified texture"}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="modify",
|
||
|
|
path="Assets/Textures/Test.png",
|
||
|
|
set_pixels={
|
||
|
|
"x": 0,
|
||
|
|
"y": 0,
|
||
|
|
"width": 10,
|
||
|
|
"height": 10,
|
||
|
|
"color": [255, 0, 0, 255]
|
||
|
|
}
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
assert captured["params"]["setPixels"]["color"] == [255, 0, 0, 255]
|
||
|
|
|
||
|
|
def test_texture_modify_pixels_array(self, monkeypatch):
|
||
|
|
"""Test texture modify pixel array normalization."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Modified texture"}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="modify",
|
||
|
|
path="Assets/Textures/Test.png",
|
||
|
|
set_pixels={
|
||
|
|
"x": 0,
|
||
|
|
"y": 0,
|
||
|
|
"width": 2,
|
||
|
|
"height": 2,
|
||
|
|
"pixels": [
|
||
|
|
[1.0, 0.0, 0.0, 1.0],
|
||
|
|
[0.0, 1.0, 0.0, 1.0],
|
||
|
|
[0.0, 0.0, 1.0, 1.0],
|
||
|
|
[0.5, 0.5, 0.5, 1.0],
|
||
|
|
]
|
||
|
|
}
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
assert captured["params"]["setPixels"]["pixels"] == [
|
||
|
|
[255, 0, 0, 255],
|
||
|
|
[0, 255, 0, 255],
|
||
|
|
[0, 0, 255, 255],
|
||
|
|
[128, 128, 128, 255],
|
||
|
|
]
|
||
|
|
|
||
|
|
def test_texture_modify_pixels_invalid_length(self, monkeypatch):
|
||
|
|
"""Test error handling for invalid pixel array length."""
|
||
|
|
async def fake_send(*args, **kwargs):
|
||
|
|
return {"success": True}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="modify",
|
||
|
|
path="Assets/Textures/Test.png",
|
||
|
|
set_pixels={
|
||
|
|
"x": 0,
|
||
|
|
"y": 0,
|
||
|
|
"width": 2,
|
||
|
|
"height": 2,
|
||
|
|
"pixels": [
|
||
|
|
[255, 0, 0, 255],
|
||
|
|
[0, 255, 0, 255],
|
||
|
|
[0, 0, 255, 255],
|
||
|
|
]
|
||
|
|
}
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is False
|
||
|
|
assert "pixels array must have 4 entries" in resp["message"]
|
||
|
|
|
||
|
|
def test_texture_modify_invalid_set_pixels_type(self, monkeypatch):
|
||
|
|
"""Test error handling for invalid set_pixels input type."""
|
||
|
|
async def fake_send(*args, **kwargs):
|
||
|
|
return {"success": True}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="modify",
|
||
|
|
path="Assets/Textures/Test.png",
|
||
|
|
set_pixels=[]
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is False
|
||
|
|
assert resp["message"] == "set_pixels must be a JSON object"
|
||
|
|
|
||
|
|
def test_texture_delete_params(self, monkeypatch):
|
||
|
|
"""Test texture delete parameter pass-through."""
|
||
|
|
captured = {}
|
||
|
|
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
captured["params"] = params
|
||
|
|
return {"success": True, "message": "Deleted texture"}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="delete",
|
||
|
|
path="Assets/Textures/Old.png"
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is True
|
||
|
|
assert captured["params"]["path"] == "Assets/Textures/Old.png"
|
||
|
|
|
||
|
|
def test_invalid_dimensions(self, monkeypatch):
|
||
|
|
"""Test error handling for invalid dimensions."""
|
||
|
|
async def fake_send(func, instance, cmd, params, **kwargs):
|
||
|
|
w = params.get("width", 0)
|
||
|
|
if w > 4096:
|
||
|
|
return {"success": False, "message": "Invalid dimensions: 5000x64. Must be 1-4096."}
|
||
|
|
return {"success": True}
|
||
|
|
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "send_with_unity_instance", fake_send)
|
||
|
|
monkeypatch.setattr(manage_texture_mod, "preflight", noop_preflight)
|
||
|
|
|
||
|
|
resp = run_async(manage_texture_mod.manage_texture(
|
||
|
|
ctx=DummyContext(),
|
||
|
|
action="create",
|
||
|
|
path="Assets/Invalid.png",
|
||
|
|
width=0,
|
||
|
|
height=64 # Non-positive dimension
|
||
|
|
))
|
||
|
|
|
||
|
|
assert resp["success"] is False
|
||
|
|
assert "positive" in resp["message"].lower()
|