a
    hk                     @   s~  d Z ddlZddlZddlZddlZedZedZed edZ	de	j
d< ddlZed	d
Zdd Zdd Zdd Zdd Zejddddgdfddgdfddgdfddgd ff	ejd!dd"gfd#d$ Zejddddgdfddgdfddgdfddgd ff	ejd!dd"gfd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zejd1ejejfd2d3 Zejd4d5d6gd6ffd7d8 Zejd4d5d6gd6ffd9d: Z ejd!g d;dd"d<gfd=d> Z!d?d@ Z"dAdB Z#ejdCdDdEdF Z$ejdGdHgdIgdJgg dKdIdLgg dMfdNdO Z%dPdQ Z&ejj'dRdS Z(dTdU Z)dVdW Z*dXdY Z+dZd[ Z,d\d] Z-d^d_ Z.d`da Z/ejdbdcg ddfdedf Z0dgdh Z1didj Z2ejdkdldmdn Z3dodp Z4dqdr Z5dsdt Z6dudv Z7ejdwej8ej9fdxdy Z:ejdwej8ej9fdzd{ Z;d|d} Z<d~d Z=dd Z>dd Z?ejdddLidbdiddiddiddifdd Z@dS )z,Unit tests for matplotlib drawing functions.    N
matplotlibnumpyZPSzmatplotlib.pyplotFztext.usetex      c                  C   s   zt jt jt jt jt jt jt jg} ddddg}t	| |D ]"\}}|t
fi | td q<W ztd W q ty   Y q0 n$ztd W n ty   Y n0 0 d S )Nblackd      )
node_color	node_sizewidthtest.ps)nxZdraw_circularZdraw_kamada_kawaiZdraw_planarZdraw_randomZdraw_spectraldraw_spring
draw_shell	itertoolsproductbarbellpltsavefigosunlinkOSError)Z	functionsoptionsfunctionoption r   O/var/www/auris/lib/python3.9/site-packages/networkx/drawing/tests/test_pylab.py	test_draw   s*    	r   c                  C   s   zdt tdt tddt tddg} tjt| d td W ztd W q t	yb   Y q0 n$ztd W n t	y   Y n0 0 d S )Nr   
      Znlistr   )
listranger   r   r   r   r   r   r   r   r    r   r   r   test_draw_shell_nlist+   s    &r#   c                  C   s(   t t } tjt| dtjjdd d S )Nr   T)
edge_colorr   Z	edge_cmapZwith_labels)r"   r   Znumber_of_edgesr   r   r   cmZBlues)colorsr   r   r   test_edge_colormap7   s    r'   c                   C   s   t t  d S N)r   r   r   to_directedr   r   r   r   test_arrows?   s    r*   )r$   expected)Nr   )rredr,   r-   )      ?r/   g        yellowr.   r0   )r      r   r2   limer1   r3   )#0000ffbluer4   r5   edgelistr   r2   c                 C   s<   t d}t j|t ||| d}tj| |s8J dS )z`Tests ways of specifying all edges have a single color for edges
    drawn with a LineCollectionr   posr6   r$   N)r   
path_graphdraw_networkx_edgesrandom_layoutmplr&   
same_color	get_color)r$   r+   r6   Gdrawn_edgesr   r   r   !test_single_edge_color_undirectedD   s
    
rB   c                 C   sL   t jdt jd}t j|t ||| d}|D ]}tj| |s,J q,dS )zaTests ways of specifying all edges have a single color for edges drawn
    with FancyArrowPatchesr   Zcreate_usingr8   N)	r   r:   DiGraphr;   r<   r=   r&   r>   get_edgecolor)r$   r+   r6   r@   rA   fapr   r   r   test_single_edge_color_directed^   s    rG   c                  C   s  t jdt jd} dd tt| D }dD ]j}t j| ||d}|D ]}tj|	 |sBJ qBt j| |ddg|d	}|D ]}tj|	 |sxJ qxq*t j| |g d
dd	}|D ]}tj|	 dsJ qt j| |g ddd	}|D ]}tj|	 dsJ qt j| |g d
dd	}tj|d 	 |d 	 s<J |D ]}tj|	 dr@J q@t j| |g ddd	}tj|d 	 |d 	 sJ tj|d 	 |d 	 sJ |D ]}tj|	 drJ qdS )zIf edge_color is a sequence with the same length as edgelist, then each
    value in edge_color is mapped onto each edge via colormap.r   rC   c                 S   s   i | ]}|||fqS r   r   .0nr   r   r   
<dictcomp>}       z8test_edge_color_tuple_interpretation.<locals>.<dictcomp>)r   r   r2   r   r   r2   r2   r$   r7   r2      )r6   r$   r7   rP   rQ   r   rN   r5   )r7   rP   rS   )r   r   rM   r   r2   rQ   r   N)
r   r:   rD   r"   lenr;   r=   r&   r>   rE   )r@   r9   ecrA   rF   r   r   r   $test_edge_color_tuple_interpretationy   sP    


rV   c                  C   sZ   t  } tt }d}tj| ||d}t|t|D ]\}}tj	
| |s6J q6dS )zZTest that the edge colors are cycled when there are fewer specified
    colors than edges.r,   gbrO   N)r   r)   r   r<   r;   zipr   cycler=   r&   r>   rE   r@   r9   Z
edgecolorsrA   rF   r+   r   r   r   .test_fewer_edge_colors_than_num_edges_directed   s    
r]   c                  C   sd   t jdt jd} t t}d}t j| ||d}t||dd D ]\}}tj	|
 |s@J q@dS )z\Test that extra edge colors are ignored when there are more specified
    colors than edges.r   rC   )r,   rX   rY   crO   N)r   r:   rD   r<   r   r;   rZ   r=   r&   r>   rE   r\   r   r   r   -test_more_edge_colors_than_num_edges_directed   s    
r`   c                  C   sl   t jtt tddgddd} |   }t|  dks>J tj	
|d d dsXJ |d dkshJ d S Nr7   rP   Zpurple皙?)r9   r6   r$   alpharQ   r_   )r   r;   r   r<   r?   ZsqueezerT   	get_pathsr=   r&   r>   )Zedge_collectionrU   r   r   r   3test_edge_color_string_with_global_alpha_undirected   s    re   c                  C   sr   t jt t tddgddd} t| dks2J | D ]6}| }tj	|d d ds\J |d dks6J q6d S ra   )
r   r;   r   r)   r<   rT   rE   r=   r&   r>   )rA   rF   rU   r   r   r   1test_edge_color_string_with_global_alpha_directed   s    rf   
graph_typec                 C   sV   t jd| d}dd tt|D }t ||}t|trB|d }| dksRJ dS )z^Test the default linewidth for edges drawn either via LineCollection or
    FancyArrowPatches.rQ   rC   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK      rL   z1test_edge_width_default_value.<locals>.<dictcomp>r   r2   N)r   r:   r"   rT   r;   
isinstancer!   get_linewidth)rg   r@   r9   rA   r   r   r   test_edge_width_default_value   s    
rj   )	edgewidthr+   r   r   r   c                 C   sX   t d}dd tt|D }t j||| d}t| dksDJ | |ksTJ d S )Nr   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK      rL   z;test_edge_width_single_value_undirected.<locals>.<dictcomp>r   r   )r   r:   r"   rT   r;   rd   ri   )rk   r+   r@   r9   rA   r   r   r   'test_edge_width_single_value_undirected   s
    
rn   c                 C   sd   t jdt jd}dd tt|D }t j||| d}t|dksFJ |D ]}| |ksJJ qJd S )Nr   rC   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK   	  rL   z9test_edge_width_single_value_directed.<locals>.<dictcomp>rm   r   )r   r:   rD   r"   rT   r;   ri   )rk   r+   r@   r9   rA   rF   r   r   r   %test_edge_width_single_value_directed   s    ro   rR   rP   c                 C   sV   t  }t|}d}tj||| |d}t|t|D ]\}}| |ks8J q8d S )N)      ?       @g      (@)r6   r   )	r   r)   r   r<   r;   rZ   r   r[   ri   )r6   r@   r9   ZwidthsrA   rF   Zexpected_widthr   r   r   test_edge_width_sequence  s    	
rr   c                  C   sx   t jdt jd} t | }t j| |ddgd}dd |D }t j| |dd	gdd	d
}dd |D }tj||stJ dS )zyTest that edge_vmin and edge_vmax properly set the dynamic range of the
    color map when num edges == len(edge_colors).r   rC   r   r/   rO   c                 S   s   g | ]}|  qS r   rE   rI   er   r   r   
<listcomp>(  rL   z7test_edge_color_with_edge_vmin_vmax.<locals>.<listcomp>rb   g?)r$   Z	edge_vminZ	edge_vmaxc                 S   s   g | ]}|  qS r   rs   rt   r   r   r   rv   -  rL   N)r   r:   rD   r<   r;   r=   r&   r>   )r@   r9   rA   Zorig_colorsZscaled_colorsr   r   r   #test_edge_color_with_edge_vmin_vmax!  s    
rw   c                  C   s`   t jdt jd} dd tt| D }t | |}t|dksBJ |D ]}| dksFJ qFdS )z>Test default linestyle for edges drawn with FancyArrowPatches.r   rC   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK   4  rL   z9test_directed_edges_linestyle_default.<locals>.<dictcomp>r   ZsolidNr   r:   rD   r"   rT   r;   get_linestyle)r@   r9   rA   rF   r   r   r   %test_directed_edges_linestyle_default1  s    rz   style)dashed--r2   r2   r2   c                 C   sd   t jdt jd}dd tt|D }t j||| d}t|dksFJ |D ]}| | ksJJ qJdS )zTests support for specifying linestyles with a single value to be applied to
    all edges in ``draw_networkx_edges`` for FancyArrowPatch outputs
    (e.g. directed edges).r   rC   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK   K  rL   z>test_directed_edges_linestyle_single_value.<locals>.<dictcomp>r{   r   Nrx   )r{   r@   r9   rA   rF   r   r   r   *test_directed_edges_linestyle_single_value=  s    r   	style_seqr|   r}   r~   )r}   -:r   )r}   r   r   z-.c                 C   st   t jdt jd}dd tt|D }t j||| d}t|dksFJ t|t| D ]\}}|	 |ksVJ qVdS )zTests support for specifying linestyles with sequences in
    ``draw_networkx_edges`` for FancyArrowPatch outputs (e.g. directed edges).r   rC   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK   c  rL   z:test_directed_edges_linestyle_sequence.<locals>.<dictcomp>r   r   N)
r   r:   rD   r"   rT   r;   rZ   r   r[   ry   )r   r@   r9   rA   rF   r{   r   r   r   &test_directed_edges_linestyle_sequenceS  s    r   c               
   C   s.  t  } t | }t j| |g ddddd t j| |g dddg dd t j| |d	d
d t j| |g ddd
dd t j| |g ddd
dd t j| |g ddd
dddd i }d|d< d|d< d|d< d|d< d|d< d|d< d|d< d |d!< t j| ||d"d# t j| |d d$d% t j| |d&d'id( d S ))Nr   r2   rQ   r   r,   i        ?)nodelistr	   r
   rc   )r      r      rY   )g      ?rp   r   r/   r/   rp   )r   rc   )r7   rP   rS   )r   r      )r6   r   rc   r$   )r   r   )r   r   )r   r   )r   r   T)r6   arrowsmin_source_marginmin_target_marginr   r$   z$a$r   z$b$r2   z$c$rQ   z$d$r   z$\alpha$r   z$\beta$r   z$\gamma$r   z$\delta$r      )Z	font_sizeF)edge_labelsrotater   z4-5r   )r   Zcubical_graphZspring_layoutdraw_networkx_nodesr;   Zdraw_networkx_labelsdraw_networkx_edge_labels)r@   r9   labelsr   r   r   test_labels_and_colorsk  sh    
	r   c                  C   s   t  } t \}}dddddd}t j| |dg dd	d
 t j| |ddgdd
 t j| |ddd |d t  td |S )Nr   r   r2   r   r7   r   )rp   rq   )r   r2   rQ   r   r   i  r   ztab:blue)r
   r   r	   i  r   z
tab:orangerp   r   )rc   r   g)\(?off)	r   Zhouse_graphr   subplotsr   r;   ZmarginsZtight_layoutZaxis)r@   figaxr9   r   r   r   test_house_with_colors  s$    

r   c                  C   s4   t  \} }tjt|d tjttt|d d S )Nr   )r   r   r   drawr   r   circular_layout)r   r   r   r   r   	test_axes  s    r   c                  C   s   t  } t |  d S r(   )r   Graphr   r@   r   r   r   test_empty_graph  s    r   c                  C   s   dd l } tddg}tddg}t|}ttj||g dtjj	sLJ ttj||g dtjj	sjJ tj
||g ddg ksJ tj
||g ddg ksJ tj
||g ddg ksJ tj
||g ddg ksJ d S )Nr   rP   rS   )r   T)r6   r   F)matplotlib.collectionsr   r   rD   r   rh   r   r=   collectionsZPathCollectionr;   )r   r@   DGr9   r   r   r   #test_draw_empty_nodes_return_values  s    
r   c                  C   s:   t jdt jd} t j| dgd t j| dgg dd d S )Nr   rC   )r   r2   r   r6   )r      r   )r6   r
   )r   r:   ZMultiDiGraphdraw_networkxr   r   r   r   test_multigraph_edgelist_tuples  s    r   c                     s   t t} t }|d t jt| ddgd ttj  fddt	 D }t	 }|d t jt| ||d |
d	 |d
 t jt| |d d S )N   皙?rb   )rc   c                    s   g | ]}|  qS r   r   )rI   xZ	num_nodesr   r   rv     rL   z#test_alpha_iter.<locals>.<listcomp>   )r	   rc   r2      )r   r<   r   r   figureZadd_subplotr   rT   nodesr"   append)r9   r   rc   r&   r   r   r   test_alpha_iter  s    





r   c                   C   s@   t jtdd tjtdd W d    n1 s20    Y  d S )NzReceived invalid argumentmatchbar)Zfoo)pytestraises
ValueErrorr   r   r   r   r   r   r   test_error_invalid_kwds  s    r   c                  C   sV   t g d} g d}tjtdd t j| |d W d    n1 sH0    Y  d S )N)r7   r   rQ   r   r   r2   r   )r2   rQ   r   z1arrowsize should have the same length as edgelistr   )	arrowsize)r   rD   r   r   r   r   )r@   r   r   r   r   +test_draw_networkx_arrowsize_incorrect_size  s    r   r      )r   r   r   c                 C   s|   t g d}dddd}t j||| d}t| tr>t| n| } t|| D ]*\}}t|tj	j
sfJ | |ksLJ qLd S )N)r7   r   rP   r   r7   r   r   r2   rQ   )r9   r   )r   rD   r;   rh   intr   repeatrZ   r=   patchesFancyArrowPatchZget_mutation_scale)r   r@   r9   edgesrF   r+   r   r   r   test_draw_edges_arrowsize  s    r   c                   C   s   t jttddgd d S )Nr   r   r   )r   r   r   nparrayr   r   r   r   test_np_edgelist  s    r   c                  C   sT   t d} ddd}tjt jdd t | | W d    n1 sF0    Y  d S )Nr   r   r   r7   zhas no positionr   )r   r:   r   r   NetworkXErrorr   r@   r9   r   r   r   *test_draw_nodes_missing_node_from_position  s    

r   
node_shape)osc           	      C   s   t  \}}tdg}ddd}tj|||| dd }|  ddddf }tj|||| ddd	d }|  ddddf }|d |d ksJ |d
 |d
 k sJ dS )a  Test that there is a wider gap between the node and the start of an
    incident edge when min_source_margin is specified.

    This test checks that the use of min_{source/target}_margin kwargs result
    in shorter (more padding) between the edges and source and target nodes.
    As a crude visual example, let 's' and 't' represent source and target
    nodes, respectively:

       Default:
       s-----------------------------t

       With margins:
       s   -----------------------   t

    r7   r   r   )r   r   r   NrQ   r   )r   r   r   r   r2   )r   r   r   rD   r;   get_extentsZcorners)	r   r   r   r@   r9   Zdefault_patchZdefault_extentZpadded_patchZpadded_extentr   r   r   )test_draw_edges_min_source_target_margins#  s$    
r   c                  C   sl   t  \} }t }|d |dd t|ddid }| }|jdkrZ|j	dks^J t 
| dS )zDEnsure that selfloop extent is non-zero when there is only one node.r   r   N)r   r   r   rD   add_nodeadd_edger;   r   r   heightdelaxes)r   r   r@   patchbboxr   r   r   &test_nonzero_selfloop_with_single_nodeP  s    
r   c                  C   s|   t  \} }tjdtjd}|dd dd |jD }tj||dgdd }| }|j	dkrj|j
dksnJ t | d	S )
zfEnsure that selfloop extent is non-zero when only a single edge is
    specified in the edgelist.
    rQ   rC   r2   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK   j  rL   zFtest_nonzero_selfloop_with_single_edge_in_edgelist.<locals>.<dictcomp>r   r   r   N)r   r   r   r:   rD   r   r   r;   r   r   r   r   )r   r   r@   r9   r   r   r   r   r   2test_nonzero_selfloop_with_single_edge_in_edgelista  s    r   c                  C   sF   g d} g d}d}t jj||| }t|dddf |ksBJ dS )zfTest apply_alpha when there is a mismatch between the number of
    supplied colors and elements.
    r   rW   rp   Nr_   )r   ZdrawingZnx_pylabZapply_alphaall)r   Z	colorlistrc   Zrgba_colorsr   r   r   test_apply_alphat  s
    r   c                  C   s  ddl } ddl} td}tjdtjd}dd |D }||fD ]@}tj||dd}t|t|jksjJ t|d t	j
js@J q@||fD ]&}tj||d	d}t|t	jjsJ qt||}t|t	jjsJ t||}t|t|jksJ t|d t	j
js
J dS )
a/  
    The `arrows` keyword argument is used as a 3-way switch to select which
    type of object to use for drawing edges:
      - ``arrows=None`` -> default (FancyArrowPatches for directed, else LineCollection)
      - ``arrows=True`` -> FancyArrowPatches
      - ``arrows=False`` -> LineCollection
    r   Nr   rC   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK     rL   z>test_draw_edges_toggling_with_arrows_kwarg.<locals>.<dictcomp>T)r   F)r   Zmatplotlib.patchesr   r:   rD   r;   rT   r   rh   r=   r   r   r   LineCollection)r   ZUGr   r9   r@   r   r   r   r   *test_draw_edges_toggling_with_arrows_kwarg  s"    
r   drawing_funcc                 C   sZ   dd l }td}t \}}| ||d tdd |jD sBJ |jrLJ t| d S )Nr   r   r   c                 s   s   | ]}t |tjjV  qd S r(   rh   r=   r   r   rI   r^   r   r   r   	<genexpr>  rL   z?test_draw_networkx_arrows_default_undirected.<locals>.<genexpr>)	r   r   r:   r   r   anyr   r   r   r   r   r@   r   r   r   r   r   ,test_draw_networkx_arrows_default_undirected  s    

r   c                 C   s`   dd l }tjdtjd}t \}}| ||d tdd |jD rHJ |jsRJ t	| d S )Nr   r   rC   r   c                 s   s   | ]}t |tjjV  qd S r(   r   r   r   r   r   r     s   z=test_draw_networkx_arrows_default_directed.<locals>.<genexpr>)
r   r   r:   rD   r   r   r   r   r   r   r   r   r   r   *test_draw_networkx_arrows_default_directed  s    
r   c                  C   sN   t d} | dd t \}}t j| ddg|d |jr@J t| d S )Nr   r   r7   rP   )r6   r   )r   r:   r   r   r   r   r   r   )r@   r   r   r   r   r   test_edgelist_kwarg_not_ignored  s    

r   c                  C   s   d} t  }|jdddd |jdddd t |d}dd	 |D }tjt j| d
  t j|||d W d   n1 s|0    Y  dS )zs
    draw_networkx_edge_labels should raise an informative error message when
    the edge label includes keys
    z5draw_networkx_edge_labels does not support multiedgesr   r2   r   )weightr   r   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK     rL   zEtest_draw_networkx_edge_label_multiedge_exception.<locals>.<dictcomp>r   r   N)r   Z
MultiGraphr   Zget_edge_attributesr   r   r   r   )Zexception_msgr@   r   r9   r   r   r   1test_draw_networkx_edge_label_multiedge_exception  s    r   c                  C   s6   t d} dd | jD }t j| |i di ks2J dS )zORegression test for draw_networkx_edge_labels with empty dict. See
    gh-5372.r   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK     rL   z<test_draw_networkx_edge_label_empty_dict.<locals>.<dictcomp>r   N)r   r:   r   r   r   r   r   r   (test_draw_networkx_edge_label_empty_dict  s    
r   c            
      C   s   t  \} }g d}g d}t|}dd |jD }tj|||||d t|jdks\J t	|dd t	d	d
g }t
|j|dd |D ]2\}}}	| |	sJ tj| |sJ qt | dS )ztWhen an edgelist is supplied along with a sequence of colors, check that
    the self-loops have the correct colors.)r   rP   rS   r   rl   )rQ   rQ   )ZpinkZcyanr   r-   r5   Zgreenc                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK     rL   zGtest_draw_networkx_edges_undirected_selfloop_colors.<locals>.<dictcomp>)r   r6   r$   r   Nr   r   )r   r   r   r   r   r;   rT   r   r   r   rZ   get_pathZcontains_pointr=   r&   r>   rE   r   )
r   r   r6   Zedge_colorsr@   r9   Z	sl_pointsrF   ZclrZslpr   r   r   3test_draw_networkx_edges_undirected_selfloop_colors  s    
  r   fap_only_kwargZ
arrowstyler   Zconnectionstylezarc3,rad=0.2r   r   r   c                 C   s   t d}dd |D }t \}}t|  d }tjtd| dd( t j	||fd|i|  W d	   n1 sx0    Y  t
 4 t
d
 t j	||f|dd|  W d	   n1 s0    Y  t| d	S )zUsers should get a warning when they specify a non-default value for
    one of the kwargs that applies only to edges drawn with FancyArrowPatches,
    but FancyArrowPatches aren't being used under the hood.r   c                 S   s   i | ]}|||fqS r   r   rH   r   r   r   rK     rL   zEtest_user_warnings_for_unused_edge_drawing_kwargs.<locals>.<dictcomp>r   z

The z# keyword argument is not applicabler   r   NerrorT)r   r   )r   r:   r   r   r!   keysr   ZwarnsUserWarningr;   warningscatch_warningssimplefilterr   )r   r@   r9   r   r   Z
kwarg_namer   r   r   1test_user_warnings_for_unused_edge_drawing_kwargs  s    
6

8r   )A__doc__r   r   r   r   Zimportorskipr=   r   Zuser   ZrcParamsZnetworkxr   Zbarbell_graphr   r   r#   r'   r*   markZparametrizerB   rG   rV   r]   r`   re   rf   r   rD   rj   rn   ro   rr   rw   rz   r   r   r   Zmpl_image_comparer   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s  




9


	
	

;
	
	
,"



