3D / voxel unit tests
This commit is contained in:
parent
e12e80e511
commit
71cd2b9b41
22 changed files with 4705 additions and 0 deletions
189
tests/unit/voxel_rendering_test.py
Normal file
189
tests/unit/voxel_rendering_test.py
Normal file
|
|
@ -0,0 +1,189 @@
|
|||
#!/usr/bin/env python3
|
||||
"""Unit tests for VoxelGrid rendering integration (Milestone 10)
|
||||
|
||||
Tests:
|
||||
- Adding voxel layer to viewport
|
||||
- Removing voxel layer from viewport
|
||||
- Voxel layer count tracking
|
||||
- Screenshot verification (visual rendering)
|
||||
"""
|
||||
import sys
|
||||
|
||||
# Track test results
|
||||
passed = 0
|
||||
failed = 0
|
||||
|
||||
def test(name, condition, detail=""):
|
||||
"""Record test result"""
|
||||
global passed, failed
|
||||
if condition:
|
||||
print(f"[PASS] {name}")
|
||||
passed += 1
|
||||
else:
|
||||
print(f"[FAIL] {name}" + (f" - {detail}" if detail else ""))
|
||||
failed += 1
|
||||
|
||||
def test_add_to_viewport():
|
||||
"""Test adding a voxel layer to viewport"""
|
||||
import mcrfpy
|
||||
|
||||
# Create viewport
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
|
||||
# Create voxel grid
|
||||
vg = mcrfpy.VoxelGrid(size=(8, 8, 8))
|
||||
stone = vg.add_material("stone", color=mcrfpy.Color(128, 128, 128))
|
||||
vg.set(4, 4, 4, stone)
|
||||
|
||||
# Initial layer count
|
||||
test("Add to viewport: initial count is 0", viewport.voxel_layer_count() == 0)
|
||||
|
||||
# Add voxel layer
|
||||
viewport.add_voxel_layer(vg, z_index=1)
|
||||
|
||||
test("Add to viewport: count increases to 1", viewport.voxel_layer_count() == 1)
|
||||
|
||||
def test_add_multiple_layers():
|
||||
"""Test adding multiple voxel layers"""
|
||||
import mcrfpy
|
||||
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
|
||||
vg1 = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
vg2 = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
vg3 = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
|
||||
viewport.add_voxel_layer(vg1, z_index=0)
|
||||
viewport.add_voxel_layer(vg2, z_index=1)
|
||||
viewport.add_voxel_layer(vg3, z_index=2)
|
||||
|
||||
test("Multiple layers: count is 3", viewport.voxel_layer_count() == 3)
|
||||
|
||||
def test_remove_from_viewport():
|
||||
"""Test removing a voxel layer from viewport"""
|
||||
import mcrfpy
|
||||
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
|
||||
vg1 = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
vg2 = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
|
||||
viewport.add_voxel_layer(vg1, z_index=0)
|
||||
viewport.add_voxel_layer(vg2, z_index=1)
|
||||
|
||||
test("Remove: initial count is 2", viewport.voxel_layer_count() == 2)
|
||||
|
||||
# Remove one layer
|
||||
result = viewport.remove_voxel_layer(vg1)
|
||||
test("Remove: returns True for existing layer", result == True)
|
||||
test("Remove: count decreases to 1", viewport.voxel_layer_count() == 1)
|
||||
|
||||
# Remove same layer again should return False
|
||||
result = viewport.remove_voxel_layer(vg1)
|
||||
test("Remove: returns False for non-existing layer", result == False)
|
||||
test("Remove: count still 1", viewport.voxel_layer_count() == 1)
|
||||
|
||||
def test_remove_nonexistent():
|
||||
"""Test removing a layer that was never added"""
|
||||
import mcrfpy
|
||||
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
vg = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
|
||||
result = viewport.remove_voxel_layer(vg)
|
||||
test("Remove nonexistent: returns False", result == False)
|
||||
|
||||
def test_add_invalid_type():
|
||||
"""Test that adding non-VoxelGrid raises error"""
|
||||
import mcrfpy
|
||||
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
|
||||
error_raised = False
|
||||
try:
|
||||
viewport.add_voxel_layer("not a voxel grid")
|
||||
except TypeError:
|
||||
error_raised = True
|
||||
|
||||
test("Add invalid type: raises TypeError", error_raised)
|
||||
|
||||
def test_z_index_parameter():
|
||||
"""Test that z_index parameter is accepted"""
|
||||
import mcrfpy
|
||||
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
vg = mcrfpy.VoxelGrid(size=(4, 4, 4))
|
||||
|
||||
# Should not raise error
|
||||
error_raised = False
|
||||
try:
|
||||
viewport.add_voxel_layer(vg, z_index=5)
|
||||
except Exception as e:
|
||||
error_raised = True
|
||||
print(f" Error: {e}")
|
||||
|
||||
test("Z-index parameter: accepted without error", not error_raised)
|
||||
|
||||
def test_viewport_in_scene():
|
||||
"""Test viewport with voxel layer added to a scene"""
|
||||
import mcrfpy
|
||||
|
||||
# Create and activate a test scene
|
||||
scene = mcrfpy.Scene("voxel_test_scene")
|
||||
|
||||
# Create viewport
|
||||
viewport = mcrfpy.Viewport3D(pos=(0, 0), size=(320, 240))
|
||||
|
||||
# Create voxel grid with visible content
|
||||
vg = mcrfpy.VoxelGrid(size=(8, 8, 8))
|
||||
stone = vg.add_material("stone", color=mcrfpy.Color(128, 128, 128))
|
||||
vg.fill_box((2, 0, 2), (5, 3, 5), stone)
|
||||
vg.offset = (0, 0, 0)
|
||||
|
||||
# Add voxel layer to viewport
|
||||
viewport.add_voxel_layer(vg, z_index=0)
|
||||
|
||||
# Position camera to see the voxels
|
||||
viewport.camera_pos = (10, 10, 10)
|
||||
viewport.camera_target = (4, 2, 4)
|
||||
|
||||
# Add viewport to scene
|
||||
scene.children.append(viewport)
|
||||
|
||||
# Trigger mesh generation
|
||||
vg.rebuild_mesh()
|
||||
|
||||
test("Viewport in scene: voxel layer added", viewport.voxel_layer_count() == 1)
|
||||
test("Viewport in scene: voxels have content", vg.count_non_air() > 0)
|
||||
test("Viewport in scene: mesh generated", vg.vertex_count > 0)
|
||||
|
||||
def main():
|
||||
"""Run all rendering integration tests"""
|
||||
print("=" * 60)
|
||||
print("VoxelGrid Rendering Integration Tests (Milestone 10)")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
test_add_to_viewport()
|
||||
print()
|
||||
test_add_multiple_layers()
|
||||
print()
|
||||
test_remove_from_viewport()
|
||||
print()
|
||||
test_remove_nonexistent()
|
||||
print()
|
||||
test_add_invalid_type()
|
||||
print()
|
||||
test_z_index_parameter()
|
||||
print()
|
||||
test_viewport_in_scene()
|
||||
print()
|
||||
|
||||
print("=" * 60)
|
||||
print(f"Results: {passed} passed, {failed} failed")
|
||||
print("=" * 60)
|
||||
|
||||
return 0 if failed == 0 else 1
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Loading…
Add table
Add a link
Reference in a new issue