
    <ej0                         d Z 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	m
Z
 ddlmZmZ  e	              G d dej                  ZdS )	z%Tests to cover the Tools/i18n package    N)dedent)assert_python_ok)skip_if_missingtoolsdir)temp_cwdtemp_dirc                   t   e Zd ZdZej                            edd          Zd Z	d Z
d Zd Z ej        ej                            d          d	          d
             Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd  Z(d! Z)d" Z*d# Z+d$ Z,d% Z-d& Z.d' Z/d(S ))Test_pygettextzTests for the pygettext.py tooli18nzpygettext.pyc                     i }|                     d          D ]_}|r|                    d          r|                    d          }|                     dd          \  }}|                                ||<   `|S )z: utility: return the header of a .po file as a dictionary 
)#msgidmsgstr":   )split
startswithstrip)selfdataheaderslinekeyvals         0/usr/lib/python3.11/test/test_tools/test_i18n.py
get_headerzTest_pygettext.get_header   s    JJt$$ 	' 	'D 4??+BCC ::c??Dzz#a((HC99;;GCLL    c                    g }d}g }|                     d          D ]}|rk|                    d          r)|                    |                    d                     n-|                    d                    |                     g }d}o|                    d          rA|t          d          d         }|                    |                    d                     d}|r(|                    d                    |                     |S )z= utility: return all msgids in .po file as a list of strings Fr   r   zmsgid NT)r   r   appendr   joinlen)r   r   msgidsreading_msgid	cur_msgidr   s         r   
get_msgidszTest_pygettext.get_msgids    s   	JJt$$ 	4 	4D ??3'' $$TZZ__5555MM$))I"6"6777 "I$)Mx(( %CMMNN+  C111 $ 4dii	22333r   c                    d}t          d          5 }t          |dd          5 }|                    |           ddd           n# 1 swxY w Y   t          | j        d|           t          dd          5 }|                                }ddd           n# 1 swxY w Y   ddd           n# 1 swxY w Y   |                     |          S )z: utility: return all msgids extracted from module_content ztest_docstrings.pyNwutf-8encodingz-Dmessages.pot)r   openwriter   scriptreadr'   )r   module_contentfilenamecwdfpr   s         r   extract_docstrings_from_strz*Test_pygettext.extract_docstrings_from_str8   sx   'd^^ 	!shg666 )"((() ) ) ) ) ) ) ) ) ) ) ) ) ) )T[$999nw777 !2wwyy! ! ! ! ! ! ! ! ! ! ! ! ! ! !		! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! t$$$sW   B1AB1A	B1A	*B19BB1B	B1!B	"B11B58B5c                    t          d          5 }t          | j                   t          dd          5 }|                                }ddd           n# 1 swxY w Y   |                     |          }|                     d|           |                     d|           |                     d|           |                     d|           |                     d	|           |                     d
|           |                     d|           |                     d|           |                     d|           ddd           dS # 1 swxY w Y   dS )zMake sure the required fields are in the header, according to:
           http://www.gnu.org/software/gettext/manual/gettext.html#Header-Entry
        Nr-   r*   r+   zProject-Id-VersionPOT-Creation-DatezPO-Revision-DatezLast-TranslatorzLanguage-TeamzMIME-VersionzContent-TypezContent-Transfer-EncodingzGenerated-By)r   r   r0   r.   r1   r   assertIn)r   r4   r5   r   headers        r   test_headerzTest_pygettext.test_headerC   s    d^^ 	2sT[)))nw777 !2wwyy! ! ! ! ! ! ! ! ! ! ! ! ! ! !__T**FMM.777MM-v666MM,f555MM+V444MM/6222MM.&111MM.&111MM5v>>>MM.&111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s5   &E
AE
A	E
A	CE

EEaixzbpo-29972: broken test on AIXc                    ddl m } t          d          5 }t          | j                   t	          dd          5 }|                                }ddd           n# 1 swxY w Y   |                     |          }|d         }|                    d          r|dt          d                    }|	                    |d	           ddd           dS # 1 swxY w Y   dS )
z; Match the date format from xgettext for POT-Creation-Date r   )datetimeNr-   r*   r+   r8   z\nz%Y-%m-%d %H:%M%z)
r>   r   r   r0   r.   r1   r   endswithr#   strptime)r   r>   r4   r5   r   r:   creationDates          r   test_POT_Creation_Datez%Test_pygettext.test_POT_Creation_Date]   s{    	&%%%%%d^^ 	@sT[)))nw777 !2wwyy! ! ! ! ! ! ! ! ! ! ! ! ! ! !__T**F!"56L $$U++ :+Lc%jj[L9 l,>???	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@ 	@s5   &CACA!	!C$A!	%A#CCCc                     dD ]j}|                      |          5  |                     t          d|z                      }|                     d|           d d d            n# 1 swxY w Y   kd S )Nz	"""doc"""z
r'''doc'''zR'doc'zu"doc"zE                def foo(bar):
                    %s
                docsubTestr6   r   r9   r   rE   r$   s      r   test_funcdocstringz!Test_pygettext.test_funcdocstringp       B 	- 	-Cc"" - -99& B B ; ;   eV,,,- - - - - - - - - - - - - - -	- 	-   <A""A&	)A&	c                     |                      t          d                    }|                     d |D                        d S )Nz5        def foo(bar):
            b"""doc"""
        c                     g | ]}d |v |	S rE    .0r   s     r   
<listcomp>z;Test_pygettext.test_funcdocstring_bytes.<locals>.<listcomp>~       FFFEu~~%~~~r   r6   r   assertFalser   r$   s     r   test_funcdocstring_bytesz'Test_pygettext.test_funcdocstring_bytesy   S    11& : 3 3   	FFVFFFGGGGGr   c                     |                      t          d                    }|                     d |D                        d S )Nz5        def foo(bar):
            f"""doc"""
        c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z=Test_pygettext.test_funcdocstring_fstring.<locals>.<listcomp>   rS   r   rT   rV   s     r   test_funcdocstring_fstringz)Test_pygettext.test_funcdocstring_fstring   rX   r   c                     dD ]j}|                      |          5  |                     t          d|z                      }|                     d|           d d d            n# 1 swxY w Y   kd S )NrD   z@                class C:
                    %s
                rE   rF   rH   s      r   test_classdocstringz"Test_pygettext.test_classdocstring   rJ   rK   c                     |                      t          d                    }|                     d |D                        d S )Nz0        class C:
            b"""doc"""
        c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z<Test_pygettext.test_classdocstring_bytes.<locals>.<listcomp>   rS   r   rT   rV   s     r   test_classdocstring_bytesz(Test_pygettext.test_classdocstring_bytes   rX   r   c                     |                      t          d                    }|                     d |D                        d S )Nz0        class C:
            f"""doc"""
        c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z>Test_pygettext.test_classdocstring_fstring.<locals>.<listcomp>   rS   r   rT   rV   s     r   test_classdocstring_fstringz*Test_pygettext.test_classdocstring_fstring   rX   r   c                     dD ]j}|                      |          5  |                     t          d|z                      }|                     d|           d d d            n# 1 swxY w Y   kd S )NrD   z#                %s
                rE   rF   rH   s      r   test_moduledocstringz#Test_pygettext.test_moduledocstring   s    B 	- 	-Cc"" - -99& BB ; ;   eV,,,	- - - - - - - - - - - - - - -	- 	-rK   c                     |                      t          d                    }|                     d |D                        d S )Nz        b"""doc"""
        c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z=Test_pygettext.test_moduledocstring_bytes.<locals>.<listcomp>   rS   r   rT   rV   s     r   test_moduledocstring_bytesz)Test_pygettext.test_moduledocstring_bytes   S    11& : 3 3   	FFVFFFGGGGGr   c                     |                      t          d                    }|                     d |D                        d S )Nz        f"""doc"""
        c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z?Test_pygettext.test_moduledocstring_fstring.<locals>.<listcomp>   rS   r   rT   rV   s     r   test_moduledocstring_fstringz+Test_pygettext.test_moduledocstring_fstring   ri   r   c                 \    |                      d          }|                     d|           d S )Nz_("""doc""" r'str' u"ing")	docstring)r6   r9   rV   s     r   
test_msgidzTest_pygettext.test_msgid   s4    1102 2k6*****r   c                 n    |                      d          }|                     d |D                        d S )Nz_(b"""doc""")c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z3Test_pygettext.test_msgid_bytes.<locals>.<listcomp>   rS   r   r6   rU   rV   s     r   test_msgid_byteszTest_pygettext.test_msgid_bytes   >    11/BBFFVFFFGGGGGr   c                 n    |                      d          }|                     d |D                        d S )Nz_(f"""doc""")c                     g | ]}d |v |	S rN   rO   rP   s     r   rR   z5Test_pygettext.test_msgid_fstring.<locals>.<listcomp>   rS   r   rr   rV   s     r   test_msgid_fstringz!Test_pygettext.test_msgid_fstring   rt   r   c                 v    |                      t          d                    }|                     d|           dS )z3 Test docstrings for functions with annotated args z9        def foo(bar: str):
            """doc"""
        rE   Nr6   r   r9   rV   s     r   !test_funcdocstring_annotated_argsz0Test_pygettext.test_funcdocstring_annotated_args   D    11& : 3 3   	eV$$$$$r   c                 v    |                      t          d                    }|                     d|           dS )z: Test docstrings for functions with annotated return type z;        def foo(bar) -> str:
            """doc"""
        rE   Nry   rV   s     r   #test_funcdocstring_annotated_returnz2Test_pygettext.test_funcdocstring_annotated_return   r{   r   c                 v    |                      t          d                    }|                     d|           dS )z6 Test docstring for functions with default arg values z7        def foo(bar=()):
            """doc"""
        rE   Nry   rV   s     r    test_funcdocstring_defvalue_argsz/Test_pygettext.test_funcdocstring_defvalue_args   r{   r   c                     |                      t          d                    }|                     d|           |                     d|           |                     d|           dS )z Test docstring extraction for multiple functions combining
        annotated args, annotated return types and default arg values
        z        def foo1(bar: tuple=()) -> str:
            """doc1"""

        def foo2(bar: List[1:2]) -> (lambda x: x):
            """doc2"""

        def foo3(bar: 'func'=lambda x: x) -> {1: 2}:
            """doc3"""
        doc1doc2doc3Nry   rV   s     r   !test_funcdocstring_multiple_funcsz0Test_pygettext.test_funcdocstring_multiple_funcs   sn     11& 	: 	3 	3 	 	 	ff%%%ff%%%ff%%%%%r   c                 v    |                      t          d                    }|                     d|           dS )ze Test docstring extraction for a class with colons occurring within
        the parentheses.
        z\        class D(L[1:2], F({1: 2}), metaclass=M(lambda x: x)):
            """doc"""
        rE   Nry   rV   s     r   test_classdocstring_early_colonz.Test_pygettext.test_classdocstring_early_colon   sF     11& : 3 3   	eV$$$$$r   c                 v    |                      t          d                    }|                     d|           d S )Nz"        f"{_('foo bar')}"
        foo barry   rV   s     r   test_calls_in_fstringsz%Test_pygettext.test_calls_in_fstrings   D    11& : 3 3   	i(((((r   c                 v    |                      t          d                    }|                     d|           d S )Nz#        rf"{_('foo bar')}"
        r   ry   rV   s     r   test_calls_in_fstrings_rawz)Test_pygettext.test_calls_in_fstrings_raw   r   r   c                 v    |                      t          d                    }|                     d|           d S )Nz+        f"""{f'{_("foo bar")}'}"""
        r   ry   rV   s     r   test_calls_in_fstrings_nestedz,Test_pygettext.test_calls_in_fstrings_nested   r   r   c                 v    |                      t          d                    }|                     d|           d S )Nz&        f"{obj._('foo bar')}"
        r   ry   rV   s     r    test_calls_in_fstrings_attributez/Test_pygettext.test_calls_in_fstrings_attribute  r   r   c                 v    |                      t          d                    }|                     d|           d S )Nz*        f"{type(str)('foo bar')}"
        r   r6   r   assertNotInrV   s     r   (test_calls_in_fstrings_with_call_on_callz7Test_pygettext.test_calls_in_fstrings_with_call_on_call  sF    11& : 3 3   	F+++++r   c                 v    |                      t          d                    }|                     d|           d S )Nz6        f"{_('foo {bar}').format(bar='baz')}"
        	foo {bar}ry   rV   s     r   "test_calls_in_fstrings_with_formatz1Test_pygettext.test_calls_in_fstrings_with_format  sD    11& : 3 3   	k6*****r   c                     |                      t          d                    }|                     d |D                        d S )Nz%        f"{_(f'foo {bar}')}"
        c                     g | ]}d |v |	S )r   rO   rP   s     r   rR   zLTest_pygettext.test_calls_in_fstrings_with_wrong_input_1.<locals>.<listcomp>  s"    LLLE{e7K7K%7K7K7Kr   rT   rV   s     r   )test_calls_in_fstrings_with_wrong_input_1z8Test_pygettext.test_calls_in_fstrings_with_wrong_input_1  sS    11& : 3 3   	LLVLLLMMMMMr   c                 v    |                      t          d                    }|                     d|           d S )Nz        f"{_(1)}"
        r   r   rV   s     r   )test_calls_in_fstrings_with_wrong_input_2z8Test_pygettext.test_calls_in_fstrings_with_wrong_input_2  sF    11& : 3 3   	F#####r   c                     |                      t          d                    }|                     d|           |                     d|           d S )Nz%        f"{_('foo', 'bar')}"
        foobarr   rV   s     r   (test_calls_in_fstring_with_multiple_argsz7Test_pygettext.test_calls_in_fstring_with_multiple_args#  s\    11& : 3 3   	''''''''r   c                     |                      t          d                    }|                     d|           |                     d|           |                     d|           d S )Nz)        f"{_('foo', bar='baz')}"
        r   r   bazr   rV   s     r   'test_calls_in_fstring_with_keyword_argsz6Test_pygettext.test_calls_in_fstring_with_keyword_args*  sr    11& : 3 3   	'''''''''''r   c                     |                      t          d                    }|                     d|           |                     d|           d S )Nz*        f"{_(f'foo') + _('bar')}"
        r   r   )r6   r   r   r9   rV   s     r   5test_calls_in_fstring_with_partially_wrong_expressionzDTest_pygettext.test_calls_in_fstring_with_partially_wrong_expression2  sZ    11& : 3 3   	'''eV$$$$$r   c           	      `   d}d}d}t          d          5  t          d          5 }t          j        t          j                            |d                     t          t          j                            |dd          dd	          5 }|                    d
|d           ddd           n# 1 swxY w Y   t          j        t          j                            |d                     t          t          j                            |dd          dd	          5 }|                    d
|d           ddd           n# 1 swxY w Y   t          j        t          j                            |d                     t          t          j                            |dd          dd	          5 }|                    d
|d           ddd           n# 1 swxY w Y   t          | j	        |           t          dd	          5 }|
                                }ddd           n# 1 swxY w Y   |                     d| d|           |                     d| d|           |                     ||           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zVMake sure the directories are inspected for source files
           bpo-31920
        zText to translate1zText to translate2zText to ignoreNpypkgzpymod.pyr)   r*   r+   z_()zpkg.pyz	pymod2.pyCVSz	pymod3.pyr-   zmsgid "r   )r   r   osmkdirpathr"   r.   r/   r   r0   r1   r9   r   )r   text1text2text3sdirsfiler5   r   s           r   test_files_listzTest_pygettext.test_files_list9  s    %$ d^^ 	* 	*Xd^^ 	*tHRW\\$00111bgll4*==s&( ( ( -+0OOOO,,,- - - - - - - - - - - - - - - HRW\\$11222bgll4;??&( ( ( -+0OOOO,,,- - - - - - - - - - - - - - - HRW\\$..///bgll4<<c&( ( ( -+0OOOO,,,- - - - - - - - - - - - - - - T[$///nw777 !2wwyy! ! ! ! ! ! ! ! ! ! ! ! ! ! !MM,E,,,d333MM,E,,,d333UD)))%	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*s   J#A$J
B0$J0B44J7B48A&JE8JEJEA&J2GJGJG )J	H*J*H..J1H.2AJ?J#J	J#J	J##J'*J'N)0__name__
__module____qualname____doc__r   r   r"   r   r0   r   r'   r6   r;   unittestskipIfsysplatformr   rB   rI   rW   r[   r]   r`   rc   re   rh   rl   ro   rs   rw   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   r   r   r
   r
      s       ))W\\(6>::F	 	 	  0	% 	% 	%2 2 24 X_S\,,U3346 6@ @6 6@"- - -H H HH H H- - -H H HH H H- - -H H HH H H+ + +
H H HH H H% % %% % %% % %& & &$% % %) ) )) ) )) ) )) ) ), , ,+ + +N N N$ $ $( ( (( ( (% % %* * * * *r   r
   )r   r   r   r   textwrapr   test.support.script_helperr   test.test_toolsr   r   test.support.os_helperr   r   TestCaser
   rO   r   r   <module>r      s    + + 				 



        7 7 7 7 7 7 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5    B* B* B* B* B*X& B* B* B* B* B*r   