Spaces:
Sleeping
Sleeping
| 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() | |