o
    ˷ee                     @   sB  d 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 Z/dgdh Z0didj Z1ejdkdldmdn Z2dodp Z3dqdr Z4dsdt Z5dudv Z6ejdwej7ej8fdxdy Z9ejdwej7ej8fdzd{ Z:d|d} Z;d~d Z<dd Z=dd Z>dS )z,Unit tests for matplotlib drawing functions.    N
matplotlibnumpyPSzmatplotlib.pyplotFztext.usetex      c                  C   s   zCt 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 d S  tyC   Y d S w ztd W w  tyT   Y w w )Nblackd      )
node_color	node_sizewidthtest.ps)nxdraw_circulardraw_kamada_kawaidraw_planardraw_randomdraw_spectraldraw_spring
draw_shell	itertoolsproductbarbellpltsavefigosunlinkOSError)	functionsoptionsfunctionoption r"   X/var/www/ideatree/venv/lib/python3.10/site-packages/networkx/drawing/tests/test_pylab.py	test_draw   s0   	r$   c                  C   s   z3t tdt tddt tddg} tjt| d td W ztd W d S  t	y3   Y d S w ztd W w  t	yD   Y w w )Nr   
      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   	edge_cmapwith_labels)r*   r   number_of_edgesr   r   r   cmBlues)colorsr"   r"   r#   test_edge_colormap6   s   
r3   c                   C   s   t t  d S N)r   r   r   to_directedr"   r"   r"   r#   test_arrows>   s   r6   )r,   expected)Nr   )rredr8   r9   )      ?r;   g        yellowr:   r<   )r      r   r>   limer=   r?   )#0000ffbluer@   rA   edgelistr   r>   c                 C   s<   t d}t j|t ||| d}tj| |sJ dS )z`Tests ways of specifying all edges have a single color for edges
    drawn with a LineCollectionr	   posrB   r,   N)r   
path_graphdraw_networkx_edgesrandom_layoutmplr2   
same_color	get_color)r,   r7   rB   Gdrawn_edgesr"   r"   r#   !test_single_edge_color_undirectedC   s
   
rN   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	   create_usingrD   N)	r   rF   DiGraphrG   rH   rI   r2   rJ   get_edgecolor)r,   r7   rB   rL   rM   fapr"   r"   r#   test_single_edge_color_directed]   s   rT   c                  C   s  t jdt jd} dd tt| D }dD ]5}t j| ||d}|D ]}tj|	 |s.J q!t j| |ddg|d	}|D ]}tj|	 |sIJ q<qt j| |g d
dd	}|D ]}tj|	 dseJ qXt j| |g ddd	}|D ]}tj|	 dsJ qst j| |g d
dd	}tj|d 	 |d 	 sJ |D ]}tj|	 drJ qt 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   rO   c                 S      i | ]}|||fqS r"   r"   .0nr"   r"   r#   
<dictcomp>|       z8test_edge_color_tuple_interpretation.<locals>.<dictcomp>)r   r   r>   r   r   r>   r>   r,   rC   r>      )rB   r,   rC   r^   r_   r	   r\   rA   )rC   r^   ra   )r	   r   r[   r   r>   r_   r	   N)
r   rF   rQ   r*   lenrG   rI   r2   rJ   rR   )rL   rE   ecrM   rS   r"   r"   r#   $test_edge_color_tuple_interpretationx   sT   rd   c                  C   sZ   t  } tt }d}tj| ||d}t|t|D ]\}}tj	
| |s*J qdS )zZTest that the edge colors are cycled when there are fewer specified
    colors than edges.r8   gbr]   N)r   r5   r   rH   rG   zipr   cyclerI   r2   rJ   rR   rL   rE   
edgecolorsrM   rS   r7   r"   r"   r#   .test_fewer_edge_colors_than_num_edges_directed   s   
rl   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   rO   )r8   rf   rg   cr]   N)r   rF   rQ   rH   r   rG   rh   rI   r2   rJ   rR   rj   r"   r"   r#   -test_more_edge_colors_than_num_edges_directed   s   
ro   c                  C   sl   t jtt tddgddd} |   }t|  dksJ tj	
|d d ds,J |d dks4J d S NrC   r^   purple皙?)rE   rB   r,   alphar_   rn   )r   rG   r   rH   rK   squeezerb   	get_pathsrI   r2   rJ   )edge_collectionrc   r"   r"   r#   3test_edge_color_string_with_gloabl_alpha_undirected   s   rw   c                  C   sr   t jt t tddgddd} t| dksJ | D ]}| }tj	|d d ds.J |d dks6J qd S rp   )
r   rG   r   r5   rH   rb   rR   rI   r2   rJ   )rM   rS   rc   r"   r"   r#   1test_edge_color_string_with_global_alpha_directed   s   rx   
graph_typec                 C   sV   t jd| d}dd tt|D }t ||}t|tr!|d }| dks)J dS )z^Test the default linewidth for edges drawn either via LineCollection or
    FancyArrowPatches.r_   rO   c                 S   rU   r"   r"   rV   r"   r"   r#   rY      rZ   z1test_edge_width_default_value.<locals>.<dictcomp>r   r>   N)r   rF   r*   rb   rG   
isinstancer)   get_linewidth)ry   rL   rE   rM   r"   r"   r#   test_edge_width_default_value   s   
r|   )	edgewidthr7   r	   r	   r	   c                 C   sX   t d}dd tt|D }t j||| d}t| dks"J | |ks*J d S )Nr   c                 S   rU   r"   r"   rV   r"   r"   r#   rY      rZ   z;test_edge_width_single_value_undirected.<locals>.<dictcomp>r   r	   )r   rF   r*   rb   rG   ru   r{   )r}   r7   rL   rE   rM   r"   r"   r#   'test_edge_width_single_value_undirected   s
   
r   c                 C   sd   t jdt jd}dd tt|D }t j||| d}t|dks#J |D ]
}| |ks/J q%d S )Nr   rO   c                 S   rU   r"   r"   rV   r"   r"   r#   rY     rZ   z9test_edge_width_single_value_directed.<locals>.<dictcomp>r   r	   )r   rF   rQ   r*   rb   rG   r{   )r}   r7   rL   rE   rM   rS   r"   r"   r#   %test_edge_width_single_value_directed   s   r   r`   r^   c                 C   sV   t  }t|}d}tj||| |d}t|t|D ]\}}| |ks(J qd S )N)      ?       @g      (@)rB   r   )	r   r5   r   rH   rG   rh   r   ri   r{   )rB   rL   rE   widthsrM   rS   expected_widthr"   r"   r#   test_edge_width_sequence  s   	
r   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||s:J 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	   rO   r   r;   r]   c                 S      g | ]}|  qS r"   rR   rW   er"   r"   r#   
<listcomp>'      z7test_edge_color_with_edge_vmin_vmax.<locals>.<listcomp>rr   g?)r,   	edge_vmin	edge_vmaxc                 S   r   r"   r   r   r"   r"   r#   r   ,  r   N)r   rF   rQ   rH   rG   rI   r2   rJ   )rL   rE   rM   orig_colorsscaled_colorsr"   r"   r#   #test_edge_color_with_edge_vmin_vmax   s   
r   c                  C   s`   t jdt jd} dd tt| D }t | |}t|dks!J |D ]
}| dks-J q#dS )z>Test default linestyle for edges drawn with FancyArrowPatches.r   rO   c                 S   rU   r"   r"   rV   r"   r"   r#   rY   3  rZ   z9test_directed_edges_linestyle_default.<locals>.<dictcomp>r	   solidNr   rF   rQ   r*   rb   rG   get_linestyle)rL   rE   rM   rS   r"   r"   r#   %test_directed_edges_linestyle_default0  s   r   style)dashed--r>   r>   r>   c                 C   sd   t jdt jd}dd tt|D }t j||| d}t|dks#J |D ]
}| | ks/J q%d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   rO   c                 S   rU   r"   r"   rV   r"   r"   r#   rY   J  rZ   z>test_directed_edges_linestyle_single_value.<locals>.<dictcomp>r   r	   Nr   )r   rL   rE   rM   rS   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s#J t|t| D ]\}}|	 |ks7J q+dS )zTests support for specifying linestyles with sequences in
    ``draw_networkx_edges`` for FancyArrowPatch outputs (e.g. directed edges).r   rO   c                 S   rU   r"   r"   rV   r"   r"   r#   rY   b  rZ   z:test_directed_edges_linestyle_sequence.<locals>.<dictcomp>r   r	   N)
r   rF   rQ   r*   rb   rG   rh   r   ri   r   )r   rL   rE   rM   rS   r   r"   r"   r#   &test_directed_edges_linestyle_sequenceR  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 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   r>   r_   r	   r8   i        ?)nodelistr
   r   rs   )r      r      rg   )g      ?r   r   r;   r;   r   )r   rs   )rC   r^   ra   )r	   r      )rB   r   rs   r,   )r   r   )r   r   )r   r   )r   r   )rB   min_source_marginmin_target_marginr   r,   z$a$r   z$b$r>   z$c$r_   z$d$r	   z$\alpha$r   z$\beta$r   z$\gamma$r   z$\delta$r      )	font_sizeF)edge_labelsrotater   z4-5r   )r   cubical_graphspring_layoutdraw_networkx_nodesrG   draw_networkx_labelsdraw_networkx_edge_labels)rL   rE   labelsr"   r"   r#   test_labels_and_colorsj  sf   
	
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   r>   r   rC   r   )r   r   )r   r>   r_   r	   r   i  r   ztab:blue)r   r   r
   i  r   z
tab:oranger   r   )rs   r   g)\(?off)	r   house_graphr   subplotsr   rG   marginstight_layoutaxis)rL   figaxrE   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 r4   )r   Graphr   rL   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	s&J ttj||g dtjj	s5J tj
||g ddg ksBJ tj
||g ddg ksOJ tj
||g ddg ks\J tj
||g ddg ksiJ d S )Nr   r^   ra   )r   T)rB   arrowsF)matplotlib.collectionsr   r   rQ   r   rz   r   rI   collectionsPathCollectionrG   )r   rL   DGrE   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	   rO   )r   r>   r   rB   )r%      r   )rB   r   )r   rF   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 }td t jt| ||d |	d	 td
 t jt| |d d S )N   皙?rr   )rs   c                    s   g | ]}|  qS r"   r"   )rW   x	num_nodesr"   r#   r     r   z#test_alpha_iter.<locals>.<listcomp>   )r
   rs   r>      )
r   rH   r   r   subplotr   rb   nodesr*   append)rE   rs   r2   r"   r   r#   test_alpha_iter  s   





r   c                   C   sB   t jtdd tjtdd W d    d S 1 sw   Y  d S )NzReceived invalid argumentmatchbar)foo)pytestraises
ValueErrorr   r   r   r"   r"   r"   r#   test_error_invalid_kwds  s   "r   c                  C   sX   t g d} g d}tjtdd t j| |d W d    d S 1 s%w   Y  d S )N)rC   r   r_   r   r	   r>   r	   )r>   r_   r	   z1arrowsize should have the same length as edgelistr   )	arrowsize)r   rQ   r   r   r   r   )rL   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
s3J | |ks;J q&d S )N)rC   r   r^   r   rC   r   r   r>   r_   )rE   r   )r   rQ   rG   rz   intr   repeatrh   rI   patchesFancyArrowPatchget_mutation_scale)r   rL   rE   edgesrS   r7   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   sV   t d} ddd}tjt jdd t | | W d    d S 1 s$w   Y  d S )Nr	   r   r   rC   zhas no positionr   )r   rF   r   r   NetworkXErrorr   rL   rE   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sMJ |d
 |d
 k sWJ 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

    rC   r   r   )r   r   r   Nr_   r   )r   r   r   r   r>   )r   r   r   rQ   rG   get_extentscorners)	r   r   r   rL   rE   default_patchdefault_extentpadded_patch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r-|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   rQ   add_nodeadd_edgerG   r   r   heightdelaxes)r   r   rL   patchbboxr"   r"   r#   &test_nonzero_selfloop_with_single_nodeM  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r5|j
dks7J t | d	S )
zfEnsure that selfloop extent is non-zero when only a single edge is
    specified in the edgelist.
    r_   rO   r>   c                 S   rU   r"   r"   rV   r"   r"   r#   rY   g  rZ   zFtest_nonzero_selfloop_with_single_edge_in_edgelist.<locals>.<dictcomp>r   r   r   N)r   r   r   rF   rQ   r  r   rG   r   r   r  r  )r   r   rL   rE   r  r	  r"   r"   r#   2test_nonzero_selfloop_with_single_edge_in_edgelist^  s   r  c                  C   sF   g d} g d}d}t jj||| }t|dddf |ks!J dS )zfTest apply_alpha when there is a mismatch between the number of
    supplied colors and elements.
    r   re   r   Nrn   )r   drawingnx_pylabapply_alphaall)r   	colorlistrs   rgba_colorsr"   r"   r#   test_apply_alphaq  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s5J t|d t	j
js@J q ||fD ]}tj||d	d}t|t	jjsXJ qEt||}t|t	jjshJ t||}t|t|jksyJ t|d t	j
jsJ 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	   rO   c                 S   rU   r"   r"   rV   r"   r"   r#   rY     rZ   z>test_draw_edges_toggling_with_arrows_kwarg.<locals>.<dictcomp>T)r   F)r   matplotlib.patchesr   rF   rQ   rG   rb   r   rz   rI   r   r   r   LineCollection)r   UGr   rE   rL   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 s!J |jr&J t| d S )Nr   r	   r   c                 s       | ]
}t |tjjV  qd S r4   rz   rI   r   r  rW   rm   r"   r"   r#   	<genexpr>  s    z?test_draw_networkx_arrows_default_undirected.<locals>.<genexpr>)	r   r   rF   r   r   anyr   r   r  r  r   rL   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 r$J |js)J t	| d S )Nr   r	   rO   r   c                 s   r  r4   r  r  r"   r"   r#   r    s    
z=test_draw_networkx_arrows_default_directed.<locals>.<genexpr>)
r   r   rF   rQ   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   rC   r^   )rB   r   )r   rF   r  r   r   r   r   r  )rL   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   dS 1 s?w   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   r>   r%   )weightr   r!  c                 S   rU   r"   r"   rV   r"   r"   r#   rY     rZ   zEtest_draw_networkx_edge_label_multiedge_exception.<locals>.<dictcomp>r   r   N)r   
MultiGraphr  get_edge_attributesr   r   r   r   )exception_msgrL   r   rE   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sJ dS )zORegression test for draw_networkx_edge_labels with empty dict. See
    gh-5372.r	   c                 S   rU   r"   r"   rV   r"   r"   r#   rY     rZ   z<test_draw_networkx_edge_label_empty_dict.<locals>.<dictcomp>r   N)r   rF   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 ]\}}}	| |	sWJ tj| |sbJ qIdS )ztWhen an edgelist is supplied along with a sequence of colors, check that
    the self-loops have the correct colors.)r   r^   ra   r   r~   )r_   r_   )pinkcyanr   r9   rA   greenc                 S   rU   r"   r"   rV   r"   r"   r#   rY     rZ   zGtest_draw_networkx_edges_undirected_selfloop_colors.<locals>.<dictcomp>)r   rB   r,   r	   Nr   r   )r   r   r   r   r   rG   rb   r   r   r   rh   get_pathcontains_pointrI   r2   rJ   rR   )
r   r   rB   edge_colorsrL   rE   	sl_pointsrS   clrslpr"   r"   r#   3test_draw_networkx_edges_undirected_selfloop_colors  s   
  r1  )?__doc__r   r   r   importorskiprI   r   user   rcParamsnetworkxr   barbell_graphr   r$   r+   r3   r6   markparametrizerN   rT   rd   rl   ro   rw   rx   r   rQ   r|   r   r   r   r   r   r   r   r   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&  r1  r"   r"   r"   r#   <module>   s    




9


	
	

:
	
	
,"


