U
    ?h\3  ã                   @   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d/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-d.„ ZdS )0Ú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k	rT|r0d}nd}||ksDt|ƒ‚||ksTt|ƒ‚|rnt| |ƒ t| |ƒ n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.)ÚnxZcheck_planarityr   ÚAssertionErrorÚcheck_embeddingÚcheck_counterexample)ÚGÚ	is_planarZis_planar_lrÚresultZis_planar_lr_recZ
result_recÚmsg© r   úZ/var/www/html/venv/lib/python3.8/site-packages/networkx/algorithms/tests/test_planarity.pyÚcheck_graph   s    

zTestLRPlanarity.check_graphc                 C   s2   ddddddddd	d
dg}| 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   s6   ddddddddd	d
dddg}| j t |¡dd d S )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   s(   ddddddg}| j t |¡dd d S )	Nr   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¡}| dddg¡ | j|dd d S )Nr   r   ©r   é   )r6   r   Fr!   )r   r0   Ú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 r/   )r   r0   ÚrangeÚadd_edger   )r%   r
   Úir   r   r   Útest_non_planar_with_selfloopm   s    
z-TestLRPlanarity.test_non_planar_with_selfloopc              
   C   s0   ddddddddd	d
g
}| j t |¡dd d S )Nr   )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„   s    
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   rC   r   r   r   Ú	test_compŠ   s    
zTestLRPlanarity.test_compc                 C   sV   ddddddddd	d
dddddddddddddddddg}t  |¡}| j|dd d S )Nr   r)   ©r   r   r   r>   )r   r6   )r   é
   ©r   é   r   r   r?   )r   r   )r   é	   )r   rH   )r   rJ   r   r   r   r@   r    r   r5   )r   rK   ©r   rH   )r6   rH   )rK   rH   )rH   rJ   Tr!   rB   rC   r   r   r   Útest_goldner_harary‘   s<    å
z#TestLRPlanarity.test_goldner_hararyc                 C   s(   t  ddddddg¡}| j|dd d S )Nr   r   r2   Tr!   )r   Ú
MultiGraphr   r8   r   r   r   Útest_planar_multigraph³   s    z&TestLRPlanarity.test_planar_multigraphc                 C   s2   t  t  d¡¡}| dgd ¡ | j|dd d S )Nr   r   Fr!   )r   rN   r0   r7   r   r8   r   r   r   Útest_non_planar_multigraph·   s    z*TestLRPlanarity.test_non_planar_multigraphc              	   C   s*   t  dddddddg¡}| j|dd	 d S )
Nr   r   r   )r   r   )r   r   rG   )r   r   Tr!   )r   ÚDiGraphr   r8   r   r   r   Útest_planar_digraph¼   s    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   rQ   r0   rE   r   r8   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   r8   r   r   r   Útest_single_componentÆ   s    
z%TestLRPlanarity.test_single_componentc                 C   s0   t  ddddddddd	d
g
¡}| j|dd d S )N)r   rH   ©r   é   ©r   rW   )r   rJ   ©r   r6   )r6   rW   )r   r   ©r   r   )r   rH   r>   Tr!   rB   r8   r   r   r   Útest_graph1Ì   s    öÿzTestLRPlanarity.test_graph1c                 C   s>   t  ddddddddd	d
dddddddg¡}| j|dd d S )Nr   )r   rW   )r   rW   r   rL   r>   )r   r   r?   r3   )r   rW   )r   r6   rY   )r   rK   rV   r   )r   r   )r   r6   Fr!   rB   r8   r   r   r   Útest_graph2Ý   s*    ïÿzTestLRPlanarity.test_graph2c                 C   s8   t  ddddddddd	d
ddddg¡}| j|dd d S )NrZ   )r   rJ   r   )r6   rK   )r   rJ   r>   rX   rI   r*   r    r)   )r   r   )r   rJ   )r   rW   Fr!   rB   r8   r   r   r   Útest_graph3õ   s$    òÿzTestLRPlanarity.test_graph3c              	   C   s6   t  tj¡  t ¡ }| d¡ t|ƒ W 5 Q R X d S ©Nr   )ÚpytestÚraisesr   ÚNetworkXExceptionr#   rT   r   r8   r   r   r   Útest_counterexample_planar
  s    
z*TestLRPlanarity.test_counterexample_planarc              	   C   s6   t  tj¡  t ¡ }| d¡ t|ƒ W 5 Q R X d S r^   )r_   r`   r   ra   r#   rT   r   r8   r   r   r   Ú$test_counterexample_planar_recursive  s    
z4TestLRPlanarity.test_counterexample_planar_recursive)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr   r'   r+   r.   r1   r4   r9   r=   rA   rD   rF   rM   rO   rP   rR   rS   rU   r[   r\   r]   rb   rc   r   r   r   r   r      s0   	$"r   c                 C   s¢   t |tjƒst d¡‚| ¡  t| jƒt|jƒks:tdƒ‚tƒ }| jD ]@}|d |d krF| 	|d |d f¡ | 	|d |d f¡ qF|t|jƒksžt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   ÚPlanarEmbeddingra   Úcheck_structureÚsetZnodesr   ÚedgesÚadd)r
   Ú	embeddingZg_edgesÚedger   r   r   r     s$    

ÿþ
ÿþr   c                 C   s  t  |¡}|D ]}| ||¡r| ||¡ qt|ƒ}t|ƒdkr¬| ¡ }||krRq4|j| }|dkr4t|| ƒ}t	|ƒ}t	|ƒ}| 
|¡ | 
|¡ | |¡ | ||¡ q4t|ƒdkrÖt  t  d¡|¡sÔt  d¡‚n:t|ƒdkrt  t  dd¡|¡st  d¡‚n
t  d¡‚dS )zÉRaises 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_edgerE   ÚlistÚlenÚpopÚdegreeÚiterÚnextÚappendÚremove_noder;   Zis_isomorphicr0   ra   r,   )r
   Z	sub_graphÚuZcontractZcontract_nodert   Z	neighborsÚvr   r   r   r	   C  s2    





r	   c                   @   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edd„ ƒZdS )ÚTestPlanarEmbeddingClassc                 C   s6   |   d¡}| ¡ }ddgdgdgdœ}||ks2t‚d S )Nr   r   r   r   )r   r   r   )Úget_star_embeddingÚget_datar   )r%   ro   ÚdataZdata_cmpr   r   r   Útest_get_dataw  s    
z&TestPlanarEmbeddingClass.test_get_datac              	   C   sD   t  tj¡. t ¡ }| dd¡ | dd¡ | ¡  W 5 Q R X d S ©Nr   r   )r_   r`   r   ra   rj   r;   rk   ©r%   ro   r   r   r   Útest_missing_edge_orientation}  s
    z6TestPlanarEmbeddingClass.test_missing_edge_orientationc              	   C   sP   t  tj¡: t ¡ }| dd¡ | dd¡ | dd¡ | ¡  W 5 Q R X d S ©Nr   r   r   )r_   r`   r   ra   rj   Úadd_half_edge_firstr;   rk   r   r   r   r   Útest_invalid_edge_orientation…  s    z6TestPlanarEmbeddingClass.test_invalid_edge_orientationc              	   C   s8   t  tj¡" t ¡ }| dd¡ | ¡  W 5 Q R X d S r€   )r_   r`   r   ra   rj   r„   rk   r   r   r   r   Útest_missing_half_edge  s    z/TestPlanarEmbeddingClass.test_missing_half_edgec              	   C   s\   t  tj¡F t ¡ }tdƒD ]&}tdƒD ]}||kr*| ||¡ q*q| ¡  W 5 Q R X d S )Nr   )r_   r`   r   ra   rj   r:   r„   rk   )r%   ro   r<   Újr   r   r   Ú!test_not_fulfilling_euler_formula”  s    z:TestPlanarEmbeddingClass.test_not_fulfilling_euler_formulac              	   C   s2   t  tj¡ t ¡ }| ddd¡ W 5 Q R X d S rƒ   )r_   r`   r   ra   rj   Zadd_half_edge_cwr   r   r   r   Útest_missing_reference  s    z/TestPlanarEmbeddingClass.test_missing_referencec                 C   s   t  ¡ }| dd¡ d S r€   )r   rj   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<t‚d S r€   )r   rj   r„   Útraverse_facer   )r%   ro   Zfacer   r   r   Útest_successful_face_traversal¦  s
    z7TestPlanarEmbeddingClass.test_successful_face_traversalc              	   C   sT   t  tj¡> t ¡ }|jddddd |jddddd | dd¡ W 5 Q R X d S )Nr   r   r   )ZccwZcw)r_   r`   r   ra   rj   r;   r‹   r   r   r   r   Ú test_unsuccessful_face_traversal­  s
    z9TestPlanarEmbeddingClass.test_unsuccessful_face_traversalc                 C   s4   t  ¡ }td| ƒD ]}| d|¡ | |d¡ q|S )Nr   r   )r   rj   r:   r„   )Únro   r<   r   r   r   r|   ´  s
    z+TestPlanarEmbeddingClass.get_star_embeddingN)rd   re   rf   r   r‚   r…   r†   rˆ   r‰   rŠ   rŒ   r   rh   r|   r   r   r   r   r{   v  s   	r{   )r_   Znetworkxr   Znetworkx.algorithms.planarityr   r   r   r   r   r	   r{   r   r   r   r   Ú<module>   s     *3