
    4hh %                     h   S r SSKrSSKrSSKrSSKJr  SSKJr  SSKJ	r	  SSK
JrJr  SSKJrJrJr  \" S5        \" \5      R$                  S	-  R'                  5       r\" \5      S-  r\S
-  r\" S5         SSKrSSS5        S r " S S\R2                  5      r " S S\R2                  5      r " S S\R2                  5      rS r\S:X  aT  \" \R@                  5      S:  a,  \R@                  S   S:X  a  \" 5         \RB                  " S5        \RD                  " 5         gg! , (       d  f       N= f)z(Tests for the Tools/i18n/msgfmt.py tool.    N)GNUTranslations)Path)temp_cwd)assert_python_failureassert_python_ok)imports_under_toolskip_if_missingtoolsdiri18nmsgfmt_dataz	msgfmt.pyc                 &    [        [        SX5        g )Nz-o)r   	msgfmt_py)po_filemo_files     D/opt/python-3.13.8/usr/lib/python3.13/test/test_tools/test_msgfmt.pycompile_messagesr      s    Yg7    c                   8    \ rS rSrS rS rS rS rS rS r	Sr
g	)
CompilationTest   c           	      F   S U l         [        5          [        R                  S5       H  nU R	                  US9   UR                  S5      n[        US5       n[        U5      nS S S 5        UR                  n[        X5        [        US5       n[        U5      nS S S 5        U R                  WR                  WR                  5        S S S 5        M     S S S 5        g ! , (       d  f       N= f! , (       d  f       NZ= f! , (       d  f       M  = f! , (       d  f       g = f)N*.po)r   .morb)maxDiffr   data_dirglobsubTestwith_suffixopenr   namer   assertDictEqual_catalog)selfr   r   fexpectedtmp_mo_fileactuals          r   test_compilation CompilationTest.test_compilation   s    Z#==0\\'\2%11%8Ggt,#21#5 - #*,,K$W:k40A!0!3 1 (((:K:KL 32 1 Z -,
 10 32 ZsR   (DD C	$+D C/	.D 	D
C,(D /
C=9D  
D
D
D c                 d   [        [        S-  S5       n[        U5      nS S S 5        U R                  WR	                  S5      S5        U R                  UR	                  S5      S5        U R                  UR                  SS5      S5        U R                  UR                  SS5      S5        U R                  UR	                  S5      S	5        U R                  UR	                  S
5      S5        U R                  UR	                  S5      S5        U R                  UR                  SSS5      S5        U R                  UR                  SSS5      S5        U R                  UR                  SSSS5      S5        U R                  UR                  SSSS5      S5        g ! , (       d  f       GN= f)Nz
general.mor   foobarbazabcxyzMultilinestringMultilinetranslationz	"escapes"z"translated"z
 newlines 
z
 translated 
zOne email sent.z%d emails sent.      )r    r   r   assertEqualgettextpgettextngettext	npgettext)r$   r%   ts      r   test_translations!CompilationTest.test_translations.   sv   (\)40A"A 1 	5)515)51E5159E5159#457MN;/@#346HI$57H!L*	,$57H!L*	,U,=%6;*	, 	U,=%6;*	,# 10s   F  
F/c                     [        5          [        S5      R                  S5        [        [        S5      nUR
                  R                  S5      nU R                  SU5        S S S 5        g ! , (       d  f       g = f)N
invalid.poz+msgid_plural "plural"
msgstr[0] "singular"
utf-8z"msgid_plural not preceded by msgidr   r   
write_textr   r   errdecodeassertInr$   resrB   s      r   test_invalid_msgid_plural)CompilationTest.test_invalid_msgid_pluralD   sX    Z)) + 
 (	<@C''..)CMM>D ZZ   AA,,
A:c                     [        5          [        S5      R                  S5        [        [        S5      nUR
                  R                  S5      nU R                  SU5        S S S 5        g ! , (       d  f       g = f)Nr>   zmsgid "foo"
msgstr[0] "bar"
r?   zplural without msgid_pluralr@   rE   s      r    test_plural_without_msgid_plural0CompilationTest.test_plural_without_msgid_pluralO   sX    Z)) + 
 (	<@C''..)CMM7= ZZrI   c                     [        5          [        S5      R                  S5        [        [        S5      nUR
                  R                  S5      nU R                  SU5        S S S 5        g ! , (       d  f       g = f)Nr>   z-msgid "foo"
msgid_plural "foos"
msgstr "bar"
r?   z"indexed msgstr required for pluralr@   rE   s      r   (test_indexed_msgstr_without_msgid_plural8CompilationTest.test_indexed_msgstr_without_msgid_pluralZ   sX    Z)) +  (	<@C''..)CMM>D ZZrI   c                     [        5          [        S5      R                  S5        [        [        S5      nUR
                  R                  S5      nU R                  SU5        S S S 5        g ! , (       d  f       g = f)Nr>   z"foo"
r?   zSyntax errorr@   rE   s      r   test_generic_syntax_error)CompilationTest.test_generic_syntax_errorf   sW    Z)) +  (	<@C''..)CMM.#. ZZrI   )r   N)__name__
__module____qualname____firstlineno__r)   r;   rG   rK   rN   rQ   __static_attributes__ r   r   r   r      s#    M ,,	E	>
E/r   r   c                   *    \ rS rSr\S 5       rS rSrg)POParserTestq   c                 @    [         R                  R                  5         g )N)msgfmtMESSAGESclear)clss    r   tearDownClassPOParserTest.tearDownClassr   s     	r   c           	         Sn[        5          U H  u  p#U R                  US9   SU S3n[        S5      R                  U5        [        R
                  R                  5         [        R                  " SS5        [        SS5       n[        U5      nS S S 5        U R                  WR                  US05        S S S 5        M     S S S 5        S	n[        5          U H  nU R                  US
9   SU S3n[        S5      R                  U5        [        R
                  R                  5         U R                  [        5         [        R                  " SS5        S S S 5        S S S 5        M     S S S 5        g ! , (       d  f       N= f! , (       d  f       GM  = f! , (       d  f       N= f! , (       d  f       NX= f! , (       d  f       M  = f! , (       d  f       g = f)N))z"" )z"" "" ""rd   )z"\\"\)z"\""")z"\t"	)z"\n"
)z"\r")z"\f")z"\a")z"\b")z"\v")z"foo"r,   )z"foo" "bar"foobar)z
"foo""bar"rn   )z"" "foo" ""r,   )z
"foo\nbar"foo
bar)z"foo\n" "bar"ro   )z
"foo\tbar"foo	bar)z"foo\t" "bar"rp   )z
"foo\"bar"foo"bar)z"foo\"" "bar"rq   )z"foo\\" "bar"zfoo\bar)z"\120\171\164\150\157\156"Python)z"\120\171\164" "\150\157\156"rr   )z!"\"\120\171\164" "\150\157\156\"""Python")z"\x50\x79\x74\x68\x6f\x6e"rr   )z"\x50\x79\x74" "\x68\x6f\x6e"rr   )z!"\"\x50\x79\x74" "\x68\x6f\x6e\""rs   )	po_stringzmsgid z
msgstr "translation"zmessages.pozmessages.mor   translation)rf   z"""z"" "r,   z"" "fooz	"foo" foo42z"" 42 ""z"\x"z"\u1234"z"\N{ROMAN NUMERAL NINE}")string)r   r   r   rA   r]   r^   r_   maker    r   r"   r#   assertRaises	Exception)	r$   valid_stringsrt   r&   por%   r(   invalid_stringsinvalid_strings	            r   test_stringsPOParserTest.test_stringsx   so   
$
L Z'4#	\\I\6 "),BCB'2226OO))+KK}=mT2a!0!3 3 ((8]:ST 76 (5 "
& Z"1\\\8!.!11GHB'2226OO))+**95M=A 6 98 #2 Z1 32 76 ZV 65 98 Zsx   FA"FE6	&F8FG-AF<F+	F<!G6
F F
F	F
F(+
F95F<<
GG
GrX   N)rS   rT   rU   rV   classmethodra   r   rW   rX   r   r   rZ   rZ   q   s       
WBr   rZ   c                   2    \ rS rSrS rS rS rS rS rSr	g)	CLITest   c                     S H@  n[        [        U5      nUR                  R                  S5      nU R	                  SU5        MB     g )N)z--helpz-hr?   EGenerate binary message catalog from textual translation description.)r   r   rB   rC   rD   )r$   optionrF   rB   s       r   	test_helpCLITest.test_help   s:    &F"9f5C''..)CMMacfg 'r   c                     S HN  n[        [        U5      nUR                  R                  S5      R	                  5       nU R                  SU5        MP     g )N)z	--versionz-Vr?   zmsgfmt.py 1.2)r   r   outrC   stripr5   )r$   r   rF   r   s       r   test_versionCLITest.test_version   sC    )F"9f5C''..)//1C_c2 *r   c                     [        [        S5      nUR                  R                  S5      nU R	                  SU5        U R	                  SU5        g )Nz--invalid-optionr?   r   z&option --invalid-option not recognized)r   r   rB   rC   rD   rE   s      r   test_invalid_optionCLITest.test_invalid_option   s@    #I/ABggnnW%]_bc>Dr   c                     [        [        5      nUR                  R                  S5      R	                  SS5      nU R                  SU5        g )Nr?   z
rh   z=No input file given
Try `msgfmt --help' for more information.)r   r   rB   rC   replacerD   rE   s      r   test_no_input_fileCLITest.test_no_input_file   sA    y)ggnnW%--fd; BCF	Hr   c                 $    [        [        S5        g )Nznonexistent.po)r   r   )r$   s    r   test_nonexistent_fileCLITest.test_nonexistent_file   s    i)9:r   rX   N)
rS   rT   rU   rV   r   r   r   r   r   rW   rX   r   r   r   r      s    h3EH;r   r   c                     [         R                  S5       H  n U R                  S5      n[        X5        [	        US5       n[        U5      nS S S 5        U R                  S5      n[	        US5       nWR                  R                  5       n[        US S9n[        R                  " XRSS	9  UR                  S
5        S S S 5        M     g ! , (       d  f       N= f! , (       d  f       M  = f)Nr   r   r   z.jsonwc                 2    [        U S   [        5      U S   4$ )Nr   )
isinstancetuple)xs    r   <lambda>*update_catalog_snapshots.<locals>.<lambda>   s    z!A$/F!.Mr   )key   )indentrh   )r   r   r   r   r    r   r#   itemssortedjsondumpwrite)r   r   r%   translationscatalog_filedatas         r   update_catalog_snapshotsr      s    ==(%%e,* '4 A*1-L !**73,$((..0D$$MNDIIda(GGDM	 %$ )
 !  %$s   C2AC
C	
C+	__main__r3   z--snapshot-update)#__doc__r   sysunittestr6   r   pathlibr   test.support.os_helperr   test.support.script_helperr   r   test.test_toolsr   r	   r
   __file__parentresolver   
script_dirr   r]   r   TestCaser   rZ   r   r   rS   lenargvexitmainrX   r   r   <module>r      s   .  
  #  + N I I  N!!M1::<(^f$
$	  8R/h'' R/j^B8$$ ^BB;h ;<  z
388}qSXXa[,?? "MMO	 Y  s   6D##
D1