o
    ]Zh@                     @   sT   d dl Z d dlZd dlmZmZmZ G dd dZdd Zdd Z	G d	d
 d
Z
dS )    N)check_planarity_recursiveget_counterexampleget_counterexample_recursivec                   @   s   e Zd ZdZed1d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!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 ZdS )2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                 C   s   t | d\}}t| d\}}|dur*|rd}nd}||ks"J |||ks*J ||r8t| | t| | dS t| | t| | dS )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_planarZis_planar_lrresultZis_planar_lr_recZ
result_recmsg r   W/var/www/auris/lib/python3.10/site-packages/networkx/algorithms/tests/test_planarity.pycheck_graph   s   

zTestLRPlanarity.check_graphc                 C       g d}| j t|dd d S )N)      r      r      r      r      )r   r   r      )r   r   r   r   r   r   r   r   Tr   r   r   Graphselfer   r   r   test_simple_planar_graph:   s   z(TestLRPlanarity.test_simple_planar_graphc                 C   r   )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%   r   r   r   test_planar_with_selfloopJ   s   z)TestLRPlanarity.test_planar_with_selfloopc                 C   s   | j tdddd d S )Nr   Fr"   )r   r   complete_bipartite_graphr&   r   r   r   	test_k3_3\   s   zTestLRPlanarity.test_k3_3c                 C   s   | j tddd d S Nr   Fr"   )r   r   complete_graphr.   r   r   r   test_k5_   s   zTestLRPlanarity.test_k5c                 C   r   )N)r   r   r   r   r    r   r   )r   r   Tr"   r#   r%   r   r   r   test_multiple_components_planarb   s   z/TestLRPlanarity.test_multiple_components_planarc                 C   s*   t d}|g d | j|dd d S )Nr   )r   r      )r7   r   Fr"   )r   r1   add_edges_fromr   r&   r
   r   r   r   #test_multiple_components_non_planarf   s   
z3TestLRPlanarity.test_multiple_components_non_planarc                 C   s6   t d}tdD ]}||| q	| j|dd d S r0   )r   r1   rangeadd_edger   )r&   r
   ir   r   r   test_non_planar_with_selfloopm   s   
z-TestLRPlanarity.test_non_planar_with_selfloopc                 C   r   )N)
r   )r   r   r   r   r   r   r   r+   )r   r   r    r   r   r   Fr"   r#   r%   r   r   r   test_non_planar1t   s   z TestLRPlanarity.test_non_planar1c                 C   s$   ddg}t |}| j|dd d S )Nr   r)   Tr"   r   r$   r   r&   r'   r
   r   r   r   	test_loop      
zTestLRPlanarity.test_loopc                 C   s0   ddg}t |}|dd | j|dd d S )Nr   r   r   r   Tr"   )r   r$   remove_edger   rD   r   r   r   	test_comp   s   
zTestLRPlanarity.test_compc                 C   s$   g d}t |}| j|dd d S )N)r   r*   r   r   r   r?   )r   r7   )r   
   r      r   r   r@   )r   r   )r   	   )r   rJ   )r   rL   r   r    r   rA   r!   r   r6   )r   rM   r   rJ   )r7   rJ   )rM   rJ   )rJ   rL   Tr"   rC   rD   r   r   r   test_goldner_harary   s   
z#TestLRPlanarity.test_goldner_hararyc                 C       t g d}| j|dd d S )N)r   r   r   r   r   r3   Tr"   )r   
MultiGraphr   r9   r   r   r   test_planar_multigraph      z&TestLRPlanarity.test_planar_multigraphc                 C   s2   t t d}|dgd  | j|dd d S )Nr   r   Fr"   )r   rQ   r1   r8   r   r9   r   r   r   test_non_planar_multigraph   s   z*TestLRPlanarity.test_non_planar_multigraphc                 C   rP   )N)r   r   r   )r   r   )r   r   rI   )r   r   Tr"   )r   DiGraphr   r9   r   r   r   test_planar_digraph   rS   z#TestLRPlanarity.test_planar_digraphc                 C   s:   t t d}|dd |dd | j|dd d S )Nr   r   r   r   Fr"   )r   rU   r1   rG   r   r9   r   r   r   test_non_planar_digraph   s   z'TestLRPlanarity.test_non_planar_digraphc                 C   s$   t  }|d | j|dd d S )Nr   Tr"   )r   r$   add_noder   r9   r   r   r   test_single_component   rF   z%TestLRPlanarity.test_single_componentc                 C   rP   )N)
)r   rJ   r      r   r[   )r   rL   r   r7   )r7   r[   r   r   r   r   )r   rJ   r?   Tr"   rC   r9   r   r   r   test_graph1   s   zTestLRPlanarity.test_graph1c                 C   rP   )N)r   )r   r[   )r   r[   r    rN   r?   r   r   r@   r4   )r   r[   )r   r7   r]   )r   rM   rZ   r   )r   r   )r   r7   Fr"   rC   r9   r   r   r   test_graph2   s   zTestLRPlanarity.test_graph2c                 C   rP   )N)r_   )r   rL   r   )r7   rM   )r   rL   r?   r\   rK   r+   r!   r*   )r   r   )r   rL   )r   r[   Fr"   rC   r9   r   r   r   test_graph3   s   zTestLRPlanarity.test_graph3c                 C   L   t tj t }|d t| W d    d S 1 sw   Y  d S Nr   )pytestraisesr   NetworkXExceptionr$   rX   r   r9   r   r   r   test_counterexample_planar
  
   

"z*TestLRPlanarity.test_counterexample_planarc                 C   rd   re   )rf   rg   r   rh   r$   rX   r   r9   r   r   r   $test_counterexample_planar_recursive  rj   z4TestLRPlanarity.test_counterexample_planar_recursivec                 C   s   d}t |}t |\}}|du sJ |dd | j|dd |ddd |ddd | j|dd |d | j|dd d S )	N))r   r   r   r   r   )r   r   r^   ra   Tr   r   r"   r   r   )ra   r*   )r   r$   r   rG   r   Zadd_half_edge_ccwZadd_half_edge_cwremove_edges_from)r&   edgesr
   certPr   r   r   'test_edge_removal_from_planar_embedding  s   

z7TestLRPlanarity.test_edge_removal_from_planar_embedding)N)__name__
__module____qualname____doc__staticmethodr   r(   r,   r/   r2   r5   r:   r>   rB   rE   rH   rO   rR   rT   rV   rW   rY   r`   rb   rc   ri   rk   rp   r   r   r   r   r      s4    	$"r   c                 C   s   t |tjstd|  t| jt|jksJ dt }| jD ] }|d |d krC||d |d f ||d |d f q#|t|jksOJ ddS )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   PlanarEmbeddingrh   check_structuresetnodesrm   add)r
   	embeddingZg_edgesedger   r   r   r   '  s&   


r   c                 C   s  t |}|D ]}|||r||| qt|}t|dkr[| }||vr)q|j| }|dkrUt|| }t	|}t	|}|
| |
| || ||| t|dks t|dkrqt t d|sot ddS t|dkrt t dd|st ddS t 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$   Zhas_edgerG   listlenpopdegreeiternextappendremove_noder<   Zis_isomorphicr1   rh   r-   )r
   Z	sub_graphuZcontractZcontract_noder   Z	neighborsvr   r   r   r	   Q  s:   








r	   c                   @   sx   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edd ZdS )TestPlanarEmbeddingClassc                 C   sx  t  }|dd tjt jdd |jdddd W d    n1 s%w   Y  tjt jdd |jdddd	 W d    n1 sEw   Y  tjt jd
d |jddddd W d    n1 sfw   Y  tjt jdd |dd W d    n1 sw   Y  |jdddd |jdddd	 t|jdddddddfdddddfdddddfgksJ d S )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   rw   add_half_edgerf   rg   rh   sortedrm   r&   r|   r   r   r   test_add_half_edge  s<   	z+TestPlanarEmbeddingClass.test_add_half_edgec                 C   s:   |  d}| }g ddgdgdgd}||ksJ d S )Nr   )r   r   r   r   )r   r   r   r   )get_star_embeddingget_data)r&   r|   r   Zdata_cmpr   r   r   test_get_data  s   
z&TestPlanarEmbeddingClass.test_get_datac              
   C   s   t  }|g dg dddgg dg dddgg dd	 |d
 |  t  }|ddgg dddgg dddgddgg dd	 t j||sPJ d S )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   rw   set_datarl   rx   utilsZgraphs_equal)r&   r|   Zembedding_expectedr   r   r   test_edge_removal  s2   
z*TestPlanarEmbeddingClass.test_edge_removalc                 C   sR   t di idi id}tt j |  W d    d S 1 s"w   Y  d S )Nr   r   r   r   rw   rf   rg   rh   rx   r   r   r   r   test_missing_edge_orientation  s   
"z6TestPlanarEmbeddingClass.test_missing_edge_orientationc                 C   sj   t ddddiddddidi idi id}tt j |  W d    d S 1 s.w   Y  d S )Nr   r   r   r   )r   r   r   r   r   r   r   r   r   test_invalid_edge_orientation  s   
"z6TestPlanarEmbeddingClass.test_invalid_edge_orientationc                 C   sN   t  }|dd tt j |  W d    d S 1 s w   Y  d S Nr   r   )r   rw   r   rf   rg   rh   rx   r   r   r   r   test_missing_half_edge  s
   
"z/TestPlanarEmbeddingClass.test_missing_half_edgec                 C   s~   t  }tdD ]}d }tdD ]}||kr |j|||d |}qqtt j |  W d    d S 1 s8w   Y  d S )Nr   r   )r   rw   r;   r   rf   rg   rh   rx   )r&   r|   r=   refjr   r   r   !test_not_fulfilling_euler_formula  s   
"z:TestPlanarEmbeddingClass.test_not_fulfilling_euler_formulac                 C   sN   t  }tjt jdd |jdddd W d    d S 1 s w   Y  d S )NzInvalid reference node.r   r   r   r   r   )r   rw   rf   rg   rh   r   r   r   r   r   test_missing_reference  s   "z/TestPlanarEmbeddingClass.test_missing_referencec                 C   s   t  }|dd d S r   )r   rw   Zconnect_componentsr   r   r   r   test_connect_components  s   z0TestPlanarEmbeddingClass.test_connect_componentsc                 C   s@   t  }|dd |dd |dd}|ddgksJ d S r   )r   rw   r   traverse_face)r&   r|   Zfacer   r   r   test_successful_face_traversal  s
   z7TestPlanarEmbeddingClass.test_successful_face_traversalc                 C   sb   t ddddiddddid}tt j |dd W d    d S 1 s*w   Y  d S )Nr   r   r   r   r   )r   rw   rf   rg   rh   r   r   r   r   r    test_unsuccessful_face_traversal  s   "z9TestPlanarEmbeddingClass.test_unsuccessful_face_traversalc                 C   s   t  }|d |dg tt |dd W d    n1 s%w   Y  tt |ddg W d    n1 sAw   Y  tt |	ddg W d    d S 1 s^w   Y  d S )	N*   )      r   r   r^   rI   )r   r   i^  )r   r   }   )
r   rw   rX   Zadd_nodes_fromrf   rg   NotImplementedErrorr<   r8   Zadd_weighted_edges_fromr   r   r   r   test_forbidden_methods  s   
"z/TestPlanarEmbeddingClass.test_forbidden_methodsc                 C   s@   t  }d }td| D ]}|jd||d |}||d q|S )Nr   r   r   )r   rw   r;   r   )nr|   r   r=   r   r   r   r     s   z+TestPlanarEmbeddingClass.get_star_embeddingN)rq   rr   rs   r   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r   r   r     s     r   )rf   Znetworkxr   Znetworkx.algorithms.planarityr   r   r   r   r   r	   r   r   r   r   r   <module>   s      *3