U
    hJ$                     @   sv   d Z ddlmZ ddlZddlZddlmZ G dd dZG dd dZ	G d	d
 d
Z
G dd dZG dd dZdS )z=Unit tests for the :mod:`networkx.generators.lattice` module.    )productN)edges_equalc                   @   s`   e Zd 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S )TestGrid2DGraphz@Unit tests for :func:`networkx.generators.lattice.grid_2d_graph`c                 C   s,   d\}}t ||}t||| ks(td S )N      )nxgrid_2d_graphlenAssertionError)selfmnG r   J/tmp/pip-unpacked-wheel-j2te_plx/networkx/generators/tests/test_lattice.pytest_number_of_vertices   s    z'TestGrid2DGraph.test_number_of_verticesc                 C   sP   d\}}t ||}dddd||  d |d |d  g}t ||ksLtd S )Nr   r            )r   r	   degree_histogramr   )r   r   r   r   expected_histogramr   r   r   test_degree_distribution   s    &z(TestGrid2DGraph.test_degree_distributionc                 C   sL   d\}}t ||}t j||t  d}|j|jks8t|j|jksHtd S Nr   create_usingr   r	   DiGraphsuccZadjr   predr   r   r   r   Hr   r   r   test_directed   s
    zTestGrid2DGraph.test_directedc                 C   sH   d\}}t ||}t j||t  d}t| t| ksDtd S r   r   r	   
MultiGraphlistedgesr   r    r   r   r   test_multigraph    s    zTestGrid2DGraph.test_multigraphc              
   C   s   t jdddd}t| i ks$tddt dfddt dfddt dfddt dfddt dfddt  fddt  ffD ]*\}}}t j||dd}t ||stqd S )	Nr   Tperiodicr   r         r   )	r   r	   dictdegreer   cycle_graphZcircular_ladder_graphcubical_graphcould_be_isomorphic)r   r   r   r   r!   r   r   r   test_periodic&   s    	zTestGrid2DGraph.test_periodicc                 C   s|   d\}}t ddgddgD ]\\}}tj||||fd}| || ksJt| || d | || d |  kstqd S )N)   r+   r   r*   r(   )r   r   r	   number_of_nodesr   number_of_edges)r   r   r   abr   r   r   r   test_periodic_iterable6   s
    z&TestGrid2DGraph.test_periodic_iterablec                 C   sJ   t jdddd}t jdddt  d}|j|jks6t|j|jksFtd S Nr   r   Tr(   )r)   r   r   r   r   r!   r   r   r   test_periodic_directed=   s    z&TestGrid2DGraph.test_periodic_directedc                 C   sF   t jdddd}t jdddt  d}t| t| ksBtd S r8   r#   r9   r   r   r   test_periodic_multigraphC   s    z(TestGrid2DGraph.test_periodic_multigraphc                 C   sP   t tjtjdd t tjtjdd t ttjdd t ttjdd d S )Nr   r2   gffffff
@g@)pytestraisesr   NetworkXErrorr	   	TypeError)r   r   r   r   test_exceptionsH   s    zTestGrid2DGraph.test_exceptionsc                 C   s   t jdddd}t jtdtddd}t ||s8tt jdddd}t ||sXtt dd}t tdtd}t||std S )	Nr   r   Tr(   ZabcdZefr   r   )r   r	   rangeis_isomorphicr   r   r9   r   r   r   test_node_inputN   s    zTestGrid2DGraph.test_node_inputN)__name__
__module____qualname____doc__r   r   r"   r'   r1   r7   r:   r;   rB   rE   r   r   r   r   r      s   r   c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	TestGridGraphz=Unit tests for :func:`networkx.generators.lattice.grid_graph`c              	   C   s   dD ]b\}}||g}t |}t||| ks2tt |dddd||  d |d |d  gkstqdD ]D\}}||g}t |}t||| kstt |t dsltqldS )	zgrid_graph([n,m]) is a connected simple graph with the
        following properties:
        number_of_nodes = n*m
        degree_histogram = [0,0,4,2*(n+m)-8,(n-2)*(m-2)]
        )r2   r   )r   r2   r   r   )r   r   r   r   r   r   ))r*   r   )r   r*   r   N)r   
grid_graphr
   r   r   rD   
path_graph)r   r   r   Zdimgr   r   r   test_grid_graph\   s     

zTestGridGraph.test_grid_graphc                 C   sH   t tddtddg}t|dks*tt |t ddgsDtd S )Nr+   	   r2   r   r   )r   rM   rC   r
   r   rD   )r   r   r   r   r   rE   w   s    zTestGridGraph.test_node_inputc           	      C   s   d\}}}t ddgddgddgD ]\}}}tj|||g|||fd}|| d | | || d | |  || d | |  }| || | kst| |ks"tq"d S )N)r2   r+   r   r   r*   r(   )r   r   rM   r3   r   r4   )	r   r   r   kr5   r6   cr   Znum_er   r   r   r7   |   s    
"<z$TestGridGraph.test_periodic_iterableN)rF   rG   rH   rI   rP   rE   r7   r   r   r   r   rJ   Y   s   rJ   c                   @   s    e Zd ZdZdd Zdd ZdS )TestHypercubeGraphzBUnit tests for :func:`networkx.generators.lattice.hypercube_graph`c                 C   sX   dt  fdt dfdt dfdt  ffD ]"\}}t |}t ||s0tq0d S )Nr   r*   r   r   r2   )r   Z
null_graphrN   r.   r/   hypercube_graphr0   r   )r   r   r!   r   r   r   r   test_special_cases   s    


z%TestHypercubeGraph.test_special_casesc                 C   sD   t ddD ]4}t|}dg| d| g }t||ks
tq
d S )Nr*   
   r   r   )rC   r   rU   r   r   )r   r   r   r   r   r   r   r      s    
z+TestHypercubeGraph.test_degree_distributionN)rF   rG   rH   rI   rV   r   r   r   r   r   rT      s   
rT   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )TestTriangularLatticeGraphzFTests for :func:`networkx.generators.lattice.triangular_lattice_graph`c                 C   s  dD ]P\}}t ||}|d d }t||d d|  |d |d d   kstq| D ]\}}|||f }||k r|d |f|kst||k r||d f|kst||k r^|dks|d r^||k s|d d r^|d |d f|ks^|d |d f|ks^tq^dS )z4Tests that the graph is really a triangular lattice.)r   r2   r   r   r   r*   r2   r2   r2   r   r2   r   r*   r   r   N)r   triangular_lattice_graphr
   r   Znodes)r   r   r   r   NijZnbrsr   r   r   test_lattice_points   s    2,z.TestTriangularLatticeGraph.test_lattice_pointsc                 C   s   t jddt  d}t jddt  d}| s4t| D ]@\}}|d |d ksXt|d |d kr<|d |d ks<tq<dS )z1Tests for creating a directed triangular lattice.r2   r   r   r*   r   N)r   r_   Graphr   is_directedr   r&   )r   r   r!   uvr   r   r   r"      s    z(TestTriangularLatticeGraph.test_directedc                 C   sH   t jddt  d}t jddt  d}t| t| ksDtdS )z3Tests for creating a triangular lattice multigraph.r2   r   r   N)r   r_   rd   r$   r%   r&   r   r9   r   r   r   r'      s    z*TestTriangularLatticeGraph.test_multigraphc                 C   s   t jdddd}t|dks t| dks0ttdd | D d	ksNtt jd
ddd}t j}tjt j|dddd tjt j|dddd tjt j|dddd d S )Nr   r   Tr(      $   c                 S   s   g | ]\}}|d kr|qS )r   r   .0r   dr   r   r   
<listcomp>   s      z<TestTriangularLatticeGraph.test_periodic.<locals>.<listcomp>r   r   r+   r   )	r   r_   r
   r   sizer-   r>   r?   r@   )r   r   ZTLGr   r   r   r1      s    z(TestTriangularLatticeGraph.test_periodicNrF   rG   rH   rI   rc   r"   r'   r1   r   r   r   r   rX      s
   
rX   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )TestHexagonalLatticeGraphzETests for :func:`networkx.generators.lattice.hexagonal_lattice_graph`c              
   C   s   dD ]8\}}t ||}t|d|d  |d  d kstqt d}ddddd	d
gdddd
ddgd	d
ddddgddddddgddddddgg}|D ]}t |||stqdS )z3Tests that the graph is really a hexagonal lattice.)rL   )r   r   )r   r2   r]   r\   rK   r   r*   r   )r   r   )r   r*   )r   r   )r*   r   )r*   r*   )r*   r   )r   r2   )r   r   )r*   r2   )r*   r   r[   rZ   rY   )r   r   )r2   r   )r2   r*   r]   )r   r   r\   r^   N)r   hexagonal_lattice_graphr
   r   r.   rD   Zsubgraph)r   r   r   r   ZC_6ZhexagonsZhexagonr   r   r   rc      s    &
z-TestHexagonalLatticeGraph.test_lattice_pointsc                 C   s   t jddt  d}t jddt  d}| s4tt |d}| D ]X\}}|| d || d kslt|| d || d krH|| d || d ksHtqHdS )z0Tests for creating a directed hexagonal lattice.r2   r   r   posr*   r   N)r   rq   rd   r   re   r   Zget_node_attributesr&   )r   r   r!   rr   rf   rg   r   r   r   r"      s    z'TestHexagonalLatticeGraph.test_directedc                 C   sH   t jddt  d}t jddt  d}t| t| ksDtdS )z2Tests for creating a hexagonal lattice multigraph.r2   r   r   N)r   rq   rd   r$   r%   r&   r   r9   r   r   r   r'      s    z)TestHexagonalLatticeGraph.test_multigraphc                 C   s   t jdddd}t|dks t| dks0ttdd | D d	ksNtt jd
ddd}t j}tjt j|dddd tjt j|dddd tjt j|dddd d S )Nr   r   Tr(   0   H   c                 S   s   g | ]\}}|d kr|qS )r2   r   rj   r   r   r   rm      s      z;TestHexagonalLatticeGraph.test_periodic.<locals>.<listcomp>r   r   r   r   r+   r*   )	r   rq   r
   r   rn   r-   r>   r?   r@   )r   r   ZHLGr   r   r   r1      s    z'TestHexagonalLatticeGraph.test_periodicNro   r   r   r   r   rp      s
   rp   )rI   	itertoolsr   r>   Znetworkxr   Znetworkx.utilsr   r   rJ   rT   rX   rp   r   r   r   r   <module>   s   N,/