import time import pytest from server.executor import execute_cadquery_code class TestExecuteValidCode: def test_flat_plate_executes(self, flat_plate_code): result = execute_cadquery_code(flat_plate_code, timeout=15.0) assert result["success"] is True assert result["error"] is None assert result["properties"] is not None def test_flat_plate_properties(self, flat_plate_code): result = execute_cadquery_code(flat_plate_code, timeout=15.0) props = result["properties"] assert props["is_valid"] is True assert props["volume_mm3"] > 0 assert abs(props["volume_mm3"] - 16000.0) < 1.0 assert props["face_count"] == 6 assert props["dominant_face_type"] == "PLANE" def test_flat_plate_bbox(self, flat_plate_code): result = execute_cadquery_code(flat_plate_code, timeout=15.0) props = result["properties"] assert abs(props["bbox_x_mm"] - 80.0) < 0.01 assert abs(props["bbox_y_mm"] - 40.0) < 0.01 assert abs(props["bbox_z_mm"] - 5.0) < 0.01 def test_box_with_hole_executes(self, box_with_hole_code): result = execute_cadquery_code(box_with_hole_code, timeout=15.0) assert result["success"] is True props = result["properties"] assert props["is_valid"] is True assert props["volume_mm3"] > 0 assert props["face_count"] > 6 def test_box_with_hole_has_cylinder_face(self, box_with_hole_code): result = execute_cadquery_code(box_with_hole_code, timeout=15.0) props = result["properties"] assert "CYLINDER" in props["face_type_counts"] def test_euler_characteristic(self, flat_plate_code): result = execute_cadquery_code(flat_plate_code, timeout=15.0) props = result["properties"] assert props["euler_characteristic"] == 2 def test_box_with_hole_euler(self, box_with_hole_code): result = execute_cadquery_code(box_with_hole_code, timeout=15.0) props = result["properties"] assert props["euler_characteristic"] == 2 class TestExecuteInvalidCode: def test_syntax_error(self, invalid_code): result = execute_cadquery_code(invalid_code, timeout=15.0) assert result["success"] is False assert result["error"] is not None def test_no_result_variable(self, no_result_code): result = execute_cadquery_code(no_result_code, timeout=15.0) assert result["success"] is False assert "result" in result["error"].lower() def test_empty_code(self): result = execute_cadquery_code("", timeout=15.0) assert result["success"] is False def test_runtime_error(self): code = "import cadquery as cq\nresult = cq.Workplane('XY').box(0, 0, 0)" result = execute_cadquery_code(code, timeout=15.0) if result["success"]: assert result["properties"]["volume_mm3"] == 0 class TestExecuteTimeout: def test_timeout_returns_error(self, timeout_code): result = execute_cadquery_code(timeout_code, timeout=2.0) assert result["success"] is False assert "timed out" in result["error"].lower() or "timeout" in result["error"].lower()