File size: 3,218 Bytes
7c72eb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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()