o
    qoi|<                     @   s   d Z ddlZddlZddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ddl
mZ ddlmZ ejG dd dZejG d	d
 d
ZdddZdd Zdd ZG dd dZG dd dejZG dd dejZedkrxe  dS dS )z#Tests for partial_with_arg_factory.    N)ListAny)absltest)parameterized)arg_factoryc                   @   s   e Zd ZU dZeed< dS )Childr   xN)__name__
__module____qualname__r   int__annotations__ r   r   P/home/ubuntu/.local/lib/python3.10/site-packages/fiddle/_src/arg_factory_test.pyr      s   
 r   c                   @   sR   e Zd ZU ejedZee e	d< dd Z
ee
eZejeefddZdS )Parent)default_factorychildrenc                 C   s   | j | d S N)r   appendselfchildr   r   r   	add_child'   s   zParent.add_childc                 C   s   |  | d S r   )r   r   r   r   r   new_child_2,   s   zParent.new_child_2N)r	   r
   r   dataclassesfieldlistr   r   r   r   r   r   partialmethod	new_childsupply_defaultsr   r   r   r   r   r   r   #   s   
 r   c                 C      | |||fS r   r   arg1arg2kwarg1kwarg2r   r   r   	sample_fn1      r&   c                C   
   | ||fS r   r   abcr   r   r   
posonly_fn5      
r-   c                  O      | |fS r   r   )argskwargsr   r   r   
varargs_fn9      r2   c                   @   s   e Zd ZdddZdd ZdS )Countercounterc                 C   s   || _ d| _d S )Nr   )namecount)r   r6   r   r   r   __init__?   s   
zCounter.__init__c                 C   s    |  j d7  _ | j d| j  S )N   _)r7   r6   r   r   r   r   __call__C   s   zCounter.__call__N)r5   )r	   r
   r   r8   r<   r   r   r   r   r4   =   s    
r4   c                   @   s   e Zd Zdd Zdd Zdd Zeddd	 Zd
d Z	dd Z
dd Zdd Zdd Zeddd Zdd Zdd Zdd Zeejeeddfejeeddfgd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*S )+ArgFactoryPartialTestc                 C   sX   t tt }| |dd | |dd | |dddd | |ddd	 d S )
N   )	counter_1r>   r   N)	counter_2r>   r   N      r%   )	counter_3rA   r   rB   r#   )	counter_4r>   r   Nr   partialr&   r4   assertEqualr   pr   r   r   test_factory_positional_argJ   s
   z1ArgFactoryPartialTest.test_factory_positional_argc                 C   sN   t jtt d}| |ddd | |ddd | |ddddd d S )	Nr$   r9   rA   r9   rA   r?   Nr9   rA   r@   Nr   rC   r9   rA   rD   r   rG   rJ   r   r   r   test_factory_keyword_argQ   s   z.ArgFactoryPartialTest.test_factory_keyword_argc                 C   sL   t jtt d}| |ddd | |dddd | |ddd	 d S )
NrE   r>   r"   r>   r?   r   Nr9   rA   r"   r#   r9   rA   r   Nr>   r@   r   NrG   rJ   r   r   r   'test_factory_is_not_run_when_overriddenW   s   z=ArgFactoryPartialTest.test_factory_is_not_run_when_overriddenz,Enable this after dropping pyhon 3.7 supportc                 C   s:   dd }t j|dd dd d}| | ddd	if d S )
Nc                 [   r/   r   r   )r   r1   r   r   r   fc      z:ArgFactoryPartialTest.test_positional_only_args.<locals>.fc                   S      dS )Npositional_xr   r   r   r   r   <lambda>i       zAArgFactoryPartialTest.test_positional_only_args.<locals>.<lambda>c                   S   rZ   )N	keyword_xr   r   r   r   r   r\   i   r]   r   r[   r   r^   r   rH   rI   r   rX   rK   r   r   r   test_positional_only_args`   s   z/ArgFactoryPartialTest.test_positional_only_argsc                 C   s|   t jttdtdtdd}| | d | |ddd | |dd	d
d | |dd	dddd | | d d S )Nr"   r#   r%   )r"   r#   r%   arg1_1arg2_1r   kwarg2_1r>   rR   r>   arg2_2r   kwarg2_2   rT   r>   rj   r   kwarg2_3      r!   r>   rj   rm   rn   arg1_2arg2_3r   kwarg2_4rG   rJ   r   r   r   test_multiple_factoriesl   s   z-ArgFactoryPartialTest.test_multiple_factoriesc                 C   s6   t  }tjt||d}| | d | | d d S )NrT   r?   r@   r   NrD   rF   r   N)r4   r   rH   r&   rI   r   factoryrK   r   r   r   test_reused_factoryx   s   z)ArgFactoryPartialTest.test_reused_factoryc                 C   sf   dd }t j|td}|d}|d}| |tdg d | |tdg d | |d |d  d S )Nc                 S   
   | |dS Nr6   r   r   r|   r   r   r   rX      r.   z2ArgFactoryPartialTest.test_list_factory.<locals>.fr   joesuer|   r   )r   rH   r   rI   dictassertIsNot)r   rX   rK   r~   r   r   r   r   test_list_factory~   s   z'ArgFactoryPartialTest.test_list_factoryc                 C   sH   dd }t |t j}| | d | | d | | d d S )Nc                 S      | d S NrA   r   r_   r   r   r   r\          zDArgFactoryPartialTest.test_itertools_count_factory.<locals>.<lambda>r   rA      )r   rH   	itertoolsr7   __next__rI   )r   doublerK   r   r   r   test_itertools_count_factory   s
   z2ArgFactoryPartialTest.test_itertools_count_factoryc                 C   st   t tdd }| }| }| |ttdg | |ttdg | |j|j | |jd |jd  d S )Nc                   S   
   t dgS NrB   r   r   r   r   r   r\         
 zQArgFactoryPartialTest.test_customized_dataclass_default_factory.<locals>.<lambda>rB   r   )r   rH   r   rI   r   r   r   r   parent_factoryr*   r+   r   r   r   )test_customized_dataclass_default_factory   s   z?ArgFactoryPartialTest.test_customized_dataclass_default_factoryc                 C   s0   dd }t j|dd d}| |ddd d S )	Nc                 S   s   | | S r   r   )r   otherr   r   r   rX      r3   z6ArgFactoryPartialTest.test_param_named_self.<locals>.fc                   S   rZ   )N
   r   r   r   r   r   r\      r]   z=ArgFactoryPartialTest.test_param_named_self.<locals>.<lambda>)r   r>   r;      r`   ra   r   r   r   test_param_named_self   s   z+ArgFactoryPartialTest.test_param_named_selfc                 C   s2   dd }t j|tttd}| | g g g f d S )Nc                 S   r(   r   r   funcr0   r1   r   r   r   rX      r.   z6ArgFactoryPartialTest.test_param_named_func.<locals>.fr   )r   rH   r   rI   ra   r   r   r   test_param_named_func   s   z+ArgFactoryPartialTest.test_param_named_funcc                 C   N   t  }|  |  | |t tdtdg | |jd |jd  d S Nr   r9   )r   r   rI   r   r   r   r   parentr   r   r   test_partialmethod   
   z(ArgFactoryPartialTest.test_partialmethodc                 C   s   |  ttjttd |  ttjdd td |  tttdj | tt	jtdd | tt	jdd dd | tt	tdj | td  | td d S )Nr_   c                 S      | d S Nr9   r   r_   r   r   r   r\      r   zAArgFactoryPartialTest.test_is_a_factory_partial.<locals>.<lambda>r   c                 S   r   r   r   r_   r   r   r   r\      r   xyz)

assertTruer   is_arg_factory_partialrH   r   r   r   __eq__assertFalse	functoolsr;   r   r   r   test_is_a_factory_partial   s8   z/ArgFactoryPartialTest.test_is_a_factory_partialrR   z9(*, arg1=<built by: list()>, arg2, kwarg1=0, kwarg2=None)rM   z7(arg1, arg2, *, kwarg1=<built by: list()>, kwarg2=None)c                 C   s   |  tt|| d S r   )rI   strinspect	signature)r   rK   r   r   r   r   test_partial_func_signature   s   z1ArgFactoryPartialTest.test_partial_func_signaturec                 C   s:   t jtdd}tj|td}| |dddg dd f d S )Nr>   rR   rE   r   rM   )r   rH   r&   r   r   rI   r   p1p2r   r   r   /test_arg_factory_partial_wrap_functools_partial      zEArgFactoryPartialTest.test_arg_factory_partial_wrap_functools_partialc                 C   s:   t jttd}tj|dd}| |dddg dd f d S )NrE   r>   rR   r   rM   )r   rH   r&   r   r   rI   r   r   r   r   /test_functools_partial_wrap_arg_factory_partial   r   zEArgFactoryPartialTest.test_functools_partial_wrap_arg_factory_partialc                 C   sx   |  td ttd W d    n1 sw   Y  |  td tjtd d W d    d S 1 s5w   Y  d S )NzExpected .* to be callabler>   rM   )assertRaisesRegex	TypeErrorr   rH   r&   r;   r   r   r   )test_arg_factories_must_be_callable_error   s   "z?ArgFactoryPartialTest.test_arg_factories_must_be_callable_errorc                 C   sJ   t jttd}| td |dd W d    d S 1 sw   Y  d S )N)r,   z>got some positional-only arguments passed as keyword argumentsr9   rA   )r   rH   r-   r   r   r   rJ   r   r   r   9test_partial_cant_bind_positional_only_params_as_keywords   s   "zOArgFactoryPartialTest.test_partial_cant_bind_positional_only_params_as_keywordsN)r	   r
   r   rL   rQ   rW   r   skiprb   rt   ry   r   r   r   r   r   r   r   r   
parametersr   rH   r&   r   r   r   r   r   r   r   r   r   r   r=   H   s:    	
	



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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 )(DefaultFactoryTestc                 C   s   t jt t dd fdd}| |ddd | |ddd | |dd	d
d | |dddd | |ddd d S )Nr   c                 S   r    r   r   r!   r   r   r   rK         z.DefaultFactoryTest.test_factory_arg.<locals>.pr>   rR   rS   rV   rA   rB   )r"   r%   )rA   rD   r   rB   r9   rT   rU   )r>   rF   r   Nr   r   r   r4   rI   rJ   r   r   r   test_factory_arg   s   z#DefaultFactoryTest.test_factory_argc                 C   sZ   t jt t d fdd}| |ddd | |ddd | |ddddd	 d S )
Nc                 S   r    r   r   r!   r   r   r   rK     r   z0DefaultFactoryTest.test_factory_kwarg.<locals>.pr9   rA   rN   rO   r   rC   rP   r   rJ   r   r   r   test_factory_kwarg   s   z%DefaultFactoryTest.test_factory_kwargc                 C   sZ   t jt t dd fdd}| |ddd | |ddd	d
 | |ddd d S )Nr   c                 S   r    r   r   r!   r   r   r   rK     r   zEDefaultFactoryTest.test_factory_is_not_run_when_overridden.<locals>.pr>   rR   rS   r9   rA   rT   rU   rV   r   rJ   r   r   r   rW     s   z:DefaultFactoryTest.test_factory_is_not_run_when_overriddenc                 C   s   t jt tdt tddt tdfdd}| | d | |dd	d
 | |dddd | |dddddd | | d d S )Nr"   r#   r   r%   c                 S   r    r   r   r!   r   r   r   rK        z5DefaultFactoryTest.test_multiple_factories.<locals>.prc   r>   rR   rg   rj   rT   rk   rm   rn   r!   ro   rp   r   rJ   r   r   r   rt     s   z*DefaultFactoryTest.test_multiple_factoriesc                 C   sJ   t  }tjt|t|dd fdd}| | d | | d d S )Nr   c                 S   r    r   r   r!   r   r   r   rK   .  r   z1DefaultFactoryTest.test_reused_factory.<locals>.pru   rv   )r4   r   r   r   rI   rw   r   r   r   ry   +  s   z&DefaultFactoryTest.test_reused_factoryc                 C   sh   t jt tfdd}|d}|d}| |tdg d | |tdg d | |d |d  d S )Nc                 S   rz   r{   r   r|   r   r   r   rX   <     
z/DefaultFactoryTest.test_list_factory.<locals>.fr~   r   r|   r   )r   r   r   r   rI   r   r   )r   rX   r~   r   r   r   r   r   :  s   z$DefaultFactoryTest.test_list_factoryc                 C   sL   t jt t jfdd}| | d | | d | | d d S )Nc                 S   r   r   r   r_   r   r   r   rK   I  rY   z:DefaultFactoryTest.test_itertools_count_factory.<locals>.pr   rA   r   )r   r   r   r   r7   r   rI   rJ   r   r   r   r   G  s
   z/DefaultFactoryTest.test_itertools_count_factoryc                 C   s   t jt dd fdd}| }| }| |ttdg | |ttdg | |j|j | |jd |jd  d S )Nc                   S   r   r   r   r   r   r   r   r\   U  r   zNDefaultFactoryTest.test_customized_dataclass_default_factory.<locals>.<lambda>c                 S   s   t | S r   )r   r}   r   r   r   r   S  s   zTDefaultFactoryTest.test_customized_dataclass_default_factory.<locals>.parent_factoryrB   r   )r   r   r   rI   r   r   r   r   r   r   r   r   r   Q  s   z<DefaultFactoryTest.test_customized_dataclass_default_factoryc                 C   r   r   )r   r   rI   r   r   r   r   r   r   r   r   `  r   z%DefaultFactoryTest.test_partialmethodc                 C   sb   t jt tfdd}|dd}|dd}| |ddg f | || | |d |d  d S )Nc                S   r(   r   r   r)   r   r   r   rK   i  r   z*DefaultFactoryTest.test_posonly.<locals>.pr9   rA   )r   r   r   r   rI   r   )r   rK   r   yr   r   r   test_posonlyg  s   

zDefaultFactoryTest.test_posonlyc                 C   s   t jt tfdtt fdd}|d}|d}|d|}| |ddg | |dg | || | || | |j	d | |j
d | t|d	 | |j|jj | |j|jj d S )
Nseqc                 S      | |  |S )
Docstring.r   )eltr   r   r   r   r   t  s   
z7DefaultFactoryTest.test_supply_defaults.<locals>.appendrB   r   r>   r   r   __wrapped__)r   r   r   r   r   r   rI   assertIsr   __doc__r	   r   hasattrr   r   r
   )r   r   r   r   zr   r   r   test_supply_defaultss  s   
z'DefaultFactoryTest.test_supply_defaultsc                 C   sF   t jt tddd}| |ddg f | |dddd d S )N)r   c                S   r/   r   r   r   r   r   r   r   rX     rY   zADefaultFactoryTest.test_default_for_keyword_only_param.<locals>.fr9   rA   r9   rA   r   r   r   r   rI   r   rX   r   r   r   #test_default_for_keyword_only_param  s   z6DefaultFactoryTest.test_default_for_keyword_only_paramc                 C   sB   t jt tfdd}| |ddg f | |ddd d S )Nc                S   r/   r   r   r   r   r   r   rX     rY   zDDefaultFactoryTest.test_default_for_positional_only_param.<locals>.fr9   rA   r   r   r   r   r   r   &test_default_for_positional_only_param  s   z9DefaultFactoryTest.test_default_for_positional_only_paramc                 C   s@   |  td tdd  W d    d S 1 sw   Y  d S )Nz&expected at least one argument to havec                 S   r/   r   r   r   r   r   r   r\     r   zQDefaultFactoryTest.test_supply_defaults_with_no_default_factory.<locals>.<lambda>)r   
ValueErrorr   r   r;   r   r   r   ,test_supply_defaults_with_no_default_factory  s
   "z?DefaultFactoryTest.test_supply_defaults_with_no_default_factoryc                 C   s   d}t tfdd}t tjfdd}| t| |d W d    n1 s*w   Y  | t| |d W d    d S 1 sEw   Y  d S )Nzarg_factory\.default_factory\(.*\) does not support.*\n.*\nDid you forget to apply the `@arg_factory\.supply_defaults` decorator\?c                 S   r   r   r   )r   lstr   r   r   rX     s   
z:DefaultFactoryTest.test_missing_decorator_error.<locals>.fc                 S   s   | |  | S r   r   )r   noiser   r   r   g  r'   z:DefaultFactoryTest.test_missing_decorator_error.<locals>.gr>   )r   r   r   randomr   AttributeErrorr   )r   expected_errorrX   r   r   r   r   test_missing_decorator_error  s   

"z/DefaultFactoryTest.test_missing_decorator_errorc                 C   4   t jt tfdtt fdd}| | g  d S )Nr   c                 S      | S r   r   r_   r   r   r   rX        z@DefaultFactoryTest.test_default_factory_type_override.<locals>.f)r   r   r   r   r   r   rI   r   r   r   r   "test_default_factory_type_override     z5DefaultFactoryTest.test_default_factory_type_overridec                 C   r   )Nr   c                 S   r   r   r   r_   r   r   r   rX     r   z<DefaultFactoryTest.test_arg_factory_type_override.<locals>.f)r   r   
ArgFactoryr   r   r   rI   r   r   r   r   test_arg_factory_type_override  r   z1DefaultFactoryTest.test_arg_factory_type_overridec                 C   s6   t t}t t}| |t t | || d S r   )r   r   r   r   rI   assertNotEqual)r   list_factorydict_factoryr   r   r   test_arg_factory_equal  s   

z)DefaultFactoryTest.test_arg_factory_equalc                 C   s2   t t}| |t| | |t| d S r   )r   r   r   rI   copydeepcopy)r   rx   r   r   r   "test_arg_factory_copy_and_deepcopy  s   
z5DefaultFactoryTest.test_arg_factory_copy_and_deepcopyN)r	   r
   r   r   r   rW   rt   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s(    
		r   __main__)r   N)r   r   r   r   r   r   r   typingr   r   absl.testingr   r   fiddler   	dataclassr   r   r&   r-   r2   r4   TestCaser=   r   r	   mainr   r   r   r   <module>   s4   
 ( `