173 lines
4.5 KiB
Python
173 lines
4.5 KiB
Python
|
|
#!/usr/bin/env python3
|
||
|
|
"""Unit tests for DiscreteMap basic operations."""
|
||
|
|
|
||
|
|
import mcrfpy
|
||
|
|
import sys
|
||
|
|
|
||
|
|
def test_construction():
|
||
|
|
"""Test basic construction."""
|
||
|
|
# Default construction
|
||
|
|
dmap = mcrfpy.DiscreteMap((100, 100))
|
||
|
|
assert dmap.size == (100, 100), f"Expected (100, 100), got {dmap.size}"
|
||
|
|
|
||
|
|
# With fill value
|
||
|
|
dmap2 = mcrfpy.DiscreteMap((50, 50), fill=42)
|
||
|
|
assert dmap2[0, 0] == 42, f"Expected 42, got {dmap2[0, 0]}"
|
||
|
|
assert dmap2[25, 25] == 42, f"Expected 42, got {dmap2[25, 25]}"
|
||
|
|
|
||
|
|
print(" [PASS] Construction")
|
||
|
|
|
||
|
|
def test_size_property():
|
||
|
|
"""Test size property."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((123, 456))
|
||
|
|
w, h = dmap.size
|
||
|
|
assert w == 123, f"Expected width 123, got {w}"
|
||
|
|
assert h == 456, f"Expected height 456, got {h}"
|
||
|
|
print(" [PASS] Size property")
|
||
|
|
|
||
|
|
def test_get_set():
|
||
|
|
"""Test get/set methods."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((10, 10))
|
||
|
|
|
||
|
|
# Test set/get
|
||
|
|
dmap.set(5, 5, 100)
|
||
|
|
assert dmap.get(5, 5) == 100, f"Expected 100, got {dmap.get(5, 5)}"
|
||
|
|
|
||
|
|
# Test subscript
|
||
|
|
dmap[3, 7] = 200
|
||
|
|
assert dmap[3, 7] == 200, f"Expected 200, got {dmap[3, 7]}"
|
||
|
|
|
||
|
|
# Test tuple subscript
|
||
|
|
dmap[(1, 2)] = 150
|
||
|
|
assert dmap[(1, 2)] == 150, f"Expected 150, got {dmap[(1, 2)]}"
|
||
|
|
|
||
|
|
print(" [PASS] Get/set methods")
|
||
|
|
|
||
|
|
def test_bounds_checking():
|
||
|
|
"""Test that out-of-bounds access raises IndexError."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((10, 10))
|
||
|
|
|
||
|
|
# Test out of bounds get
|
||
|
|
try:
|
||
|
|
_ = dmap[10, 10]
|
||
|
|
print(" [FAIL] Should have raised IndexError for (10, 10)")
|
||
|
|
return False
|
||
|
|
except IndexError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
try:
|
||
|
|
_ = dmap[-1, 0]
|
||
|
|
print(" [FAIL] Should have raised IndexError for (-1, 0)")
|
||
|
|
return False
|
||
|
|
except IndexError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
# Test out of bounds set
|
||
|
|
try:
|
||
|
|
dmap[100, 100] = 5
|
||
|
|
print(" [FAIL] Should have raised IndexError for set")
|
||
|
|
return False
|
||
|
|
except IndexError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
print(" [PASS] Bounds checking")
|
||
|
|
return True
|
||
|
|
|
||
|
|
def test_value_range():
|
||
|
|
"""Test that values are clamped to 0-255."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((10, 10))
|
||
|
|
|
||
|
|
# Test valid range
|
||
|
|
dmap[0, 0] = 0
|
||
|
|
dmap[0, 1] = 255
|
||
|
|
assert dmap[0, 0] == 0
|
||
|
|
assert dmap[0, 1] == 255
|
||
|
|
|
||
|
|
# Test invalid values
|
||
|
|
try:
|
||
|
|
dmap[0, 0] = -1
|
||
|
|
print(" [FAIL] Should have raised ValueError for -1")
|
||
|
|
return False
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
try:
|
||
|
|
dmap[0, 0] = 256
|
||
|
|
print(" [FAIL] Should have raised ValueError for 256")
|
||
|
|
return False
|
||
|
|
except ValueError:
|
||
|
|
pass
|
||
|
|
|
||
|
|
print(" [PASS] Value range")
|
||
|
|
return True
|
||
|
|
|
||
|
|
def test_fill():
|
||
|
|
"""Test fill operation."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((10, 10))
|
||
|
|
|
||
|
|
# Fill entire map
|
||
|
|
dmap.fill(77)
|
||
|
|
for y in range(10):
|
||
|
|
for x in range(10):
|
||
|
|
assert dmap[x, y] == 77, f"Expected 77 at ({x}, {y}), got {dmap[x, y]}"
|
||
|
|
|
||
|
|
# Fill region
|
||
|
|
dmap.fill(88, pos=(2, 2), size=(3, 3))
|
||
|
|
assert dmap[2, 2] == 88, "Region fill failed at start"
|
||
|
|
assert dmap[4, 4] == 88, "Region fill failed at end"
|
||
|
|
assert dmap[1, 1] == 77, "Region fill affected outside area"
|
||
|
|
assert dmap[5, 5] == 77, "Region fill affected outside area"
|
||
|
|
|
||
|
|
print(" [PASS] Fill operation")
|
||
|
|
|
||
|
|
def test_clear():
|
||
|
|
"""Test clear operation."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((10, 10), fill=100)
|
||
|
|
dmap.clear()
|
||
|
|
|
||
|
|
for y in range(10):
|
||
|
|
for x in range(10):
|
||
|
|
assert dmap[x, y] == 0, f"Expected 0 at ({x}, {y}), got {dmap[x, y]}"
|
||
|
|
|
||
|
|
print(" [PASS] Clear operation")
|
||
|
|
|
||
|
|
def test_repr():
|
||
|
|
"""Test repr output."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((100, 50))
|
||
|
|
r = repr(dmap)
|
||
|
|
assert "DiscreteMap" in r, f"Expected 'DiscreteMap' in repr, got {r}"
|
||
|
|
assert "100" in r, f"Expected '100' in repr, got {r}"
|
||
|
|
assert "50" in r, f"Expected '50' in repr, got {r}"
|
||
|
|
print(" [PASS] Repr")
|
||
|
|
|
||
|
|
def test_chaining():
|
||
|
|
"""Test method chaining."""
|
||
|
|
dmap = mcrfpy.DiscreteMap((10, 10))
|
||
|
|
|
||
|
|
# Methods should return self
|
||
|
|
result = dmap.fill(50).clear().fill(100)
|
||
|
|
assert result is dmap, "Method chaining should return self"
|
||
|
|
assert dmap[5, 5] == 100, "Chained operations should work"
|
||
|
|
|
||
|
|
print(" [PASS] Method chaining")
|
||
|
|
|
||
|
|
def main():
|
||
|
|
print("Running DiscreteMap basic tests...")
|
||
|
|
|
||
|
|
test_construction()
|
||
|
|
test_size_property()
|
||
|
|
test_get_set()
|
||
|
|
if not test_bounds_checking():
|
||
|
|
sys.exit(1)
|
||
|
|
if not test_value_range():
|
||
|
|
sys.exit(1)
|
||
|
|
test_fill()
|
||
|
|
test_clear()
|
||
|
|
test_repr()
|
||
|
|
test_chaining()
|
||
|
|
|
||
|
|
print("All DiscreteMap basic tests PASSED!")
|
||
|
|
sys.exit(0)
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
main()
|