
    ni                         S r SSKrSSKrSSKr " S S5      r " S S5      r " S S5      r " S	 S
5      r	 " S S5      r
g)z
Unit tests for pyreason input validation and edge cases.
Tests parameter validation, boundary conditions, and error handling across all API functions.
    Nc                   $    \ rS rSrSrS rS rSrg)TestParameterValidation   z8Test parameter validation across all pyreason functions.c                 X    [         R                  " 5         [         R                  " 5         gzClean state before each test.Nprresetreset_settingsselfs    b/home/james-whalen/.local/lib/python3.13/site-packages/tests/api_tests/test_pyreason_validation.pysetup_method$TestParameterValidation.setup_method        	

    c                     [         R                  " SS5      nUc   e[        R                  " [        [
        [        45         [         R                  " S5        SSS5        g! , (       d  f       g= f)z&Test Rule object parameter validation.test(x) <- fact(x)	test_ruleN)r	   Rulepytestraises	TypeError
ValueErrorAttributeError)r   rules     r   test_rule_parameter_validation6TestParameterValidation.test_rule_parameter_validation   sN     ww+[9 ]]Iz>BCGGDM DCCs   A""
A0 N)__name__
__module____qualname____firstlineno____doc__r   r   __static_attributes__r   r   r   r   r      s    Br   r   c                   $    \ rS rSrSrS rS rSrg)TestTypeValidation   z*Test type validation across all functions.c                 X    [         R                  " 5         [         R                  " 5         gr   r   r   s    r   r   TestTypeValidation.setup_method!   s    


r   c                    [         R                  " [        [        45         [        R
                  " S5        SSS5        [         R                  " [        [        45         [        R
                  " S5        SSS5        [         R                  " [        [        45         [        R                  " S5        SSS5        [         R                  " [        [        45         [        R                  " S5        SSS5        g! , (       d  f       N= f! , (       d  f       N= f! , (       d  f       Np= f! , (       d  f       g= f)z1Test passing wrong object types to add functions.string_instead_of_ruleN{   string_instead_of_fact)r   r   r   r   r	   add_ruleadd_factr   s    r   *test_wrong_object_types_for_add_operations=TestTypeValidation.test_wrong_object_types_for_add_operations&   s     ]]I~67KK01 8 ]]I~67KK 8 ]]I~67KK01 8 ]]I~67KK 87 87 87 87 87s/   C> DD D1>
D
D 
D.1
D?r   N)r    r!   r"   r#   r$   r   r1   r%   r   r   r   r'   r'      s    4
r   r'   c                   $    \ rS rSrSrS rS rSrg)TestStateValidation7   z2Test validation of system state before operations.c                 X    [         R                  " 5         [         R                  " 5         gr   r   r   s    r   r    TestStateValidation.setup_method:   r   r   c                    [         R                  " S5      n[         R                  " S5      n[         R                  " U5        [         R                  " U5        [         R
                  " 5         [         R                  " S5      n[         R                  " S5      n[         R                  " U5        [         R                  " U5        g)z0Test that operations work correctly after reset.r   fact(node1)znew_test(x) <- new_fact(x)znew_fact(node1)N)r	   r   Factr/   r0   r
   )r   r   factnew_rulenew_facts        r   &test_operations_after_reset_validation:TestStateValidation.test_operations_after_reset_validation@   s|     ww+,ww}%
D
D 	
 777877,-
H
Hr   r   N)r    r!   r"   r#   r$   r   r>   r%   r   r   r   r4   r4   7   s    <r   r4   c                   $    \ rS rSrSrS rS rSrg)TestConcurrentModificationR   z6Test behavior under concurrent modification scenarios.c                 X    [         R                  " 5         [         R                  " 5         gr   r   r   s    r   r   'TestConcurrentModification.setup_methodU   r   r   c                 l   [         R                  " 5       nUR                  SS5        [        R                  " U5        S[        R
                  l        S[        R
                  l        [        R
                  R                  S:X  d   e[        R
                  R                  S:X  d   e[        R                  " S5      n[        R                  " U5        S[        U5      ;   d  [        UR                  S5      (       d   eS[        R
                  l        [        R
                  R                  S:X  d   eg)z0Test modifying settings during other operations.ABTFr   get_rule_nameN)nxDiGraphadd_edger	   
load_graphsettingsverbosememory_profiler   r/   strhasattrr   graph_attribute_parsing)r   graphr   s      r   )test_modifying_settings_during_operationsDTestConcurrentModification.test_modifying_settings_during_operations\   s     

sC 
e #%*"{{""d***{{))U222 ww+,
D $s4y0GDII4W4WWW /4+{{22e;;;r   r   N)r    r!   r"   r#   r$   r   rT   r%   r   r   r   rA   rA   R   s    @<r   rA   c                   0    \ rS rSrSrS rS rS rS rSr	g)	TestErrorRecoveryw   z3Test system recovery from various error conditions.c                 X    [         R                  " 5         [         R                  " 5         gr   r   r   s    r   r   TestErrorRecovery.setup_methodz   r   r   c                 &    [         R                  " S5         [         R                  " S5        [         R                  " S5      n[         R
                  " S5      n[        R                  " 5       nUR                  SS5        [         R                  " U5        [         R                  " U5        [         R                  " U5        [        UR                  S5      (       d   eS[        U5      ;   d   eg! [         a     Nf = f! [         a     Nf = f)z3Test that system recovers after invalid operations.Ninvalidr   r9   rF   rG   rH   )r	   r/   	ExceptionrL   r   r:   rI   rJ   rK   r0   rQ   r   rP   )r   
valid_rule
valid_factvalid_graphs       r   &test_recovery_after_invalid_operations8TestErrorRecovery.test_recovery_after_invalid_operations   s    	KK	MM)$
 WW12
WW]+
jjlS#& 	J
J
k" z8888J///+  		
  		s"   C3 D 3
D ?D 
DDc                 0   [         R                  " S5      n[         R                  " U5        [        UR                  S5      (       d   e [         R
                  " S5        [         R                  " S5      n[         R                  " U5        S[        U5      ;   d   e[        R                  " 5       nUR                  SS5        [         R                  " U5        UR                  5       S:X  d   eUR                  5       S:X  d   eg	! [         a     Nf = f)
z$Test recovery from partial failures.r   rH   znonexistent.graphmlr9   rF   rG         N)r	   r   r/   rQ   r   load_graphmlr]   r:   r0   rP   rI   rJ   rK   rL   number_of_nodesnumber_of_edges)r   r   r;   rS   s       r   test_partial_failure_recovery/TestErrorRecovery.test_partial_failure_recovery   s     ww+,
D tyy/2222	OO12
 ww}%
D D	)))

sC 
e $$&!+++$$&!+++!  		s   D 
DDc                    [         R                  " S5      n[         R                  " S5      n[         R                  " U5        [         R                  " U5        [        UR                  S5      (       d   eS[        U5      ;   d   e [         R                  " S5         [         R                  " S5        [         R                  " 5         [         R                  " 5         [         R                  " S5      n[         R                  " U5        [        UR                  S5      (       d   eg! [         a     Nf = f! [         a     Nf = f)z+Test that reset works after various errors.zinitial(x) <- start(x)zstart(node1)rH   Nr-   r   )r	   r   r:   r/   r0   rQ   r   rP   r]   rL   r
   r   )r   r^   r_   r   s       r   test_reset_after_errors)TestErrorRecovery.test_reset_after_errors   s     WW56
WW^,

J
J z8888Z000	KK	MM#
 	

 ww+,
D tyy/2222#  		
  		s$   D) D9 )
D65D69
EEr   N)
r    r!   r"   r#   r$   r   ra   ri   rl   r%   r   r   r   rW   rW   w   s    =08,< 3r   rW   )r$   r   networkxrI   pyreasonr	   r   r'   r4   rA   rW   r   r   r   <module>rp      sJ   
    & 2 6#< #<Jc3 c3r   