o
    ]Zhr                     @   s  d dl mZ d dlmZmZ d dlZd dlZd dlm	Z	m
Z
 dd ZG dd dZG d	d
 d
ZG 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G d)d* d*Zd+d, Zd-d. Zd/d0 Z d1d2 Z!d3d4 Z"ej#$d5g d6d7hfg d8d9hfg d:e% ffd;d< Z&d=d> Z'ej#$d5g d6d7hfg d8d9d?hffd@dA Z(dS )B    deque)combinationspermutationsN)edges_equalpairwisec                 C   s   t | dd dS )zConsume the iterator entirely.r   )maxlenNr   )iterator r
   Q/var/www/auris/lib/python3.10/site-packages/networkx/algorithms/tests/test_dag.py_consume   s   r   c                   @   sX   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S )TestDagLongestPathzBUnit tests computing the longest path in a directed acyclic graph.c                 C   s   t  }t |g ksJ d S NnxDiGraphdag_longest_pathselfGr
   r
   r   
test_empty      zTestDagLongestPath.test_emptyc                 C   ,   g d}t |}t |g dksJ d S )N)      r      r      r      r!      )r      )r   r   r   r!   r#   r   r   edgesr   r
   r
   r   test_unweighted1      
z#TestDagLongestPath.test_unweighted1c                 C   r   )Nr   r   r   r   r   r!   r   r   r   r!   r    r   r   r   r   r!   r   r%   r
   r
   r   test_unweighted2   r(   z#TestDagLongestPath.test_unweighted2c                 C   s4   t  }g d}|| t |g dksJ 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   add_weighted_edges_fromr   r   r   r&   r
   r
   r   test_weighted"   s   
z TestDagLongestPath.test_weightedc                 C      t  }tt jt j| d S r   )r   GraphpytestraisesNetworkXNotImplementedr   r   r
   r
   r   test_undirected_not_implemented(   r   z2TestDagLongestPath.test_undirected_not_implementedc                 C   sx   dd t dD }t }||d |d  ||d |d  ||d |d  ||d |d  t| dS )	zTests that computing the longest path does not depend on
        nodes being orderable.

        For more information, see issue #1989.

        c                 S   s   g | ]}t  qS r
   )object.0nr
   r
   r   
<listcomp>5   s    z=TestDagLongestPath.test_unorderable_nodes.<locals>.<listcomp>r   r   r   r   r   N)ranger   r   add_edger   )r   nodesr   r
   r
   r   test_unorderable_nodes,   s   	z)TestDagLongestPath.test_unorderable_nodesc                 C   r   )Nr   r   r   r*   r+   r,   r-   r    r.   )r   MultiDiGraphr   r%   r
   r
   r   test_multigraph_unweighted?   r(   z-TestDagLongestPath.test_multigraph_unweightedc                 C   s4   t  }g d}|| t |ddgksJ d S )N)r   r   r   )r   r   r   r   r   r   r   r   r!   r   r   r   r   r   r   rE   r2   r   r3   r
   r
   r   test_multigraph_weightedD   s   
z+TestDagLongestPath.test_multigraph_weightedc                 C   sP   t ddg}|g d t |ddgksJ t j|ddg dks&J d S )Nr   r   )rH   rI   rJ   r   r   )Zdefault_weightr   r   r   rK   r   r
   r
   r   'test_multigraph_weighted_default_weightP   s   z:TestDagLongestPath.test_multigraph_weighted_default_weightN)__name__
__module____qualname____doc__r   r'   r/   r4   r:   rC   rF   rL   rN   r
   r
   r
   r   r      s    r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )TestDagLongestPathLengthz\Unit tests for computing the length of a longest path in a
    directed acyclic graph.

    c                 C   sp   g d}t |}t |dksJ g d}t |}t |dks$J t  }|d t |dks6J d S )Nr   r   r   r    r"   )r!   r$   r   r)   r   r   )r   r   dag_longest_path_lengthadd_noder%   r
   r
   r   test_unweighted_   s   


z(TestDagLongestPathLength.test_unweightedc                 C   r5   r   )r   r6   r7   r8   r9   rU   r   r
   r
   r   r:   m   r   z8TestDagLongestPathLength.test_undirected_not_implementedc                 C   s0   g d}t  }|| t |dksJ d S )Nr0   r!   )r   r   r2   rU   r%   r
   r
   r   r4   q   s   
z&TestDagLongestPathLength.test_weightedc                 C   s(   g d}t |}t |dksJ d S )NrD   r   )r   rE   rU   r%   r
   r
   r   rF   w   s   
z3TestDagLongestPathLength.test_multigraph_unweightedc                 C   s0   t  }g d}|| t |dksJ d S )NrG   r!   )r   rE   r2   rU   r3   r
   r
   r   rL   |   s   
z1TestDagLongestPathLength.test_multigraph_weightedN)	rO   rP   rQ   rR   rW   r:   r4   rF   rL   r
   r
   r
   r   rS   Y   s    rS   c                   @   s   e Zd Ze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d1S )2TestDAGc                 C   s   d S r   r
   )clsr
   r
   r   setup_class   s   zTestDAG.setup_classc                 C   s   t g d}t jt jfD ]}t||dksJ q|dd t jt jfD ]}tt jt	|| q&|
dd t jt jfD ]}t||dksKJ q?|
dd tt |dv s]J tt |dkshJ d S )N)r   r,   r   rM   r   r   rJ   >   rJ   rM   )r   r   topological_sort lexicographical_topological_sorttuplerA   r7   r8   NetworkXUnfeasibler   remove_edge)r   DG	algorithmr
   r
   r   test_topological_sort1   s   zTestDAG.test_topological_sort1c                 C   s`   t jd}t |rJ t | rJ t t ddgr"J t t ddgs.J d S )Nr   r*   r+   )r   
generatorsZcomplete_graphis_directed_acyclic_graphZto_directedr6   r   r   r
   r
   r   test_is_directed_acyclic_graph   s
   z&TestDAG.test_is_directed_acyclic_graphc                 C   s   t dgdgdgdgdgdgdgdgd	gd
	}tt jtt | t |r*J |dd tt | t |s>J d S )Nr   r   r   r!   r               )	r   r   r   r   r!      rf   rg   rh   )	r   r   r7   r8   r^   r   r[   rd   r_   r   r`   r
   r
   r   test_topological_sort2   s"   zTestDAG.test_topological_sort2c                    s   t    dd tddD   dd tddD   dd tddD   d	d tdd
D   fdd}|tt    dd tt j	t
t   d S )Nc                 S      g | ]}d |fqS )r   r
   r=   ir
   r
   r   r?          z2TestDAG.test_topological_sort3.<locals>.<listcomp>r   r!   c                 S   rm   )r   r
   rn   r
   r
   r   r?      rp   	   c                 S   rm   )r#   r
   rn   r
   r
   r   r?      rp   rf   c                 S   rm   )r   r
   rn   r
   r
   r   r?      rp   ri   c                    sL   t | tsJ t| t ksJ t| dD ]\}}t ||r#J qd S )Nr   )
isinstancelistsetr   r   Zhas_path)orderuvr`   r
   r   validate   s
   z0TestDAG.test_topological_sort3.<locals>.validaterh   r   )r   r   add_edges_fromr@   rs   r[   rA   r7   r8   r^   r   )r   ry   r
   rx   r   test_topological_sort3   s   zTestDAG.test_topological_sort3c                 C   s.   t  }|dd tt jtt | d S )Nr   r   )r   r6   rA   r7   r8   NetworkXErrorr   r[   r   r
   r
   r   test_topological_sort4   s   zTestDAG.test_topological_sort4c                 C   s2   t  }|dd tt |ddgksJ d S )Nr   r   )r   r   rA   rs   r[   r   r
   r
   r   test_topological_sort5   s   zTestDAG.test_topological_sort5c                    s`   t jt jfD ]'  fdd} fdd} fdd}tt| tt| tt j| qd S )Nc                     s<   t g d} d} | D ]}|rd}| d| d qd S )Nr   r   r*   TFr!   )r   r   rA   r`   firstxra   r
   r   runtime_error   s   z5TestDAG.test_topological_sort6.<locals>.runtime_errorc                     6   t g d} d} | D ]}|rd}| d qd S )Nr   TFr   r   r   remove_noder   r   r
   r   unfeasible_error      
z8TestDAG.test_topological_sort6.<locals>.unfeasible_errorc                     r   )Nr   TFr   r   r   r   r
   r   runtime_error2   r   z6TestDAG.test_topological_sort6.<locals>.runtime_error2)r   r[   r\   r7   r8   RuntimeErrorr^   )r   r   r   r   r
   r   r   test_topological_sort6   s   zTestDAG.test_topological_sort6c                 C   s.   t g d}tt |g dgksJ d S )N)r   r   r*   r+   r.   r   r   rs   all_topological_sortsrk   r
   r
   r   test_all_topological_sorts_1   s    z$TestDAG.test_all_topological_sorts_1c                 C   sF   t g d}tt |g dg dg dg dg dgks!J 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   sortedr   rk   r
   r
   r   test_all_topological_sorts_2   s   z$TestDAG.test_all_topological_sorts_2c                 C   sF   dd }dd }dd }t tj| t tj| t tj| d S )Nc                  S       t g d} tt |  d S )N)r   r   r*   r   r   r+   r   rx   r
   r
   r   
unfeasible     z8TestDAG.test_all_topological_sorts_3.<locals>.unfeasiblec                  S   s    t ddg} tt |  d S )Nr   r   )r   r6   rs   r   r   r
   r
   r   not_implemented  r   z=TestDAG.test_all_topological_sorts_3.<locals>.not_implementedc                  S   r   )N)r   r   r   )r   
MultiGraphrs   r   r   r
   r
   r   not_implemented_2  s   z?TestDAG.test_all_topological_sorts_3.<locals>.not_implemented_2)r7   r8   r   r^   r9   )r   r   r   r   r
   r
   r   test_all_topological_sorts_3
  s   z$TestDAG.test_all_topological_sorts_3c                 C   sJ   t  }tdD ]}|| qtttt|jtt 	|ks#J d S )Nr$   )
r   r   r@   rV   r   maprs   r   rB   r   )r   r`   ro   r
   r
   r   test_all_topological_sorts_4  s   z$TestDAG.test_all_topological_sorts_4c                 C   s8   t g d}tt |tg dg dgksJ d S )N)r   r   r   r*   r    r    r    r.   )r   r   r   r!   r   )r   rE   r   r   rk   r
   r
   r   'test_all_topological_sorts_multigraph_1%  s   z/TestDAG.test_all_topological_sorts_multigraph_1c                 C   sd   d}g }t d|D ]}|||d fg|  q	t|}tt|tt d|d gks0J d S )Nrq   r   )r@   extendr   rE   rs   r   )r   Nr&   ro   r`   r
   r
   r   'test_all_topological_sorts_multigraph_2+  s   
*z/TestDAG.test_all_topological_sorts_multigraph_2c                 C   sv   t  }t jjj}|g d ||dh dksJ ||dddhks&J ||dt ks0J tt j	||d d S )Nr   r,   r   r   r+   r   r#   r"   r#   >   r   r   r   r!   r   r   r      )
r   r   
algorithmsdag	ancestorsrz   rt   r7   r8   r|   )r   r   r   r
   r
   r   test_ancestors3     
zTestDAG.test_ancestorsc                 C   sv   t  }t jjj}|g d ||dh dksJ ||dh dks&J ||dt ks0J tt j	||d d S )Nr   r   >   r   r   r#   r   >   r   r   r!   r#   r   r   )
r   r   r   r   descendantsrz   rt   r7   r8   r|   )r   r   r   r
   r
   r   test_descendants<  r   zTestDAG.test_descendantsc                 C   s4  t g d}g d}tt | |sJ t g d}g d}tt | |s.J t g d}g d}t|dd |D  }ttt | |sRJ t g d}g d}ttt | |skJ t g d}g d}ttt | |sJ t g d}g d}ttt | |sJ t d	d
ddifd
dddifdg}t |}| D ]\}}|	|||	||ksJ qd}t dd t
|D }t |}| D ]\}}|	|||	||ksJ qt  }tt j t j|dd W d    d S 1 sw   Y  d S )Nr   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   c                 S      g | ]}||fqS r
   r
   r<   r
   r
   r   r?   N  rp   z3TestDAG.test_transitive_closure.<locals>.<listcomp>r   r   ar   br   r*   
   c                 s   $    | ]}||d  d|dfV  qdS )r   r   )fweightNr
   rn   r
   r
   r   	<genexpr>d     " z2TestDAG.test_transitive_closure.<locals>.<genexpr>zwrong input)Z	reflexive)r   r   r   transitive_closurer&   r   r6   r   rE   get_edge_datar@   r7   r8   r|   )r   r   solutionsolnHrv   rw   kr
   r
   r   test_transitive_closureE  s@   $

$zTestDAG.test_transitive_closurec                 C   s  t g d}g d}t|dd |D  }tt | |s"J tt |d |s/J tt |d |s<J tt |d  |sIJ t g d}g d}t|d	d |D  }tt | |skJ tt |d |sxJ tt |d |sJ tt |d  |sJ t g d
}tg d}t|dd |D  }ttt | |sJ ttt |d |sJ ttt |d  |sJ ttt |d |sJ t g d}g d}t|dd |D  }tt | |sJ tt |d |sJ tt |d |s$J tt |d  |s2J t g d}g d}t|dd |D  }tt | |sUJ tt |d |scJ tt |d |sqJ tt |d  |sJ t g d}g d}t|dd |D  }tt | |sJ tt |d |sJ tt |d |sJ tt |d  |sJ d S )Nr   r   c                 S   r   r
   r
   r<   r
   r
   r   r?   p  rp   z=TestDAG.test_reflexive_transitive_closure.<locals>.<listcomp>FTr   r   c                 S   r   r
   r
   r<   r
   r
   r   r?   x  rp   r   r   c                 S   r   r
   r
   r<   r
   r
   r   r?     rp   c                 S   r   r
   r
   r<   r
   r
   r   r?     rp   c                 S   r   r
   r
   r<   r
   r
   r   r?     rp   c                 S   r   r
   r
   r<   r
   r
   r   r?     rp   )	r   r   r   r   r   r&   r6   r   rE   )r   r   r   r   r
   r
   r   !test_reflexive_transitive_closurem  sT    z)TestDAG.test_reflexive_transitive_closurec                 C   s0  t g d}t jjj}g d}t|| |sJ t g d}g d}t|| |s1J t g d}t	t j
|| t ddddifddd	d
ifdg}||}| D ]\}}||||||kslJ qZd}t dd t|D }||}| D ]\}}||||||ksJ qd S )Nr   r   r   r   r   r   r   r   r   r   r*   r   c                 s   r   )r   bar)Zfoor   Nr
   rn   r
   r
   r   r     r   z6TestDAG.test_transitive_closure_dag.<locals>.<genexpr>)r   r   r   r   Ztransitive_closure_dagr   r&   r6   r7   r8   r9   r   r@   )r   r   r   r   r   rv   rw   r   r
   r
   r   test_transitive_closure_dag  s&   
$z#TestDAG.test_transitive_closure_dagc                 C   s   t g d}t jjj}g d}t|| |sJ t g d}t jjj}g d}t|| |s6J t g d}t	t j
|| d S )Nr   r   r   r   )r   r   r   r   transitive_reductionr   r&   r6   r7   r8   r9   )r   r   r   r   r
   r
   r   test_transitive_reduction  s   

z!TestDAG.test_transitive_reductionc                 C   s4   dd |D }dd |D }t |t |ksJ d S )Nc                 S      g | ]}t |qS r
   	frozensetr=   r   r
   r
   r   r?     rp   z-TestDAG._check_antichains.<locals>.<listcomp>c                 S   r   r
   r   r   r
   r
   r   r?     rp   )rt   )r   r   resultZsolresr
   r
   r   _check_antichains  s   zTestDAG._check_antichainsc                    s0  t jjj t g d}g dgdgdgdgg}| t || t g d}g dgdgddgdgddgddgg d	d
gd
dgdgddgdgdgg}| t || t g d}g dgd
gdgddgdd
gdgdgddgdd
gddgg dg dddgdgg}| t || t ddgdgdgdgd}g dgdgdgdgddgddgdgg}| t || t  }| t |g g t  }|g d g dgdgddgdgddgddgg dg}| t ||  fdd}t g d}t	
t j|| t g d}t	
t j|| d S )Nr   r   r   r   r   rT   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   c                    s   t  | S r   )rs   r   
antichainsr
   r   r     s   z"TestDAG.test_antichains.<locals>.fr   )r   r   r   r   r   r   rs   Zadd_nodes_fromr6   r7   r8   r9   r^   )r   r   r   r   r
   r   r   test_antichains  sj   
&*zTestDAG.test_antichainsc                 C   sp   t g d}tt |g dksJ tt j|dd dg dks%J tt j|dd dg dks6J d S )N)r   r   r   r-   r   )r   r   r   r   r!   r#   c                 S   s   | S r   r
   r   r
   r
   r   <lambda>  s    z?TestDAG.test_lexicographical_topological_sort.<locals>.<lambda>keyc                 S   s   |  S r   r
   r   r
   r
   r   r     s    )r   r!   r   r   r#   r   )r   r   rs   r\   r   r
   r
   r   %test_lexicographical_topological_sort  s   "&z-TestDAG.test_lexicographical_topological_sortc                    sv   G dd d dd } fddt dD t }g d}|fd	d
|D  ttj||d}|ks9J dS )z
        Check the case of two or more nodes with same key value.
        Want to avoid exception raised due to comparing nodes directly.
        See Issue #3493
        c                   @   s   e Zd Zdd Zdd ZdS )zATestDAG.test_lexicographical_topological_sort2.<locals>.Test_Nodec                 S   s   || _ d| _d S )Nr   )labelpriority)r   r>   r
   r
   r   __init__  s   
zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__init__c                 S   s   d| j  dS )NzNode())r   r   r
   r
   r   __repr__"  s   zJTestDAG.test_lexicographical_topological_sort2.<locals>.Test_Node.__repr__N)rO   rP   rQ   r   r   r
   r
   r
   r   	Test_Node  s    r   c                 S   s   | j S r   )r   )noder
   r
   r   sorting_key%  s   zCTestDAG.test_lexicographical_topological_sort2.<locals>.sorting_keyc                    s   g | ]} |qS r
   r
   r<   )r   r
   r   r?   (  rp   zBTestDAG.test_lexicographical_topological_sort2.<locals>.<listcomp>r   )r   r   r   r   )r   r   r   c                 3   s$    | ]\}} |  | fV  qd S r   r
   )r=   r   r   )
test_nodesr
   r   r   +  r   zATestDAG.test_lexicographical_topological_sort2.<locals>.<genexpr>r   N)r@   r   r   rz   rs   r\   )r   r   r   r&   Zsortingr
   )r   r   r   &test_lexicographical_topological_sort2  s   z.TestDAG.test_lexicographical_topological_sort2N)rO   rP   rQ   classmethodrZ   rb   re   rl   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   rX      s4    

		(1<rX   c               
   C   s   t ddgddgdgg ddgg g d } dd	 t | D }g d
ddgdgdgg}||ks2J t | j}|dd dd	 t |D }||ksNJ d S )Nr   r   r   r!   r$   r#   )r   r   r   r   r!   r#   r$   c                 S   r   r
   r   r=   genr
   r
   r   r?   6  rp   z0test_topological_generations.<locals>.<listcomp>)r   r#   r$   r   c                 S   r   r
   r   r   r
   r
   r   r?   <  rp   )r   r   reversetopological_generationsrE   r&   rA   )r   ZgenerationsexpectedZMGr
   r
   r   test_topological_generations1  s    r   c                  C   s"   t  } tt | g ksJ d S r   )r   r   rs   r   r   r
   r
   r   "test_topological_generations_empty@  s   r   c                  C   s\   t ddgddgddgg} tt j tt |  W d    d S 1 s'w   Y  d S )Nr   r   r   )r   r   r7   r8   r^   rs   r   r   r
   r
   r   "test_topological_generations_cycleE  s   "r   c                  C   s*   t  } t | g d t | rJ d S )Nr   r   r   r   r   r   	add_cycleis_aperiodicr   r
   r
   r   test_is_aperiodic_cycleK  s   r   c                  C   s:   t  } t | g d t | g d t | sJ d S )Nr   )r   r   r!   r#   r$   r   r   r
   r
   r   test_is_aperiodic_cycle2Q     r   c                  C   s:   t  } t | g d t | g d t | rJ d S )Nr   )r   r   r!   r#   r   r   r
   r
   r   test_is_aperiodic_cycle3X  r   r   c                  C   s6   t  } t | g d | dd t | sJ d S )Nr   r   r   r   r   r   rA   r   r   r
   r
   r   test_is_aperiodic_cycle4_     r   c                  C   s6   t  } t | g d | dd t | sJ d S )Nr   r   r   r   r
   r
   r   test_is_aperiodic_selfloopf  r   r   c                  C   s   t  } tt jt j|  d S r   )r   r6   r7   r8   r|   r   r   r
   r
   r   #test_is_aperiodic_undirected_raisesm  r   r   c                  C   sN   t jt jd} tjt jdd t |  W d    d S 1 s w   Y  d S )NZcreate_usingzGraph has no nodes.match)r   Zempty_graphr   r7   r8   ZNetworkXPointlessConceptr   r   r
   r
   r   test_is_aperiodic_empty_graphr  s   "r  c                  C   s    t t  } t | rJ d S r   )r   r   Zdavis_southern_women_graphr   r   r
   r
   r   test_is_aperiodic_bipartitex  s   r  c                  C   s&   t jddt  d} t | rJ d S )Nr      r   )r   Zfull_rary_treer   r   r   r
   r
   r   test_is_aperiodic_rary_tree~  s   r  c                  C   s`   t  } t | g d t | g d t | rJ | dd | dd t | s.J d S )Nr   )r!   r#   r$   r   r   r   r!   r$   )r   r   r   r   rA   r   r
   r
   r   test_is_aperiodic_disconnected  s   r  c                  C   s6   t  } t | g d | dd t | rJ d S )Nr   r   r   r   r
   r
   r   test_is_aperiodic_disconnected2  r   r  c                   @   sP   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S )TestDagToBranchingz>Unit tests for the :func:`networkx.dag_to_branching` function.c                 C   sH   t g d}t |}t g d}t |sJ t ||s"J dS )znTests that a directed acyclic graph with a single degree
        zero node produces an arborescence.

        )r   r   r,   r   )r   r,   r   r   N)r   r   dag_to_branchingis_arborescenceis_isomorphicr   r   Br   r
   r
   r   test_single_root  s
   
z#TestDagToBranching.test_single_rootc                 C   sV   t g d}t |}t g d}t |sJ t |r!J t ||s)J dS )zTests that a directed acyclic graph with multiple degree zero
        nodes creates an arborescence with multiple (weakly) connected
        components.

        )r   r   r,   r   )r!   r   )r   r,   r   r   r"   )r#   r$   N)r   r   r  Zis_branchingr	  r
  r  r
   r
   r   test_multiple_roots  s   
z&TestDagToBranching.test_multiple_rootsc                 C   s2   t jddt  d}t |}t ||sJ dS )zTests that a directed acyclic graph that is already an
        arborescence produces an isomorphic arborescence as output.

        r   r   N)r   balanced_treer   r  r
  )r   Ar  r
   r
   r   test_already_arborescence  s   
z,TestDagToBranching.test_already_arborescencec                 C   sR   t jddt  d}t jddt  d}t ||}t |}t ||s'J dS )z}Tests that a directed acyclic graph that is already a
        branching produces an isomorphic branching as output.

        r   r   N)r   r  r   Zdisjoint_unionr  r
  )r   ZT1ZT2r   r  r
   r
   r   test_already_branching  s
   
z)TestDagToBranching.test_already_branchingc                 C   sN   t tj ttddd}t| W d   dS 1 s w   Y  dS )z3Tests that a non-acyclic graph causes an exception.abcT)ZcyclicN)r7   r8   r   Z	HasACycler   r   r  r   r
   r
   r   test_not_acyclic  s   "z#TestDagToBranching.test_not_acyclicc                 C   @   t tj tt  W d    d S 1 sw   Y  d S r   )r7   r8   r   r9   r  r6   r   r
   r
   r   test_undirected     "z"TestDagToBranching.test_undirectedc                 C   r  r   )r7   r8   r   r9   r  r   r   r
   r
   r   test_multigraph  r  z"TestDagToBranching.test_multigraphc                 C   r  r   )r7   r8   r   r9   r  rE   r   r
   r
   r   test_multidigraph  r  z$TestDagToBranching.test_multidigraphN)rO   rP   rQ   rR   r  r  r  r  r  r  r  r  r
   r
   r
   r   r    s    (	r  c                  C   s>   t d} t | dt | d  koh dk dS    dS )z^Regression test to ensure ancestors and descendants work as expected on
    undirected graphs.r!   r   >   r   r   r   r   N)r   Z
path_graphr   r   r   r
   r
   r   %test_ancestors_descendants_undirected  s   
4r  c                  C   sH   t  } tjt jdd t |  W d    d S 1 sw   Y  d S Nzfor undirected typer   )r   r6   r7   r8   r9   compute_v_structuresr   r
   r
   r   test_compute_v_structures_raise  s   "r  c                  C   sp   g d} t | }tt |}t|dksJ d|v sJ g d} t | }tt |}t|dks6J d S )Nr   r   r   r   r   r   r   )r  r  Cr  )r  Dr#  Er   r%  r   )r   r   rt   r  len)r&   r   	v_structsr
   r
   r   test_compute_v_structures  s   

r)  c                  C   s@   t  } t  t |  W d    d S 1 sw   Y  d S r   )r   r   r7   Zdeprecated_callr  r   r
   r
   r   $test_compute_v_structures_deprecated  s   
"r*  c                  C   J   t  } tjt jdd t j|  W d    d S 1 sw   Y  d S r  )r   r6   r7   r8   r9   r   v_structuresr   r
   r
   r   test_v_structures_raise     "r-  )edgelistr   r  r  )r   r!  )r#  r   r$  r&  )r  r  r"  )r   r   r   c                 C   *   t | }tt j|}||ksJ d S r   )r   r   rt   r   r,  )r/  r   r   r(  r
   r
   r   test_v_structures  s   
r1  c                  C   r+  r  )r   r6   r7   r8   r9   r   	collidersr   r
   r
   r   test_colliders_raise-  r.  r3  )r#  r%  r   c                 C   r0  r   )r   r   rt   r   r2  )r/  r   r   r2  r
   r
   r   test_colliders3  s   
r4  ))collectionsr   	itertoolsr   r   r7   Znetworkxr   Znetworkx.utilsr   r   r   r   rS   rX   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r  r  r)  r*  r-  markZparametrizert   r1  r3  r4  r
   r
   r
   r   <module>   sp    H0   +]
