
    ni                         S r SSKrSSKrSSKrSSKrSSKrSSKr	SSK
Jr   " S S5      r " S S5      r " S S	5      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 file loading operations and graph management.
Tests load_graphml, load_graph, load_inconsistent_predicate_list functions.
    NRulec                   ~    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rSrg)TestLoadGraphML   zTest load_graphml() function.c                 X    [         R                  " 5         [         R                  " 5         gzClean state before each test.Nprresetreset_settingsselfs    d/home/james-whalen/.local/lib/python3.13/site-packages/tests/api_tests/test_pyreason_file_loading.pysetup_methodTestLoadGraphML.setup_method        	

    c                     [         R                  " [        [        45         [        R
                  " S5        SSS5        g! , (       d  f       g= f)z*Test load_graphml() with nonexistent file.znonexistent_file.graphmlNpytestraisesFileNotFoundErrorOSErrorr   load_graphmlr   s    r   "test_load_graphml_nonexistent_file2TestLoadGraphML.test_load_graphml_nonexistent_file   s/     ]]-w78OO67 988   A
Ac                     [         R                  " [        [        45         [        R
                  " S5        SSS5        g! , (       d  f       g= f)z$Test load_graphml() with empty path. Nr   r   s    r   !test_load_graphml_with_empty_path1TestLoadGraphML.test_load_graphml_with_empty_path   s,    ]]-w78OOB 988r   c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z#Test loading a simple GraphML file.<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="directed">
    <node id="A"/>
    <node id="B"/>
    <edge source="A" target="B"/>
  </graph>
</graphml>w.graphmlFmodesuffixdeleteNtempfileNamedTemporaryFilewritenamer   r   osunlinkr   graphml_contenttmptmp_paths       r   test_load_graphml_simple_graph.TestLoadGraphML.test_load_graphml_simple_graph#   sq     ((c*USWZIIo&xxH T	 OOH%IIh TS IIh   A- A> -
A;>Bc                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z*Test loading GraphML with node attributes.a  <?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <key id="name" for="node" attr.name="name" attr.type="string"/>
  <key id="age" for="node" attr.name="age" attr.type="int"/>
  <graph id="G" edgedefault="directed">
    <node id="A">
      <data key="name">Alice</data>
      <data key="age">25</data>
    </node>
    <node id="B">
      <data key="name">Bob</data>
      <data key="age">30</data>
    </node>
    <edge source="A" target="B"/>
  </graph>
</graphml>r%   r&   Fr'   Nr+   r2   s       r   &test_load_graphml_with_node_attributes6TestLoadGraphML.test_load_graphml_with_node_attributes7   sq    " ((c*USWZIIo&xxH T	 OOH%IIh TS IIhr8   c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z*Test loading GraphML with edge attributes.a  <?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <key id="weight" for="edge" attr.name="weight" attr.type="double"/>
  <key id="relation" for="edge" attr.name="relation" attr.type="string"/>
  <graph id="G" edgedefault="directed">
    <node id="A"/>
    <node id="B"/>
    <edge source="A" target="B">
      <data key="weight">0.8</data>
      <data key="relation">knows</data>
    </edge>
  </graph>
</graphml>r%   r&   Fr'   Nr+   r2   s       r   &test_load_graphml_with_edge_attributes6TestLoadGraphML.test_load_graphml_with_edge_attributesS   q     ((c*USWZIIo&xxH T	 OOH%IIh TS IIhr8   c                 \   S[         R                  l        Sn[        R                  " SSSS9 nUR                  U5        UR                  nSSS5         [         R                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z4Test loading GraphML with attribute parsing enabled.T  <?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <key id="person" for="node" attr.name="person" attr.type="boolean"/>
  <graph id="G" edgedefault="directed">
    <node id="A">
      <data key="person">true</data>
    </node>
    <node id="B">
      <data key="person">true</data>
    </node>
    <edge source="A" target="B"/>
  </graph>
</graphml>r%   r&   Fr'   N
r   settingsgraph_attribute_parsingr,   r-   r.   r/   r   r0   r1   r2   s       r   0test_load_graphml_with_attribute_parsing_enabled@TestLoadGraphML.test_load_graphml_with_attribute_parsing_enabledl   s}    .2+ ((c*USWZIIo&xxH T	 OOH%IIh TS IIh   BB 
BB+c                 \   S[         R                  l        Sn[        R                  " SSSS9 nUR                  U5        UR                  nSSS5         [         R                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z5Test loading GraphML with attribute parsing disabled.FrA   r%   r&   r'   NrB   r2   s       r   1test_load_graphml_with_attribute_parsing_disabledATestLoadGraphML.test_load_graphml_with_attribute_parsing_disabled   s}    .3+ ((c*USWZIIo&xxH T	 OOH%IIh TS IIhrG   c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z$Test loading an empty GraphML graph.z<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="directed">
  </graph>
</graphml>r%   r&   Fr'   Nr+   r2   s       r   test_load_graphml_empty_graph-TestLoadGraphML.test_load_graphml_empty_graph   sq     ((c*USWZIIo&xxH T	 OOH%IIh TS IIhr8   c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z%Test loading GraphML with self-loops.a  <?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="directed">
    <node id="A"/>
    <node id="B"/>
    <edge source="A" target="A"/>
    <edge source="A" target="B"/>
  </graph>
</graphml>r%   r&   Fr'   Nr+   r2   s       r   !test_load_graphml_with_self_loops1TestLoadGraphML.test_load_graphml_with_self_loops   sq     ((c*USWZIIo&xxH T	 OOH%IIh TS IIhr8   c                 R   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " W5        g! , (       d  f       N<= f! [         a     N4f = f! [        R                  " W5        f = f)z)Test loading an undirected GraphML graph.z<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="undirected">
    <node id="A"/>
    <node id="B"/>
    <edge source="A" target="B"/>
  </graph>
</graphml>r%   r&   Fr'   N)	r,   r-   r.   r/   r   r   	Exceptionr0   r1   r2   s       r   "test_load_graphml_undirected_graph2TestLoadGraphML.test_load_graphml_undirected_graph   s     ((c*USWZIIo&xxH T	 OOH%
 IIh TS  		 IIhs/   A- A> -
A;>
BB 
BB B&c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z=Test loading GraphML with multiple graphs (should use first).aa  <?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G1" edgedefault="directed">
    <node id="A"/>
    <node id="B"/>
    <edge source="A" target="B"/>
  </graph>
  <graph id="G2" edgedefault="directed">
    <node id="X"/>
    <node id="Y"/>
    <edge source="X" target="Y"/>
  </graph>
</graphml>r%   r&   Fr'   Nr+   r2   s       r   !test_load_graphml_multiple_graphs1TestLoadGraphML.test_load_graphml_multiple_graphs   r?   r8   c                    S[         R                  l        Sn[        R                  " SSSS9 nUR                  U5        UR                  nSSS5         [         R                  " W5        [        R                  " U5        S[         R                  l        g! , (       d  f       NQ= f! [        R                  " W5        S[         R                  l        f = f)z:Test loading GraphML with reverse_digraph setting enabled.Tr$   r%   r&   Fr'   N
r   rC   reverse_digraphr,   r-   r.   r/   r   r0   r1   r2   s       r   .test_load_graphml_with_reverse_digraph_enabled>TestLoadGraphML.test_load_graphml_with_reverse_digraph_enabled   s    &*# ((c*USWZIIo&xxH T	0OOH%IIh*/BKK' TS IIh*/BKK's   BB( 
B%(-Cc                 \   S[         R                  l        Sn[        R                  " SSSS9 nUR                  U5        UR                  nSSS5         [         R                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z;Test loading GraphML with reverse_digraph setting disabled.Fr$   r%   r&   r'   NrY   r2   s       r   /test_load_graphml_with_reverse_digraph_disabled?TestLoadGraphML.test_load_graphml_with_reverse_digraph_disabled  s}    &+# ((c*USWZIIo&xxH T	 OOH%IIh TS IIhrG   c                 T   SnSn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5        [         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R
                  " W5        [        R                  " U5        [        R                  " U5        g! , (       d  f       N= f! , (       d  f       Ny= f! [        R                  " W5        [        R                  " W5        f = f)z>Test that loading a new GraphML overwrites the previous graph.r$   z<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="directed">
    <node id="X"/>
    <node id="Y"/>
    <edge source="X" target="Y"/>
  </graph>
</graphml>r%   r&   Fr'   Nr+   )r   graphml_content1graphml_content2tmp1	tmp1_pathtmp2	tmp2_paths          r   +test_load_graphml_overwrites_previous_graph;TestLoadGraphML.test_load_graphml_overwrites_previous_graph%  s     ((c*USW[JJ'(		I T ((c*USW[JJ'(		I T	!OOI&OOI&IIi IIi  TS TS IIi IIi #   CC(>,C9 
C%(
C69.D'c                    Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " [        5         [        R                  " W5        SSS5        [        R                  " W5        g! , (       d  f       N_= f! , (       d  f       N6= f! [        R                  " W5        f = f)z&Test loading invalid XML GraphML file.z<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="directed">
    <node id="A"/>
    <node id="B"
    <edge source="A" target="B"/>
  </graph>
</graphml>r%   r&   Fr'   N)r,   r-   r.   r/   r   r   rR   r   r   r0   r1   )r   invalid_graphmlr4   r5   s       r   test_load_graphml_invalid_xml-TestLoadGraphML.test_load_graphml_invalid_xmlH  s     ((c*USWZIIo&xxH T	 y)) * IIh TS
 *) IIh/   B B2 B!1B2 
B!
B/+B2 2C
c                     [         R                  " [        [        45         [        R
                  " S5        SSS5        g! , (       d  f       g= f)z+Test load_graphml() with invalid path type.{   N)r   r   	TypeErrorr   r   r   r   s    r   (test_load_graphml_with_invalid_path_type8TestLoadGraphML.test_load_graphml_with_invalid_path_type]  s+    ]]Iw/0OOC  100r    N)__name__
__module____qualname____firstlineno____doc__r   r   r!   r6   r:   r=   rE   rI   rL   rO   rS   rV   r[   r^   rg   rl   rr   __static_attributes__rt   r   r   r   r      s[    '8 
 ( 8 2 6 6 " * . 20. ,!!F *!r   r   c                   `    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)TestLoadGraphic  zTest load_graph() function.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   TestLoadGraph.setup_methodf      


r   c                     [         R                  " 5       nUR                  SS5        UR                  SS5        [        R                  " U5        g)zTest loading a simple DiGraph.ABCNnxDiGraphadd_edger   
load_graphr   graphs     r   test_load_graph_simple_digraph,TestLoadGraph.test_load_graph_simple_digraphk  s7    

sC sC  	er   c                 Z    [         R                  " 5       n[        R                  " U5        g)zTest loading an empty DiGraph.N)r   r   r   r   r   s     r   test_load_graph_empty_digraph+TestLoadGraph.test_load_graph_empty_digrapht  s    


er   c                     [         R                  " 5       nUR                  SSSS9  UR                  SSSS9  UR                  SS5        [        R
                  " U5        g)z*Test loading a graph with node attributes.r   person   )labelager      Nr   r   add_noder   r   r   r   s     r   $test_load_graph_with_node_attributes2TestLoadGraph.test_load_graph_with_node_attributesz  sK    

s(3s(3sC 
er   c                     [         R                  " 5       nUR                  SSSSS9  UR                  SSSSS9  [        R                  " U5        g	)
z*Test loading a graph with edge attributes.r   r   knows皙?)relationweightr   likesg333333?Nr   r   s     r   $test_load_graph_with_edge_attributes2TestLoadGraph.test_load_graph_with_edge_attributes  sA    

sC'#>sC'#>
er   c                     S[         R                  l        [        R                  " 5       nUR                  SSS9  UR                  SSSS9  [         R                  " U5        g)	z2Test loading graph with attribute parsing enabled.Tr   r   r   r   r   r   Nr   rC   rD   r   r   r   r   r   r   s     r   .test_load_graph_with_attribute_parsing_enabled<TestLoadGraph.test_load_graph_with_attribute_parsing_enabled  sG    .2+

s(+sC'2
er   c                     S[         R                  l        [        R                  " 5       nUR                  SSS9  UR                  SSSS9  [         R                  " U5        g)	z3Test loading graph with attribute parsing disabled.Fr   r   r   r   r   r   Nr   r   s     r   /test_load_graph_with_attribute_parsing_disabled=TestLoadGraph.test_load_graph_with_attribute_parsing_disabled  sG    .3+

s(+sC'2
er   c                     [         R                  " 5       nUR                  SS5        UR                  SS5        [        R                  " U5        g)z#Test loading graph with self-loops.r   r   Nr   r   s     r   test_load_graph_with_self_loops-TestLoadGraph.test_load_graph_with_self_loops  s5    

sC sC 
er   c                     [         R                  " 5       nUR                  SS5        UR                  SS5        UR                  SS5        UR                  SS5        [        R                  " U5        g)z9Test loading graph with multiple disconnected components.r   r   r   XYZNr   r   s     r   (test_load_graph_with_multiple_components6TestLoadGraph.test_load_graph_with_multiple_components  sQ    

sC sC sC sC 
er   c                     [         R                  " 5       n[        S5       H>  n[        US-   [        US-   S5      5       H  nUR	                  SU 3SU 35        M     M@     [
        R                  " U5        g)zTest loading a larger graph.d         node_N)r   r   rangeminr   r   r   )r   r   ijs       r   test_load_graph_large_graph)TestLoadGraph.test_load_graph_large_graph  sb    

sA1Q3AaC.qc{eA3K8 /  	er   c                     [         R                  " 5       nUR                  SS5        [         R                  " 5       nUR                  SS5        [        R                  " U5        [        R                  " U5        g)z:Test that loading a new graph overwrites the previous one.r   r   r   r   Nr   )r   graph1graph2s      r   )test_load_graph_overwrites_previous_graph7TestLoadGraph.test_load_graph_overwrites_previous_graph  sL    S!S!
f
fr   c                     [         R                  " 5       nUR                  SS5         [        R                  " U5        g! [
        [        4 a     gf = f)zLTest load_graph() with undirected graph (should handle gracefully or error).r   r   N)r   Graphr   r   r   rq   AttributeErrorr   s     r    test_load_graph_undirected_graph.TestLoadGraph.test_load_graph_undirected_graph  sE     
sC 	MM% >* 		s   A   AArt   N)ru   rv   rw   rx   ry   r   r   r   r   r   r   r   r   r   r   r   r   rz   rt   r   r   r|   r|   c  sA    %

	r   r|   c                   0    \ rS rSrSrS rS rS rS rSr	g)	!TestLoadInconsistentPredicateListi  z1Test load_inconsistent_predicate_list() function.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   .TestLoadInconsistentPredicateList.setup_method  r   r   c                     [         R                  " [        [        45         [        R
                  " S5        SSS5        g! , (       d  f       g= f)z>Test load_inconsistent_predicate_list() with nonexistent file.nonexistent.yamlN)r   r   r   r   r    load_inconsistent_predicate_listr   s    r   test_load_ipl_nonexistent_file@TestLoadInconsistentPredicateList.test_load_ipl_nonexistent_file  s/    ]]-w78//0BC 988r   c                    Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " [        5         [        R                  " W5        SSS5        [        R                  " W5        g! , (       d  f       N_= f! , (       d  f       N6= f! [        R                  " W5        f = f)z:Test load_inconsistent_predicate_list() with invalid YAML.zK
        invalid: yaml: content:
        - missing closing bracket
        r%   .yamlFr'   N)r,   r-   r.   r/   r   r   rR   r   r   r0   r1   )r   invalid_yamlr4   r5   s       r   test_load_ipl_with_invalid_yamlATestLoadInconsistentPredicateList.test_load_ipl_with_invalid_yaml  s    
 ((c'%PTWIIl#xxH Q	 y)33H= * IIh QP
 *) IIhrn   c                     [         R                  " [        5         [        R                  " S5        SSS5        g! , (       d  f       g= f)z?Test load_inconsistent_predicate_list() with invalid path type.rp   N)r   r   r   r   r   r   s    r   $test_load_ipl_with_invalid_path_typeFTestLoadInconsistentPredicateList.test_load_ipl_with_invalid_path_type  s(    ]]7#//4 $##s	   ;
A	rt   N)
ru   rv   rw   rx   ry   r   r   r   r   rz   rt   r   r   r   r     s    ;
D $5r   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
TestGraphAttributeParsingi  z&Test graph attribute parsing behavior.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   &TestGraphAttributeParsing.setup_method  r   r   c                     S[         R                  l        [        R                  " 5       nUR                  SSSS9  UR                  SSSS9  UR                  SSSSS9  [         R                  " U5        g	)
z>Test attribute parsing when enabled with node/edge attributes.Tr   r   r   r   r   r   r   r   r   Nr   r   s     r   4test_graph_attribute_parsing_enabled_with_attributesNTestGraphAttributeParsing.test_graph_attribute_parsing_enabled_with_attributes  s]    .2+

s4R0s4R0sCtC8
er   c                     S[         R                  l        [        R                  " 5       nUR                  SSSS9  UR                  SSSS9  UR                  SSSSS	9  [         R                  " U5        g
)z?Test attribute parsing when disabled with node/edge attributes.Fr   Tr   r   r   r   r   r   Nr   r   s     r   5test_graph_attribute_parsing_disabled_with_attributesOTestGraphAttributeParsing.test_graph_attribute_parsing_disabled_with_attributes  s]    .3+

s4R0s4R0sCtC8
er   c           	          [         R                  " 5       nUR                  SSSSS/ SQS9  UR                  SSS	S
SS0S9  [        R
                  " U5        g)z(Test graph with complex attribute types.r   value*   gQ	@T)r         )string_attrint_attr
float_attr	bool_attr	list_attrr   
edge_valuer   key)r   r   	dict_attrNr   r   s     r   "test_graph_with_complex_attributes<TestGraphAttributeParsing.test_graph_with_complex_attributes  sb    

s")!!% $ ) 	 	+ 	sC"."!& 0 	 	2
 	er   c                 "   [         R                  " 5       nUR                  SS5        UR                  SS5        S[        R                  l        [        R                  " U5        S[        R                  l        [        R                  " U5        g)z3Test graph with no attributes (both parsing modes).r   r   r   TFN)r   r   r   r   rC   rD   r   r   s     r   test_graph_with_no_attributes7TestGraphAttributeParsing.test_graph_with_no_attributes-  s]    

sC sC  /3+
e /4+
er   rt   N)ru   rv   rw   rx   ry   r   r   r   r   r   rz   rt   r   r   r   r     s    0
		 r   r   c                   *    \ rS rSrSrS rS rS rSrg)TestFileLoadingSequencesi<  z*Test sequences of file loading operations.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   %TestFileLoadingSequences.setup_method>  r   r   c                    [         R                  " 5       nUR                  SS5        [        R                  " U5        [
        R                  " SSSS9 nUR                  S5        UR                  nSSS5         [        R                  " W5        [        R                  " W5        g! , (       d  f       N<= f! [         a     N4f = f! [        R                  " W5        f = f)	z;Test loading graph followed by inconsistent predicate list.r   r   r%   r   Fr'   z- [pred1, pred2]
N)r   r   r   r   r   r,   r-   r.   r/   r   rR   r0   r1   )r   r   r4   r5   s       r   test_load_graph_then_ipl1TestFileLoadingSequences.test_load_graph_then_iplD  s     

sC 
e ((c'%PTWII*+xxH Q	 //9
 IIh QP
  		 IIhs0   B(;B9 (
B69
CC	 CC	 	C!c                    [         R                  " 5       nUR                  SS5        [         R                  " 5       nUR                  SS5        UR                  SS5        [         R                  " 5       nUR                  S5        [        R
                  " U5        [        R
                  " U5        [        R
                  " U5        g)z)Test loading multiple graphs in sequence.r   r   r   r   r   single_nodeN)r   r   r   r   r   r   )r   r   r   graph3s       r   test_multiple_graph_loads2TestFileLoadingSequences.test_multiple_graph_loadsW  s}    S!S!S!&
f
f
fr   rt   N)	ru   rv   rw   rx   ry   r   r   r  rz   rt   r   r   r   r   <  s    4 &r   r   c                   0    \ rS rSrSrS rS rS rS rSr	g)	TestErrorHandlingig  z/Test error handling in file loading operations.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   TestErrorHandling.setup_methodj  r   r   c                    [         R                  " SS9 nUR                  S5        UR                  nSSS5         [        R
                  " WS5        [        R                  " [        [        45         [        R                  " U5        SSS5         [        R
                  " WS5        [        R                  " U5        g! , (       d  f       N= f! , (       d  f       NN= f! [        [        4 a    [        R                  " S5         Nyf = f! [         a     gf = f!  [        R
                  " WS5        [        R                  " U5        f ! [         a     f f = f= f)z4Test file loading operations with permission denied.F)r*   s   test contentNr   z,Cannot test permission errors on this systemi  )r,   r-   r.   r/   r0   chmodr   r   PermissionErrorr   r   r   skipr1   r   r4   r5   s      r   +test_load_operations_with_permission_errors=TestErrorHandling.test_load_operations_with_permission_errorsp  s     ((6#IIo&xxH 7	HHXu% 9:) ;5)		(#) 76 ;: ) 	HKKFG	H  5)		(# s   C7C# 3C
C# -D 
C
C C# D  C# #&D	D DD 
DDE!-EE
EEEEc                    [         R                  " [        [        45         [        R
                  " S5        SSS5        [        R                  " 5       nUR                  SS5        [        R                  " U5        g! , (       d  f       NL= f)z2Test that operations work after previous failures.znonexistent.graphmlNr   r   )
r   r   r   r   r   r   r   r   r   r   r   s     r   #test_load_operations_after_failures5TestErrorHandling.test_load_operations_after_failures  sX     ]]-w78OO12 9 

sC 
e 98s   A>>
Bc                    [         R                  " 5       nUR                  SS5        [        R                  " U5        [
        R                  " [        [        45         [        R                  " S5        SSS5        [         R                  " 5       nUR                  SS5        [        R                  " U5        g! , (       d  f       NL= f)z$Test recovery from partial failures.r   r   r   Nr   D)
r   r   r   r   r   r   r   r   r   r   )r   r   r   s      r   test_partial_failure_recovery/TestErrorHandling.test_partial_failure_recovery  s     

sC 
e ]]-w78//0BC 9
 S!
f 98s   B;;
C	rt   N)
ru   rv   rw   rx   ry   r   r  r  r  rz   rt   r   r   r  r  g  s    96	r   r  c                   `    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rSrg)TestAddRulesFromFilei  z$Test add_rules_from_file() function.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   !TestAddRulesFromFile.setup_method  r   r   c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z$Test loading simple rules from file.z8friend(A, B) <- knows(A, B)
enemy(A, B) <- ~friend(A, B)r%   .txtFr'   Nr,   r-   r.   r/   r   add_rules_from_filer0   r1   r   rules_contentr4   r5   s       r   %test_add_rules_from_file_simple_rules:TestAddRulesFromFile.test_add_rules_from_file_simple_rules  ss      ((c&OSVIIm$xxH P	 ""8,IIh PO IIhr8   c                 &   [         R                  " SSSS9 nUR                  S5        UR                  S5        UR                  S5        UR                  S5        UR                  S	5        UR                  S
5        UR                  nSSS5         [        R
                  " W5        [        R                  " 5       n[        U5      S:X  d   e [        R                  " U5        g! , (       d  f       Nc= f! [        R                  " W5        f = f)z7Test rule file parsing handles comments and empty linesr%   Fr  )r(   r*   r)   z# This is a comment

z   
ztest_rule(x) <-1 other_rule(x)
z# Another comment
z!another_rule(y) <-1 test_rule(y)
Nr   )
r,   r-   r.   r/   r   r  	get_ruleslenr0   r1   )r   f	temp_pathruless       r   6test_add_rules_from_file_with_comments_and_empty_linesKTestAddRulesFromFile.test_add_rules_from_file_with_comments_and_empty_lines  s    ((c%OSTGG+,GGDMGGGGG67GG)*GG89I P	!""9-LLNEu:?"?IIi  PO IIi s   A3C'<C8 '
C58Dc                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z.Test loading rules from file with empty lines.zSfriend(A, B) <- knows(A, B)

            enemy(A, B) <- ~friend(A, B)

            r%   r  Fr'   Nr  r  s       r   )test_add_rules_from_file_with_empty_lines>TestAddRulesFromFile.test_add_rules_from_file_with_empty_lines  ss     ((c&OSVIIm$xxH P	 ""8,IIh PO IIhr8   c                 0   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " WSS9  [        R                  " U5        g! , (       d  f       N;= f! [        R                  " W5        f = f)	z)Test loading rules with infer_edges=True.friend(A, B) <- knows(A, B)r%   r  Fr'   NTinfer_edgesr  r  s       r   .test_add_rules_from_file_with_infer_edges_trueCTestAddRulesFromFile.test_add_rules_from_file_with_infer_edges_true  sq    9((c&OSVIIm$xxH P	 ""8>IIh PO IIh   A, A= ,
A:=Bc                 0   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " WSS9  [        R                  " U5        g! , (       d  f       N;= f! [        R                  " W5        f = f)z*Test loading rules with infer_edges=False.r/  r%   r  Fr'   Nr0  r  r  s       r   /test_add_rules_from_file_with_infer_edges_falseDTestAddRulesFromFile.test_add_rules_from_file_with_infer_edges_false  sq    9((c&OSVIIm$xxH P	 ""8?IIh PO IIhr4  c                     [         R                  " [        [        45         [        R
                  " S5        SSS5        g! , (       d  f       g= f)z1Test add_rules_from_file() with nonexistent file.znonexistent_rules.txtN)r   r   r   r   r   r  r   s    r   )test_add_rules_from_file_nonexistent_file>TestAddRulesFromFile.test_add_rules_from_file_nonexistent_file  s1     ]]-w78""#:; 988r   c                 .   [         R                  " SSSS9 nUR                  S5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z#Test loading rules from empty file.r%   r  Fr'   r    Nr  r  s      r   #test_add_rules_from_file_empty_file8TestAddRulesFromFile.test_add_rules_from_file_empty_file  si    ((c&OSVIIbMxxH P	 ""8,IIh PO IIhs   A+A< +
A9<Bc                 T   SnSn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5        [         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R
                  " W5        [        R                  " U5        [        R                  " U5        g! , (       d  f       N= f! , (       d  f       Ny= f! [        R                  " W5        [        R                  " W5        f = f)z+Test multiple calls to add_rules_from_file.r/  zenemy(A, B) <- ~friend(A, B)r%   r  Fr'   Nr  )r   rules_content1rules_content2rc   rd   re   rf   s          r   'test_add_rules_from_file_multiple_calls<TestAddRulesFromFile.test_add_rules_from_file_multiple_calls  s    :;((c&OSWJJ~&		I P ((c&OSWJJ~&		I P	!""9-""9-IIi IIi  PO PO IIi IIi ri   c                 2   Sn[         R                  " SSSS9 nUR                  U5        UR                  nSSS5         [        R
                  " W5        [        R                  " U5        g! , (       d  f       N<= f! [        R                  " W5        f = f)z%Test loading complex rules from file.zfriend(A, B) <- knows(A, B), likes(A, B)
        enemy(A, B) <- ~friend(A, B), conflict(A, B)
        ally(A, B) <- friend(A, B), common_interest(A, B)r%   r  Fr'   Nr  r  s       r   &test_add_rules_from_file_complex_rules;TestAddRulesFromFile.test_add_rules_from_file_complex_rules(  ss    = ((c&OSVIIm$xxH P	 ""8,IIh PO IIhr8   c                 z   SSK Jn  [        R                  " U" SSS5      5        Sn[        R
                  " SSSS	9 nUR                  U5        UR                  nS
S
S
5         [        R                  " W5        [        R                  " U5        g
! , (       d  f       N<= f! [        R                  " W5        f = f)z7Test that rule numbering continues from existing rules.r   r   zexisting(A, B) <- test(A, B)existing_ruleFz@friend(A, B) <- knows(A, B)
        enemy(A, B) <- ~friend(A, B)r%   r  r'   N)pyreason.scripts.rules.ruler   r   add_ruler,   r-   r.   r/   r  r0   r1   )r   r   r  r4   r5   s        r   -test_add_rules_from_file_after_existing_rulesBTestAddRulesFromFile.test_add_rules_from_file_after_existing_rules9  s     	5 	D7%PQ( ((c&OSVIIm$xxH P	 ""8,IIh PO IIhs   B$B" 
B"B:c                 `    [         R                  " SS5        [         R                  " SS5        g)z(Test adding inconsistent predicate pairspred1pred2pred3pred4N)r   add_inconsistent_predicater   s    r    test_add_inconsistent_predicates5TestAddRulesFromFile.test_add_inconsistent_predicatesN  s"    
%%gw7
%%gw7r   rt   N)ru   rv   rw   rx   ry   r   r   r)  r,  r2  r6  r9  r<  rA  rD  rJ  rR  rz   rt   r   r   r  r    sA    .  !$ &  <	 !* " *8r   r  c                   B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)TestRuleTraceiU  z6Test save_rule_trace() and get_rule_trace() functions.c                 X    [         R                  " 5         [         R                  " 5         gr	   r
   r   s    r   r   TestRuleTrace.setup_methodX  r   r   c                     S[         R                  l        0 n[        R                  " [
        SS9   [         R                  " U5        SSS5        g! , (       d  f       g= f)zBTest save_rule_trace() with store_interpretation_changes disabled.F+store interpretation changes setting is offmatchN)r   rC   store_interpretation_changesr   r   AssertionErrorsave_rule_tracer   interpretations     r   ?test_save_rule_trace_with_store_interpretation_changes_disabledMTestRuleTrace.test_save_rule_trace_with_store_interpretation_changes_disabled]  s?    380 ]]>1^_~. `__   A
Ac                     S[         R                  l        0 n[        R                  " [
        SS9   [         R                  " U5        SSS5        g! , (       d  f       g= f)zATest get_rule_trace() with store_interpretation_changes disabled.FrY  rZ  N)r   rC   r\  r   r   r]  get_rule_tracer_  s     r   >test_get_rule_trace_with_store_interpretation_changes_disabledLTestRuleTrace.test_get_rule_trace_with_store_interpretation_changes_disabledg  s?    380 ]]>1^_n- `__rc  c                 T   S[         R                  l        [        R                  " 5       nUR                  SS5        [         R                  " U5        [         R                  " [         R                  " SSSS5      5        [         R                  " [        SSS5      5        [         R                  " S5      n[        R                  " 5        n[         R                  " X#5        [        R                   " U5      n[#        U5      S	:  d   S
5       e SSS5        g! , (       d  f       g= f)zATest save_rule_trace() with store_interpretation_changes enabled.Tr   r   	person(A)r   friend(A, B) <- person(A)	test_ruleFr   z0Expected files to be created in the trace folderN)r   rC   r\  r   r   r   r   add_factFactrI  r   reasonr,   TemporaryDirectoryr^  r0   listdirr%  )r   r   r`  temp_dirfiles_createds        r   >test_save_rule_trace_with_store_interpretation_changes_enabledLTestRuleTrace.test_save_rule_trace_with_store_interpretation_changes_enabledq  s    370 

sC 
e 	BGGKa34
D4k5IJ 1 ((*h~8JJx0M}%)]+]])	 +**s   AD
D'c                    S[         R                  l        [        R                  " 5       nUR                  SS5        [         R                  " U5        [         R                  " [         R                  " SSSS5      5        [         R                  " [        SSS5      5        [         R                  " S5      n[        R                  " 5        n[        R                  R!                  US	5      n[        R"                  " USS
9  [         R$                  " X$5        [        R&                  " U5      n[)        U5      S:  d   S5       e SSS5        g! , (       d  f       g= f)z/Test save_rule_trace() with custom folder path.Tr   r   ri  r   rj  rk  Fcustom_trace)exist_okr   z7Expected files to be created in the custom trace folderN)r   rC   r\  r   r   r   r   rl  rm  rI  r   rn  r,   ro  r0   pathjoinmakedirsr^  rp  r%  )r   r   r`  rq  custom_folderrr  s         r   'test_save_rule_trace_with_custom_folder5TestRuleTrace.test_save_rule_trace_with_custom_folder  s    370 

sC 
e
BGGKa34
D4k5IJ1 ((*hGGLL>BMKK5~=JJ}5M}%)d+dd) +**s   A8E
Ec                 8   S[         R                  l        [        R                  " 5       nUR                  SS5        [         R                  " U5        [         R                  " [         R                  " SSSS5      5        [         R                  " [        SSS5      5        [         R                  " S5      n[         R                  " U5      u  p4[        U[        R                  5      (       d   S	5       e[        U[        R                  5      (       d   S
5       eg)z@Test get_rule_trace() with store_interpretation_changes enabled.Tr   r   ri  r   rj  rk  Fz,Expected node_trace to be a pandas DataFramez,Expected edge_trace to be a pandas DataFrameN)r   rC   r\  r   r   r   r   rl  rm  rI  r   rn  re  
isinstancepd	DataFramer   r   r`  
node_trace
edge_traces        r   =test_get_rule_trace_with_store_interpretation_changes_enabledKTestRuleTrace.test_get_rule_trace_with_store_interpretation_changes_enabled  s    370 

sC 
e
BGGKa34
D4k5IJ1 "$!2!2>!B
 *bll33c5cc3*bll33c5cc3r   c                    S[         R                  l        [        R                  " 5       nUR                  / SQ5        [         R                  " U5        [         R                  " [         R                  " SSSS5      5        [         R                  " [         R                  " SSSS5      5        [         R                  " [        SS	S
5      5        [         R                  " [        SSS
5      5        [         R                  " S5      n[         R                  " U5      u  p4[        U[        R                  5      (       d   e[        U[        R                  5      (       d   e[!        US5      (       d   e[!        US5      (       d   eg)z?Test that get_rule_trace() returns proper DataFrame structures.T))r   r   )r   r   )r   r   ri  r   r   z	person(B)r   rj  rule1Fzlikes(A, B) <- friend(A, B)rule2r   columnsN)r   rC   r\  r   r   add_edges_fromr   rl  rm  rI  r   rn  re  r  r  r  hasattrr  s        r   &test_get_rule_trace_returns_dataframes4TestRuleTrace.test_get_rule_trace_returns_dataframes  s   370 

AB
e 	BGGKa34
BGGKa34
D4guEF
D6GH1!#!2!2>!B
 *bll3333*bll3333 z9----z9----r   rt   N)ru   rv   rw   rx   ry   r   ra  rf  rs  r|  r  r  rz   rt   r   r   rU  rU  U  s+    @
/.^.e.d*.r   rU  )ry   r   networkxr   r,   r0   pyreasonr   pandasr  rH  r   r   r|   r   r   r   r  r  rU  rt   r   r   <module>r     s   
    	   ,R! R!j
s sl#5 #5L: :z) )V? ?Dh8 h8Xy. y.r   