o
    &?eYI                     @   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   )K3Zhas_edgeselfG r   g/home/www/facesmatcher.com/pyenv/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	   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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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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   Z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*   r,   r/   r   r   r   different_attrdictP   r1   z'BaseMultiGraphTester.different_attrdictc                 C   >   | 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^      

z'BaseMultiGraphTester.test_to_undirectedc                 C   r3   r4   )r	   r5   r6   ZMultiDiGraphr8   Zto_directedr9   r:   r   r   r   test_to_directedf   r<   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   r@   bizr   r   r   r   )r   r   r@   )GraphrA   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   k1rE   )r@   r   k2r+   c                 3   s"    | ]\}}}t | jV  qd S r4   )
isinstanceedge_attr_dict_factory).0uvdr   r   r   	<genexpr>   s    
z6BaseMultiGraphTester.test_edge_attr.<locals>.<genexpr>TdatakeysrV   r   )r   r   rK   rE   )r   r   rL   r+   )rH   rA   rM   r   edge_key_dict_factoryallrI   r   r   r   rS   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      rE   r   )r@   rV   spamrE   TrU   )rV   r^   rE   r   rV   r      rG      listdataweight)rV   r^   rE   ra   rb   )rH   rA   r   rI   r-   r
   r   r   r   test_edge_attr4   s@   
z$BaseMultiGraphTester.test_edge_attr4N)__name__
__module____qualname__r   r   r   r!   r#   r)   r0   r2   r;   r=   rD   rJ   r\   rc   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   )	r6   r7   rH   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   )rH   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s<J | j |d d}t|jddd|ksPJ | j |dd}t|jddd|ksdJ | j |dd}|  t|}t||du s}J dD ]}	| j t||	d}t|||	ksJ qd S )Nr`   r   ws   rE   r   abr   r   Tmultigraph_inputrW   F)TF)rH   listrI   r6   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   rq   bluebox)colorshape)traitsgraphicsru   rv   )r   rs   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 )Nrw   TrW   Zcreate_usingrx   )rH   ry   rI   r6   to_networkx_graph)r   dodr}   rI   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 )NTrW   )rH   ry   rI   )r   r   rI   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 )NTrw   r   )pytestraisesr6   NetworkXErrorrH   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_noder-   r   r   r6   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sJ |   }|jd  |jddi iiddi iidks7J |   }tt |d d W d    d S 1 sRw   Y  d S )Nr   r   r   Zanything)rH   rA   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sJ |   }|dddi fg |dg | dks6J d S )Nr   r   r?   r   r   )rH   rA   rC   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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   rb      r   )rb   )r   r   r   r   )r   r   ))rb   r   )r   r      )r   r   rs   )r   r   r   rs   )r   )r   r   r   r      )	rH   r   r-   r$   r   r   r6   r   r   )r   r   rI   rz   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)r6   r7   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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   r?   )r	   rB   r-   r   r   r6   r   r
   r   r   r   test_remove_edgek  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)rV   rX   Fr   r   r   r   )r	   copyZremove_edges_fromr-   rA   ry   rI   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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   r>   r?   r   r   r   r   r   r   )r	   rA   rB   r-   r   r   r6   r   r   r   r   r   test_remove_multiedge  s   $"z$TestMultiGraph.test_remove_multiedgeN)$rd   re   rf   rk   rp   r~   ZetraitsZ	egraphicsZedataZdodod1Zdodod2Zdodod3Zdolr{   r|   Zsingle_edge1Zsingle_edge2Zsingle_edge3casesr   markZparametrizer   Zmgi_none_casesr   Zraise_casesr   r   r   r   r   r   r   r   r   r   r   r   r   r   rg      sT    








!

rg   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   Zedge011Zedge340r   r   edge341r&   r   )r   r   r   )
r6   r7   Zadd_pathranger.   r-   r&   r   Zedge_subgraphr    )r   r   ir   r   r   rk     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)rm   r    r.   r[   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'   rW   N)rm   r    rI   r[   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_noderm   r    r.   r[   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   rm   r    r.   r[   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'   rE   r   N)r    r   r.   )r   rQ   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)rX   r   r   r   r'   rE   r   r   N)r    rI   r   r$   )r   rP   rQ   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    r[   r   r   r   test_graph_attr_dict  s   z%TestEdgeSubgraph.test_graph_attr_dictN)rd   re   rf   __doc__rk   r   r   r   r   r   r   r   r   r   r   r   r     s    r   c                   @   s   e Zd ZdS )CustomDictClassN)rd   re   rf   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)rd   re   rf   r   node_dict_factorynode_attr_dict_factoryadjlist_outer_dict_factoryadjlist_inner_dict_factoryrY   rN   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 ]}||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 )Nrh   r   r   r   r   )r   rH   ri   rj   r	   r   r   r$   r(   r   r%   r   )r   rP   rQ   rR   r   r   r   rk     s.   




z#TestMultiGraphSubclass.setup_methodN)rd   re   rf   rk   r   r   r   r   r     s    r   )collectionsr   r   Znetworkxr6   Znetworkx.utilsr   Z
test_graphr   r   Z
_TestGraphr   rg   r   r   r7   r   r   r   r   r   r   <module>   s     + dQ
