a
    hYI                     @   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J |ddr&J |ddds8J |dddrJJ d S )Nr   r   )K3Zhas_edgeselfG r   T/var/www/auris/lib/python3.9/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J |d d di iks6J |d d d i ksNJ |ddd u sbJ |dddi ksxJ d S )Nr   r   
      )r	   get_edge_datar
   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sLJ d S )Nr   r      r   r   r   r   r   r   r   )r	   dictZ	adjacencyr
   r   r   r   test_adjacency   s    
z#BaseMultiGraphTester.test_adjacencyc                 C   sv   |d d d d |d d d d ks,J |d d d d  d |d d d d |d d d d ksrJ d S Nr   r   r   foo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,J |d d d d  d |d d d d |d d d d ksrJ 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J |j|jks J |j|jks0J |j|jks@J | s| s|j d d d |j d d d u sxJ |j d d d |j d d d u sJ n| s|j |_|j |_| s|j |_|j |_|j|jksJ |j|jksJ |jd d d |jd d d u sJ |jd d d |jd d d u sFJ d S )Nr   r   r   )_adj_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:J ||j d d d d< |j|jks`J |jd d }d|jd d< |j|jksJ ||jd d< |j|jksJ d S Nr   r   r   r   bazadjr#   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:J ||j d d d d< |j|jks`J |jd d }d|jd d< |j|jksJ ||jd d< |j|jksJ 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 r1   )r	   r2   r3   ZMultiDiGraphr5   Zto_directedr6   r7   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sRJ |dd |dddksrJ d S )Nr   parallel edgekeyr   r   )r	   add_edgeremove_edgenumber_of_edgesr
   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sBJ t|jd	 ddisZJ d S )
Nr   r   bar)r   r<   bizr   r   r   r   )r   r   r<   )Graphr=   r   edgesr
   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sDJ t fdd	 jd
dD sfJ t jd
d
ddddddifdddddifgsJ t jd
ddddgsJ d S )Nr   r   k1rA   )r<   r   k2r*   c                 3   s    | ]\}}}t | jV  qd S r1   )
isinstanceedge_attr_dict_factory).0uvdr   r   r   	<genexpr>   s   z6BaseMultiGraphTester.test_edge_attr.<locals>.<genexpr>TdatakeysrR   r   )r   r   rG   rA   )r   r   rH   r*   )rD   r=   rI   r   edge_key_dict_factoryallrE   r   r   r   rO   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sDJ d|d d d d< t|jdd	dddddd
fgs~J d|jd d d d< t|jdd	dddddd
fgsJ d|jd d< t|jdd	dddddd
fgsJ 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sNJ d S )Nr   r   r      rA   r   )r<   rR   spamrA   TrQ   )rR   rZ   rA   r   rR   r      rC      listdataweight)rR   rZ   rA   r]   r^   )rD   r=   r   rE   r,   r
   r   r   r   test_edge_attr4   s@    
z$BaseMultiGraphTester.test_edge_attr4N)__name__
__module____qualname__r   r   r   r!   r"   r(   r/   r0   r8   r9   r@   rF   rX   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| _g d| _g d| _|  | _| 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   r   r   r   )	r3   r4   rD   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&J dddi iifdddi iifg}t|j |ks\J d S )Nr   r   r   test)r&   r   )rD   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sxJ | j |d d}t|jddd|ksJ | j |dd}t|jddd|ksJ | j |dd}|  t|}t||du sJ dD ],}	| j t||	d}t|||	ksJ qd S )Nr\   r   ws   rA   r   abr   r   Tmultigraph_inputrS   F)TF)rD   listrE   r3   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(J tj|| j |d}t|jddd|ksTJ d S )Nrs   TrS   Zcreate_usingrt   )rD   ru   rE   r3   to_networkx_graph)r   dodry   rE   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$J d S )NTrS   )rD   ru   rE   )r   r   rE   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raisesr3   NetworkXErrorrD   r   )r   r   r   r   r   test_non_multigraph_input_raise  s    z.TestMultiGraph.test_non_multigraph_input_raisec                 C   s   | j }|d di idi idks$J tt |d W d    n1 sN0    Y  tt |dg W d    n1 s0    Y  d S )Nr   r   jA)r	   r   r   KeyError__getitem__	TypeErrorr
   r   r   r   test_getitem  s    (zTestMultiGraph.test_getitemc                 C   sn   | j }|d |jddi iiddi iidks4J ttj |d W d    n1 s`0    Y  d S )Nr   r   r   r   r   )r	   remove_noder,   r   r   r3   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s8J |   }|jd  |jddi iiddi iidksnJ |   }tt |d d W d    n1 s0    Y  d S )Nr   r   r   Zanything)rD   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s4J |   }|dddi fg |dg | dkslJ d S )Nr   r   r;   r   r   )rD   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sPJ |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sJ |   }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J ttj |dg W d    n1 s@0    Y  ttj |dg W d    n1 sz0    Y  tt |dg W d    n1 s0    Y  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      )	rD   r   r,   r#   r   r   r3   r   r   )r   r   rE   rv   r   r   r   test_add_edges_from@  s4    
,,z"TestMultiGraph.test_add_edges_fromc                 C   sN   t  }tt( |ddddidfg W d   n1 s@0    Y  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)r3   r4   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sFJ ttj |dd W d    n1 st0    Y  ttj  |jdddd W d    n1 s0    Y  d S )Nr   r   r   r   r   r   r;   )r	   r>   r,   r   r   r3   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sBJ |dg | j dd | j  }|t|jddd |ji i i dksJ | j  }|t|jd	dd |ji i i dksJ | j  }|t|jd	d	d |ji i i dksJ | j  }|d
dddi fdg |jddi iiddi iii dksPJ d S )Nr   r   r   r   )r   r   r   T)rR   rT   Fr   r   r   r   )r	   copyZremove_edges_fromr,   r=   ru   rE   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sfJ |dd di i}|jd	|id	|i||ddksJ ttj |d
d W d    n1 s0    Y  d S )Nr   r   r:   r;   r   r   r   r   r   r   )r	   r=   r>   r,   r   r   r3   r   r   r   r   r   test_remove_multiedge  s    $z$TestMultiGraph.test_remove_multiedgeN)$r`   ra   rb   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   rc      sR   








!

rc   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   )
r3   r4   Zadd_pathranger-   r,   r%   r   Zedge_subgraphr    )r   r   ir   r   r   rg     s    
zTestEdgeSubgraph.setup_methodc                 C   s   g dt | j ksJ dS )z.Tests that the subgraph has the correct nodes.r   r   r   r   N)ri   r    r-   rW   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 J dS )z.Tests that the subgraph has the correct edges.)r   r   r   r   )r   r   r   r   Tr&   rS   N)ri   r    rE   rW   r   r   r   test_correct_edges  s    z#TestEdgeSubgraph.test_correct_edgesc                 C   s*   | j d g dt| j ks&J dS )zkTests that adding a node to the original graph does not
        affect the nodes of the subgraph.

        r   r   N)r   add_noderi   r    r-   rW   r   r   r   test_add_node  s    zTestEdgeSubgraph.test_add_nodec                 C   s*   | j d g dt| j ks&J 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-   rW   r   r   r   r     s    z!TestEdgeSubgraph.test_remove_nodec                 C   s   | j D ] }| jj| | j j| ksJ qd| jjd d< | jjd | j jd ksTJ d| j jd d< | jjd | j jd ksJ dS )z`Tests that the node attribute dictionary of the two graphs is
        the same object.

        r   r   r&   rA   r   N)r    r   r-   )r   rM   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J qd| jjd d d d< | jjd d d d | j jd d d d ksJ d| j jd d	 d d< | jjd d	 d d | j jd d	 d d ksJ d
S )z`Tests that the edge attribute dictionary of the two graphs is
        the same object.

        T)rT   r   r   r   r&   rA   r   r   N)r    rE   r   r#   )r   rL   rM   kr   r   r   test_edge_attr_dict  s    .4z$TestEdgeSubgraph.test_edge_attr_dictc                 C   s   | j j| jju sJ dS )zaTests that the graph attribute dictionary of the two graphs
        is the same object.

        N)r   r%   r    rW   r   r   r   test_graph_attr_dict  s    z%TestEdgeSubgraph.test_graph_attr_dictN)r`   ra   rb   __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)r`   ra   rb   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)r`   ra   rb   r   node_dict_factorynode_attr_dict_factoryadjlist_outer_dict_factoryadjlist_inner_dict_factoryrU   rJ   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 | _g d| _g d| _|  | _| j| j | j | j d| j_i i i d| j_| jD ]@}| jD ]4}||krndi i}|| jj| |< || jj| |< qnqd| j	 | j_
| j | jj
d< | j | jj
d< | j | jj
d< d S )Nrd   r   r   r   r   )r   rD   re   rf   r	   r   r   r#   r'   r   r$   r   )r   rL   rM   rN   r   r   r   rg     s*    




z#TestMultiGraphSubclass.setup_methodN)r`   ra   rb   rg   r   r   r   r   r     s   r   )collectionsr   r   Znetworkxr3   Znetworkx.utilsr   Z
test_graphr   r   Z
_TestGraphr   rc   r   r   r4   r   r   r   r   r   r   <module>   s    + dQ
