File size: 3,378 Bytes
9d29c62
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# test_v4_2_16.py - REGRESSION TEST FOR ALGEBRA & INTENT GATING
import asyncio
from orchestrator import orchestrator, PipelineContext

async def run_tests():
    print("🚀 starting BuddyMath V4.2.16 Regression Test Matrix...\n")

    test_cases = [
        {
            "id": "CASE_1_SMADAR_ALGEBRA",
            "name": "סמדר והמחברות (כיתה ז')",
            "grade": "ז'",
            "category": "ALGEBRA",
            "math_input": "4x + 5y = 120, y = x + 6",
            "text": "סמדר קנתה מחברות חשבון ב-4 שקלים וחלקות ב-5 שקלים. כמה קנתה?",
            "expected_operator": "LINEAR_SYSTEM"
        },
        {
            "id": "CASE_2_Y12_ALGEBRA_NO_INTENT",
            "name": "יב' אלגברה - ללא כוונת חקירה",
            "grade": "יב'",
            "category": "INVESTIGATION", # קטגוריה מוטעית בכוונה
            "math_input": "y = 4x + 3",
            "text": "מצא את נקודת החיתוך של הישר עם הצירים.",
            "expected_operator": "ALGEBRA_GENERAL" # אמור להיחסם כי אין מילת 'חקור'
        },
        {
            "id": "CASE_3_Y12_INVESTIGATION_FULL",
            "name": "יב' חקירה - עם כוונת חקירה",
            "grade": "יב'",
            "category": "INVESTIGATION",
            "math_input": "y = x^2 - 4",
            "text": "חקור את הפונקציה ומצא נקודות קיצון.",
            "expected_operator": "DERIVATIVE" # אמור לעבור כי יש 'חקור' ו'קיצון'
        }
    ]

    for tc in test_cases:
        print(f"--- Testing: {tc['name']} ---")
        
        # 1. יצירת קונטקסט בדיקה
        context = PipelineContext(
            grade=tc["grade"],
            grade_num=12 if "יב" in tc["grade"] else 7,
            topic=tc["category"],
            math_input=tc["math_input"],
            confidence=1.0,
            original_text=tc["text"],
            category=tc["category"]
        )

        # 2. הרצת הסולבר ישירות (בדיקת מנוע המתמטיקה)
        result = orchestrator.smart_solver.solve(context)
        print(f"   [SOLVER] Operator Used: {result.operator_used}")
        print(f"   [SOLVER] Success: {result.success}")
        
        # 3. בדיקת ה-Validator (בדיקת חסימת זליגות)
        # נדמה פלט של LLM שמנסה להזליג נגזרת באלגברה
        mock_resp = {
            "sections": [{
                "steps": [{"explanation_text": "נחשב את הנגזרת של הפונקציה כדי למצוא פתרון."}]
            }],
            "logic_error": False
        }
        
        from orchestrator import validate_and_sanitize_response
        validated = validate_and_sanitize_response(mock_resp, category=tc["category"])
        
        if tc["category"] != "INVESTIGATION":
             print(f"   [VALIDATOR] Logic Error Detected (Expected): {validated['logic_error']}")
        
        # Verification
        if result.operator_used == tc["expected_operator"]:
            print(f"✅ PASSED: {tc['id']}\n")
        else:
            print(f"❌ FAILED: {tc['id']} - Expected {tc['expected_operator']} but got {result.operator_used}\n")

if __name__ == "__main__":
    asyncio.run(run_tests())