104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
|
|
"""Test multi-tile entity rendering and positioning (#236).
|
||
|
|
|
||
|
|
Verifies that entities can span multiple grid cells using tile_width
|
||
|
|
and tile_height properties, with correct frustum culling and spatial
|
||
|
|
hash queries.
|
||
|
|
"""
|
||
|
|
import mcrfpy
|
||
|
|
import sys
|
||
|
|
|
||
|
|
def test_default_tile_size():
|
||
|
|
"""New entities default to 1x1 tile size."""
|
||
|
|
entity = mcrfpy.Entity()
|
||
|
|
assert entity.tile_width == 1, f"Expected 1, got {entity.tile_width}"
|
||
|
|
assert entity.tile_height == 1, f"Expected 1, got {entity.tile_height}"
|
||
|
|
ts = entity.tile_size
|
||
|
|
assert ts.x == 1.0 and ts.y == 1.0, f"tile_size wrong: ({ts.x}, {ts.y})"
|
||
|
|
print(" PASS: default tile size")
|
||
|
|
|
||
|
|
def test_set_tile_size_individual():
|
||
|
|
"""tile_width and tile_height can be set individually."""
|
||
|
|
entity = mcrfpy.Entity()
|
||
|
|
entity.tile_width = 2
|
||
|
|
entity.tile_height = 3
|
||
|
|
assert entity.tile_width == 2, f"Expected 2, got {entity.tile_width}"
|
||
|
|
assert entity.tile_height == 3, f"Expected 3, got {entity.tile_height}"
|
||
|
|
print(" PASS: individual tile size setters")
|
||
|
|
|
||
|
|
def test_set_tile_size_tuple():
|
||
|
|
"""tile_size can be set as a tuple."""
|
||
|
|
entity = mcrfpy.Entity()
|
||
|
|
entity.tile_size = (4, 2)
|
||
|
|
assert entity.tile_width == 4, f"Expected 4, got {entity.tile_width}"
|
||
|
|
assert entity.tile_height == 2, f"Expected 2, got {entity.tile_height}"
|
||
|
|
print(" PASS: tile_size tuple setter")
|
||
|
|
|
||
|
|
def test_tile_size_validation():
|
||
|
|
"""tile_width/height must be >= 1."""
|
||
|
|
entity = mcrfpy.Entity()
|
||
|
|
try:
|
||
|
|
entity.tile_width = 0
|
||
|
|
assert False, "Should have raised ValueError"
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
try:
|
||
|
|
entity.tile_height = -1
|
||
|
|
assert False, "Should have raised ValueError"
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
try:
|
||
|
|
entity.tile_size = (0, 1)
|
||
|
|
assert False, "Should have raised ValueError"
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
print(" PASS: tile size validation")
|
||
|
|
|
||
|
|
def test_multi_tile_in_grid():
|
||
|
|
"""Multi-tile entities work correctly in grids."""
|
||
|
|
grid = mcrfpy.Grid(grid_size=(20, 20))
|
||
|
|
entity = mcrfpy.Entity(grid_pos=(5, 5), grid=grid)
|
||
|
|
entity.tile_width = 2
|
||
|
|
entity.tile_height = 2
|
||
|
|
|
||
|
|
assert entity.tile_width == 2
|
||
|
|
assert entity.tile_height == 2
|
||
|
|
assert entity.cell_pos.x == 5
|
||
|
|
assert entity.cell_pos.y == 5
|
||
|
|
print(" PASS: multi-tile entity in grid")
|
||
|
|
|
||
|
|
def test_spatial_hash_multi_tile():
|
||
|
|
"""Spatial hash queries find multi-tile entities at covered cells."""
|
||
|
|
grid = mcrfpy.Grid(grid_size=(20, 20))
|
||
|
|
entity = mcrfpy.Entity(grid_pos=(5, 5), grid=grid)
|
||
|
|
entity.tile_width = 2
|
||
|
|
entity.tile_height = 2
|
||
|
|
|
||
|
|
at_origin = grid.at(5, 5).entities
|
||
|
|
assert len(at_origin) >= 1, f"Entity not found at origin (5,5): {len(at_origin)}"
|
||
|
|
|
||
|
|
at_right = grid.at(6, 5).entities
|
||
|
|
assert len(at_right) >= 1, f"Entity not found at covered cell (6,5): {len(at_right)}"
|
||
|
|
|
||
|
|
at_below = grid.at(5, 6).entities
|
||
|
|
assert len(at_below) >= 1, f"Entity not found at covered cell (5,6): {len(at_below)}"
|
||
|
|
|
||
|
|
at_corner = grid.at(6, 6).entities
|
||
|
|
assert len(at_corner) >= 1, f"Entity not found at covered cell (6,6): {len(at_corner)}"
|
||
|
|
|
||
|
|
at_outside = grid.at(7, 5).entities
|
||
|
|
assert len(at_outside) == 0, f"Entity found outside footprint (7,5): {len(at_outside)}"
|
||
|
|
|
||
|
|
print(" PASS: spatial hash multi-tile queries")
|
||
|
|
|
||
|
|
print("Testing #236: Multi-tile entities...")
|
||
|
|
test_default_tile_size()
|
||
|
|
test_set_tile_size_individual()
|
||
|
|
test_set_tile_size_tuple()
|
||
|
|
test_tile_size_validation()
|
||
|
|
test_multi_tile_in_grid()
|
||
|
|
test_spatial_hash_multi_tile()
|
||
|
|
print("All #236 tests passed.")
|
||
|
|
sys.exit(0)
|