o
    æS™i¶/  ã                   @   s^   d Z ddlZddlT ddlmZ ddlmZ G dd„ dƒZdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )a   Test that functions are reasonably behaved with None as input.

Typed Cython objects (like dict) may also be None.  Using functions from
Python's C API that expect a specific type but receive None instead can cause
problems such as throwing an uncatchable SystemError (and some systems may
segfault instead).  We obviously don't what that to happen!  As the tests
below discovered, this turned out to be a rare occurence.  The only changes
required were to use `d.copy()` instead of `PyDict_Copy(d)`, and to always
return Python objects from functions instead of int or bint (so exceptions
can propagate).

The vast majority of functions throw TypeError.  The vast majority of
functions also behave the same in `toolz` and `cytoolz`.  However, there
are a few minor exceptions.  Since passing None to functions are edge cases
that don't have well-established behavior yet (other than raising TypeError),
the tests in this file serve to verify that the behavior is at least
reasonably well-behaved and don't cause SystemErrors.

é    N)Ú*)Úraises)Úaddc                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚGenExceptionc                 C   s
   || _ d S ©N©Úexc)Úselfr   © r
   úP/home/ubuntu/.local/lib/python3.10/site-packages/cytoolz/tests/test_none_safe.pyÚ__init__   s   
zGenException.__init__c                 C   ó   | S r   r
   ©r	   r
   r
   r   Ú__iter__   s   zGenException.__iter__c                 C   ó   | j ‚r   r   r   r
   r
   r   Ú__next__"   ó   zGenException.__next__c                 C   r   r   r   r   r
   r
   r   Únext%   r   zGenException.nextN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r
   r
   r
   r   r      s
    r   c                  C   sP  g } t ttfdd„ ƒsJ ‚|  d¡ t ttfdd„ ƒsJ ‚|  d¡ t tdd„ ƒs2td i ƒd u s2J ‚t tdd„ ƒs;J ‚tdd	gd ƒd u sFJ ‚t td
d„ ƒsOJ ‚|  d¡ t tdd„ ƒs]J ‚t ttfdd„ ƒshJ ‚|  d¡ t tdd„ ƒstd d	diƒddiksJ ‚t ttfdd„ ƒsŒJ ‚|  d¡ t tdd„ ƒsšJ ‚t ttfdd„ ƒs¥J ‚|  d¡ t tdd„ ƒs³J ‚t tdd„ ƒs¼J ‚t ttfdd„ ƒsÇJ ‚|  d¡ t tdd„ ƒsÕJ ‚t tdd„ ƒsÞJ ‚t ttfdd„ ƒséJ ‚|  d¡ t tdd„ ƒs÷J ‚t ttfd d„ ƒsJ ‚|  d!¡ t td"d„ ƒstd d	diƒd	d#iksJ ‚t ttfd$d„ ƒs*J ‚|  d%¡ t td&d„ ƒsEtd d	diƒd	d#iksEJ ‚t ttfd'd„ ƒsQJ ‚|  d(¡ t td)d„ ƒs`J ‚t ttfd*d„ ƒslJ ‚|  d+¡ t ttfd,d„ ƒs}J ‚t td-d„ ƒs‡J ‚|  d.¡ t| ƒ}tt	j
jƒ}||ks¦J d/d0 || ¡ ƒ‚d S )1Nc                   S   s   t d ddƒS ©Né   é   )Úassocr
   r
   r
   r   Ú<lambda>+   ó    z test_dicttoolz.<locals>.<lambda>r   c                   S   ó
   t d dƒS ©Nr   )Údissocr
   r
   r
   r   r   .   ó   
 r   c                   S   s
   t d i ƒS r   ©Úget_inr
   r
   r
   r   r   2   r    c                   S   s   t d i ddS )NT©Ú
no_defaultr!   r
   r
   r
   r   r   5   ó    r   r   c                   S   s   t ddgd ddS )Nr   r   Tr#   r!   r
   r
   r
   r   r   7   ó    r"   c                   S   ó   t d ddiƒS r   )Ú	keyfilterr
   r
   r
   r   r   :   r%   c                   S   ó
   t td ƒS r   )r(   Úidentityr
   r
   r
   r   r   ;   r    r(   c                   S   r'   r   )Úkeymapr
   r
   r
   r   r   ?   r%   r   ©r   c                   S   r)   r   )r+   r*   r
   r
   r
   r   r   A   r    r+   c                   S   ó   t d ƒS r   ©Úmerger
   r
   r
   r   r   D   ó    c                   S   s
   t d d ƒS r   r.   r
   r
   r
   r   r   E   r    r/   c                   S   s   t d ddiddiƒS )Nr   r   é   é   )Ú
merge_withr
   r
   r
   r   r   H   ó    c                   S   r)   r   ©r3   r*   r
   r
   r
   r   r   I   r    c                   S   s   t td d ƒS r   r5   r
   r
   r
   r   r   K   r   r3   c                   S   s   t dddiiddgd ƒS ©Nr   r   r1   )Ú	update_inr
   r
   r
   r   r   N   s    c                   S   s   t dddiid tƒS r6   ©r7   r*   r
   r
   r
   r   r   O   r4   c                   S   s   t d ddgtƒS r   r8   r
   r
   r
   r   r   Q   ó    r7   c                   S   r'   r   )Ú	valfilterr
   r
   r
   r   r   T   r%   c                   S   r)   r   )r:   r*   r
   r
   r
   r   r   U   r    r:   c                   S   r'   r   )Úvalmapr
   r
   r
   r   r   Y   r%   ©r   c                   S   r)   r   )r;   r*   r
   r
   r
   r   r   [   r    r;   c                   S   r'   r   )Úitemmapr
   r
   r
   r   r   ^   r%   c                   S   r)   r   )r=   r*   r
   r
   r
   r   r   `   r    r=   c                   S   r'   r   )Ú
itemfilterr
   r
   r
   r   r   c   r%   c                   S   r)   r   )r>   r*   r
   r
   r
   r   r   d   r    r>   c                   S   s   t d ddgdƒS )Nr   r1   ©Úassoc_inr
   r
   r
   r   r   g   r9   c                   S   s   t i d dƒS ©Nr1   r?   r
   r
   r
   r   r   h   r   r@   ú!%s not tested for being None-safeú, )r   Ú	TypeErrorÚAttributeErrorÚappendr"   r+   r;   r=   ÚsetÚcytoolzÚ	dicttoolzÚ__all__Újoin©ÚtestedÚs1Ús2r
   r
   r   Útest_dicttoolz)   sj   





ÿ
ÿ





$rP   c                  C   s4  g } t tdd„ ƒsJ ‚|  d¡ td ƒd u sJ ‚t tdd„ ƒs!J ‚|  d¡ td ƒd u s.J ‚t tdd„ ƒs7J ‚|  d¡ t tdd„ ƒsEJ ‚|  d	¡ t td
d„ ƒsSJ ‚|  d¡ td ƒd u s`J ‚|  d¡ t tdd„ ƒsnJ ‚t tdd„ ƒswJ ‚|  d¡ ttd ddƒdksˆJ ‚ttd ddƒdks”J ‚|  d¡ t tdd„ ƒs¢J ‚|  d¡ tdd ƒd u s°J ‚|  d¡ tdd ƒd u s¾J ‚|  d¡ t	dd„ ƒd ƒd ƒdksÑJ ‚|  d¡ t
td ƒd u sßJ ‚t tdd„ ƒsèJ ‚|  d¡ td dd„ ƒ ttd ƒ |  d¡ t| ƒ}ttjjƒ}||ksJ dd  || ¡ ƒ‚d S )!Nc                   S   s
   t d ƒƒ S r   )Ú
complementr
   r
   r
   r   r   r   r    z test_functoolz.<locals>.<lambda>rQ   c                   S   ó   t d d ƒƒ S r   )Úcomposer
   r
   r
   r   r   v   r   rS   c                   S   rR   r   )Úcompose_leftr
   r
   r
   r   r   z   r   rT   c                   S   r-   r   )Úcurryr
   r
   r
   r   r   }   r0   rU   c                   S   r   r   )Údor
   r
   r
   r   r   €   r    rV   r*   c                   S   r-   r   )Újuxtr
   r
   r
   r   r   †   r0   c                   S   s   t td d ƒƒ ƒS r   )ÚlistrW   r
   r
   r
   r   r   ‡   r9   rW   ©Úkeyr   )ÚcacheÚmemoizec                   S   ó
   t dd ƒS r   )Úpiper
   r
   r
   r   r   Ž   r    r^   Úthread_firstÚthread_lastc                 S   s   | |fS r   r
   )ÚaÚbr
   r
   r   r   —   r0   )NNÚflipc                   S   r-   r   )Úapplyr
   r
   r
   r   r   ›   r0   rd   c                 S   r   r   r
   )Úxr
   r
   r   r   ž   s    ÚexceptsrB   rC   )r   rD   rF   rS   rT   r*   r\   r_   r`   rc   rd   rf   rG   rH   Ú	functoolzrJ   rK   rL   r
   r
   r   Útest_functoolzp   sL   














$rh   c                  C   sF  g } t tdd„ ƒsJ ‚t tdd„ ƒsJ ‚|  d¡ t tdd„ ƒs"J ‚t tdd„ ƒs+J ‚|  d¡ t tdd„ ƒs9J ‚|  d	¡ t td
d„ ƒsGJ ‚|  d¡ t tdd„ ƒsUJ ‚|  d¡ t tdd„ ƒspttd ddgƒƒddgkspJ ‚t tdd„ ƒsyJ ‚|  d¡ t tdd„ ƒs‡J ‚|  d¡ t tdd„ ƒs•J ‚|  d¡ t tdd„ ƒs£J ‚t tdd„ ƒs¬J ‚|  d¡ t tdd„ ƒsºJ ‚t tdd„ ƒsÃJ ‚|  d¡ t tdd„ ƒsÑJ ‚t tdd„ ƒsÚJ ‚t tdd„ ƒsãJ ‚|  d ¡ t td!d„ ƒsñJ ‚|  d"¡ t td#d„ ƒsÿJ ‚|  d$¡ td ƒd%u sJ ‚|  d&¡ t td'd„ ƒsJ ‚|  d(¡ t td)d„ ƒs+J ‚|  d*¡ t td+d„ ƒsLttd dgdggƒƒdgdggksLJ ‚t td,d„ ƒsVJ ‚t td-d„ ƒs`J ‚|  d.¡ t td/d„ ƒsoJ ‚|  d0¡ t td1d„ ƒs~J ‚t td2d„ ƒsˆJ ‚|  d3¡ t td4d„ ƒs—J ‚t td5d„ ƒs¡J ‚|  d6¡ t td7d„ ƒs°J ‚t td8d„ ƒsºJ ‚|  d9¡ t td:d„ ƒsÉJ ‚t td;d„ ƒsÓJ ‚t td<d„ ƒsÝJ ‚|  d=¡ t td>d„ ƒsìJ ‚t td?d„ ƒsöJ ‚t td@d„ ƒs J ‚|  dA¡ t tdBd„ ƒsJ ‚t tdCd„ ƒsJ ‚|  dD¡ t tdEd„ ƒs(J ‚|  dF¡ t tdGd„ ƒsCttd g dH¢ƒƒg ksCJ ‚t tdId„ ƒsMJ ‚|  dJ¡ t tdKd„ ƒsjttd ddgƒƒddgksjJ ‚t tdLd„ ƒstJ ‚|  dM¡ t tdNd„ ƒs‘tt	d ddgƒƒddgks‘J ‚t tdOd„ ƒs›J ‚|  dP¡ t tdQd„ ƒs¸tt
d ddgƒƒddgks¸J ‚t tdRd„ ƒsÂJ ‚|  dS¡ t tdTd„ ƒsÑJ ‚ttg dU¢d dVƒddgksâJ ‚|  dW¡ t tdXd„ ƒsñJ ‚t tdYd„ ƒsûJ ‚|  dZ¡ t td[d„ ƒs
J ‚t td\d„ ƒsJ ‚|  d]¡ t td^d„ ƒs#J ‚t td_d„ ƒs-J ‚t td`d„ ƒs7J ‚t tdad„ ƒsAJ ‚|  db¡ t tdcd„ ƒsPJ ‚|  dd¡ t tded„ ƒs_J ‚t tdfd„ ƒsiJ ‚|  dg¡ t tdhd„ ƒsxJ ‚t tdid„ ƒs‚J ‚|  dj¡ t| ƒ}ttjjƒ}||ks¡J dkdl || ¡ ƒ‚d S )mNc                   S   ó   t td ddgƒƒS r   )rX   Ú
accumulater
   r
   r
   r   r   ©   r&   z test_itertoolz.<locals>.<lambda>c                   S   ó   t ttd ƒƒS r   )rX   rj   r*   r
   r
   r
   r   r   ª   r%   rj   c                   S   r-   r   )Úconcatr
   r
   r
   r   r   ­   r0   c                   S   ó   t td gƒƒS r   )rX   rl   r
   r
   r
   r   r   ®   r%   rl   c                   S   ó   t td ƒƒS r   )rX   Úconcatvr
   r
   r
   r   r   ±   r   ro   c                   S   ó   t tdd ƒƒS r   )rX   Úconsr
   r
   r
   r   r   ´   r%   rq   c                   S   r-   r   )Úcountr
   r
   r
   r   r   ·   r0   rr   c                   S   ri   r   ©rX   Údropr
   r
   r
   r   r   »   r&   r   r   c                   S   rp   r   rs   r
   r
   r
   r   r   ¾   r%   rt   c                   S   r-   r   )Úfirstr
   r
   r
   r   r   Á   r0   ru   c                   S   r-   r   )Úfrequenciesr
   r
   r
   r   r   Ä   r0   rv   c                   S   r]   r   ©Úgetr
   r
   r
   r   r   Ç   r    c                   S   s   t ddgd ƒS r   rw   r
   r
   r
   r   r   È   r%   rx   c                   S   ó   t d ddgƒS r   )Úgroupbyr
   r
   r
   r   r   Ë   r%   c                   S   r)   r   )rz   r*   r
   r
   r
   r   r   Ì   r    rz   c                   S   rn   r   ©rX   Ú
interleaver
   r
   r
   r   r   Ï   r   c                   S   ó   t td d gƒƒS r   r{   r
   r
   r
   r   r   Ð   r9   c                   S   s   t tddgttƒgd dƒS )Nr   r   )Úpass_exceptions)rX   r|   r   Ú
ValueErrorr
   r
   r
   r   r   Ò   s    ÿr|   c                   S   rp   r   )rX   Ú	interposer
   r
   r
   r   r   Ö   r%   r€   c                   S   r-   r   )Ú
isdistinctr
   r
   r
   r   r   Ù   r0   r   FÚ
isiterablec                   S   s   t td dƒƒS r   )rX   Úiterater
   r
   r
   r   r   ß   r%   rƒ   c                   S   r-   r   )Úlastr
   r
   r
   r   r   â   r0   r„   c                   S   ó   t td dgdggƒƒS r   )rX   Úmapcatr
   r
   r
   r   r   æ   ó    c                   S   s   t ttd dggƒƒS )Nr   ©rX   r†   r*   r
   r
   r
   r   r   è   r4   c                   S   rk   r   rˆ   r
   r
   r
   r   r   é   r%   r†   c                   S   ri   r   )rX   Úmerge_sortedr
   r
   r
   r   r   ì   r&   r‰   c                   S   ry   r   ©Únthr
   r
   r
   r   r   ï   r%   c                   S   r]   ©Nr   rŠ   r
   r
   r
   r   r   ð   r    r‹   c                   S   ó   t d g d¢ƒS ©N©r   r   r1   ©Ú	partitionr
   r
   r
   r   r   ó   r%   c                   S   r]   r   r   r
   r
   r
   r   r   ô   r    r‘   c                   S   ó   t td g d¢ƒƒS rŽ   ©rX   Úpartition_allr
   r
   r
   r   r   ÷   r&   c                   S   rp   r   r“   r
   r
   r
   r   r   ø   r%   r”   c                   S   r…   r   ©rX   Úpluckr
   r
   r
   r   r   û   r‡   c                   S   s   t tdd dggƒƒS )Nr   r   r•   r
   r
   r
   r   r   ü   r4   c                   S   rp   rŒ   r•   r
   r
   r
   r   r   ý   r%   r–   c                   S   s   t d tg d¢dƒS ©Nr   r   )Úreducebyr   r
   r
   r
   r   r      r&   c                   S   s   t td g d¢dƒS r—   )r˜   r*   r
   r
   r
   r   r     r&   c                   S   s   t ttd dƒS rŒ   )r˜   r*   r   r
   r
   r
   r   r     r%   r˜   c                   S   ri   r   )rX   Úremover
   r
   r
   r   r     r&   c                   S   rk   r   )rX   r™   r*   r
   r
   r
   r   r     r%   r™   c                   S   r-   r   )Úsecondr
   r
   r
   r   r   	  r0   rš   c                   S   r’   rŽ   ©rX   Úsliding_windowr
   r
   r
   r   r     r&   r   c                   S   rp   r   r›   r
   r
   r
   r   r     r%   rœ   c                   S   ó   t td ddgƒƒddgkS r   ©rX   Útaker
   r
   r
   r   r     ó    c                   S   rp   r   rž   r
   r
   r
   r   r     r%   rŸ   c                   S   r   r   ©rX   Útailr
   r
   r
   r   r     r    c                   S   rp   r   r¡   r
   r
   r
   r   r     r%   r¢   c                   S   ri   r   ©rX   Útake_nthr
   r
   r
   r   r     r&   c                   S   rp   r   r£   r
   r
   r
   r   r   !  r%   r¤   c                   S   rn   r   )rX   Úuniquer
   r
   r
   r   r   $  r   )r   r   r   rY   r¥   c                   S   s   t td tdƒS rŽ   ©rK   ru   rš   r
   r
   r
   r   r   (  r%   c                   S   s   t tdtd ƒS rŽ   r¦   r
   r
   r
   r   r   )  r%   rK   c                   S   r   rŽ   ©Útopkr
   r
   r
   r   r   ,  r%   c                   S   r]   rA   r§   r
   r
   r
   r   r   -  r    r¨   c                   S   r’   rŽ   ©rX   Údiffr
   r
   r
   r   r   0  r&   c                   S   rn   r   r©   r
   r
   r
   r   r   1  r   c                   S   rm   r   r©   r
   r
   r
   r   r   2  r%   c                   S   r}   r   r©   r
   r
   r
   r   r   3  r9   rª   c                   S   r-   r   )Úpeekr
   r
   r
   r   r   6  r0   r«   c                   S   r   rŽ   ©Úpeeknr
   r
   r
   r   r   9  r%   c                   S   r]   rA   r¬   r
   r
   r
   r   r   :  r    r­   c                   S   s   t td dgƒƒS r   ©rX   Úrandom_sampler
   r
   r
   r   r   =  r9   c                   S   rp   )Ngš™™™™™¹?r®   r
   r
   r
   r   r   >  r%   r¯   rB   rC   )r   rD   rF   rX   rt   r‚   r†   rœ   rŸ   r¢   r¤   r¥   rG   rH   Ú	itertoolzrJ   rK   rL   r
   r
   r   Útest_itertoolz§   sâ   









ÿ





(









 
 
 
"






$r±   c                  C   sÈ   g } t tdd„ ƒstd ddgƒdddœksJ ‚t tdd„ ƒs J ‚|  d¡ t tdd„ ƒs;ttd ddgƒƒd	d
gks;J ‚t tdd„ ƒsDJ ‚|  d¡ t| ƒ}ttjj	ƒ}||ksbJ dd 
|| ¡ ƒ‚d S )Nc                   S   ry   r   )Úcountbyr
   r
   r
   r   r   I  r%   ztest_recipes.<locals>.<lambda>r   r   )r,   r<   c                   S   r)   r   )r²   r*   r
   r
   r
   r   r   K  r    r²   c                   S   ri   r   )rX   Úpartitionbyr
   r
   r
   r   r   O  r&   r,   r<   c                   S   rk   r   )rX   r³   r*   r
   r
   r
   r   r   Q  r%   r³   rB   rC   )r   rD   r²   rF   rX   r³   rG   rH   ÚrecipesrJ   rK   rL   r
   r
   r   Útest_recipesF  s   

"rµ   )Ú__doc__rH   Úcytoolz.utilsr   Úoperatorr   r   rP   rh   r±   rµ   r
   r
   r
   r   Ú<module>   s    G7  