U
    :vfVQ                     @   s   d dl Z d dlZ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	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
   E/tmp/pip-unpacked-wheel-_lngutwb/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| dddgks*tt| dddgksDt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std S )Nlabelr   Node 1Node 2Node 3)r   r   )r   r   )r   r   TdataZblue   )lineZ	thicknesszEdge from node 1 to node 2)colorr   zEdge from node 2 to node 3zEdge from node 3 to node 1)r   r   r   sortednodesAssertionErroredgesr   Gr
   r
   r   test_parse_gml   s"    

zTestGraph.test_parse_gmlc                 C   s   t  \}}t|d}|| j |  tj|dd}tj| jdd}t	|j
ddt	|j
ddksltt	|jddt	|jddkstt| t| d S )Nwr   r   Tr   )tempfilemkstempopenwriter   closer   read_gmlr   r   r   r   r   osunlink)r   fd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s6td S )Nz0graph [
  node [
    id 0
    label "1203"
  ]
]i  
Z
stringizer)r   Graphadd_nodejoingenerate_gmlr   r   )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_duplicatec                 C   s<   t  }|dd dt j|td}d}||ks8td S )N)r      )r?   r   r/   r0   zgraph [
  node [
    id 0
    label "(0,1)"
  ]
  node [
    id 1
    label "(1,0)"
  ]
  edge [
    source 0
    target 1
  ]
])r   r1   add_edger3   r4   r   r   )r   r    r   r5   r
   r
   r   test_tuplelabels   s
    zTestGraph.test_tuplelabelsc                 C   sn   t d}d|_dtd }||jd d< t }t || |d |	 
 d}d}||ksjtd S )	Nr?   zpath_graph(1)z*This is "quoted" and this is a copyright:    r   Zdemo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#   NamedTemporaryFile	write_gmlr:   readstripdecoder   )r   r    attrfobjr   r5   r
   r
   r   test_quotes   s    

zTestGraph.test_quotesc                 C   sb   dt d }t }|| t }t|| |d | 	 
d}d}||ks^td S )NnoderB   r   rC   z6graph [
  node [
    id 0
    label "node&#169;"
  ]
])rF   r   r1   r2   r#   rG   rH   r:   rI   rJ   rK   r   r   rO   r    rM   r   r5   r
   r
   r   test_unicode_node  s    

zTestGraph.test_unicode_nodec                 C   sZ   d}t  }|| t }t || |d |  	d}d}||ksVt
d S )Ng      ?r   rC   z/graph [
  node [
    id 0
    label "1.0"
  ]
])r   r1   r2   r#   rG   rH   r:   rI   rJ   rK   r   rP   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k
rV   ||7 }Y nX tt|}tt	|}t
||d t|j  fddt	|D }t||d	 t }t|| |d |  d
}d}||kst|d t|}t	|D ]\}	}
|jt|	 d }t|
rBt|sPtn||
ksPt |	 }t|d t|d f}|j| d	 }t|
rt|stn||
ks
tq
d S )Nnanz+infz-infr   Z	nodefloatc                    s   i | ]\}} | |qS r
   r
   ).0ivaluer   r
   r   
<dictcomp>2  s      z6TestGraph.test_special_float_label.<locals>.<dictcomp>Z	edgefloatrC   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?   )floatZnumpyrS   infImportErrorr   Zcycle_graphlendict	enumerateZset_node_attributeslistr   Zset_edge_attributesr#   rG   rH   r:   rI   rJ   rK   r   r(   r   strmathisnan)r   Zspecial_floatsnpr    attrsrM   r   r5   graphZindxrW   Z
node_valueZedgeZstring_edgeZ
edge_valuer
   rX   r   test_special_float_label%  s>    

>

z"TestGraph.test_special_float_labelc                 C   sF   t d}d|jd kstt d}d|jks4td|jksBtd S )Nz*graph [ name "x" node [ id 0 label "x" ] ]xrE   z!graph [ node [ id 0 label "x" ] ] )r   r   rf   r   rE   r   r
   r
   r   	test_name  s
    

zTestGraph.test_namec                 C   s   dD ]}dD ]}d}|d k	r0|dt t| 7 }|d k	rL|dt t| 7 }|d7 }|d7 }|d7 }t|}t|| kstt|| kstd}|d	kr|d
7 }|d	kr|d7 }|d7 }|r|d7 }|d7 }|dt	|kst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/   )
ra   intr   r   boolZis_directedr   Zis_multigraphr3   r4   )r   ZdirectedZ
multigraphgmlr    r
   r
   r   test_graph_types  s.    
zTestGraph.test_graph_typesc              
   C   sN  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st||d|jkstt|jddddd|idfgkstt|jddddd|dfgkstt }d|jd< tjt
|td}|jd dksJtd S )NTFl      Fx:^V gF"'z"&&amp;&&#34;")   DD  )r?      )rs   3iDD z{2.3j, 1 - 2.3j, ()}r   r   rT   )rk   r   g      )rZ   r   r/   r0   Zdestringizer)rE   r   r   frozenset([1, 2, 3]))rF   appendr   r   r1   rE   rf   r2   r@   r3   r4   r   r   r   r   r`   r   r   )r   r   r    rm   r
   r
   r   test_data_types  s2    	
((
zTestGraph.test_data_typesc                 C   sX   d}t |}dtd d |jks(tdt |}d}d| d }||ksTtd S )	NzTgraph [
  name "&amp;&#34;&#xf;&#x4444;&#1234567890;&#x1234567890abcdef;&unknown;"
]z&"rr   z*&#1234567890;&#x1234567890abcdef;&unknown;r/   z##1234567890;&#38;#x1234567890abcdefz,graph [
  name "&#38;&#34;&#15;&#17476;&#38;z;&#38;unknown;"
])r   r   rF   rE   r   r3   r4   )r   rm   r    Zalnur5   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dddg t ttt t 2}|t	j
d  |d t tjtj| W 5 Q R X 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dddg|jd.< ||td/ d S )0N(rv   r?   rs   r   s   graph[]r   c                 S   s   t tjtj|  d S N)r;   r<   r   r=   r   )rm   r
   r
   r   assert_parse_error  s    z5TestGraph.test_exceptions.<locals>.assert_parse_errorz	graph [

]ri   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 ]uK   graph [edge [ source u'uĐ0' target u'uĐ0' ] node [ id u'uĐ0' label b ] ]c                     s   t tj fdd d S )Nc                      s   t tj S r{   )r`   r   r4   r
   argskwargsr
   r   <lambda>2      zJTestGraph.test_exceptions.<locals>.assert_generate_error.<locals>.<lambda>)r;   r<   r   r=   r   r
   r   r   assert_generate_error0  s     z8TestGraph.test_exceptions.<locals>.assert_generate_errorrt   r   r0   )r;   r<   
ValueErrorr   r   	frozensetr#   TemporaryFiler&   codecsBOM_UTF8r:   r   r=   r(   r   r1   rf   )r   fr|   r   r    r
   r
   r   test_exceptions  s    





zTestGraph.test_exceptionsc                    s   t j| jdd t jdddgks(t fddt jD }|dd	d
gksRtt j| jd d t jdddgkszt fddt jD }|dd	d
gkstd S )Nr   r   r?   rs   r   c                    s   g | ]} j | d  qS r   r   rU   nr    r
   r   
<listcomp>B  s     z.TestGraph.test_label_kwarg.<locals>.<listcomp>r   r   r   c                    s   g | ]} j | d  qS r   r   r   r   r
   r   r   G  s     )r   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| t \}}zdt || t 	|}|j
d	  D ]:\}}|d
ksr|dkrt|tkstqZt|tksZtqZW 5 t| t| X d S )Nl    i   r      il        )toosmallsmallZmed1Zmed2Zmed3bigtoobigNoder   r   )r   )r   r1   r2   r#   r$   r)   r'   r*   rH   r(   r   itemstypera   r   rk   )r   r    Znumbersr+   r,   ZG2rL   rW   r
   r
   r   test_outofrange_integersJ  s(    	

z"TestGraph.test_outofrange_integersN)__name__
__module____qualname__classmethodr   r   r!   r.   r6   r>   rA   rN   rQ   rR   rg   rj   rn   rx   ry   r   r   r   r
   r
   r
   r   r      s&   
+Uf ]r   c                  c   s   t  } | V  | d d S )Nr   )r7   r8   r:   )Z_file_handler
   r
   r   	byte_filej  s    r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
TestPropertyListsc              	   C   s`   t  }|jdddddddgd t }t || W 5 Q R X |  }|td	ks\t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   r1   r2   r   rH   rI   rK   r   r   r   gr   resultr
   r
   r   3test_writing_graph_with_multi_element_property_listr  s    zETestPropertyLists.test_writing_graph_with_multi_element_property_listc              	   C   sV   t  }|jddgd t }t || W 5 Q R X |  }|tdksRt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   sb   t  .}|tdd |d t|}W 5 Q R X |jddd dddd	d
giks^t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   r9   r:   r   r(   r   r   r   r   rf   r
   r
   r   %test_reading_graph_with_list_property  s    
z7TestPropertyLists.test_reading_graph_with_list_propertyc              	   C   s\   t  .}|tdd |d t|}W 5 Q R X |jddd ddgiksXt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   q  s   r   collr
   c                 C   s   t d}| |jd d< t }t || |d t |}|jd d | ksVtt 	|ddd}t j
||szt|d t j|td}t j
||std S )Nrs   r   testr~   r?   )r~   1ru   )r   rD   r   r7   r8   rH   r:   r(   r   Zrelabel_nodesutilsZgraphs_equalrk   )r   r    r   Hr
   r
   r   test_stringize_empty_list_tuple  s    



r   )r   r7   rb   r)   r#   astr   
contextlibr   textwrapr   r;   Znetworkxr   Znetworkx.readwrite.gmlr   r   r   r   r   markZparametrizer   r
   r
   r
   r   <module>   s(       ^
X