a
    zeG                     @   sh   d Z ddlZddlZddlZddlmZ dd Zdd Zdd
dZG dd dej	Z
edkrde  dS )zHUnit tests for the positional only argument syntax specified in PEP 570.    Ncheck_syntax_errorc                C   s   | |fS N abr   r   3/usr/lib/python3.9/test/test_positional_only_arg.pyglobal_pos_only_f
   s    r
   c                C   s   | |fS r   r   r   r   r   r	   global_pos_only_and_normal   s    r         c                C   s   | |fS r   r   r   r   r   r	   global_pos_only_defaults   s    r   c                   @   s   e Zd Z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d d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 Zd:d; Zd<S )>PositionalOnlyTestCaseinvalid syntaxc                 C   s@   |  t|  t|d dd W d    n1 s20    Y  d S )N
<test>single)assertRaisesRegexSyntaxErrorcompile)selfZcodestrZregexr   r   r	   assertRaisesSyntaxError   s    z.PositionalOnlyTestCase.assertRaisesSyntaxErrorc                 C   s   t | dd t | dd t | dd t | dd t | d t | d t | d t | d	 t | d
 t | d t | d t | d t | dd t | dd t | d t | d t | d t | d t | d d S )Nzdef f(a, b = 5, /, c): pass-non-default argument follows default argumentzdef f(a = 5, b, /, c): passz%def f(a = 5, b=1, /, c, *, d=2): passzdef f(a = 5, b, /): passzdef f(*args, /): passzdef f(*args, a, /): passzdef f(**kwargs, /): passzdef f(/, a = 1): passzdef f(/, a): passzdef f(/): passzdef f(*, a, /): passzdef f(*, /, a): passzdef f(a, /, a): pass-duplicate argument 'a' in function definitionzdef f(a, /, *, a): passzdef f(a, b/2, c): passzdef f(a, /, c, /): passzdef f(a, /, c, /, d): passz def f(a, /, c, /, d, *, e): passzdef f(a, *, c, /, d, e): passr   r   r   r   r	   test_invalid_syntax_errors   s&    











z1PositionalOnlyTestCase.test_invalid_syntax_errorsc                 C   s   t | dd t | dd t | dd t | dd t | d t | d t | d t | d	 t | d
 t | d t | d t | d t | dd t | dd t | d t | d t | d t | d t | d d S )Nz!async def f(a, b = 5, /, c): passr   z!async def f(a = 5, b, /, c): passz(async def f(a = 5, b=1, /, c, d=2): passzasync def f(a = 5, b, /): passzasync def f(*args, /): passzasync def f(*args, a, /): passzasync def f(**kwargs, /): passzasync def f(/, a = 1): passzasync def f(/, a): passzasync def f(/): passzasync def f(*, a, /): passzasync def f(*, /, a): passzasync def f(a, /, a): passr   zasync def f(a, /, *, a): passzasync def f(a, b/2, c): passzasync def f(a, /, c, /): passz async def f(a, /, c, /, d): passz&async def f(a, /, c, /, d, *, e): passz#async def f(a, *, c, /, d, e): passr   r   r   r   r	    test_invalid_syntax_errors_async.   s&    











z7PositionalOnlyTestCase.test_invalid_syntax_errors_asyncc                 C   s  ddd}|  |dddd |  |dddd	d | td
 |dddd W d    n1 sd0    Y  |  |ddd | td
 |ddd W d    n1 s0    Y  |  |ddd	d ddd}|  |dddd |  |dddd	d | td
 |dddd W d    n1 s20    Y  |  |ddd | td
 |ddd W d    n1 s~0    Y  |  |ddd	d d S )N
   d   c                S   s   | | | S r   r   r   r   cr   r   r	   fD   s    zDPositionalOnlyTestCase.test_optional_positional_only_args.<locals>.fr   r         r!   If\(\) got some positional-only arguments passed as keyword arguments: 'b'r   r!   g   r      c                S   s   | | | S r   r   r    r   r   r	   r"   Q   s    )r   r   )r   r   r   assertEqualr   	TypeErrorr   r"   r   r   r	   "test_optional_positional_only_argsC   s$    
,*
.,z9PositionalOnlyTestCase.test_optional_positional_only_argsc                 C   s,   dd dd tdD  }t|dd d S )Ndef f(%s, /):
  pass
, c                 s   s   | ]}d | V  qdS zi%dNr   .0ir   r   r	   	<genexpr>`       zNPositionalOnlyTestCase.test_syntax_for_many_positional_only.<locals>.<genexpr>,  r   r   joinranger   r   Zfundefr   r   r	   $test_syntax_for_many_positional_only^   s    z;PositionalOnlyTestCase.test_syntax_for_many_positional_onlyc                 C   s   ddddd}|  d|jj |  d|jj |  d|j dd	dd
d}|  d|jj |  d|jj |  d|j d S )Nr   r   )gc               S   s   d S r   r   r   r   r!   der"   r>   r   r   r	   r"   d   s    z:PositionalOnlyTestCase.test_pos_only_definition.<locals>.f   r#   )r      c               S   s   d S r   r   r?   r   r   r	   r"   k   s    r   r   r#   )r   )r   r   r#   )r,   __code__co_argcountco_posonlyargcount__defaults__r.   r   r   r	   test_pos_only_definitionc   s    z/PositionalOnlyTestCase.test_pos_only_definitionc                 C   s    dd }|  |ddg d d S )Nc                S   s   | | S r   r   r   r   r   r	   r"   s   s    zBPositionalOnlyTestCase.test_pos_only_call_via_unpacking.<locals>.fr   r   r#   r,   r.   r   r   r	    test_pos_only_call_via_unpackingr   s    z7PositionalOnlyTestCase.test_pos_only_call_via_unpackingc                 C   s   dd }d}|  t| |dd W d    n1 s80    Y  dd }d}|  t| |ddd W d    n1 s|0    Y  d	d }d
}|  t| |ddd W d    n1 s0    Y  d S )Nc                S   s   d S r   r   r   r   r   r	   r"   y   s    z@PositionalOnlyTestCase.test_use_positional_as_keyword.<locals>.fIf\(\) got some positional-only arguments passed as keyword arguments: 'a'r   rL   c                S   s   d S r   r   r   r   r   r	   r"      s    r   r   c                S   s   d S r   r   r   r   r   r	   r"      s    zLf\(\) got some positional-only arguments passed as keyword arguments: 'a, b'r   r-   )r   r"   expectedr   r   r	   test_use_positional_as_keywordx   s    (*z5PositionalOnlyTestCase.test_use_positional_as_keywordc                 C   s   dd }|  td |dd W d    n1 s40    Y  |  td |d W d    n1 sh0    Y  |  td |  W d    n1 s0    Y  |  td |ddd	d
 W d    n1 s0    Y  d S )Nc                S   s   d S r   r   r    r   r   r	   r"      s    zLPositionalOnlyTestCase.test_positional_only_and_arg_invalid_calls.<locals>.f1f\(\) missing 1 required positional argument: 'c'r   r   :f\(\) missing 2 required positional arguments: 'b' and 'c'z@f\(\) missing 3 required positional arguments: 'a', 'b', and 'c'z3f\(\) takes 3 positional arguments but 4 were givenr#   rC   rN   r.   r   r   r	   *test_positional_only_and_arg_invalid_calls   s    (&$zAPositionalOnlyTestCase.test_positional_only_and_arg_invalid_callsc                 C   s   d
dd}|dd |  td |d W d    n1 s>0    Y  |  td |  W d    n1 sp0    Y  |  td |dddd	 W d    n1 s0    Y  d S )Nr#   c                S   s   d S r   r   r    r   r   r	   r"      s    zUPositionalOnlyTestCase.test_positional_only_and_optional_arg_invalid_calls.<locals>.fr   r   1f\(\) missing 1 required positional argument: 'b':f\(\) missing 2 required positional arguments: 'a' and 'b'z=f\(\) takes from 2 to 3 positional arguments but 4 were givenrC   )r#   rN   r.   r   r   r	   3test_positional_only_and_optional_arg_invalid_calls   s    

&$zJPositionalOnlyTestCase.test_positional_only_and_optional_arg_invalid_callsc                 C   s  dd }|dddddd |  td  |ddddd W d    n1 sL0    Y  |  td	 |ddd W d    n1 s0    Y  |  td
 |dd W d    n1 s0    Y  |  td |d W d    n1 s0    Y  |  td |  W d    n1 s"0    Y  |  td( |ddddddddd W d    n1 sh0    Y  |  td$ |ddddddd W d    n1 s0    Y  d S )Nc               S   s   d S r   r   )r   r   r!   r@   rA   r   r   r	   r"      s    zSPositionalOnlyTestCase.test_positional_only_and_kwonlyargs_invalid_calls.<locals>.fr   r   r#   )r@   rA   z-missing 1 required keyword-only argument: 'd')rA   z6missing 2 required keyword-only arguments: 'd' and 'e'rQ   rR   z; missing 3 required positional arguments: 'a', 'b', and 'c'zif\(\) takes 3 positional arguments but 6 positional arguments \(and 2 keyword-only arguments\) were givenrC   rB   r$         z,f\(\) got an unexpected keyword argument 'f'8   )r@   rA   r"   rN   r.   r   r   r	   1test_positional_only_and_kwonlyargs_invalid_calls   s     .*(&&8zHPositionalOnlyTestCase.test_positional_only_and_kwonlyargs_invalid_callsc                 C   s   dd }|dd |  td |d W d    n1 s<0    Y  |  td |  W d    n1 sn0    Y  |  td |ddd W d    n1 s0    Y  d S )	Nc                S   s   d S r   r   r   r   r   r	   r"      s    zDPositionalOnlyTestCase.test_positional_only_invalid_calls.<locals>.fr   r   rT   rU   z3f\(\) takes 2 positional arguments but 3 were givenr#   rN   r.   r   r   r	   "test_positional_only_invalid_calls   s    
&$z9PositionalOnlyTestCase.test_positional_only_invalid_callsc                 C   s   ddd}|d |  td |  W d    n1 s:0    Y  |  td |ddd W d    n1 sr0    Y  d S )	Nr   c                S   s   d S r   r   r   r   r   r	   r"      s    zRPositionalOnlyTestCase.test_positional_only_with_optional_invalid_calls.<locals>.fr   z1f\(\) missing 1 required positional argument: 'a'z=f\(\) takes from 1 to 2 positional arguments but 3 were givenr#   )r   rN   r.   r   r   r	   0test_positional_only_with_optional_invalid_calls   s    
$zGPositionalOnlyTestCase.test_positional_only_with_optional_invalid_callsc                 C   sR   dd }|dddd |  t |dddd W d    n1 sD0    Y  d S )Nc               S   s   d S r   r   r    r   r   r	   r"      s    z=PositionalOnlyTestCase.test_no_standard_args_usage.<locals>.fr   r   r#   r%   r'   )assertRaisesr-   r.   r   r   r	   test_no_standard_args_usage   s    z2PositionalOnlyTestCase.test_no_standard_args_usagec                 C   s6   d	dd}|  d|j d|_|  |dddd d S )
Nr   r#   c                S   s   | | | S r   r   r    r   r   r	   r"      s    z>PositionalOnlyTestCase.test_change_default_pos_only.<locals>.f)r   r#   rD   r   r$   )r   r#   )r,   rH   r.   r   r   r	   test_change_default_pos_only   s    
z3PositionalOnlyTestCase.test_change_default_pos_onlyc                 C   s   dd }|  |ddd |  |dddd d
dd}|  |dd dd }|  |ddd d	d }|  |ddd d S )Nc                S   s   | | S r   r   r   r   r   r	   <lambda>   r7   z5PositionalOnlyTestCase.test_lambdas.<locals>.<lambda>r   r   r#   r)   c                S   s   | | S r   r   r   r   r   r	   r`      r7   c                S   s   | | S r   r   r   r   r   r	   r`      r7   c                S   s   | | S r   r   r   r   r   r	   r`      r7   )r   rJ   )r   xr   r   r	   test_lambdas   s    
z#PositionalOnlyTestCase.test_lambdasc                 C   s   t | dd t | dd t | dd t | d t | d t | d t | d t | d	 t | d
 t | d t | d t | dd t | dd t | d t | d t | d t | d d S )Nzlambda a, b = 5, /, c: Noner   zlambda a = 5, b, /, c: Nonezlambda a = 5, b, /: Nonezlambda *args, /: Nonezlambda *args, a, /: Nonezlambda **kwargs, /: Nonezlambda /, a = 1: Nonezlambda /, a: Nonezlambda /: Nonezlambda *, a, /: Nonezlambda *, /, a: Nonezlambda a, /, a: Noner   zlambda a, /, *, a: Nonezlambda a, /, b, /: Nonezlambda a, /, b, /, c: Nonez lambda a, /, b, /, c, *, d: Nonezlambda a, *, b, /, c: Noner   r   r   r   r	   test_invalid_syntax_lambda   s"    










z1PositionalOnlyTestCase.test_invalid_syntax_lambdac                 C   s   G dd d}|  | ddd |  || ddd | t|jdd d}| t|  | jddd W d    n1 s0    Y  d S )Nc                   @   s   e Zd Zdd ZdS )z<PositionalOnlyTestCase.test_posonly_methods.<locals>.Examplec                S   s   ||fS r   r   )r   r   r   r   r   r	   r"      s    z>PositionalOnlyTestCase.test_posonly_methods.<locals>.Example.fN)__name__
__module____qualname__r"   r   r   r   r	   Example   s   rg   r   r   r   r   r&   r)   )r,   r"   r]   r-   r   )r   rg   rO   r   r   r	   test_posonly_methods   s    z+PositionalOnlyTestCase.test_posonly_methodsc                 C   s6   |  td t  W d    n1 s(0    Y  d S )NrU   )r   r-   r
   r   r   r   r	   test_module_function  s    z+PositionalOnlyTestCase.test_module_functionc                 C   sX  dd }|  |ddddd | td |ddd W d    n1 sP0    Y  | td	" |ddddd
 W d    n1 s0    Y  dd }|  |ddddd dd }|  |ddddd | td |ddd W d    n1 s
0    Y  | td	" |ddddd
 W d    n1 sJ0    Y  d S )Nc                    s    fdd}|S )Nc                   s     |  | S r   r   Zx2Zy2ra   yr   r	   r>     s    :PositionalOnlyTestCase.test_closures.<locals>.f.<locals>.gr   ra   rm   r>   r   rl   r	   r"     s    z/PositionalOnlyTestCase.test_closures.<locals>.fr   r   r#   rC   r   z2g\(\) missing 1 required positional argument: 'y2'z3g\(\) takes 2 positional arguments but 3 were givenrB   c                   s    fdd}|S )Nc                    s     |  | S r   r   rk   rl   r   r	   r>     s    rn   r   ro   r   rl   r	   r"     s    c                   s    fdd}|S )Nc                   s     |  | S r   r   rk   rl   r   r	   r>   !  s    rn   r   ro   r   rl   r	   r"      s    r+   r.   r   r   r	   test_closures  s    ,0.z$PositionalOnlyTestCase.test_closuresc                 C   sb   dd }| j dtiksJ G dd d}|  j dtiksBJ dd }| j dtiks^J d S )Nc                  S   s   t ddd} | S )Nra   c                S   s   d S r   r   rq   r   r   r	   r"   .  r7   zZPositionalOnlyTestCase.test_annotations_in_closures.<locals>.inner_has_pos_only.<locals>.fintr"   r   r   r	   inner_has_pos_only-  s    zOPositionalOnlyTestCase.test_annotations_in_closures.<locals>.inner_has_pos_onlyra   c                   @   s   e Zd Zdd ZdS )zFPositionalOnlyTestCase.test_annotations_in_closures.<locals>.Somethingc                 S   s   t ddd}|S )Nrq   c                S   s   d S r   r   rq   r   r   r	   r"   5  r7   zXPositionalOnlyTestCase.test_annotations_in_closures.<locals>.Something.method.<locals>.frr   r.   r   r   r	   method4  s    zMPositionalOnlyTestCase.test_annotations_in_closures.<locals>.Something.methodNrd   re   rf   rv   r   r   r   r	   	Something3  s   rx   c                  S   s   dd } |  S )Nc                  S   s   t ddd} | S )Nrq   c                S   s   d S r   r   rq   r   r   r	   r"   <  r7   zsPositionalOnlyTestCase.test_annotations_in_closures.<locals>.multiple_levels.<locals>.inner_has_pos_only.<locals>.frr   rt   r   r   r	   ru   ;  s    zhPositionalOnlyTestCase.test_annotations_in_closures.<locals>.multiple_levels.<locals>.inner_has_pos_onlyr   )ru   r   r   r	   multiple_levels:  s    zLPositionalOnlyTestCase.test_annotations_in_closures.<locals>.multiple_levels)__annotations__rs   rv   )r   ru   rx   ry   r   r   r	   test_annotations_in_closures+  s    z3PositionalOnlyTestCase.test_annotations_in_closuresc                 C   sr   dd }|  |ddddddif | td |dd W d    n1 sP0    Y  |  |ddi f d S )Nc                [   s   | |fS r   r   )	somethingkwargsr   r   r	   r"   C  s    zMPositionalOnlyTestCase.test_same_keyword_as_positional_with_kwargs.<locals>.f*   )r|   r|   z9f\(\) missing 1 required positional argument: 'something'r+   r.   r   r   r	   +test_same_keyword_as_positional_with_kwargsB  s
    (zBPositionalOnlyTestCase.test_same_keyword_as_positional_with_kwargsc                 C   sH   G dd d}|  |  d |  |  d |  |  d d S )Nc                   @   s0   e Zd ZdddZdddZdddd	d
ZdS )z/PositionalOnlyTestCase.test_mangling.<locals>.Xr~   c                S   s   |S r   r   )r   _X__ar   r   r	   r"   O  s    z1PositionalOnlyTestCase.test_mangling.<locals>.X.f+   c                S   s   ||fS r   r   )r   r   _X__br   r   r	   f2R  s    z2PositionalOnlyTestCase.test_mangling.<locals>.X.f2,   )_X__cc               S   s
   |||fS r   r   )r   r   r   r   r   r   r	   f3U  s    z2PositionalOnlyTestCase.test_mangling.<locals>.X.f3N)r~   )r~   r   )r~   r   )rd   re   rf   r"   r   r   r   r   r   r	   XN  s   

r   r~   )r~   r   )r~   r   r   )r,   r"   r   r   )r   r   r   r   r	   test_manglingM  s    
z$PositionalOnlyTestCase.test_manglingc                 C   s,   dd dd tdD  }t|dd d S )Nr0   r1   c                 s   s   | ]}d | V  qdS r2   r   r3   r   r   r	   r6   ^  r7   zAPositionalOnlyTestCase.test_too_many_arguments.<locals>.<genexpr>r8   r   r   r9   r<   r   r   r	   test_too_many_arguments\  s    z.PositionalOnlyTestCase.test_too_many_argumentsc                 C   s(  t t}t t}t t}t |}t |}t |}| |ddd d}| t| |ddd W d    n1 s0    Y  | |ddd d}| t| |ddd W d    n1 s0    Y  | | d d}| t| |ddd W d    n1 s0    Y  d S )Nr   r   rh   z\global_pos_only_f\(\) got some positional-only arguments passed as keyword arguments: 'a, b'r   zbglobal_pos_only_and_normal\(\) got some positional-only arguments passed as keyword arguments: 'a'z`global_pos_only_defaults\(\) got some positional-only arguments passed as keyword arguments: 'a')	pickledumpsr
   r   r   loadsr,   r   r-   )r   Zpickled_posonlyZpickled_optionalZpickled_defaultsZunpickled_posonlyZunpickled_optionalZunpickled_defaultsrO   r   r   r	   test_serializationa  s$    





**z)PositionalOnlyTestCase.test_serializationc                    sx   d
dd  td  ddd W d    n1 s80    Y   fdd}|dd |ddd	 |d |  d S )Nr   r   c                   s   | |fS r   r   r   r   r   r	   r"   ~  s    z,PositionalOnlyTestCase.test_async.<locals>.frM   r   c               
      sX   z | i |}| d  W n* tyF } z|j}W Y d }~n
d }~0 0 |d d S )Nrh   )sendStopIterationvaluer,   )argsr}   cororA   resultr"   r   r   r	   _check_call  s    z6PositionalOnlyTestCase.test_async.<locals>._check_callr)   )r   r   rN   )r   r   r   r   r	   
test_async|  s    
*
z!PositionalOnlyTestCase.test_asyncc                 C   s   d	dd}|  td |ddd W d    n1 s80    Y  |dd}| t|d |ddd}| t|d |d}| t|d | }| t|d d S )
Nr   r   c                s   s   | |fV  d S r   r   r   r   r   r	   r"     s    z0PositionalOnlyTestCase.test_generator.<locals>.frM   r   rh   r)   )r   r   )r   r-   r,   next)r   r"   genr   r   r	   test_generator  s    
*
z%PositionalOnlyTestCase.test_generatorc                    s>   t   G  fddd}G dd d|}| |    d S )Nc                       s   e Zd Z fddZdS )z,PositionalOnlyTestCase.test_super.<locals>.Ac                    s    S r   r   r   sentinelr   r	   rv     s    z3PositionalOnlyTestCase.test_super.<locals>.A.methodNrw   r   r   r   r	   A  s   r   c                       s   e Zd Z fddZ  ZS )z,PositionalOnlyTestCase.test_super.<locals>.Cc                   s
   t   S r   )superrv   r   	__class__r   r	   rv     s    z3PositionalOnlyTestCase.test_super.<locals>.C.method)rd   re   rf   rv   __classcell__r   r   r   r	   C  s   r   )objectr,   rv   )r   r   r   r   r   r	   
test_super  s    z!PositionalOnlyTestCase.test_superc                 C   s8   dd }dd t |D }| d| | d| d S )Nc                  S   s   t t uddd} d S )Nrq   c                S   s   d S r   r   rq   r   r   r	   r"     r7   zKPositionalOnlyTestCase.test_annotations_constant_fold.<locals>.g.<locals>.frr   rt   r   r   r	   r>     s    z@PositionalOnlyTestCase.test_annotations_constant_fold.<locals>.gc                 S   s   g | ]}|j |jfqS r   )opnameZargvalr3   r   r   r	   
<listcomp>  r7   zIPositionalOnlyTestCase.test_annotations_constant_fold.<locals>.<listcomp>)Z	UNARY_NOTN)ZIS_OPr   )disZget_instructionsZassertNotInZassertIn)r   r>   Zcodesr   r   r	   test_annotations_constant_fold  s    z5PositionalOnlyTestCase.test_annotations_constant_foldN)r   ) rd   re   rf   r   r   r   r/   r=   rI   rK   rP   rS   rV   rZ   r[   r\   r^   r_   rb   rc   ri   rj   rp   r{   r   r   r   r   r   r   r   r   r   r   r   r	   r      s:   

r   __main__)r   r   )__doc__r   r   ZunittestZtest.supportr   r
   r   r   ZTestCaser   rd   mainr   r   r   r	   <module>   s   
   ,