U
    ?hYM                     @   sV   d Z ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 eZG dd dZdS )z
====================
Generators - Classic
====================

Unit tests for various classic graph generators in generators/classic.py
    N)graph_could_be_isomorphic)edges_equalnodes_equalc                   @   s4  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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d1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$dEdF Z%dGdH Z&dIdJ Z'dKS )LTestGeneratorClassicc                 C   s   dD ]\}}t ||}| }|||d  d |d  ks@tt |sNt| |d ksbtt |}|d dks|t|d || kst|| dkst||d  |||  d kstt||d kstqd S )N))   r   )   r   )   r      r   r   )nxbalanced_treeorderAssertionErroris_connectedsizedegree_histogramlen)selfrhtr   dh r   X/var/www/html/venv/lib/python3.8/site-packages/networkx/generators/tests/test_classic.pytest_balanced_tree   s     
 z'TestGeneratorClassic.test_balanced_treec                 C   sj   t jddd}t|t ds"tt jddd}t|t dsDtt jddd}t|t dsftd S )Nr   r	   )r   r      
   )r
   r   is_isomorphic
star_graphr   r   r   r   r   r   test_balanced_tree_star$   s    z,TestGeneratorClassic.test_balanced_tree_starc                 C   s(   t dd}t d}t||s$tdS )z[Tests that the balanced tree with branching factor one is the
        path graph.

        r	      r   N)r
   r   
path_graphr   r   )r   TPr   r   r   test_balanced_tree_path-   s    
z,TestGeneratorClassic.test_balanced_tree_pathc                 C   s   d}d}t ||}| |ks$tt |s2tt |}|d dksLt|d dks\t|| dkslt||d  dkstt||d kstd S )Nr   	   r   r	   r   r   )r
   full_rary_treer   r   r   r   r   )r   r   nr   r   r   r   r   test_full_rary_tree7   s    
z(TestGeneratorClassic.test_full_rary_treec                 C   s*   t dd}t dd}t||s&td S )Nr      r   )r
   r&   r   r   r   )r   r   thr   r   r   test_full_rary_tree_balancedD   s    z1TestGeneratorClassic.test_full_rary_tree_balancedc                 C   s$   t dd}t|t ds td S )Nr	   r   )r
   r&   r   r!   r   r   r   r   r   test_full_rary_tree_pathI   s    z-TestGeneratorClassic.test_full_rary_tree_pathc                 C   sD   t dd}t|t ds tt dd}t|t ds@td S )Nr   r   r   )r
   r&   r   empty_graphr   r   r   r   r   test_full_rary_tree_emptyM   s    z.TestGeneratorClassic.test_full_rary_tree_emptyc                 C   s    t dd}| dkstd S )Nr      )r
   r&   r   r   r   r   r   r   test_full_rary_tree_3_20S   s    z-TestGeneratorClassic.test_full_rary_tree_3_20c                 C   s  d}d}t ||}t |d| | ks.tt |||d  | d ksPtd}d}t ||}t |d| | ks~tt |||d  | d kstd}d}t ||}t |d| | kstt |||d  | d kstd}d}tt jt j|| d}d}tt jt j|| d}d}t ||}t|t 	|d sVtd}d}t ||}t|t 	|d std}d}t ||}t|t 	|d sttjt jt j||t 
 d	 t j||t  d	}t| | std S )
Nr   r   r   r	   r    r   r/   create_using)r
   Zbarbell_graphnumber_of_nodesr   number_of_edgespytestraisesNetworkXErrorr   r!   DiGraph
MultiGraphr   edges)r   m1m2bmbr   r   r   test_barbell_graphW   sT    """    z'TestGeneratorClassic.test_barbell_graphc                 C   sp   d t jt jt jt jf}|D ]P}tddD ]@}t ||}t |d| ksNtt 	|d| d ks(tq(qd S )Nr   r    r   r	   )
r
   Graphr9   r:   MultiDiGraphrangeZbinomial_treer4   r   r5   )r   Zgraphsr3   r'   r>   r   r   r   test_binomial_tree   s    z'TestGeneratorClassic.test_binomial_treec                 C   s  dD ]>}t |}t ||ks$tt |||d  d kstqt j|t jd}t| | sjtt d}t|	 dddgst|
 d	kstt d
}t|	 dddgst|
 dkstt jd
t jd}t|	 dddgst|
 dkstd S )Nr   r	   r   r   r	   r   r2   abcar>   cr   abcbr    r   )r
   complete_graphr4   r   r5   r:   r   r;   r   nodesr   )r   mgmgr   r   r   test_complete_graph   s    
 

z(TestGeneratorClassic.test_complete_graphc                 C   s   dD ]@}t j|t jd}t ||ks*tt |||d  kstqt jdt jd}t|dksft| dksvt| std S )NrE   r2   r	   rF   r   r   )	r
   rJ   r9   r4   r   r5   r   r   is_directed)r   rL   rM   r   r   r   test_complete_digraph   s    z*TestGeneratorClassic.test_complete_digraphc                 C   sL   t d}tjt jt jdt jd t jdt jd}t| | sHt	d S )Nr   r2   )
r
   Zcircular_ladder_graphr6   r7   r8   r9   r:   r   r;   r   )r   GmGr   r   r   test_circular_ladder_graph   s    
   z/TestGeneratorClassic.test_circular_ladder_graphc                 C   s   t ddg}t d}t| | s.tt ddddg}t d}t| | s`tt dddg}t dd}t||std S )Nr   r	      r   r   )	r
   Zcirculant_graphcycle_graphr   r;   r   rJ   complete_bipartite_graphr   )r   ZCi6_1ZC6ZCi7ZK7ZCi6_1_3ZK3_3r   r   r   test_circulant_graph   s    

z)TestGeneratorClassic.test_circulant_graphc                 C   sR  t d}t| ddddgs$tt jdt jd}t| ddddgsNtt jdt jd}|ddrnt|dds~t| stt d	}t	|d
kst|
 d
kstt d}t	|d
kst|
 dkstt d	t j}t	|d
kst|
 d
kst| stt dt j}t	|d
ks<t|
 dksNtd S )Nr    r   r	   )r   r   r	   r   )r   r   r2   r   r	   rF   r   rI   )r
   rV   r   r;   r   r:   r9   has_edgerP   r   r   )r   rR   rS   rM   r   r   r   test_cycle_graph   s*    


z%TestGeneratorClassic.test_cycle_graphc                 C   s   t d}t| dgsttt|ddgs4tt d}t| dddgsVtt |dkshttt 	|
 dddgkstt d}t |dkstt |d	kst|dd
kst|dd
kst|dd
ksttjt jt jdt jd tjt jt jdt jd d S )Nr   rY   r	   )r   r   rZ   g      ?r   iVs  i  i   r   rU   r2   )r
   Z dorogovtsev_goltsev_mendes_graphr   r;   r   r   listZaverage_clusteringsortedZ	trianglesvaluesr4   r5   degreer6   r7   r8   r9   r:   )r   rR   r   r   r   %test_dorogovtsev_goltsev_mendes_graph   s2    

 
z:TestGeneratorClassic.test_dorogovtsev_goltsev_mendes_graphc                 C   s  t  }t|t jsttjtt jdd tjtt jdd t jt jd}t|t jsZtt jt j	d}t|t j	sxtt jt j	t jd}t|t j	stt jd t jd}t|t jstt jt jd}t|t jstt 
d}t j|d}| rt| rtt|dkst||ks(tt jt  d}| sFt| rTt||k	sbtG dd	 d	tj}G d
d d|t j	}t j|d}d S )Ng        r2   rA   )r3   default)rb   r   r   c                   @   s   e Zd ZdS )z5TestGeneratorClassic.test_create_using.<locals>.MixinN__name__
__module____qualname__r   r   r   r   Mixin%  s   rg   c                   @   s   e Zd ZdS )z7TestGeneratorClassic.test_create_using.<locals>.MyGraphNrc   r   r   r   r   MyGraph(  s   rh   )r
   r-   
isinstancerA   r   r6   r7   	TypeErrorr:   r9   r!   Zis_multigraphrP   r   typingProtocol)r   rR   Hrg   rh   r   r   r   test_create_using  s6    
z&TestGeneratorClassic.test_create_usingc                 C   s\  t  }t |dkstt d}t |dks6tt |dksHtt d}t|dksbt| dksrtt jdt jddd}t |dkstt |dkstt|t jstt jdt j	ddd}t |dkstt |dkstt|t j	stt 
 }t jd|d}t |dks2tt |dksFtt|t jsXtd S )Nr   *   rF   r   Zduh)namer2   )r
   r-   r4   r   r5   r   r   r9   ri   r:   Zpetersen_graphrA   )r   rR   Zpeter   r   r   test_empty_graph-  s*    

z%TestGeneratorClassic.test_empty_graphc                 C   s   dt dfdt dfdt dfdt ddgffD ]\}}tt ||s8tq8tj	t j
t jdt jd t d}t jdt jd}t| | std S )Nr   r	   r   r   r2   )r
   r-   r!   Zhypercube_graphZ
grid_graphr   Zladder_graphr   r6   r7   r8   r9   r:   r   r;   )r   irR   rM   rN   r   r   r   test_ladder_graphK  s    
z&TestGeneratorClassic.test_ladder_graphc                 C   s   dD ]L\}}t ||}t ||| ks.tt |||d  d | kstqdD ]^\}}t|t| }}t ||}t ||| kstt |||d  d | ksVtqVd S )N))r   r   )r    r   )r   r/   r	   r   ))ab )rF   Zdefg)r
   lollipop_graphr4   r   r5   r   )r   r<   r=   rR   firstsecondr   r   r   test_lollipop_graph_right_sizesZ  s    $z4TestGeneratorClassic.test_lollipop_graph_right_sizesc              	   C   s   t tjtjdd t tjtjdd t tjtjdd t tjtjdd t tjtjdd t tj tjddtjd	 W 5 Q R X t tj tjddtjd	 W 5 Q R X d S )
Nr   r	   r/   ru   rG   r   r1   r2   )r6   r7   r
   r8   rv   r9   rB   r   r   r   r   test_lollipop_graph_exceptionsg  s    z3TestGeneratorClassic.test_lollipop_graph_exceptionsc                 C   s6   dD ],\}}t ||}t|t |d stqd S )N))r   r   )r   r   )r   r   )rt   r/   r   )r
   rv   r   r!   r   )r   r<   r=   rR   r   r   r   -test_lollipop_graph_same_as_path_when_m1_is_2w  s    zBTestGeneratorClassic.test_lollipop_graph_same_as_path_when_m1_is_2c                 C   s8   t dd}t jddt jd}t| | s4td S )Nr   r/   r2   )r
   rv   r:   r   r;   r   )r   rR   ZMGr   r   r   "test_lollipop_graph_for_multigraph}  s    z7TestGeneratorClassic.test_lollipop_graph_for_multigraphc                 C   s`   ddddddgdfddddgfg}|D ]4\}}t ||}t|d	ksJt| d
ks&tq&d S )N)r    rF   )abcdr   r	   r   r   r    rF   r   rU   r%   )r
   rv   r   r   r   )r   Zcasesr<   r=   rR   r   r   r   &test_lollipop_graph_mixing_input_types  s
    "z;TestGeneratorClassic.test_lollipop_graph_mixing_input_typesc                 C   sF   t d}t|d|d}t|dks2t| dksBtd S )Nnumpyr    r   rU   r%   )	r6   importorskipr
   rv   int32Zint64r   r   r   r   nprR   r   r   r   *test_lollipop_graph_not_int_integer_inputs  s    
z?TestGeneratorClassic.test_lollipop_graph_not_int_integer_inputsc                 C   s   t t  dkstd S )Nr   )r
   r4   
null_graphr   r{   r   r   r   test_null_graph  s    z$TestGeneratorClassic.test_null_graphc                 C   s  t d}t|t  stt d}t|t ds:tt d}t |sRttdd | D ddddddddddg
kst|	 d |
 kstt jdt jd}|ddst|ddrtt jdt jd}t| | stt d	}t|dkst|
 dks tt d
}t|dks<t|
 dksNtt d	t j}t|dksnt|
 dkst| stt d
t j}t|dkst|
 dkstt d}|ddstd S )Nr   r	   r   c                 s   s   | ]\}}|V  qd S Nr   .0r'   dr   r   r   	<genexpr>  s     z7TestGeneratorClassic.test_path_graph.<locals>.<genexpr>r   r   r2   rF   rI   )r	   r   r   r   r    r    )r
   r!   r   r   r   r-   r   r^   r`   r   r   r9   r[   r:   r   r;   r   rP   )r   pZdpmprR   rM   r   r   r   test_path_graph  s8    


2


z$TestGeneratorClassic.test_path_graphc                 C   s  t tdtdstt tg tds4tt tdtdsNtt tdtdshtt tdtdstt tdtddsttd}tdd	 | D dddddddddddgkstt	j
tjtjdtjd
 tjdtjd
}t| | sttd}t|dks8t| dksJttd}t|dksft| dksxttjdtjd
}t|dkst| dksttd}t|dkst| dkstd S )Nru   r   r	   r   r   r   r   c                 s   s   | ]\}}|V  qd S r   r   r   r   r   r   r     s     z7TestGeneratorClassic.test_star_graph.<locals>.<genexpr>r2   rF   rI   ZabcdefgrU   r   )r   r
   r   r-   r   r!   rW   r^   r`   r6   r7   r8   r9   r:   r   r;   r   r   )r   smsrR   r   r   r   test_star_graph  s.    
4


z$TestGeneratorClassic.test_star_graphc                 C   s>   t d}t|d}t|dks*t| dks:td S )Nr   r   r    )r6   r   r
   r   r   r   r   r   r   r   r   r   $test_non_int_integers_for_star_graph  s    
z9TestGeneratorClassic.test_non_int_integers_for_star_graphc                 C   s   t t  dkstd S )Nr	   )r
   r4   Ztrivial_graphr   r{   r   r   r   test_trivial_graph  s    z'TestGeneratorClassic.test_trivial_graphc                 C   s@   t t dddksttt ddt dddds<td S )N   r    ?   r   )r
   r5   Zturan_graphr   r   complete_multipartite_graphr{   r   r   r   test_turan_graph  s
    
 z%TestGeneratorClassic.test_turan_graphc                 C   sx  dt  fdt  fdt dfdt dfdt dfdt dffD ] \}}t |}t||sHtqHt d}tdd	 |	 D dddddddddd
g
kstt
jt jt jdt jd t jdt  d}t| | stt d}t|dkst| dkstt d}t|dks0t| dksBtt dt j}t|dksbt| dksttd S )Nru   r   r	   r   r   r    r   c                 s   s   | ]\}}|V  qd S r   r   r   r   r   r   r     s     z8TestGeneratorClassic.test_wheel_graph.<locals>.<genexpr>r%   r2   rF   rI   r   )r
   r   r-   r!   rJ   wheel_graphr   r   r^   r`   r6   r7   r8   r9   r:   r   r;   r   r   )r   r'   rR   rM   rN   r   r   r   test_wheel_graph  s.    



2

z%TestGeneratorClassic.test_wheel_graphc                 C   s>   t d}t|d}t|dks*t| dks:td S )Nr   r   )r6   r   r
   r   r   r   r   r   r   r   r   r   %test_non_int_integers_for_wheel_graph  s    
z:TestGeneratorClassic.test_non_int_integers_for_wheel_graphc                 C   s8   t  }t  }t||stt| | s4tdS )z:Tests that the complete 0-partite graph is the null graph.N)r
   r   r   r   r   r   r;   r   rR   rm   r   r   r   test_complete_0_partite_graph
  s    z2TestGeneratorClassic.test_complete_0_partite_graphc                 C   s<   t d}t d}t||s"tt| | s8tdS )z;Tests that the complete 1-partite graph is the empty graph.r   N)r
   r   r-   r   r   r   r;   r   r   r   r   test_complete_1_partite_graph  s    

z2TestGeneratorClassic.test_complete_1_partite_graphc                 C   s@   t dd}t dd}t||s&tt| | s<tdS )zZTests that the complete 2-partite graph is the complete bipartite
        graph.

        r   r   N)r
   r   rW   r   r   r   r;   r   r   r   r   test_complete_2_partite_graph  s    z2TestGeneratorClassic.test_complete_2_partite_graphc                 C   s   t ddd}dddg}|D ]B}t|dD ]0\}}||| ksDt|j| |j| ks,tq,qt|dD ]F\}}t||D ]0\}}||| kst|j| |j| kstqqldS )z5Tests for generating the complete multipartite graph.r   r   r    rY   )r   r   r    )r   r   rU      N)r
   r   	itertoolscombinations_with_replacementr   rK   combinationsproduct)r   rR   blocksblockuvZblock1Zblock2r   r   r    test_complete_multipartite_graph"  s    
z5TestGeneratorClassic.test_complete_multipartite_graphN)(rd   re   rf   r   r   r$   r(   r+   r,   r.   r0   r@   rD   rO   rQ   rT   rX   r\   ra   rn   rq   rs   ry   r|   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      sJ   	
6'$
r   )__doc__r   rk   r6   Znetworkxr
   Z(networkx.algorithms.isomorphism.isomorphr   Znetworkx.utilsr   r   r   r   r   r   r   r   <module>   s   