U
    ¹mœdYI  ã                   @   s¦   d dl mZ d dlZd dlZd dlmZ ddlmZ ddlm	Z
 G dd„ deƒZG d	d
„ d
ee
ƒZG dd„ dƒZG dd„ deƒZG dd„ dejƒZG dd„ deƒZdS )é    )ÚUserDictN)Úedges_equalé   )ÚBaseAttrGraphTester)Ú	TestGraphc                   @   s|   e Z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 )ÚBaseMultiGraphTesterc                 C   sN   | j }| dd¡st‚| dd¡r&t‚| ddd¡s8t‚| ddd¡rJt‚d S )Nr   r   éÿÿÿÿ)ÚK3Zhas_edgeÚAssertionError©ÚselfÚG© r   ú_/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/networkx/classes/tests/test_multigraph.pyÚtest_has_edge   s
    z"BaseMultiGraphTester.test_has_edgec                 C   s|   | j }| dd¡di ikst‚|d d di iks6t‚|d d d i ksNt‚| dd¡d ksbt‚| ddd¡i ksxt‚d S )Nr   r   é
   é   )r	   Úget_edge_datar
   r   r   r   r   Útest_get_edge_data   s    z'BaseMultiGraphTester.test_get_edge_datac                 C   sP   | j }t| ¡ ƒdi idi idœdi idi idœdi idi idœdœksLt‚d S )Nr   ©r   é   ©r   r   ©r   r   ©r   r   r   )r	   ÚdictZ	adjacencyr
   r   r   r   r   Útest_adjacency   s    
ýz#BaseMultiGraphTester.test_adjacencyc                 C   sv   |d d d d |d d d d ks,t ‚|d d d d  d¡ |d d d d |d d d d ksrt ‚d S ©Nr   r   r   Úfoo©r
   Úappend©r   ÚHr   r   r   r   Údeepcopy_edge_attr$   s    ,z'BaseMultiGraphTester.deepcopy_edge_attrc                 C   sv   |d d d d |d d d d ks,t ‚|d d d d  d¡ |d d d d |d d d d ksrt ‚d S r   r   r    r   r   r   Úshallow_copy_edge_attr)   s    ,z+BaseMultiGraphTester.shallow_copy_edge_attrc                 C   sJ  |j |j kst‚|j|jks t‚|j|jks0t‚|j|jks@t‚| ¡ s¢| ¡ s¢|j d d d |j d d d ksxt‚|j d d d |j d d d ks t‚n¤| ¡ sº|j |_|j |_| ¡ sÒ|j |_|j |_|j|jksât‚|j|jksòt‚|jd d d |jd d d k�st‚|jd d d |jd d d k�sFt‚d S )Nr   r   r   )Ú_adjr
   Ú_nodeÚgraphÚnameZis_directedÚ_predZ_succr    r   r   r   Úgraphs_equal.   s"    (**z!BaseMultiGraphTester.graphs_equalc                 C   s®   |d d d d }d|j d d d d< |j|jks:t‚||j d d d d< |j|jks`t‚|jd d }d|jd d< |j|jksŒt‚||jd d< |j|jksªt‚d S ©Nr   r   r   r   Úbaz©Úadjr$   r
   Únodesr%   ©r   r!   r   Zold_foor   r   r   Úsame_attrdictB   s    z"BaseMultiGraphTester.same_attrdictc                 C   s®   |d d d d }d|j d d d d< |j|jks:t‚||j d d d d< |j|jks`t‚|jd d }d|jd d< |j|jksŒt‚||jd d< |j|jksªt‚d S r*   r,   r/   r   r   r   Údifferent_attrdictP   s    z'BaseMultiGraphTester.different_attrdictc                 C   s>   | j }|  |¡ t |¡}|  ||¡ | ¡ }|  ||¡ d S ©N)r	   Úadd_attributesÚnxÚ
MultiGraphÚis_shallow_copyZto_undirectedÚis_deepcopy©r   r   r!   r   r   r   Útest_to_undirected^   s    

z'BaseMultiGraphTester.test_to_undirectedc                 C   s>   | j }|  |¡ t |¡}|  ||¡ | ¡ }|  ||¡ d S r2   )r	   r3   r4   ZMultiDiGraphr6   Zto_directedr7   r8   r   r   r   Útest_to_directedf   s    

z%BaseMultiGraphTester.test_to_directedc                 C   sv   | j }| dd¡ | dd¡ |jdddd� |jdddd� | dd¡dksRt‚| dd¡ | dd¡dksrt‚d S )Nr   úparallel edge©Úkeyr   r   )r	   Úadd_edgeÚremove_edgeÚnumber_of_edgesr
   r   r   r   r   Útest_number_of_edges_selfloopsn   s    z3BaseMultiGraphTester.test_number_of_edges_selfloopsc                 C   s^   |   ¡ }|jdddd� |jddddd� t|jd ddiƒsBt‚t|jd	 ddiƒsZt‚d S )
Nr   r   Úbar)r   r=   Úbiz©r   r   r   r   )r   r   r=   )ÚGraphr>   r   Úedgesr
   r   r   r   r   Útest_edge_lookupx   s
    z%BaseMultiGraphTester.test_edge_lookupc                    sº   |   ¡ ‰ ˆ jddddd� ˆ jddddd� tˆ  dd¡ˆ jƒsDt‚t‡ fdd	„ˆ jd
d�D ƒƒsft‚tˆ jd
d
d�dddddifdddddifgƒsšt‚tˆ jd
dd�ddgƒs¶t‚d S )Nr   r   Úk1rB   )r=   r   Úk2r+   c                 3   s    | ]\}}}t |ˆ jƒV  qd S r2   )Ú
isinstanceÚedge_attr_dict_factory)Ú.0ÚuÚvÚd©r   r   r   Ú	<genexpr>„   s    z6BaseMultiGraphTester.test_edge_attr.<locals>.<genexpr>T©Údata©ÚkeysrS   r   )r   r   rH   rB   )r   r   rI   r+   )	rE   r>   rJ   r   Úedge_key_dict_factoryr
   ÚallrF   r   ©r   r   rP   r   Útest_edge_attr   s    
ÿþ ÿz#BaseMultiGraphTester.test_edge_attrc              
   C   sR  |   ¡ }|jddddddd� t|jdd	�dddddd
œfgƒsDt‚d|d d d d< t|jdd	�dddddd
œfgƒs~t‚d|jd d d d< t|jdd	�dddddd
œfgƒsºt‚d|jd d< t|jdd	�dddddd
œfgƒsît‚ddg|jd d d d< d|jd d d d< t|jdd	�dddddddgddœfgƒ�sNt‚d S )Nr   r   r   é   rB   r   )r=   rS   ÚspamrB   TrR   )rS   r[   rB   r   rS   r   é   rD   éÈ   ÚlistdataÚweight)rS   r[   rB   r^   r_   )rE   r>   r   rF   r
   r-   r   r   r   r   Útest_edge_attr4�   sH    
 ÿ
 ÿ
 ÿ
 ÿ
ûýÿþz$BaseMultiGraphTester.test_edge_attr4N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r"   r#   r)   r0   r1   r9   r:   rA   rG   rY   r`   r   r   r   r   r      s   
r   c                   @   s¢  e Zd Zdd„ Zdd„ Zdd„ Zddd	œZd
ddœZeedœZddeiiZ	ddeiiZ
ddeddœiiZddgiZdddefdddefgZdddi fgZdddefgZdddefgZdddeddœfgZe	defe	defe
defedefedefgZej de¡dd„ ƒZe	efe
efeefgZej de¡dd„ ƒZe
eegZej d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/d0„ Z#d1S )2ÚTestMultiGraphc                 C   s    t j| _di idi idi i  }}}||dœ||dœ||dœdœ| _dddg| _dddg| _|  ¡ | _| j| j_i | j_i | jjd< i | jjd< i | jjd< d S )Nr   r   r   r   r   r   r   )	r4   r5   rE   Zk3adjÚk3edgesÚk3nodesr	   r$   r%   )r   Zed1Zed2Zed3r   r   r   Úsetup_method·   s     

zTestMultiGraph.setup_methodc                 C   s`   | j dgdgdœdd�}|jdks&t‚dddi iifdddi iifg}t|j ¡ ƒ|ks\t‚d S )Nr   r   r   Útest)r'   r   )rE   r'   r
   Úsortedr-   Úitems)r   r   Úexpectedr   r   r   Útest_data_inputÅ   s     zTestMultiGraph.test_data_inputc           
      C   s0  dddœ}dddœ}||dœ}dd|ii}ddd	|fddd
|fg}ddd	|fg}| j |dd�}t|jddd�ƒ|ksxt‚| j |d d�}t|jddd�ƒ|ks t‚| j |dd�}t|jddd�ƒ|ksÈt‚| j |dd�}|   t |¡¡}t ||¡dksút‚dD ],}	| j t |¡|	d�}t ||¡|	ksþt‚qþd S )Nr]   r   ©ÚwÚséÉ   rB   r   ÚaÚbr   r   T©Úmultigraph_inputrT   F)TF)rE   ÚlistrF   r
   r4   Zto_dict_of_dictsZis_isomorphic)
r   Zedata0Zedata1ÚkeydictZdodododÚmultiple_edgeÚsingle_edger   r!   Úmgir   r   r   Útest_data_multigraph_inputË   s$    


z)TestMultiGraph.test_data_multigraph_inputr]   r   rm   ÚblueÚbox)ÚcolorÚshape)ÚtraitsÚgraphicsrq   rr   )r   ro   r   r€   r   TFzdod, mgi, edgesc                 C   sX   | j ||d�}t|jddd�ƒ|ks(t‚tj|| j |d�}t|jddd�ƒ|ksTt‚d S )Nrs   TrT   ©Zcreate_usingrt   )rE   ru   rF   r
   r4   Úto_networkx_graph)r   Údodry   rF   r   r   r   r   Útest_non_multigraph_inputû   s    z(TestMultiGraph.test_non_multigraph_inputz
dod, edgesc                 C   s(   |   |¡}t|jddd�ƒ|ks$t‚d S )NTrT   )rE   ru   rF   r
   )r   rƒ   rF   r   r   r   r   Ú"test_non_multigraph_input_mgi_none  s    
z1TestMultiGraph.test_non_multigraph_input_mgi_nonerƒ   c                 C   s4   t jtj| j|dd� t jtjtj|| jdd� d S )NTrs   r�   )ÚpytestÚraisesr4   ÚNetworkXErrorrE   r‚   )r   rƒ   r   r   r   Útest_non_multigraph_input_raise  s    ûz.TestMultiGraph.test_non_multigraph_input_raisec              	   C   sj   | j }|d di idi idœks$t‚t t¡� | d¡ W 5 Q R X t t¡� | dg¡ W 5 Q R X d S )Nr   r   ÚjÚA)r	   r
   r†   r‡   ÚKeyErrorÚ__getitem__Ú	TypeErrorr   r   r   r   Útest_getitem  s    zTestMultiGraph.test_getitemc              	   C   sZ   | j }| d¡ |jddi iiddi iidœks4t‚t tj¡� | d¡ W 5 Q R X d S )Nr   r   r   r   r   )r	   Úremove_noder-   r
   r†   r‡   r4   rˆ   r   r   r   r   Útest_remove_node$  s
    
$zTestMultiGraph.test_remove_nodec              	   C   sœ   |   ¡ }| dd¡ |jddi iiddi iidœks8t‚|   ¡ }|jdŽ  |jddi iiddi iidœksnt‚|   ¡ }t t¡� | d d¡ W 5 Q R X d S )Nr   r   r   Zanything)rE   r>   r-   r
   r†   r‡   Ú
ValueErrorr   r   r   r   Útest_add_edge+  s    $
$zTestMultiGraph.test_add_edgec                 C   sp   |   ¡ }|jdddd� | dd¡ | ¡ dks4t‚|   ¡ }| dddi fg¡ | dg¡ | ¡ dkslt‚d S )Nr   r   r<   r   r   )rE   r>   r@   r
   Úadd_edges_fromr   r   r   r   Útest_add_edge_conflicting_key6  s    z,TestMultiGraph.test_add_edge_conflicting_keyc              	   C   s~  |   ¡ }| dddddifg¡ |jdi ddidœidi ddidœidœksPt‚|jdddddifgdd� |jdi ddiddiddidœidi ddiddiddidœidœks´t‚|   ¡ }ddddifd	d
dg}| |¡ ddiddii i dœ}|jd|id|idœk�st‚t tj¡� | dg¡ W 5 Q R X t tj¡� | dg¡ W 5 Q R X t t	¡� | dg¡ W 5 Q R X d S )Nr   r   r   r_   é   r   )r_   )r   r   r   r–   )r   r   ))r_   r   )r   r   é   )r   r   ro   )r   r   r—   ro   )r   )r   r   r   r–   é   )
rE   r”   r-   r
   r$   r†   r‡   r4   rˆ   rŽ   )r   r   rF   rv   r   r   r   Útest_add_edges_from@  s4    þþü
z"TestMultiGraph.test_add_edges_fromc              	   C   s:   t  ¡ }t t¡� | ddddidfg¡ W 5 Q R X dS )z—add_edges_from expects 4-tuples of the format (u, v, key, data_dict).

        Ensure 4-tuples of form (u, v, data_dict, key) raise exception.
        r   r   r}   ÚredN)r4   r5   r†   r‡   rŽ   r”   r   r   r   r   Ú4test_multigraph_add_edges_from_four_tuple_misordereda  s    zCTestMultiGraph.test_multigraph_add_edges_from_four_tuple_misorderedc              	   C   s–   | j }| dd¡ |jddi iiddi iidi idi idœdœksFt‚t tj¡� | dd¡ W 5 Q R X t tj¡� |jdddd� W 5 Q R X d S )Nr   r   r   r   r   r   r<   )r	   r?   r-   r
   r†   r‡   r4   rˆ   r   r   r   r   Útest_remove_edgek  s    4zTestMultiGraph.test_remove_edgec                 C   sT  | j  ¡ }| dg¡ di i}|jd|id|i||dœdœksBt‚| dg¡ | j  dd¡ | j  ¡ }| t|jddd�ƒ¡ |ji i i dœks”t‚| j  ¡ }| t|jd	dd�ƒ¡ |ji i i dœksÌt‚| j  ¡ }| t|jd	d	d�ƒ¡ |ji i i dœk�st‚| j  ¡ }| d
dddi fdg¡ |jddi iiddi iii dœk�sPt‚d S )Nr   r   r   r   )r   r   r   T)rS   rU   F©r   r   r   r   )r	   ÚcopyZremove_edges_fromr-   r
   r>   ru   rF   ©r   r   Úkdr   r   r   Útest_remove_edges_fromu  s$    
$



z%TestMultiGraph.test_remove_edges_fromc              	   C   sÆ   | j }|jdddd� |jdddd� |jdi idi idœdi idi idœdi idi idœdœksft‚| dd¡ di i}|jd	|id	|i||dœdœksžt‚t tj¡� | d
d¡ W 5 Q R X d S )Nr   r   r;   r<   r   r   r   r   r   r   )	r	   r>   r?   r-   r
   r†   r‡   r4   rˆ   rŸ   r   r   r   Útest_remove_multiedge‰  s    ý$z$TestMultiGraph.test_remove_multiedgeN)$ra   rb   rc   rg   rl   rz   ZetraitsZ	egraphicsZedataZdodod1Zdodod2Zdodod3Zdolrw   rx   Zsingle_edge1Zsingle_edge2Zsingle_edge3Zcasesr†   ÚmarkZparametrizer„   Zmgi_none_casesr…   Zraise_casesr‰   r�   r‘   r“   r•   r™   r›   rœ   r¡   r¢   r   r   r   r   rd   ¶   sR   



û
ý



!

rd   c                   @   sP   e Zd Z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 )ÚTestEdgeSubgraphz;Unit tests for the :meth:`MultiGraph.edge_subgraph` method.c                 C   sÆ   t  ¡ }t  |tdƒ¡ t  |tdƒ¡ tdƒD ]}d|› �|j| d< q0d|jd d d d< d|jd d d d< d|jd	 d
 d d< d|jd	 d
 d d< d|jd< || _| ddg¡| _	d S )Nr—   Únoder'   Úedge010r   r   Zedge011Zedge340r–   r˜   Úedge341r&   r�   )r–   r˜   r   )
r4   r5   Zadd_pathÚranger.   r-   r&   r   Zedge_subgraphr!   )r   r   Úir   r   r   rg   œ  s    
zTestEdgeSubgraph.setup_methodc                 C   s"   ddddgt | j ¡ ƒkst‚dS )z.Tests that the subgraph has the correct nodes.r   r   r–   r˜   N)ri   r!   r.   r
   rX   r   r   r   Útest_correct_nodes®  s    z#TestEdgeSubgraph.test_correct_nodesc                 C   s$   ddgt | jjddd�ƒks t‚dS )z.Tests that the subgraph has the correct edges.)r   r   r   r¦   )r–   r˜   r   r§   Tr'   rT   N)ri   r!   rF   r
   rX   r   r   r   Útest_correct_edges²  s    ÿz#TestEdgeSubgraph.test_correct_edgesc                 C   s.   | j  d¡ ddddgt| j ¡ ƒks*t‚dS )zkTests that adding a node to the original graph does not
        affect the nodes of the subgraph.

        r—   r   r   r–   r˜   N)r   Úadd_noderi   r!   r.   r
   rX   r   r   r   Útest_add_node¸  s    zTestEdgeSubgraph.test_add_nodec                 C   s,   | j  d¡ dddgt| j ¡ ƒks(t‚dS )ziTests that removing a node in the original graph does
        affect the nodes of the subgraph.

        r   r   r–   r˜   N)r   r�   ri   r!   r.   r
   rX   r   r   r   r‘   À  s    z!TestEdgeSubgraph.test_remove_nodec                 C   s„   | j D ] }| jj| | j j| kst‚qd| jjd d< | jjd | j jd ksTt‚d| j jd d< | jjd | j jd ks€t‚dS )z`Tests that the node attribute dictionary of the two graphs is
        the same object.

        r   r   r'   rB   r   N)r!   r   r.   r
   )r   rN   r   r   r   Útest_node_attr_dictÈ  s    
z$TestEdgeSubgraph.test_node_attr_dictc                 C   sâ   | j jdd�D ]6\}}}| jj| | | | j j| | | kst‚qd| jjd d d d< | jjd d d d | j jd d d d ks’t‚d| j jd d	 d d< | jjd d	 d d | j jd d	 d d ksÞt‚d
S )z`Tests that the edge attribute dictionary of the two graphs is
        the same object.

        T)rU   r   r   r   r'   rB   r–   r˜   N)r!   rF   r   r$   r
   )r   rM   rN   Úkr   r   r   Útest_edge_attr_dictÕ  s    .4z$TestEdgeSubgraph.test_edge_attr_dictc                 C   s   | j j| jjkst‚dS )zaTests that the graph attribute dictionary of the two graphs
        is the same object.

        N)r   r&   r!   r
   rX   r   r   r   Útest_graph_attr_dictâ  s    z%TestEdgeSubgraph.test_graph_attr_dictN)ra   rb   rc   Ú__doc__rg   rª   r«   r­   r‘   r®   r°   r±   r   r   r   r   r¤   ™  s   r¤   c                   @   s   e Zd ZdS )ÚCustomDictClassN)ra   rb   rc   r   r   r   r   r³   ê  s   r³   c                   @   s(   e Zd ZeZeZeZeZeZeZ	eZ
dS )ÚMultiGraphSubClassN)ra   rb   rc   r³   Únode_dict_factoryÚnode_attr_dict_factoryÚadjlist_outer_dict_factoryÚadjlist_inner_dict_factoryrV   rK   Zgraph_attr_dict_factoryr   r   r   r   r´   î  s   r´   c                   @   s   e Zd Zdd„ ZdS )ÚTestMultiGraphSubclassc                 C   sò   t | _dddg| _dddg| _|  ¡ | _| j | j ¡ | j ¡ | j ¡ dœ¡| j_i i i dœ| j_| jD ]@}| jD ]4}||krrdi i}|| jj| |< || jj| |< qrqh| j 	¡ | j_
| j ¡ | jj
d< | j ¡ | jj
d< | j ¡ | jj
d< d S )Nr   r   r   r   r   r   r   )r´   rE   re   rf   r	   r·   r¸   r$   r(   rµ   r%   r¶   )r   rM   rN   rO   r   r   r   rg   ù  s*    
ýÿ

z#TestMultiGraphSubclass.setup_methodN)ra   rb   rc   rg   r   r   r   r   r¹   ø  s   r¹   )Úcollectionsr   r†   Znetworkxr4   Znetworkx.utilsr   Z
test_graphr   r   Z
_TestGraphr   rd   r¤   r³   r5   r´   r¹   r   r   r   r   Ú<module>   s    + dQ
