File size: 2,892 Bytes
06ca3b1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import pytest
import asyncio
import logging
from solver.dsl_parser import DSLParser
from solver.engine import GeometryEngine

logging.basicConfig(level=logging.DEBUG)

@pytest.mark.asyncio
async def test_section_internal():
    print("\n--- Test: Section Point (Internal AE=2/3 AC) ---")
    dsl = """
    POINT(A)
    POINT(B)
    POINT(C)
    LENGTH(AB, 6)
    LENGTH(BC, 6)
    ANGLE(B, 90)
    SECTION(E, A, C, 0.6667)
    """
    parser = DSLParser()
    engine = GeometryEngine()
    
    pts, constraints, is_3d = parser.parse(dsl)
    result = engine.solve(pts, constraints, is_3d)
    
    if result:
        coords = result['coordinates']
        print(f"  A: {coords['A']}")
        print(f"  C: {coords['C']}")
        print(f"  E: {coords['E']}")
        
        # Verify AE = 0.6667 * AC
        import math
        def dist(p1, p2): return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
        
        d_ac = dist(coords['A'], coords['C'])
        d_ae = dist(coords['A'], coords['E'])
        ratio = d_ae / d_ac
        print(f"  Calculated Ratio AE/AC: {ratio:.4f} (Expected: 0.6667)")
        assert abs(ratio - 0.6667) < 1e-4
    else:
        print("  ❌ Solve failed")

@pytest.mark.asyncio
async def test_section_external():
    print("\n--- Test: Section Point (External AE=2*AC) ---")
    dsl = """
    POINT(A)
    POINT(C)
    LENGTH(AC, 5)
    SECTION(E, A, C, 2.0)
    """
    parser = DSLParser()
    engine = GeometryEngine()
    
    pts, constraints, is_3d = parser.parse(dsl)
    result = engine.solve(pts, constraints, is_3d)
    
    if result:
        coords = result['coordinates']
        print(f"  A: {coords['A']}")
        print(f"  C: {coords['C']}")
        print(f"  E: {coords['E']}")
        
        import math
        def dist(p1, p2): return math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
        d_ac = dist(coords['A'], coords['C'])
        d_ae = dist(coords['A'], coords['E'])
        print(f"  AE: {d_ae}, AC: {d_ac}, Ratio: {d_ae/d_ac}")
        assert abs(d_ae/d_ac - 2.0) < 1e-4
    else:
        print("  ❌ Solve failed")

@pytest.mark.asyncio
async def test_line_ray_metadata():
    print("\n--- Test: Line and Ray Metadata ---")
    dsl = """
    POINT(A)
    POINT(B)
    LINE(A, B)
    RAY(A, B)
    """
    parser = DSLParser()
    engine = GeometryEngine()
    
    pts, constraints, is_3d = parser.parse(dsl)
    result = engine.solve(pts, constraints, is_3d)
    
    if result:
        print(f"  Lines: {result.get('lines')}")
        print(f"  Rays: {result.get('rays')}")
        assert ['A', 'B'] in result.get('lines', [])
        assert ['A', 'B'] in result.get('rays', [])
        print("  ✅ Metadata present")
    else:
        print("  ❌ Solve failed")

if __name__ == "__main__":
    asyncio.run(test_section_internal())
    asyncio.run(test_section_external())
    asyncio.run(test_line_ray_metadata())