from app.services.numeric_validator import ( run_numeric_checks_for_demo_answer, validate_derivative, ) def test_validate_derivative_success_sets_sympy_cas_fields() -> None: item = validate_derivative("x**2", "2*x") assert item.is_valid is True assert item.sympy_status == "ok" assert item.sympy_result == "2*x" assert item.wolfram_status == "not_run" assert item.wolfram_result is None assert item.cas_status == "SYMPY_ONLY" assert item.preferred_engine == "sympy" assert item.confidence_impact == "neutral" assert item.human_review_reason is None def test_validate_derivative_failure_sets_review_reason() -> None: item = validate_derivative("x**2", "x") assert item.is_valid is False assert item.sympy_status == "ok" assert item.sympy_result == "2*x" assert item.wolfram_status == "not_run" assert item.cas_status == "SYMPY_ONLY" assert item.preferred_engine == "sympy" assert item.confidence_impact == "decrease" assert item.human_review_reason == "sympy_contradicts_expected_derivative" def test_validate_derivative_unusable_expression_sets_no_cas_validation() -> None: item = validate_derivative("sin(", "2*x") assert item.is_valid is False assert item.sympy_status == "failed" assert item.sympy_result is None assert item.wolfram_status == "not_run" assert item.cas_status == "NO_CAS_VALIDATION" assert item.preferred_engine == "none" assert item.confidence_impact == "decrease" assert item.human_review_reason == "sympy_unusable_expression" def test_demo_numeric_checks_keep_report_consistent() -> None: report = run_numeric_checks_for_demo_answer("On trouve f'(x)=2x.") assert len(report.checks) == 1 assert report.checks[0].is_valid is True assert report.checks[0].cas_status == "SYMPY_ONLY" assert report.contradicted_by_numeric_check is False assert report.needs_human_review is False