o
    ˷eH                     @   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sJ |dddr%J d S )Nr   r   )K3has_edgeselfG r   ]/var/www/ideatree/venv/lib/python3.10/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sJ |d d d i ks'J |ddd u s1J |dddi ks<J 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s&J d S )Nr   r      r   r   r   r   r   r   r   )r	   dict	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s9J d S Nr   r   r   fooappendr   Hr   r   r   r   deepcopy_edge_attr$      ,0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s9J d S r   r   r!   r   r   r   shallow_copy_edge_attr)   r$   z+BaseMultiGraphTester.shallow_copy_edge_attrc                 C   sH  |j |j ksJ |j|jksJ |j|jksJ |j|jks J | sR| sR|j d d d |j d d d u s<J |j d d d |j d d d u sPJ d S | s^|j |_|j |_| sj|j |_|j |_|j|jksrJ |j|jkszJ |jd d d |jd d d u sJ |jd d d |jd d d u sJ d S )Nr   r   r   )_adj_nodegraphnameis_directed_pred_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s0J |jd d }d|jd d< |j|jksFJ ||jd d< |j|jksUJ d S Nr   r   r   r   bazadjr&   nodesr'   r   r"   r   old_foor   r   r   same_attrdictB      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s0J |jd d }d|jd d< |j|jksFJ ||jd d< |j|jksUJ d S r.   r0   r3   r   r   r   different_attrdictP   r6   z'BaseMultiGraphTester.different_attrdictc                 C   >   | j }| | t|}| || | }| || d S N)r	   add_attributesnx
MultiGraphis_shallow_copyto_undirectedis_deepcopyr   r   r"   r   r   r   test_to_undirected^      

z'BaseMultiGraphTester.test_to_undirectedc                 C   r8   r9   )r	   r:   r;   MultiDiGraphr=   to_directedr?   r@   r   r   r   test_to_directedf   rB   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s)J |dd |dddks9J 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s!J t|jd	 ddis-J d S )
Nr   r   bar)r   rH   bizr   r   r   r   )r   r   rH   )GraphrI   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s"J t fdd	 jd
dD s3J t jd
d
ddddddifdddddifgsMJ t jd
ddddgs[J d S )Nr   r   k1rM   )rH   r   k2r/   c                 3   s"    | ]\}}}t | jV  qd S r9   )
isinstanceedge_attr_dict_factory).0uvdr   r   r   	<genexpr>   s    
z6BaseMultiGraphTester.test_edge_attr.<locals>.<genexpr>Tdatakeysr^   r   )r   r   rS   rM   )r   r   rT   r/   )rP   rI   rU   r   edge_key_dict_factoryallrQ   r   r   r   r[   r   test_edge_attr   s   
z#BaseMultiGraphTester.test_edge_attrc              
   C   sP  |   }|jddddddd t|jdd	dddddd
fgs"J 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s]J d|jd d< t|jdd	dddddd
fgswJ 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sJ d S )Nr   r   r      rM   r   )rH   r^   spamrM   Tr]   )r^   rf   rM   r   r^   r      rO      listdataweight)r^   rf   rM   ri   rj   )rP   rI   r   rQ   r1   r   r   r   r   test_edge_attr4   s@   
z$BaseMultiGraphTester.test_edge_attr4N)__name__
__module____qualname__r   r   r   r#   r%   r-   r5   r7   rA   rE   rL   rR   rd   rk   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   )	r;   r<   rP   k3adjk3edgesk3nodesr	   r&   r'   )r   ed1ed2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   )rP   r)   sortedr1   items)r   r   expectedr   r   r   test_data_input   s    zTestMultiGraph.test_data_inputc           
      C   s4  t ddd}t 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s>J | j|d d}t|jddd|ksRJ | j|dd}t|jddd|ksfJ | j|dd}| t|}t||du sJ dD ]}	| jt||	d}t|||	ksJ qd S )Nrh   r   ws   rM   r   abr   r   Tmultigraph_inputr_   F)TF)r   rP   listrQ   r;   to_dict_of_dictsis_isomorphic)
r   edata0edata1keydictdodododmultiple_edgesingle_edger   r"   mgir   r   r   test_data_multigraph_input   s&   
z)TestMultiGraph.test_data_multigraph_inputrh   r   r}   bluebox)colorshape)traitsgraphicsr   r   )r   r   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s*J d S )Nr   Tr_   create_usingr   )rP   r   rQ   r;   to_networkx_graph)r   dodr   rQ   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 )NTr_   )rP   r   rQ   )r   r   rQ   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 )NTr   r   )pytestraisesr;   NetworkXErrorrP   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 s'w   Y  tt |dg W d    d S 1 sCw   Y  d S )Nr   r   jA)r	   r   r   KeyError__getitem__	TypeErrorr   r   r   r   test_getitem  s   "zTestMultiGraph.test_getitemc                 C   sp   | j }|d |jddi iiddi iidksJ ttj |d W d    d S 1 s1w   Y  d S )Nr   r   r   r   r   )r	   remove_noder1   r   r   r;   r   r   r   r   r   test_remove_node$  s   
$"zTestMultiGraph.test_remove_nodec                 C   sr   |   }|dd |jddi iiddi iidksJ |   }|jd  |jddi iiddi iidks7J d S )Nr   r   r   )rP   rI   r1   r   r   r   r   test_add_edge+  s   $
(zTestMultiGraph.test_add_edgec                 C   sp   |   }|jdddd |dd | dksJ |   }|dddi fg |dg | dks6J d S )Nr   r   rG   r   r   )rP   rI   rK   add_edges_fromr   r   r   r   test_add_edge_conflicting_key3  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s(J |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sZJ |   }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sJ ttj |dg W d    n1 sw   Y  ttj |dg W d    n1 sw   Y  tt |dg W d    d S 1 sw   Y  d S )Nr   r   r   rj      r   )rj   )r   r   r   r   )r   r   ))rj   r   )r   r      )r   r   r   )r   r   r   r   )r   )r   r   r   r      )	rP   r   r1   r&   r   r   r;   r   r   )r   r   rQ   r   r   r   r   test_add_edges_from=  s:   
"z"TestMultiGraph.test_add_edges_fromc                 C   sP   t  }tt |ddddidfg W d   dS 1 s!w   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   redN)r;   r<   r   r   r   r   r   r   r   r   4test_multigraph_add_edges_from_four_tuple_misordered^  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s#J ttj |dd W d    n1 s:w   Y  ttj |jdddd W d    d S 1 sYw   Y  d S )Nr   r   r   r   r   r   rG   )r	   rJ   r1   r   r   r;   r   r   r   r   r   test_remove_edgeh  s   4"zTestMultiGraph.test_remove_edgec                 C   sP  | j  }|dg di i}|jd|id|i||ddks!J |dg | j dd | j  }|t|jddd |ji i i dksJJ | j  }|t|jd	dd |ji i i dksfJ | j  }|t|jd	d	d |ji i i dksJ | j  }|d
dddi fdg |jddi iiddi iii dksJ d S )Nr   r   r   r   )r   r   r   T)r^   r`   Fr   r   r   r   )r	   copyremove_edges_fromr1   rI   r   rQ   r   r   kdr   r   r   test_remove_edges_fromr  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s3J |dd di i}|jd	|id	|i||ddksOJ ttj |d
d W d    d S 1 sgw   Y  d S )Nr   r   rF   rG   r   r   r   r   r   r   )r	   rI   rJ   r1   r   r   r;   r   r   r   r   r   test_remove_multiedge  s   $"z$TestMultiGraph.test_remove_multiedgeN)$rl   rm   rn   rw   r|   r   etraits	egraphicsedatadodod1dodod2dodod3dolr   r   single_edge1single_edge2single_edge3casesr   markparametrizer   mgi_none_casesr   raise_casesr   r   r   r   r   r   r   r   r   r   r   r   r   r   ro      sT    








!

ro   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< qd|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   edge011edge340r   r   edge341r(   r   )r   r   r   )
r;   r<   add_pathranger2   r1   r(   r   edge_subgraphr"   )r   r   ir   r   r   rw     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)ry   r"   r2   rc   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)   r_   N)ry   r"   rQ   rc   r   r   r   test_correct_edges  s   z#TestEdgeSubgraph.test_correct_edgesc                 C   *   | 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_nodery   r"   r2   rc   r   r   r   test_add_node     zTestEdgeSubgraph.test_add_nodec                 C   r   )ziTests that removing a node in the original graph does
        affect the nodes of the subgraph.

        r   )r   r   r   N)r   r   ry   r"   r2   rc   r   r   r   r     r   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s*J d| j jd d< | jjd | j jd ks@J dS )z`Tests that the node attribute dictionary of the two graphs is
        the same object.

        r   r   r)   rM   r   N)r"   r   r2   )r   rY   r   r   r   test_node_attr_dict  s   
 z$TestEdgeSubgraph.test_node_attr_dictc                 C   s   | j jddD ]\}}}| 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sIJ d| j jd d	 d d< | jjd d	 d d | j jd d	 d d ksoJ d
S )z`Tests that the edge attribute dictionary of the two graphs is
        the same object.

        T)r`   r   r   r   r)   rM   r   r   N)r"   rQ   r   r&   )r   rX   rY   kr   r   r   test_edge_attr_dict  s   .48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"   rc   r   r   r   test_graph_attr_dict  s   z%TestEdgeSubgraph.test_graph_attr_dictN)rl   rm   rn   __doc__rw   r   r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   s   e Zd ZdS )CustomDictClassN)rl   rm   rn   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)rl   rm   rn   r   node_dict_factorynode_attr_dict_factoryadjlist_outer_dict_factoryadjlist_inner_dict_factoryra   rV   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 ]}||krQdi i}|| jj| |< || jj| |< q7q2| j	 | j_
| j | jj
d< | j | jj
d< | j | jj
d< d S )Nrp   r   r   r   r   )r   rP   rr   rs   r	   r   r   r&   r+   r   r'   r   )r   rX   rY   rZ   r   r   r   rw     s.   




z#TestMultiGraphSubclass.setup_methodN)rl   rm   rn   rw   r   r   r   r   r     s    r   )collectionsr   r   networkxr;   networkx.utilsr   
test_graphr   r   
_TestGraphr   ro   r   r   r<   r   r   r   r   r   r   <module>   s     + aQ
