U
    9vfYI                     @   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   J/tmp/pip-unpacked-wheel-_lngutwb/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stn| s|j |_|j |_| s|j |_|j |_|j|jkst|j|jkst|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st||jd d< |j|jkst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st||jd d< |j|jkst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stt jd
ddddgst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std|jd d< t|jdd	dddddd
fgst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st| j |dd}t|jddd|kst| j |dd}|  t|}t||dkstdD ],}	| j t||	d}t|||	kstqd 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   ZblueZ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st|   }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 )zadd_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{   Z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st| j  }|t|jd	dd |ji i i dkst| 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   Z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st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st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std| j jd d	 d d< | jjd d	 d d | j jd d	 d d kst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
