McRogueFace/tests/unit/tileset_file_test.py
2026-02-06 16:15:07 -05:00

145 lines
5.3 KiB
Python

"""Unit tests for mcrfpy.TileSetFile - Tiled tileset loading"""
import mcrfpy
import sys
import os
PASS_COUNT = 0
FAIL_COUNT = 0
def check(condition, msg):
global PASS_COUNT, FAIL_COUNT
if condition:
PASS_COUNT += 1
print(f" PASS: {msg}")
else:
FAIL_COUNT += 1
print(f" FAIL: {msg}")
def test_tsx_loading():
"""Test loading a .tsx tileset"""
print("=== TSX Loading ===")
ts = mcrfpy.TileSetFile("../tests/assets/tiled/test_tileset.tsx")
check(ts.name == "test_tileset", f"name = '{ts.name}'")
check(ts.tile_width == 16, f"tile_width = {ts.tile_width}")
check(ts.tile_height == 16, f"tile_height = {ts.tile_height}")
check(ts.tile_count == 16, f"tile_count = {ts.tile_count}")
check(ts.columns == 4, f"columns = {ts.columns}")
check(ts.margin == 0, f"margin = {ts.margin}")
check(ts.spacing == 0, f"spacing = {ts.spacing}")
check("test_tileset.png" in ts.image_source, f"image_source contains PNG: {ts.image_source}")
return ts
def test_tsj_loading():
"""Test loading a .tsj tileset"""
print("\n=== TSJ Loading ===")
ts = mcrfpy.TileSetFile("../tests/assets/tiled/test_tileset.tsj")
check(ts.name == "test_tileset", f"name = '{ts.name}'")
check(ts.tile_width == 16, f"tile_width = {ts.tile_width}")
check(ts.tile_height == 16, f"tile_height = {ts.tile_height}")
check(ts.tile_count == 16, f"tile_count = {ts.tile_count}")
check(ts.columns == 4, f"columns = {ts.columns}")
return ts
def test_properties(ts):
"""Test tileset properties"""
print("\n=== Properties ===")
props = ts.properties
check(isinstance(props, dict), f"properties is dict: {type(props)}")
check(props.get("author") == "test", f"author = '{props.get('author')}'")
check(props.get("version") == 1, f"version = {props.get('version')}")
def test_tile_info(ts):
"""Test per-tile metadata"""
print("\n=== Tile Info ===")
info = ts.tile_info(0)
check(info is not None, "tile_info(0) exists")
check("properties" in info, "has 'properties' key")
check("animation" in info, "has 'animation' key")
check(info["properties"].get("terrain") == "grass", f"terrain = '{info['properties'].get('terrain')}'")
check(info["properties"].get("walkable") == True, f"walkable = {info['properties'].get('walkable')}")
check(len(info["animation"]) == 2, f"animation frames = {len(info['animation'])}")
check(info["animation"][0] == (0, 500), f"frame 0 = {info['animation'][0]}")
check(info["animation"][1] == (4, 500), f"frame 1 = {info['animation'][1]}")
info1 = ts.tile_info(1)
check(info1 is not None, "tile_info(1) exists")
check(info1["properties"].get("terrain") == "dirt", f"terrain = '{info1['properties'].get('terrain')}'")
check(len(info1["animation"]) == 0, "tile 1 has no animation")
info_none = ts.tile_info(5)
check(info_none is None, "tile_info(5) returns None (no metadata)")
def test_wang_sets(ts):
"""Test Wang set access"""
print("\n=== Wang Sets ===")
wang_sets = ts.wang_sets
check(len(wang_sets) == 1, f"wang_sets count = {len(wang_sets)}")
ws = wang_sets[0]
check(ws.name == "terrain", f"wang set name = '{ws.name}'")
check(ws.type == "corner", f"wang set type = '{ws.type}'")
check(ws.color_count == 2, f"color_count = {ws.color_count}")
colors = ws.colors
check(len(colors) == 2, f"colors length = {len(colors)}")
check(colors[0]["name"] == "Grass", f"color 0 name = '{colors[0]['name']}'")
check(colors[0]["index"] == 1, f"color 0 index = {colors[0]['index']}")
check(colors[1]["name"] == "Dirt", f"color 1 name = '{colors[1]['name']}'")
check(colors[1]["index"] == 2, f"color 1 index = {colors[1]['index']}")
def test_wang_set_lookup(ts):
"""Test wang_set() method"""
print("\n=== Wang Set Lookup ===")
ws = ts.wang_set("terrain")
check(ws.name == "terrain", "wang_set('terrain') found")
try:
ts.wang_set("nonexistent")
check(False, "wang_set('nonexistent') should raise KeyError")
except KeyError:
check(True, "wang_set('nonexistent') raises KeyError")
def test_to_texture(ts):
"""Test texture creation"""
print("\n=== to_texture ===")
tex = ts.to_texture()
check(tex is not None, "to_texture() returns a Texture")
check(isinstance(tex, mcrfpy.Texture), f"is Texture: {type(tex)}")
def test_error_handling():
"""Test error cases"""
print("\n=== Error Handling ===")
try:
mcrfpy.TileSetFile("nonexistent.tsx")
check(False, "Missing file should raise IOError")
except IOError:
check(True, "Missing file raises IOError")
def test_repr(ts):
"""Test repr"""
print("\n=== Repr ===")
r = repr(ts)
check("TileSetFile" in r, f"repr contains 'TileSetFile': {r}")
check("test_tileset" in r, f"repr contains name: {r}")
def main():
ts_tsx = test_tsx_loading()
ts_tsj = test_tsj_loading()
test_properties(ts_tsx)
test_tile_info(ts_tsx)
test_wang_sets(ts_tsx)
test_wang_set_lookup(ts_tsx)
test_to_texture(ts_tsx)
test_error_handling()
test_repr(ts_tsx)
print(f"\n{'='*40}")
print(f"Results: {PASS_COUNT} passed, {FAIL_COUNT} failed")
if FAIL_COUNT > 0:
sys.exit(1)
else:
print("ALL TESTS PASSED")
sys.exit(0)
if __name__ == "__main__":
main()