
    wg@                     \    d dl Z d dlZd dlmZmZmZ  G d d      Zd Zd Z	 G d d      Z
y)	    N)check_planarity_recursiveget_counterexampleget_counterexample_recursivec                       e Zd ZdZedd       Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)TestLRPlanaritya`  Nose Unit tests for the :mod:`networkx.algorithms.planarity` module.

    Tests three things:
    1. Check that the result is correct
        (returns planar if and only if the graph is actually planar)
    2. In case a counter example is returned: Check if it is correct
    3. In case an embedding is returned: Check if its actually an embedding
    Nc                     t        j                  | d      \  }}t        | d      \  }}||rd}nd}||k(  sJ |       ||k(  sJ |       |rt        | |       t        | |       yt	        | |       t	        | |       y)a,  Raises an exception if the lr_planarity check returns a wrong result

        Parameters
        ----------
        G : NetworkX graph
        is_planar : bool
            The expected result of the planarity check.
            If set to None only counter example or embedding are verified.

        TNz/Wrong planarity check result. Should be planar.z3Wrong planarity check result. Should be non-planar.)nxcheck_planarityr   check_embeddingcheck_counterexample)G	is_planaris_planar_lrresultis_planar_lr_rec
result_recmsgs          m/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/networkx/algorithms/tests/test_planarity.pycheck_graphzTestLRPlanarity.check_graph   s      "11!T:f'@D'I$* GK ,1c1, 005#50Av&Az* !F+ J/    c                 X    g d}| j                  t        j                  |      d       y )N)      r      r      r      r       )r"   r   r      )r$   r   r   r   r   r$   r$   r"   Tr   r   r	   Graphselfes     r   test_simple_planar_graphz(TestLRPlanarity.test_simple_planar_graph:   s&    
 	!5r   c                 X    g d}| j                  t        j                  |      d       y )N))r   r   r   r   )r   r   )r   r   )r$   r$   r   r   r   r#   )r   r$   r%   r   r   r$   r&   Tr(   r)   r+   s     r   test_planar_with_selfloopz)TestLRPlanarity.test_planar_with_selfloopJ   s&    
 	!5r   c                 R    | j                  t        j                  dd      d       y )Nr   Fr(   )r   r	   complete_bipartite_graphr,   s    r   	test_k3_3zTestLRPlanarity.test_k3_3\   s"    44Q:eLr   c                 P    | j                  t        j                  d      d       y Nr$   Fr(   )r   r	   complete_graphr6   s    r   test_k5zTestLRPlanarity.test_k5_   s     **1-?r   c                 X    g d}| j                  t        j                  |      d       y )N)r   r   r   r   r&   r$   r    )r    r   Tr(   r)   r+   s     r   test_multiple_components_planarz/TestLRPlanarity.test_multiple_components_planarb   s"    <!5r   c                 z    t        j                  d      }|j                  g d       | j                  |d       y )Nr$   )r!   r"      )rB   r    Fr(   )r	   r:   add_edges_fromr   r,   r   s     r   #test_multiple_components_non_planarz3TestLRPlanarity.test_multiple_components_non_planarf   s6    a  	
12e,r   c                     t        j                  d      }t        d      D ]  }|j                  ||        | j	                  |d       y r9   )r	   r:   rangeadd_edger   )r,   r   is      r   test_non_planar_with_selfloopz-TestLRPlanarity.test_non_planar_with_selfloopm   sF    a q 	AJJq!	e,r   c                 X    g d}| j                  t        j                  |      d       y )N)
r#   )r   r    r   r"   r   r    r   r2   )r   r"   r&   r   r   r"   Fr(   r)   r+   s     r   test_non_planar1z TestLRPlanarity.test_non_planar1t   s&    
 	!6r   c                 \    ddg}t        j                  |      }| j                  |d       y )Nr   r0   Tr(   r	   r*   r   r,   r-   r   s      r   	test_loopzTestLRPlanarity.test_loop   s,    VHHQKd+r   c                     ddg}t        j                  |      }|j                  dd       | j                  |d       y )Nr   r   r   r   Tr(   )r	   r*   remove_edger   rR   s      r   	test_compzTestLRPlanarity.test_comp   s:    VHHQK	ad+r   c                 \    g d}t        j                  |      }| j                  |d       y )N)r   r1   r   r   r#   rL   )r   rB   )r   
   r      r   r%   rM   )r   r"   )r   	   )r   rY   )r   r[   r   r&   r   rN   r'   r!   rA   )r"   r\   r"   rY   )rB   rY   )r\   rY   )rY   r[   Tr(   rQ   rR   s      r   test_goldner_hararyz#TestLRPlanarity.test_goldner_harary   s+    
: HHQKd+r   c                 X    t        j                  g d      }| j                  |d       y )N)r   r   r   r   r   r=   Tr(   )r	   
MultiGraphr   rD   s     r   test_planar_multigraphz&TestLRPlanarity.test_planar_multigraph   s$    MMJKd+r   c                     t        j                  t        j                  d            }|j                  dgdz         | j	                  |d       y )Nr$   r   Fr(   )r	   r`   r:   rC   r   rD   s     r   test_non_planar_multigraphz*TestLRPlanarity.test_non_planar_multigraph   sB    MM"++A./	&A&e,r   c                 X    t        j                  g d      }| j                  |d       y )N)r   r   r%   )r   r   )r   r   rX   )r   r   Tr(   )r	   DiGraphr   rD   s     r   test_planar_digraphz#TestLRPlanarity.test_planar_digraph   s$    JJOPd+r   c                     t        j                  t        j                  d            }|j                  dd       |j                  dd       | j	                  |d       y )Nr$   r   r   r   Fr(   )r	   re   r:   rU   r   rD   s     r   test_non_planar_digraphz'TestLRPlanarity.test_non_planar_digraph   sJ    JJr((+,	a	ae,r   c                 t    t        j                         }|j                  d       | j                  |d       y )Nr   Tr(   )r	   r*   add_noder   rD   s     r   test_single_componentz%TestLRPlanarity.test_single_component   s+    HHJ	

1d+r   c                 X    t        j                  g d      }| j                  |d       y )N)
)r   rY   r      r   rn   )r"   r[   r   rB   )rB   rn   r   r   r   r"   )r   rY   rL   Tr(   rQ   rD   s     r   test_graph1zTestLRPlanarity.test_graph1   s*    HH
 	d+r   c                 X    t        j                  g d      }| j                  |d       y )N)r   )r   rn   )r   rn   r&   r]   rL   r   r   rM   r>   )r"   rn   )r   rB   rp   )r   r\   rm   r!   )r   r    )r   rB   Fr(   rQ   rD   s     r   test_graph2zTestLRPlanarity.test_graph2   s*    HH
* 	e,r   c                 X    t        j                  g d      }| j                  |d       y )N)rr   )r   r[   r   )rB   r\   )r   r[   rL   ro   rZ   r2   r'   r1   )r   r   )r$   r[   )r$   rn   Fr(   rQ   rD   s     r   test_graph3zTestLRPlanarity.test_graph3   s*    HH
$ 	e,r   c                     t        j                  t        j                        5  t        j                         }|j                  d       t        |       d d d        y # 1 sw Y   y xY wNr   )pytestraisesr	   NetworkXExceptionr*   rj   r   rD   s     r   test_counterexample_planarz*TestLRPlanarity.test_counterexample_planar
  sG    ]]2//0 	"
AJJqMq!		" 	" 	"   1AA'c                     t        j                  t        j                        5  t        j                         }|j                  d       t        |       d d d        y # 1 sw Y   y xY wrz   )r{   r|   r	   r}   r*   rj   r   rD   s     r   $test_counterexample_planar_recursivez4TestLRPlanarity.test_counterexample_planar_recursive  sG    ]]2//0 	,
AJJqM(+		, 	, 	,r   c                 r   d}t        j                  |      }t        j                  |      \  }}|du sJ |j                  dd       | j	                  |d       |j                  ddd       |j                  ddd       | j	                  |d       |j                  d       | j	                  |d       y )	N))r   r   r   r   r   )r   r   rq   ru   Tr   r   r(   r   r   )ru   r1   )r	   r*   r
   rU   r   add_half_edge_ccwadd_half_edge_cwremove_edges_from)r,   edgesr   certPs        r   'test_edge_removal_from_planar_embeddingz7TestLRPlanarity.test_edge_removal_from_planar_embedding  s    HHHUO$$Q'at||	ad+	Aq!$	1a#d+	,-d+r   )N)__name__
__module____qualname____doc__staticmethodr   r.   r3   r7   r;   r?   rE   rJ   rO   rS   rV   r^   ra   rc   rf   rh   rk   rs   rv   rx   r~   r   r    r   r   r   r      s     "0 "0H6 6$M@6--7 ,, ,D,-
,-,,"-0-*",,r   r   c                    t        |t        j                        st        j                  d      |j	                          t        | j                        t        |j                        k(  sJ d       t               }| j                  D ]@  }|d   |d   k7  s|j                  |d   |d   f       |j                  |d   |d   f       B |t        |j                        k(  sJ d       y)a;  Raises an exception if the combinatorial embedding is not correct

    Parameters
    ----------
    G : NetworkX graph
    embedding : a dict mapping nodes to a list of edges
        This specifies the ordering of the outgoing edges from a node for
        a combinatorial embedding

    Notes
    -----
    Checks the following things:
        - The type of the embedding is correct
        - The nodes and edges match the original graph
        - Every half edge has its matching opposite half edge
        - No intersections of edges (checked by Euler's formula)
    z-Bad embedding. Not of type nx.PlanarEmbeddingz4Bad embedding. Nodes don't match the original graph.r   r   z4Bad embedding. Edges don't match the original graph.N)	
isinstancer	   PlanarEmbeddingr}   check_structuresetnodesr   add)r   	embeddingg_edgesedges       r   r   r   '  s    & i!3!34""#RSS  qww<3  >=> 
 eG ,7d1gKKa$q'*+KKa$q'*+, c  >=> r   c                 X   t        j                  |      }|D ]'  }|j                  ||      s|j                  ||       ) t	        |      }t        |      dkD  r|j                         }||vr#|j                  |   }|dk(  rit        ||         }t        |      }t        |      }|j                  |       |j                  |       |j                  |       |j                  ||       t        |      dkD  rt        |      dk(  r?t        j                  t        j                  d      |      st        j                  d      yt        |      dk(  r@t        j                  t        j                   dd      |      st        j                  d      yt        j                  d      )zRaises an exception if the counterexample is wrong.

    Parameters
    ----------
    G : NetworkX graph
    subdivision_nodes : set
        A set of nodes inducing a subgraph as a counterexample
    r   r   r$   zBad counter example.r    r   N)r	   r*   has_edgerU   listlenpopdegreeiternextappendremove_noderH   is_isomorphicr:   r}   r5   )r   	sub_graphucontractcontract_noder   	neighborsvs           r   r   r   Q  s    #I  (a#!!!Q'(
 IH h-!
 	)!!-0Q;Y}56IYAYAOOAOOA!!-0q!$# h-!
( 9~ 1 1! 4i@&&'=>> A	Y1	 ; ;Aq A9M&&'=>> N ""#9::r   c                   d    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zed        Zy)TestPlanarEmbeddingClassc                 z   t        j                         }|j                  dd       t        j                  t         j
                  d      5  |j                  ddd       d d d        t        j                  t         j
                  d      5  |j                  ddd	       d d d        t        j                  t         j
                  d
      5  |j                  dddd       d d d        t        j                  t         j
                  d      5  |j                  dd       d d d        |j                  ddd       |j                  ddd	       t        |j                  d            dddddfdddddfdddddfgk(  sJ y # 1 sw Y   -xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr   r   z!Invalid clockwise reference node.matchr   r   cwz(Invalid counterclockwise reference node.ccwz$Only one of cw/ccw can be specified.r   r   zNNode already has out-half-edge\(s\), either cw or ccw reference node required.T)data)r   r   )r	   r   add_half_edger{   r|   r}   sortedr   r,   r   s     r   test_add_half_edgez+TestPlanarEmbeddingClass.test_add_half_edge  s   &&(	1%]]  (K
 	0 ##AqQ#/	0 ]]  (R
 	1 ##Aqa#0	1 ]]  (N
 	7 ##AqQA#6	7 ]]  6
 	* ##Aq)	* 	1+1!,ioo4o011A&'!A&'!A&'6
 
 	
 
/	0 	0	1 	1	7 	7	* 	*s0   FFF%F1FF"%F.1F:c                 l    | j                  d      }|j                         }g ddgdgdgd}||k(  sJ y )Nr   )r   r   r   r   )r   r   r   r   )get_star_embeddingget_data)r,   r   r   data_cmps       r   test_get_dataz&TestPlanarEmbeddingClass.test_get_data  sB    ++A.	!!# aSaSaS9xr   c           
      v   t        j                         }|j                  g dg dddgg dg dddgg dd	       |j                  d
       |j	                          t        j                         }|j                  ddgg dddgg dddgddgg dd	       t         j
                  j                  ||      sJ y )N)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"   ))r$   r   r#   )r   r    r   )r	   r   set_datar   r   utilsgraphs_equal)r,   r   embedding_expecteds      r   test_edge_removalz*TestPlanarEmbeddingClass.test_edge_removal  s    &&(	q6q6
	
 	##$45!!#//1##q6q6q6q6
	
 xx$$Y0BCCCr   c                     t        j                  di idi id      }t        j                  t         j                        5  |j                          d d d        y # 1 sw Y   y xY w)Nr   r   r   r	   r   r{   r|   r}   r   r   s     r   test_missing_edge_orientationz6TestPlanarEmbeddingClass.test_missing_edge_orientation  sR    &&Ar72w'?@	]]2//0 	(%%'	( 	( 	(s    AA#c                     t        j                  ddddiddddidi idi id      }t        j                  t         j                        5  |j                          d d d        y # 1 sw Y   y xY w)Nr   r   r   r   )r   r   r   r   r   r   s     r   test_invalid_edge_orientationz6TestPlanarEmbeddingClass.test_invalid_edge_orientation  st    &&a*+a*+r7r7	
	 ]]2//0 	(%%'	( 	( 	(s   A&&A/c                     t        j                         }|j                  dd       t        j                  t         j
                        5  |j                          d d d        y # 1 sw Y   y xY wNr   r   )r	   r   r   r{   r|   r}   r   r   s     r   test_missing_half_edgez/TestPlanarEmbeddingClass.test_missing_half_edge  sS    &&(	1%]]2//0 	(%%'	( 	( 	(s   
A$$A-c                 8   t        j                         }t        d      D ]0  }d }t        d      D ]  }||k7  s	|j                  |||       |}  2 t	        j
                  t         j                        5  |j                          d d d        y # 1 sw Y   y xY w)Nr$   r   )r	   r   rG   r   r{   r|   r}   r   )r,   r   rI   refjs        r   !test_not_fulfilling_euler_formulaz:TestPlanarEmbeddingClass.test_not_fulfilling_euler_formula  s    &&(	q 	AC1X 6++AqS+9C	 ]]2//0 	(%%'	( 	( 	(s   6BBc                     t        j                         }t        j                  t         j                  d      5  |j                  ddd       d d d        y # 1 sw Y   y xY w)NzInvalid reference node.r   r   r   r   r   )r	   r   r{   r|   r}   r   r   s     r   test_missing_referencez/TestPlanarEmbeddingClass.test_missing_reference  sO    &&(	]]2//7PQ 	1##Aqa#0	1 	1 	1s   AA!c                 P    t        j                         }|j                  dd       y r   )r	   r   connect_componentsr   s     r   test_connect_componentsz0TestPlanarEmbeddingClass.test_connect_components  s     &&(	$$Q*r   c                     t        j                         }|j                  dd       |j                  dd       |j                  dd      }|ddgk(  sJ y r   )r	   r   r   traverse_face)r,   r   faces      r   test_successful_face_traversalz7TestPlanarEmbeddingClass.test_successful_face_traversal  sR    &&(	1%1%&&q!,1v~~r   c                     t        j                  ddddiddddid      }t        j                  t         j                        5  |j                  dd       d d d        y # 1 sw Y   y xY w)Nr   r   r   r   r   )r	   r   r{   r|   r}   r   r   s     r    test_unsuccessful_face_traversalz9TestPlanarEmbeddingClass.test_unsuccessful_face_traversal  sg    &&1Q'(a!1D-EF
	 ]]2//0 	*##Aq)	* 	* 	*s   A""A+c                    t        j                         }|j                  d       |j                  dg       t	        j
                  t              5  |j                  dd       d d d        t	        j
                  t              5  |j                  ddg       d d d        t	        j
                  t              5  |j                  ddg       d d d        y # 1 sw Y   txY w# 1 sw Y   KxY w# 1 sw Y   y xY w)	N*   )      r   r   rq   rX   )r   r   i^  )r   r   }   )
r	   r   rj   add_nodes_fromr{   r|   NotImplementedErrorrH   rC   add_weighted_edges_fromr   s     r   test_forbidden_methodsz/TestPlanarEmbeddingClass.test_forbidden_methods  s    &&(	2  (,]]./ 	%q!$	%]]./ 	7$$ff%56	7]]./ 	J--{K.HI	J 	J		% 	%	7 	7	J 	Js$   CC#:C/C #C,/C8c                     t        j                         }d }t        d|       D ]*  }|j                  d||       |}|j                  |d       , |S )Nr   r   r   )r	   r   rG   r   )nr   r   rI   s       r   r   z+TestPlanarEmbeddingClass.get_star_embedding  s\    &&(	q! 	*A##AqS#1C##Aq)	* r   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     sU    
@ D<(
((	(1
+*	J  r   r   )r{   networkxr	   networkx.algorithms.planarityr   r   r   r   r   r   r   r   r   r   <module>r      s:      Y, Y,x'>T0;fS Sr   