o
    ]ZhS                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	Z	d dl
Zd dlmZmZ G dd dZedd	 ZG d
d dZe	jdg dfdd ZdS )    N)literal_eval)contextmanager)dedent)literal_destringizerliteral_stringizerc                   @   s   e Zd Zedd Zdd Zdd Zdd Zd	d
 Zdd Z	e
jddefdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( ZdS ))	TestGraphc                 C   s
   d| _ d S )Na2  Creator "me"
Version "xx"
graph [
 comment "This is a sample graph"
 directed 1
 IsPlanar 1
 pos  [ x 0 y 1 ]
 node [
   id 1
   label "Node 1"
   pos [ x 1 y 1 ]
 ]
 node [
    id 2
    pos [ x 1 y 2 ]
    label "Node 2"
    ]
  node [
    id 3
    label "Node 3"
    pos [ x 1 y 3 ]
  ]
  edge [
    source 1
    target 2
    label "Edge from node 1 to node 2"
    color [line "blue" thickness 3]

  ]
  edge [
    source 2
    target 3
    label "Edge from node 2 to node 3"
  ]
  edge [
    source 3
    target 1
    label "Edge from node 3 to node 1"
  ]
]
)simple_data)cls r
   P/var/www/auris/lib/python3.10/site-packages/networkx/readwrite/tests/test_gml.pysetup_class   s   
zTestGraph.setup_classc                 C   s   d}t | d S )Nas  
Creator "Cytoscape"
Version 1.0
graph   [
    node    [
        root_index  -3
        id  -3
        graphics    [
            x   -96.0
            y   -67.0
            w   40.0
            h   40.0
            fill    "#ff9999"
            type    "ellipse"
            outline "#666666"
            outline_width   1.5
        ]
        label   "node2"
    ]
    node    [
        root_index  -2
        id  -2
        graphics    [
            x   63.0
            y   37.0
            w   40.0
            h   40.0
            fill    "#ff9999"
            type    "ellipse"
            outline "#666666"
            outline_width   1.5
        ]
        label   "node1"
    ]
    node    [
        root_index  -1
        id  -1
        graphics    [
            x   -31.0
            y   -17.0
            w   40.0
            h   40.0
            fill    "#ff9999"
            type    "ellipse"
            outline "#666666"
            outline_width   1.5
        ]
        label   "node0"
    ]
    edge    [
        root_index  -2
        target  -2
        source  -1
        graphics    [
            width   1.5
            fill    "#0000ff"
            type    "line"
            Line    [
            ]
            source_arrow    0
            target_arrow    3
        ]
        label   "DirectedEdge"
    ]
    edge    [
        root_index  -1
        target  -1
        source  -3
        graphics    [
            width   1.5
            fill    "#0000ff"
            type    "line"
            Line    [
            ]
            source_arrow    0
            target_arrow    3
        ]
        label   "DirectedEdge"
    ]
]
)nx	parse_gml)selfZcytoscape_exampler
   r
   r   test_parse_gml_cytoscape_bug;   s   Qz&TestGraph.test_parse_gml_cytoscape_bugc                 C   s   t j| jdd}t| g dksJ t| g dks J t|jddddd	d
dddfddddifddddifgksBJ d S )Nlabelr   Node 1Node 2Node 3))r   r   )r   r   )r   r   Tdatar   r   blue   )lineZ	thicknesszEdge from node 1 to node 2)colorr   r   zEdge from node 2 to node 3zEdge from node 3 to node 1)r   r   r   sortednodesedgesr   Gr
   r
   r   test_parse_gml   s   zTestGraph.test_parse_gmlc                 C   s   |d }t |d}|| j W d    n1 sw   Y  tj|dd}tj| jdd}t|jddt|jddks@J t|jddt|jddksRJ d S )Ntest.gmlwr   r   Tr   )	openwriter   r   read_gmlr   r   r   r   )r   tmp_pathfnamefhZGinr!   r
   r
   r   test_read_gml   s   $(zTestGraph.test_read_gmlc                 C   s:   d}t  }|d dt j|td}||ksJ d S )Nz0graph [
  node [
    id 0
    label "1203"
  ]
]i  

stringizer)r   Graphadd_nodejoingenerate_gmlr   )r   answerr!   r   r
   r
   r   test_labels_are_strings   s
   
z!TestGraph.test_labels_are_stringsc                 C   s8   d}t |d}|d tjtjtj|dd d S )Nz
graph
[
        label   ""
        directed        1
        node
        [
                id      0
                label   "same"
        ]
        node
        [
                id      1
                label   "same"
        ]
]
zUTF-8r   r   r   )	ioBytesIOencodeseekpytestraisesr   NetworkXErrorr'   )r   r   r*   r
   r
   r   test_relabel_duplicate   s   
z TestGraph.test_relabel_duplicater.   Nc                 C   s<   t  }|dd dt j||d}d}||ksJ d S )N)r      )r=   r   r,   r-   zgraph [
  node [
    id 0
    label "(0,1)"
  ]
  node [
    id 1
    label "(1,0)"
  ]
  edge [
    source 0
    target 1
  ]
])r   r/   add_edger1   r2   )r   r.   r!   r   r3   r
   r
   r   test_tuplelabels   s
   zTestGraph.test_tuplelabelsc                 C   s   t d}d|_dtd }||jd d< t|d d}t || |d | 	 
d	}W d    n1 s;w   Y  d
}||ksHJ d S )Nr=   zpath_graph(1)z*This is "quoted" and this is a copyright:    r   demor#   w+basciizgraph [
  name "path_graph(1)"
  node [
    id 0
    label "0"
    demo "This is &#34;quoted&#34; and this is a copyright: &#169;"
  ]
])r   
path_graphnamechrr   r%   	write_gmlr8   readstripdecode)r   r(   r!   attrfobjr   r3   r
   r
   r   test_quotes   s   

zTestGraph.test_quotesc                 C   s   dt d }t }|| t|d d}t|| |d |  	d}W d    n1 s5w   Y  d}||ksBJ d S )Nnoder@   r#   rB   r   rC   z6graph [
  node [
    id 0
    label "node&#169;"
  ]
])
rF   r   r/   r0   r%   rG   r8   rH   rI   rJ   r   r(   rN   r!   rL   r   r3   r
   r
   r   test_unicode_node   s   

zTestGraph.test_unicode_nodec                 C   s   d}t  }|| t|d d}t || |d |  d}W d    n1 s1w   Y  d}||ks>J d S )Ng      ?r#   rB   r   rC   z/graph [
  node [
    id 0
    label "1.0"
  ]
])	r   r/   r0   r%   rG   r8   rH   rI   rJ   rO   r
   r
   r   test_float_label  s   

zTestGraph.test_float_labelc                    s  t dt dt dg}zdd l}||j|j|jd g7 }W n ty*   ||7 }Y nw tt|}tt	|}t
||d t|j  fddt	|D }t||d	 t|d
 d~}t|| |d |  d}d}||kszJ |d t|}	t	|D ]J\}
}|	jt|
 d }t|rt|sJ n||ksJ  |
 }t|d t|d f}|	j| d	 }t|rt|sJ q||ksJ qW d    d S 1 sw   Y  d S )Nnanz+infz-infr   Z	nodefloatc                    s   i | ]	\}} | |qS r
   r
   ).0ivaluer   r
   r   
<dictcomp>.      z6TestGraph.test_special_float_label.<locals>.<dictcomp>Z	edgefloatr#   rB   rC   a  graph [
  node [
    id 0
    label "0"
    nodefloat NAN
  ]
  node [
    id 1
    label "1"
    nodefloat +INF
  ]
  node [
    id 2
    label "2"
    nodefloat -INF
  ]
  node [
    id 3
    label "3"
    nodefloat NAN
  ]
  node [
    id 4
    label "4"
    nodefloat +INF
  ]
  node [
    id 5
    label "5"
    nodefloat -INF
  ]
  edge [
    source 0
    target 1
    edgefloat NAN
  ]
  edge [
    source 0
    target 5
    edgefloat +INF
  ]
  edge [
    source 1
    target 2
    edgefloat -INF
  ]
  edge [
    source 2
    target 3
    edgefloat NAN
  ]
  edge [
    source 3
    target 4
    edgefloat +INF
  ]
  edge [
    source 4
    target 5
    edgefloat -INF
  ]
]r=   )floatnumpyrR   infImportErrorr   Zcycle_graphlendict	enumerateZset_node_attributeslistr   Zset_edge_attributesr%   rG   r8   rH   rI   rJ   r'   r   strmathisnan)r   r(   Zspecial_floatsnpr!   attrsrL   r   r3   graphZindxrV   Z
node_valueedgeZstring_edgeZ
edge_valuer
   rW   r   test_special_float_label!  sD   

>



"z"TestGraph.test_special_float_labelc                 C   sF   t d}d|jd ksJ t d}d|jksJ d|jvs!J d S )Nz*graph [ name "x" node [ id 0 label "x" ] ]xrE   z!graph [ node [ id 0 label "x" ] ] )r   r   rg   rE   r    r
   r
   r   	test_name  s
   

zTestGraph.test_namec                 C   s   dD ]v}dD ]q}d}|d ur|dt t| 7 }|d ur&|dt t| 7 }|d7 }|d7 }|d7 }t|}t|| ksAJ t|| ksKJ d}|d	u rU|d
7 }|d	u r]|d7 }|d7 }|rg|d7 }|d7 }|dt|kswJ qqd S )N)NFTzgraph [z
 directed z multigraph z node [ id 0 label "0" ]z edge [ source 0 target 0 ]z ]zgraph [
Tz  directed 1
z  multigraph 1
zG  node [
    id 0
    label "0"
  ]
  edge [
    source 0
    target 0
z
    key 0
z  ]
]r,   )	rb   intr   r   boolZis_directedZis_multigraphr1   r2   )r   ZdirectedZ
multigraphgmlr!   r
   r
   r   test_graph_types  s2   
zTestGraph.test_graph_typesc              
   C   sJ  ddddddddt d	d
idgg}|t d |td t }||_||jd< |jddd|id |jddd|d d	tj
|td}tj|td}||jksVJ ||d|jks`J t|jddddd|idfgkstJ t|jddddd|dfgksJ t }d|jd< tjt
|td}|jd dksJ d S )NTFl      Fx:^V gF"'z"&&amp;&&#34;")   DD  )r=      )ru   3iDD z{2.3j, 1 - 2.3j, ()}r   r   rS   )rm   r   g      )rZ   r   r,   r-   Zdestringizer)rE   r   r   frozenset([1, 2, 3]))rF   appendr   r   r/   rE   rg   r0   r>   r1   r2   r   r   r   ra   r   r   )r   r   r!   ro   r
   r
   r   test_data_types  s2   	
(&
zTestGraph.test_data_typesc                 C   sX   d}t |}dtd d |jksJ dt |}d}d| d }||ks*J d S )	NzTgraph [
  name "&amp;&#34;&#xf;&#x4444;&#1234567890;&#x1234567890abcdef;&unknown;"
]z&"rt   z*&#1234567890;&#x1234567890abcdef;&unknown;r,   z##1234567890;&#38;#x1234567890abcdefz,graph [
  name "&#38;&#34;&#15;&#17476;&#38;z;&#38;unknown;"
])r   r   rF   rE   r1   r2   )r   ro   r!   Zalnur3   r
   r
   r   test_escape_unescape  s   
zTestGraph.test_escape_unescapec                 C   s  t ttd t ttd t ttt t tttg d t ttt t|d d}|tj	d  |
d t tjtj| W d    n1 sOw   Y  dd	 }|d
dg |d |d |d |d |d |d |d |d |d |d |d |d tjddd |d |d |d |d td |d  |d! |d" td# td$ td% |d& td' td( td) |d* d+d, }t }d-|jd-< || t }d-|jd.< || t }tg d|jd/< ||td0 d S )1N(rx   r=   ru   r   r#   rB   s   graph[]r   c                 S   s   t tjtj|  d S N)r9   r:   r   r;   r   )ro   r
   r
   r   assert_parse_error  s   z5TestGraph.test_exceptions.<locals>.assert_parse_errorz	graph [

]rk   z
Creator ""0zgraph ]zgraph [ 1 ]zgraph [ 1.E+2 ]zgraph [ "A" ]zgraph [ ] graph ]zgraph [ ] graph [ ]zgraph [ data [1, 2, 3] ]zgraph [ node [ ] ]zgraph [ node [ id 0 ] ]zgraph [ node [ id "a" ] ]idr   z5graph [ node [ id 0 label 0 ] node [ id 0 label 1 ] ]z5graph [ node [ id 0 label 0 ] node [ id 1 label 0 ] ]z(graph [ node [ id 0 label 0 ] edge [ ] ]z1graph [ node [ id 0 label 0 ] edge [ source 0 ] ]z9graph [edge [ source 0 target 0 ] node [ id 0 label 0 ] ]z:graph [ node [ id 0 label 0 ] edge [ source 1 target 0 ] ]z:graph [ node [ id 0 label 0 ] edge [ source 0 target 1 ] ]zkgraph [ node [ id 0 label 0 ] node [ id 1 label 1 ] edge [ source 0 target 1 ] edge [ source 1 target 0 ] ]zvgraph [ node [ id 0 label 0 ] node [ id 1 label 1 ] edge [ source 0 target 1 ] edge [ source 1 target 0 ] directed 1 ]zwgraph [ node [ id 0 label 0 ] node [ id 1 label 1 ] edge [ source 0 target 1 ] edge [ source 0 target 1 ]multigraph 1 ]z}graph [ node [ id 0 label 0 ] node [ id 1 label 1 ] edge [ source 0 target 1 key 0 ] edge [ source 0 target 1 ]multigraph 1 ]zgraph [ node [ id 0 label 0 ] node [ id 1 label 1 ] edge [ source 0 target 1 key 0 ] edge [ source 0 target 1 key 0 ]multigraph 1 ]zgraph [ node [ id 0 label 0 ] node [ id 1 label 1 ] edge [ source 0 target 1 key 0 ] edge [ source 1 target 0 key 0 ]directed 1 multigraph 1 ]z9graph [edge [ source a target a ] node [ id a label b ] ]zgraph [ node [ id n42 label 0 ] node [ id x43 label 1 ]edge [ source n42 target x43 key 0 ]edge [ source x43 target n42 key 0 ]directed 1 multigraph 1 ]uE   graph [edge [ source '䈀' target '䈀' ] node [ id '䈀' label b ] ]c                     s   t tj fdd d S )Nc                      s   t tj i S r~   )ra   r   r2   r
   argskwargsr
   r   <lambda>.  s    zJTestGraph.test_exceptions.<locals>.assert_generate_error.<locals>.<lambda>)r9   r:   r   r;   r   r
   r   r   assert_generate_error,  s   z8TestGraph.test_exceptions.<locals>.assert_generate_errorr   rv   r   r-   )r9   r:   
ValueErrorr   r   	frozensetr%   r&   codecsBOM_UTF8r8   r   r;   r'   r   r/   rg   )r   r(   fr   r   r!   r
   r
   r   test_exceptions  s   




zTestGraph.test_exceptionsc                    s   t j| jdd t jg dksJ  fddt jD }|g dks'J t j| jd d t jg dks:J  fddt jD }|g dksNJ d S )Nr   r   r}   c                       g | ]	} j | d  qS r   r   rT   nr!   r
   r   
<listcomp>>  rY   z.TestGraph.test_label_kwarg.<locals>.<listcomp>r   c                    r   r   r   r   r   r
   r   r   C  rY   )r   r   r   r   r   )r   labelsr
   r   r   test_label_kwarg;  s   zTestGraph.test_label_kwargc                 C   s   t  }dddddddd}|jdi | |d
 }t || t |}|jd	  D ]\}}|dks8|dkrAt|tks@J q,t|t	ksIJ q,d S )Nl    i   r      il        )toosmallZsmallZmed1Zmed2Zmed3bigtoobigNoder#   r   r   )r   )
r   r/   r0   rG   r'   r   itemstyperb   rm   )r   r(   r!   numbersr)   ZG2rK   rV   r
   r
   r   test_outofrange_integersF  s$   	
z"TestGraph.test_outofrange_integersc                 C   s*   d}t |}|jd dddksJ d S )Nz
graph
[
    node
    [
	    id 0
	    label "multiline node"
	    label2 "multiline1
    multiline2
    multiline3"
	    alt_name "id 0"
    ]
]
zmultiline nodez multiline1 multiline2 multiline3zid 0)label2Zalt_name)r   r   r   )r   Zmultiline_exampler!   r
   r
   r   test_multilinea  s   
zTestGraph.test_multiline)__name__
__module____qualname__classmethodr   r   r"   r+   r4   r<   r9   markparametrizer   r?   rM   rP   rQ   ri   rl   rp   rz   r{   r   r   r   r   r
   r
   r
   r   r      s,    
+U	
f ]r   c                  c   s    t  } | V  | d d S )Nr   )r5   r6   r8   )Z_file_handler
   r
   r   	byte_filex  s   r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestPropertyListsc                 C   sl   t  }|jdg dd t }t || W d    n1 s!w   Y  |  }|tdks4J d S )Nn1)elementr   r=         @TF
propertiesa7              graph [
              node [
                id 0
                label "n1"
                properties "element"
                properties 0
                properties 1
                properties 2.5
                properties 1
                properties 0
              ]
            ]
        r   r/   r0   r   rG   rH   rJ   r   r   gr   resultr
   r
   r   3test_writing_graph_with_multi_element_property_list  s   zETestPropertyLists.test_writing_graph_with_multi_element_property_listc                 C   sj   t  }|jddgd t }t || W d    n1 s w   Y  |  }|tdks3J d S )Nr   r   r   z            graph [
              node [
                id 0
                label "n1"
                properties "_networkx_list_start"
                properties "element"
              ]
            ]
        r   r   r
   r
   r   1test_writing_graph_with_one_element_property_list  s   zCTestPropertyLists.test_writing_graph_with_one_element_property_listc                 C   sr   t  }|tdd |d t|}W d    n1 s"w   Y  |jddd dg diks7J d S )	Na  
              graph [
                node [
                  id 0
                  label "n1"
                  properties "element"
                  properties 0
                  properties 1
                  properties 2.5
                ]
              ]
            rC   r   Tr   r   r   )r   r   r=   r   r   r&   r   r7   r8   r   r'   r   r   r   rg   r
   r
   r   %test_reading_graph_with_list_property  s   
$z7TestPropertyLists.test_reading_graph_with_list_propertyc                 C   sp   t  }|tdd |d t|}W d    n1 s"w   Y  |jddd ddgiks6J d S )	Nz
              graph [
                node [
                  id 0
                  label "n1"
                  properties "_networkx_list_start"
                  properties "element"
                ]
              ]
            rC   r   Tr   r   r   r   r   r   r
   r
   r   4test_reading_graph_with_single_element_list_property  s   
"zFTestPropertyLists.test_reading_graph_with_single_element_list_propertyN)r   r   r   r   r   r   r   r
   r
   r
   r   r     s
    r   collr
   c                 C   s   t d}| |jd d< t }t || |d t |}|jd d | ks+J t |ddd}t j	
||s=J |d t j|td}t j	
||sRJ d S )Nru   r   testr   r=   )r   1rw   )r   rD   r   r5   r6   rG   r8   r'   Zrelabel_nodesutilsZgraphs_equalrm   )r   r!   r   Hr
   r
   r   test_stringize_empty_list_tuple  s   



r   )r   r5   rc   astr   
contextlibr   textwrapr   r9   Znetworkxr   Znetworkx.readwrite.gmlr   r   r   r   r   r   r   r   r
   r
   r
   r   <module>   s&        n
X