test_lua_builder.py•10.5 kB
"""Tests for Lua builder module."""
import pytest
from aseprite_mcp.core.lua_builder import LuaBuilder
class TestLuaBuilder:
"""Tests for LuaBuilder class."""
def test_basic_line_addition(self):
"""Test basic line addition and indentation."""
builder = LuaBuilder()
builder.add_line("local x = 1")
builder.add_line("local y = 2")
script = builder.build()
assert script == "local x = 1\nlocal y = 2"
def test_indentation(self):
"""Test indentation management."""
builder = LuaBuilder()
builder.add_line("function test()")
builder.indent()
builder.add_line("local x = 1")
builder.add_line("return x")
builder.dedent()
builder.add_line("end")
expected = "function test()\n local x = 1\n return x\nend"
assert builder.build() == expected
def test_comments(self):
"""Test comment addition."""
builder = LuaBuilder()
builder.add_comment("This is a comment")
builder.add_line("local x = 1")
expected = "-- This is a comment\nlocal x = 1"
assert builder.build() == expected
def test_transaction(self):
"""Test transaction blocks."""
builder = LuaBuilder()
builder.begin_transaction()
builder.add_line("sprite:newLayer()")
builder.end_transaction()
expected = "app.transaction(function()\n sprite:newLayer()\nend)"
assert builder.build() == expected
def test_auto_close_transaction(self):
"""Test that open transactions are auto-closed."""
builder = LuaBuilder()
builder.begin_transaction()
builder.add_line("sprite:newLayer()")
# Don't explicitly end transaction
expected = "app.transaction(function()\n sprite:newLayer()\nend)"
assert builder.build() == expected
def test_create_sprite(self):
"""Test sprite creation."""
builder = LuaBuilder()
builder.create_sprite(100, 200)
expected = "local sprite = Sprite(100, 200, ColorMode.RGBA)"
assert builder.build() == expected
def test_open_sprite(self):
"""Test sprite opening."""
builder = LuaBuilder()
builder.open_sprite("test.aseprite")
expected = 'local sprite = app.open("test.aseprite")\napp.activeSprite = sprite'
assert builder.build() == expected
def test_save_sprite(self):
"""Test sprite saving."""
builder = LuaBuilder()
builder.save_sprite()
expected = "app.activeSprite:save()"
assert builder.build() == expected
# Test with filename
builder = LuaBuilder()
builder.save_sprite("output.aseprite")
expected = 'app.activeSprite:saveAs("output.aseprite")'
assert builder.build() == expected
def test_layer_operations(self):
"""Test layer operations."""
builder = LuaBuilder()
builder.create_layer("New Layer")
expected = 'local layer = app.activeSprite:newLayer()\nlayer.name = "New Layer"'
assert builder.build() == expected
# Test set active layer by name
builder = LuaBuilder()
builder.set_active_layer(layer_name="Background")
expected = 'app.activeLayer = app.activeSprite.layers["Background"]'
assert builder.build() == expected
# Test set active layer by index
builder = LuaBuilder()
builder.set_active_layer(layer_index=0)
expected = 'app.activeLayer = app.activeSprite.layers[1]' # Lua is 1-indexed
assert builder.build() == expected
def test_color_setting(self):
"""Test color setting."""
builder = LuaBuilder()
builder.set_color("FF0000")
expected = "app.fgColor = Color{r=255, g=0, b=0, a=255}"
assert builder.build() == expected
def test_draw_pixel(self):
"""Test single pixel drawing."""
builder = LuaBuilder()
builder.draw_pixel(10, 20)
expected = """app.useTool{
tool="pencil",
points={{x=10, y=20}}
}"""
assert builder.build() == expected
# Test with color
builder = LuaBuilder()
builder.draw_pixel(10, 20, "FF0000")
expected = """app.fgColor = Color{r=255, g=0, b=0, a=255}
app.useTool{
tool="pencil",
points={{x=10, y=20}}
}"""
assert builder.build() == expected
def test_draw_pixels_batch(self):
"""Test batch pixel drawing."""
builder = LuaBuilder()
pixels = [
{"x": 10, "y": 20, "color": "FF0000"},
{"x": 11, "y": 21, "color": "FF0000"},
{"x": 12, "y": 22, "color": "00FF00"}
]
builder.draw_pixels(pixels)
script = builder.build()
# Should group by color
assert "app.fgColor = Color{r=255, g=0, b=0, a=255}" in script
assert "points={{x=10, y=20}, {x=11, y=21}}" in script
assert "app.fgColor = Color{r=0, g=255, b=0, a=255}" in script
assert "points={{x=12, y=22}}" in script
def test_draw_line(self):
"""Test line drawing."""
builder = LuaBuilder()
builder.draw_line(0, 0, 100, 100, thickness=2)
expected = """app.useTool{
tool="line",
brush=Brush(2),
points={{x=0, y=0}, {x=100, y=100}}
}"""
assert builder.build() == expected
def test_draw_rectangle(self):
"""Test rectangle drawing."""
# Outline rectangle
builder = LuaBuilder()
builder.draw_rectangle(10, 20, 30, 40, filled=False)
expected = """app.useTool{
tool="rectangle",
points={{x=10, y=20}, {x=40, y=60}}
}"""
assert builder.build() == expected
# Filled rectangle
builder = LuaBuilder()
builder.draw_rectangle(10, 20, 30, 40, filled=True)
expected = """app.useTool{
tool="filled_rectangle",
points={{x=10, y=20}, {x=40, y=60}}
}"""
assert builder.build() == expected
def test_draw_circle(self):
"""Test circle drawing."""
# Outline circle
builder = LuaBuilder()
builder.draw_circle(50, 50, 20, filled=False)
expected = """app.useTool{
tool="ellipse",
points={{x=30, y=30}, {x=70, y=70}}
}"""
assert builder.build() == expected
# Filled circle
builder = LuaBuilder()
builder.draw_circle(50, 50, 20, filled=True)
expected = """app.useTool{
tool="filled_ellipse",
points={{x=30, y=30}, {x=70, y=70}}
}"""
assert builder.build() == expected
def test_fill_area(self):
"""Test area filling."""
builder = LuaBuilder()
builder.fill_area(50, 50, "FF0000", tolerance=10)
expected = """app.fgColor = Color{r=255, g=0, b=0, a=255}
app.useTool{
tool="paint_bucket",
points={{x=50, y=50}},
tolerance=10
}"""
assert builder.build() == expected
def test_export_sprite(self):
"""Test sprite export."""
# Basic export
builder = LuaBuilder()
builder.export_sprite("output.png")
expected = 'app.activeSprite:saveCopyAs("output.png")'
assert builder.build() == expected
# Export with scale
builder = LuaBuilder()
builder.export_sprite("output.png", scale=2.0)
expected = """app.command.ExportSpriteSheet{
type="none",
columns=1,
rows=1,
scale=2.0,
outputFile="output.png"
}"""
assert builder.build() == expected
def test_add_frame(self):
"""Test frame addition."""
# Add frame at end
builder = LuaBuilder()
builder.add_frame()
expected = "app.activeSprite:newFrame()"
assert builder.build() == expected
# Add frame after specific frame
builder = LuaBuilder()
builder.add_frame(after_frame=2)
expected = "app.activeSprite:newFrame(3)" # Lua is 1-indexed
assert builder.build() == expected
def test_control_structures(self):
"""Test if/else and loops."""
# If statement
builder = LuaBuilder()
builder.if_condition("x > 0")
builder.add_line("print('positive')")
builder.end_if()
expected = """if x > 0 then
print('positive')
end"""
assert builder.build() == expected
# If/else statement
builder = LuaBuilder()
builder.if_condition("x > 0")
builder.add_line("print('positive')")
builder.else_block()
builder.add_line("print('non-positive')")
builder.end_if()
expected = """if x > 0 then
print('positive')
else
print('non-positive')
end"""
assert builder.build() == expected
# For loop
builder = LuaBuilder()
builder.for_loop("i", 1, 10)
builder.add_line("print(i)")
builder.end_loop()
expected = """for i = 1, 10 do
print(i)
end"""
assert builder.build() == expected
# For loop with step
builder = LuaBuilder()
builder.for_loop("i", 1, 10, step=2)
builder.add_line("print(i)")
builder.end_loop()
expected = """for i = 1, 10, 2 do
print(i)
end"""
assert builder.build() == expected
def test_complex_script(self):
"""Test building a complex script."""
builder = LuaBuilder()
builder.open_sprite("test.aseprite")
builder.add_line()
builder.begin_transaction()
builder.create_layer("Effects")
builder.set_color("FF0000")
builder.for_loop("i", 0, 9)
builder.draw_pixel(10, "i * 10")
builder.end_loop()
builder.end_transaction()
builder.save_sprite()
expected = """local sprite = app.open("test.aseprite")
app.activeSprite = sprite
app.transaction(function()
local layer = app.activeSprite:newLayer()
layer.name = "Effects"
app.fgColor = Color{r=255, g=0, b=0, a=255}
for i = 0, 9 do
app.useTool{
tool="pencil",
points={{x=10, y=i * 10}}
}
end
end)
app.activeSprite:save()"""
assert builder.build() == expected