o
    HXh;                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZ d dlmZ d dl	Z	d dl
Z
d dlZe
dZdd ZG dd	 d	ejZG d
d dejZedkrOe  dS dS )    N)support)import_helper)dedentz\((\S+).py, line (\d+)c                 C   s   t t| }|ddS )N      )rxsearchstrgroup)msgmo r   :/opt/python-3.10.19/usr/lib/python3.10/test/test_future.pyget_error_location   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"S )$
FutureTestr   c                 C   sR   |  d||f t| | tj|j|d  | |j| | |j| d S )Nz%s.py, line %dz.py)	ZassertInr	   assertEqualospathbasenamefilenamelinenooffset)selferrr   r   r   r   r   r   check_syntax_error   s   zFutureTest.check_syntax_errorc                 C   J   t d ddlm} | |jd W d    d S 1 sw   Y  d S )Nfuture_test1r   )r      )r   CleanImporttestr   r   result)r   r   r   r   r   test_future1      "zFutureTest.test_future1c                 C   r   )Nfuture_test2r   )r#   r   )r   r   r   r#   r   r    )r   r#   r   r   r   test_future2    r"   zFutureTest.test_future2c                 C   <   t d ddlm} W d    d S 1 sw   Y  d S )Ntest_future3r   )r&   )r   r   r   r&   )r   r&   r   r   r   r&   %      "zFutureTest.test_future3c                 C   J   |  t}ddlm} W d    n1 sw   Y  | |jdd d S )Nr   )badsyntax_future3r)      )assertRaisesSyntaxErrorr   r)   r   	exception)r   cmr)   r   r   r   test_badfuture3)      zFutureTest.test_badfuture3c                 C   r(   )Nr   )badsyntax_future4r1   r*   )r+   r,   r   r1   r   r-   )r   r.   r1   r   r   r   test_badfuture4.   r0   zFutureTest.test_badfuture4c                 C   r(   )Nr   )badsyntax_future5r3      )r+   r,   r   r3   r   r-   )r   r.   r3   r   r   r   test_badfuture53   r0   zFutureTest.test_badfuture5c                 C   r(   )Nr   )badsyntax_future6r6   r*   )r+   r,   r   r6   r   r-   )r   r.   r6   r   r   r   test_badfuture68   r0   zFutureTest.test_badfuture6c                 C   sL   |  t}ddlm} W d    n1 sw   Y  | |jddd d S )Nr   )badsyntax_future7r8   r*   5   )r+   r,   r   r8   r   r-   )r   r.   r8   r   r   r   test_badfuture7=   s   zFutureTest.test_badfuture7c                 C   r(   )Nr   )badsyntax_future8r;   r*   )r+   r,   r   r;   r   r-   )r   r.   r;   r   r   r   test_badfuture8B   r0   zFutureTest.test_badfuture8c                 C   r(   )Nr   )badsyntax_future9r=   r*   )r+   r,   r   r=   r   r-   )r   r.   r=   r   r   r   test_badfuture9G   r0   zFutureTest.test_badfuture9c                 C   r(   )Nr   )badsyntax_future10r?   r*   )r+   r,   r   r?   r   r-   )r   r.   r?   r   r   r   test_badfuture10L   r0   zFutureTest.test_badfuture10c                 C   sB   dd t jD }|dd ttD O }| t| |  d S )Nc                 S   s$   i | ]}d |   tt|jqS )Z
CO_FUTURE_)uppergetattr
__future__Zcompiler_flag).0futurer   r   r   
<dictcomp>U   s    z;FutureTest.test_ensure_flags_dont_clash.<locals>.<dictcomp>c                 S   s"   i | ]}| d r|tt|qS )ZPyCF_)
startswithrB   ast)rD   flagr   r   r   rF   Z   s
    

)rC   Zall_feature_namesdirrH   ZassertCountEqualsetvalues)r   flagsr   r   r   test_ensure_flags_dont_clashQ   s   z'FutureTest.test_ensure_flags_dont_clashc                 C   sZ   zt d W n	 ty   Y nw | d zt d W n
 ty%   Y d S w | d d S )Nz.from __future__ import print_function; print 0zsyntax error didn't occurz0from __future__ import (print_function); print 0)execr,   Zfailr   r   r   r   test_parserhack`   s   
zFutureTest.test_parserhackc                 C   r%   )Nztest.test_future5r   )test_future5)r   r   r   rR   )r   rR   r   r   r   test_multiple_featurest   r'   z!FutureTest.test_multiple_featuresc                 C   s$   i }t di | | |d t d S )Nz/from __future__ import unicode_literals; x = ''x)rO   ZassertIsInstancer	   )r   scoper   r   r   test_unicode_literals_execx   s   z%FutureTest.test_unicode_literals_execN)r   )__name__
__module____qualname__r   r!   r$   r&   r/   r2   r5   r7   r:   r<   r>   r@   rN   rQ   rS   rV   r   r   r   r   r      s"    
r   c                   @   s`   e Zd ZedZd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S )AnnotationsFutureTestCasea  
        from __future__ import annotations
        def f() -> {ann}:
            ...
        def g(arg: {ann}) -> None:
            ...
        async def f2() -> {ann}:
            ...
        async def g2(arg: {ann}) -> None:
            ...
        class H:
            var: {ann}
            object.attr: {ann}
        var: {ann}
        var2: {ann} = None
        object.attr: {ann}
        c           	      C   s   i }t | jj|di | |d jd }|d jd }|d jd }|d jd }|d d	 }|d d
 }| || | || | || | || | || |S )N)annfreturngargf2Zg2__annotations__varZvar2)rO   templateformatra   r   )	r   
annotationrU   Zfunc_ret_annZfunc_arg_annZasync_func_ret_annZasync_func_arg_annZvar_ann1Zvar_ann2r   r   r   	getActual   s   z#AnnotationsFutureTestCase.getActualNFc                 C   sZ   |  |}|d u r|s|n|dd }|r%| || |dddd}| || d S )Nr   ( ))rf   ZassertNotEqualreplacer   )r   re   expectedZdrop_parensZis_tupleactualr   r   r   assertAnnotationEqual   s   
z/AnnotationsFutureTestCase.assertAnnotationEqualc                 C   s   i }t d| i | |S )Nz#from __future__ import annotations
)rO   )r   coderU   r   r   r   _exec_future   s   z&AnnotationsFutureTestCase._exec_futurec                 C   s  | j }|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 |d |d |d |d |d |d |d  |d! |d" |d# |d$ |d% |d& |d' |d( |d) |d* |d+ |d, |d- |d. |d/ |d0 |d1 |d2 |d3 |d4 |d5 |d6 |d7 |d8 |d9 |d: |d; |d< |d= |d> |d? |d@ |dA |dB |dC |dD |dE |dF |dG |dH |dI |dJ |dK |dL |dM |dN |dO |dP |dQ |dR |dS |dT |dU |dV |dW |dX |dY |dZ |d[ |d\ |d] |d^ |d_ |d` |da |db |dc |dd |de |df |dg |dh |di |dj |dk |dl |dm |dn |do |dp |dq |dr |ds |dt |du |dv |dw |dx |dy |dz |d{ |d| |d} |d~ |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |d |dd |ddE |d d S )Nz...z'some_string'zu'some_string'zb'\xa3'NameNoneTrueFalse1z1.0Z1jzTrue or FalsezTrue or False or NonezTrue and FalsezTrue and False and NonezName1 and Name2 or Name3zName1 and (Name2 or Name3)zName1 or Name2 and Name3z(Name1 or Name2) and Name3z"Name1 and Name2 or Name3 and Name4z!Name1 or Name2 and Name3 or Name4za + b + (c + d)za * b * (c * d)z(a ** b) ** c ** dzv1 << 2z1 >> v2z1 % finishedz"1 + v2 - v3 * 4 ^ 5 ** v6 / 7 // 8z	not greatznot not greatz~greatz+valuez++valuez-1z!~int and not v1 ^ 123 + v2 | Trueza + (not b)zlambda: Nonezlambda arg: Nonezlambda a=True: azlambda a, b, c=True: az-lambda a, b, c=True, *, d=1 << v2, e='str': az9lambda a, b, c=True, *vararg, d, e='str', **kwargs: a + bz<lambda a, /, b, c=True, *vararg, d, e='str', **kwargs: a + bzlambda x, /: xzlambda x=1, /: xzlambda x, /, y: x + yzlambda x=1, /, y=2: x + yzlambda x, /, y=1: x + yz#lambda x, /, y=1, *, z=3: x + y + zz%lambda x=1, /, y=2, *, z=3: x + y + zz#lambda x=1, /, y=2, *, z: x + y + zz>lambda x=1, y=2, z=3, /, w=4, *, l, l2: x + y + z + w + l + l2zHlambda x=1, y=2, z=3, /, w=4, *, l, l2, **kwargs: x + y + z + w + l + l2z!lambda x, /, y=1, *, z: x + y + zzlambda x: lambda y: x + yz1 if True else 2z4str or None if int or True else str or bytes or Nonez;str or None if (1 if True else 2) else str or bytes or Nonez"0 if not x else 1 if x > 0 else -1z (1 if x > 0 else -1) if x else 0z+{'2.7': dead, '3.7': long_live or die_hard}z@{'2.7': dead, '3.7': long_live or die_hard, **{'3.6': verygood}}z{**a, **b, **c}zC{'2.7', '3.6', '3.7', '3.8', '3.9', '4.0' if gilectomy else '3.10'}z{*a, *b, *c}z?({'a': 'b'}, True or False, +value, 'string', b'bytes') or Nonez()z(a,)z(a, b)z	(a, b, c)z(*a, *b, *c)z[]z6[1, 2, 3, 4, 5, 6, 7, 8, 9, 10 or A, 11 or B, 12 or C]z[*a, *b, *c]z{i for i in (1, 2, 3)}z{i ** 2 for i in (1, 2, 3)}z3{i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))}z2{i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3)}z[i for i in (1, 2, 3)]z[i ** 2 for i in (1, 2, 3)]z3[i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c'))]z2[i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3)]z(i for i in (1, 2, 3))z(i ** 2 for i in (1, 2, 3))z3(i ** 2 for i, _ in ((1, 'a'), (2, 'b'), (3, 'c')))z2(i ** 2 + j for i in (1, 2, 3) for j in (1, 2, 3))z{i: 0 for i in (1, 2, 3)}z1{i: j for i, j in ((1, 'a'), (2, 'b'), (3, 'c'))}z[(x, y) for x, y in (a, b)]z[(x,) for x, in (a,)]zPython3 > Python2 > COBOLzLife is Lifezcall()z	call(arg)zcall(kwarg='hey')zcall(arg, kwarg='hey')z&call(arg, *args, another, kwarg='hey')z6call(arg, another, kwarg='hey', **kwargs, kwarg2='ho')zlukasz.langa.plzcall.me(maybe)z1 .realz1.0.realz....__class__z	list[str]zdict[str, int]z	set[str,]ztuple[str, ...]ztuple[(str, *types)]ztuple[str, int, (str, int)]z#tuple[(*int, str, str, (str, int))]z&tuple[str, int, float, dict[str, int]]zslice[0]z
slice[0:1]zslice[0:1:2]zslice[:]z
slice[:-1]z	slice[1:]zslice[::-1]z	slice[:,]zslice[1:2,]zslice[1:2:3,]zslice[1:2, 1]zslice[1:2, 2, 3]z	slice[()]zslice[a, b:c, d:e:f]zslice[(x for x in a)]zCstr or None if sys.version_info[0] > (3,) else str or bytes or Nonez5f'f-string without formatted values is just a string'zf'{{NOT a formatted value}}'z:f'some f-string with {a} {few():.2f} {formatted.values!r}'zf"{f'{nested} inner'} outer"z:f'space between opening braces: { {a for a in (1, 2, 3)}}'zf'{(lambda x: x)}'z!f'{(None if a else lambda x: x)}'zf'{x}'zf'{x!r}'zf'{x!a}'z[x for x in (a if b else c)]z![x for x in a if (b if c else d)]zf(x for x in a)zf(1, (x for x in a))zf((x for x in a), 2)z(((a)))az
(((a, b)))z	1 + 2 + 3rn   )r   eqr   r   r   test_annotations   s$  

z*AnnotationsFutureTestCase.test_annotationsc                 C   sX   | j ddd | j ddd | j ddd | j ddd | j dd	d | j d
dd d S )Nz	f'{x=!r}'z
f'x={x!r}'rl   zf'{x=:}'z	f'x={x:}'zf'{x=:.2f}'zf'x={x:.2f}'z	f'{x=!a}'z
f'x={x!a}'zf'{x=!s:*^20}'zf'x={x!s:*^20}'rw   rP   r   r   r   test_fstring_debug_annotationsJ  s   z8AnnotationsFutureTestCase.test_fstring_debug_annotationsc                 C   s   dt tjjd  }| d}| jd|d | jd|d | jdd| d | jd	d
| d | jdd| d| dd | d | jdd| d| dd | jdd| d| dd d S )NZ1er   jZ1e1000rz   Z1e1000jz-1e1000-z	3+1e1000jz3 + z(1e1000, 1e1000j)rh   z, rj   z'inf'z"('inf', 1e1000, 'infxxx', 1e1000j)z('inf', z, 'infxxx', z(1e1000, (1e1000j,))z, (z,)))reprsys
float_info
max_10_exprn   )r   infZinfjr   r   r   test_infinity_numbersT  s   

 z/AnnotationsFutureTestCase.test_infinity_numbersc                 C   s8   |  t td W d    d S 1 sw   Y  d S )Nz8from __future__ import annotations
object.__debug__: int)r+   r,   rO   rP   r   r   r   #test_annotation_with_complex_target`  s
   "z=AnnotationsFutureTestCase.test_annotation_with_complex_targetc                 C   sL   |  td}|d}| | j | |jjd | | jjd d S )Nz
        from __future__ import annotations

        def foo():
            outer = 1
            def bar():
                inner: outer = 1
            return bar
        foor   )	rp   r   popZassertIsNone__closure__r   __code__co_cellvarsco_freevars)r   	namespacer   r   r   r   "test_annotations_symbol_table_passg  s
   

z<AnnotationsFutureTestCase.test_annotations_symbol_table_passc                 C   s  |  t | d W d    n1 sw   Y  |  t | d W d    n1 s/w   Y  |  t | d W d    n1 sIw   Y  |  t | d W d    n1 scw   Y  |  t | d W d    n1 s}w   Y  |  t | d W d    n1 sw   Y  |  t | d W d    n1 sw   Y  |  t | d W d    n1 sw   Y  |  t | td	 W d    d S 1 sw   Y  d S )
Nztest: (yield)ztest.test: (yield a + b)ztest[something]: (yield from x)z7def func(test: (yield from outside_of_generator)): passzdef test() -> (await y): passz-async def test() -> something((a := b)): passzBtest: await some.complicated[0].call(with_args=True or 1 is not 1)ztest: f'{(x := 10):=10}'zO            def foo():
                def bar(arg: (yield)): pass
            )r+   r,   rp   r   rP   r   r   r   test_annotations_forbiddenw  s6   "z4AnnotationsFutureTestCase.test_annotations_forbidden)NFF)rW   rX   rY   r   rc   rf   rn   rp   ry   r{   r   r   r   r   r   r   r   r   rZ   }   s    
 
rZ   __main__)rC   rH   Zunittestr   r   Ztest.supportr   textwrapr   r   rer   compiler   r   ZTestCaser   rZ   rW   mainr   r   r   r   <module>   s$   
j  