
    /hhS                     p   S SK r S SKrS SK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/rSrSrSr/ S	Qr\R"                  S
:X  a  SrSrO\R"                  R%                  S5      (       a  \R'                  S5        O_\R"                  R%                  S5      (       a  SrSrO:\R"                  S:X  a  SrO'\R"                  S:X  a  SrO\R"                  S:X  a  SrSrS	r\" \R"                  S;  =(       a    \" \ S5      =(       a	    \" \ S5      5      rS rSr\" S\5      r " S S\5      rSrSrSqSqSq S r! " S S\RD                  5      r# " S  S!\#5      r$\	RJ                  \RL                  " \RN                  " S"5      S#5       " S$ S%\#5      5       5       r(S& r)\*S':X  a  \RV                  " 5         gg)(    N)
namedtuple)support)run_python_until_endCzinvalid.asciiasciiT)zC.UTF-8zC.utf8UTF-8androidutf-8linuxPOSIXaixz	iso8859-1darwincygwinFvxworks)r   r   nl_langinfoCODESETc                     Sn[         (       a  US-  nUR                  U 5      n[        SUSS9u  p4UR                  S:H  $ )Nz=import locale; print(locale.setlocale(locale.LC_CTYPE, '{}'))z>; import sys; sys.exit(not locale.nl_langinfo(locale.CODESET))-c PYTHONCOERCECLOCALEr   )_check_nl_langinfo_CODESETformatr   rc)locale_namecmd_fmtcmdresultpy_cmds        D/opt/python-3.13.8/usr/lib/python3.13/test/test_c_locale_coercion.py_set_locale_in_subprocessr!   V   sD    MG!!SS
..
%C)$LNF99>    zBfsencoding stdin_info stdout_info stderr_info lang lc_ctype lc_allEncodingDetailsc                   Z    \ rS rSrSR	                  / SQ5      r\S 5       r\S 5       rSr	g)r#   d   ;)zimport sys, osz"print(sys.getfilesystemencoding())z2print(sys.stdin.encoding + ':' + sys.stdin.errors)z4print(sys.stdout.encoding + ':' + sys.stdout.errors)z4print(sys.stderr.encoding + ':' + sys.stderr.errors)z(print(os.environ.get('LANG', 'not set'))z,print(os.environ.get('LC_CTYPE', 'not set'))z*print(os.environ.get('LC_ALL', 'not set'))c                 T   US-   nUc  SnUR                  U5      /S-  nUR                  UR                  S5      5        UR                  SS5      nU(       a  [        n	OUR                  SS5      n	UR                  SS5      n
XU
4n[	        U " U/UQUQ76 R                  5       5      $ )	z;Returns expected child process details for a given encodingz:{}surrogateescape   backslashreplaceLANGznot setLC_CTYPELC_ALL)r   appendgetCLI_COERCION_TARGETdict_asdict)clscoercion_expectedfs_encodingstream_encodingstream_errorsenv_vars_streamstream_infoexpected_langexpected_lc_ctypeexpected_lc_allenv_infos               r    get_expected_details$EncodingDetails.get_expected_detailsq   s     "E)  .M~~m459 	7>>*<=> VY7 3 (Z C",,x; _DC=k=H=EEGHHr"   c                 x   [        SSSU R                  40 UD6u  p#UR                  S:X  d  UR                  U5        UR                  R                  S5      R                  5       n[        U " U6 R                  5       5      nUR                  R                  S5      R                  5       R                  5       nXV4$ )a:  Retrieves fsencoding and standard stream details from a child process

Returns (encoding_details, stderr_lines):

- encoding_details: EncodingDetails for eager decoding
- stderr_lines: result of calling splitlines() on the stderr output

The child is run in isolated mode if the current interpreter supports
that.
z-Xzutf8=0r   r   r   )r   CHILD_PROCESS_SCRIPTr   failoutdecode
splitlinesr1   r2   errrstrip)r3   r8   r   r   stdout_lineschild_encoding_detailsstderr_liness          r    get_child_details!EncodingDetails.get_child_details   s     .(D#":":

 yyA~KKzz((1<<>!%c<&8&@&@&B!Czz((188:EEG%33r"    N)
__name__
__module____qualname____firstlineno__joinrB   classmethodr?   rL   __static_attributes__rN   r"   r    r#   r#   d   s@    88 	% 	 I I* 4 4r"   zPython runtime initialized with LC_CTYPE=C (a locale with default ASCII encoding), which may cause Unicode compatibility problems. Using C.UTF-8, C.utf8, or UTF-8 (if available) as alternative Unicode-compatible locales is recommended.zPython detected LC_CTYPE=C: LC_CTYPE coerced to {} (set another locale or PYTHONCOERCECLOCALE=0 to disable this locale coercion behavior).c                     [         b  g / q [         H*  n [        U 5      (       d  M  [         R                  U 5        M,     [         (       a"  [         S   q[
        R                  [        5      q[        R                  (       a  [        S[         < 35        [        S[        < 35        [        S[        < 35        [        S[        < 35        [        S[        < 35        [        S[        < 35        [        S[        < 35        g g )	Nr   zAVAILABLE_TARGETS = z EXPECTED_C_LOCALE_EQUIVALENTS = z$EXPECTED_C_LOCALE_STREAM_ENCODING = z EXPECTED_C_LOCALE_FS_ENCODING = z$EXPECT_COERCION_IN_DEFAULT_LOCALE = z_C_UTF8_LOCALES = z_check_nl_langinfo_CODESET = )AVAILABLE_TARGETS_C_UTF8_LOCALESr!   r.   r0   CLI_COERCION_WARNING_FMTr   CLI_COERCION_WARNINGr   verboseprintEXPECTED_C_LOCALE_EQUIVALENTS!EXPECTED_C_LOCALE_STREAM_ENCODINGEXPECTED_C_LOCALE_FS_ENCODING!EXPECT_COERCION_IN_DEFAULT_LOCALEr   )target_locales    r    setUpModulerb      s    
 $ )$]33$$]3 ) /27>>?RS$%6$9:;01N0QRS45V4YZ[01N0QRS45V4YZ["?"567-.H-KLM r"   c                       \ rS rSrS rSrg)_LocaleHandlingTestCase   c                     [         R                  U5      nUu  p[         R                  UUUUU5      n
U R                  X5        Uc  / nU R                  X5        g)a  Check the C locale handling for the given process environment

Parameters:
    expected_fs_encoding: expected sys.getfilesystemencoding() result
    expected_stream_encoding: expected encoding for standard streams
    expected_warning: stderr output to expect (if any)
N)r#   rL   r?   assertEqual)selfr8   expected_fs_encodingexpected_stream_encodingexpected_stream_errorsexpected_warningsr4   r   encoding_detailsrK   expected_detailss              r    _check_child_encoding_details5_LocaleHandlingTestCase._check_child_encoding_details   sh     !228<)/&*?? $"
 	)<$ "9r"   rN   N)rO   rP   rQ   rR   ro   rU   rN   r"   r    rd   rd      s    :r"   rd   c                   0    \ rS rSr\S 5       rS rS rSrg)LocaleConfigurationTests   c                 F    [         (       d  [        R                  " S5      eg )Nz No C-with-UTF-8 locale available)rW   unittestSkipTest)r3   s    r    
setUpClass#LocaleConfigurationTests.setUpClass   s!     ! ##$FGG !r"   c                    S U l         SnSnSSSSSS.nS H_  n[         HR  nUS:X  a  US:X  a  M  U R                  UUS9   UR                  5       nXVU'   U R	                  UUUS S SS	9  S S S 5        MT     Ma     g ! , (       d  f       Mj  = f)
Nr
   r   r+   r,   r-   r   PYTHONIOENCODINGr+   r,   r+   r   env_varconfigured_localeFrk   rl   r4   maxDiffrW   subTestcopyro   rh   ri   rj   base_var_dictr~   locale_to_setvar_dicts          r    )test_external_target_locale_configurationBLocaleConfigurationTests.test_external_target_locale_configuration   s     &#*  #% "
 ,G!2 f$')A\\'4A " C,113H(5W%66x7K7ONRIMIN 7 P	C C "3 ,C C    )A::
B	c                    S U l         SnSnSSSSSS.nS H_  n[         HR  nUS:X  a  US:X  a  M  U R                  UUS9   UR                  5       nXVU'   U R	                  UUUSS S	S
9  S S S 5        MT     Ma     g ! , (       d  f       Mj  = f)Nr
   r   r   rz   r|   r+   r}   strictFr   r   r   s          r    test_with_ioencoding-LocaleConfigurationTests.test_with_ioencoding  s     &#*  #% '
 ,G!2 f$')A\\'4A " C,113H(5W%66x7K7ONVIMIN 7 P	C C "3 ,C Cr   r   N)	rO   rP   rQ   rR   rT   rw   r   r   rU   rN   r"   r    rr   rr      s%     H H!PF Pr"   rr   PY_COERCE_C_LOCALEz(C locale coercion disabled at build timec                   F    \ rS rSr  SS jrS rS rS rS rS r	S	 r
S
rg)LocaleCoercionTestsi@  Nc                 f   SU l         [        (       d  [        n[        nSnU(       a  [        /nSSSSSS.nUR                  U5        Ub  X7S'   U R                  SUS9   [        (       a  UnUn	OSnSn	[        R                  (       a  U[        /:X  a  SnU R                  UUUSUU	5        SSS5        [         HQ  n
S HH  nU R                  UU
USS	9   UR                  5       nXU'   U R                  UUUSUU5        SSS5        MJ     MS     g! , (       d  f       Nj= f! , (       d  f       Mq  = f)
a  Check the C locale handling for various configurations

Parameters:
    fs_encoding: expected sys.getfilesystemencoding() result
    stream_encoding: expected encoding for standard streams
    coerce_c_locale: setting to use for PYTHONCOERCECLOCALE
      None: don't set the variable at all
      str: the value set in the child's environment
    expected_warnings: expected warning lines on stderr
    extra_vars: additional environment variables to set in subprocess
NFr   rz   r   T)default_localer   r|   )r~   nominal_localer   r{   )r   rW   r_   r^   LEGACY_LOCALE_WARNINGupdater   r`   r   
is_androidrZ   ro   r]   r   )rh   r5   r6   coerce_c_localerl   r4   
extra_varsr   _expected_warnings_coercion_expectedr   r~   r   s                r    _check_c_locale_coercion,LocaleCoercionTests._check_c_locale_coercionF  sf   "   7K?O % %:$;! #% "
 	Z(&3B/0 \\.=  ?00%6"%6"%)"%*"
 ""&+?*@@%)"..}/:/>/3/A/AC?. ;M/\\'1>6E35 " 7  -113H(5W%66x7B7F7;7H7HJ7 7 0 ;/? ?27 7s   AD+D!
D!
D0c                 &    U R                  SSS S9  g )Nr
   r   r   rh   s    r     test_PYTHONCOERCECLOCALE_not_set4LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_set  s    %%gw%Mr"   c                 8    S H  nU R                  SSUS9  M     g )N)r   1truefalser
   r   r   )rh   settings     r    !test_PYTHONCOERCECLOCALE_not_zero5LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_zero  s#     2G))'7G)T 2r"   c                 2    U R                  SSS[        /S9  g )Nr
   warn)r   rl   )r   rZ   r   s    r    $test_PYTHONCOERCECLOCALE_set_to_warn8LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_warn  s#    %%gw6<9M8N 	& 	Pr"   c                 n    U R                  [        [        SSS9  U R                  [        [        SSSS9  g )N0F)r   r4   r   r   r-   r4   )r   r_   r^   r   s    r    $test_PYTHONCOERCECLOCALE_set_to_zero8LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_zero  sE    %%&C&G698= 	& 	?
 	%%&C&G69-08=	 	& 	?r"   c           	      |    U R                  [        [        S SSS9  U R                  [        [        SS[        /SS9  g )Nr   Fr   r   )r   r-   rl   r4   )r   r_   r^   r   r   s    r    test_LC_ALL_set_to_C(LocaleCoercionTests.test_LC_ALL_set_to_C  sN    %%&C&G6:-08=	 	& 	? 	%%&C&G6<-09N8O8= 	& 	?r"   c                    [         R                  " [         R                  S 5      nU R                  [         R                  [         R                  U5         [         R                  " [         R                  S5      nWS:X  a  U R                  S5        U[        ;   a  U R                  SU-  5        Sn[        [        R                  SS9n[        R                  " [        R                  SU/[        R                  US	S
9nU R!                  UR"                  R%                  5       U5        g ! [         R                   a$  nU R                  [        U5      5         S nANS nAff = f)Nr   r   z.test requires LC_CTYPE locale different than Czcoerced LC_CTYPE locale: %sz=import locale; print(locale.setlocale(locale.LC_CTYPE, None))r   r   r   T)stdoutenvtext)locale	setlocaler,   
addCleanupErrorskipTeststrTARGET_LOCALESr1   osenviron
subprocessrunsys
executablePIPErg   r   rH   )rh   old_loclocecoder   r   s          r    #test_PYTHONCOERCECLOCALE_set_to_one7LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_one  s   ""6??D9((&//7C	"""6??B7C #:MMJK. MM7#=> O2::37nncnndD9$.OO!$"&( 	**,c2 || 	"MM#a&!!	"s   %D+ +E#?EE#r   )NT)rO   rP   rQ   rR   r   r   r   r   r   r   r   rU   rN   r"   r    r   r   @  s3     4837	LJ\NUP??3r"   r   c                  .    [         R                  " 5         g )N)r   reap_childrenrN   r"   r    tearDownModuler     s    r"   __main__),r   r   r   r   	sysconfigru   collectionsr   testr   test.support.script_helperr   r]   r^   r_   r`   r   platform
startswithr.   rX   boolhasattrr   r!   _fields_EncodingDetailsr#   r   rY   rW   r0   rZ   rb   TestCaserd   rr   cpython_only
skipUnlessget_config_varr   r   rO   mainrN   r"   r    <module>r      s    	  
   "  ; "%o 6  %, ! '  %) !/ <<9(/%$+!\\W%%
 "((1\\U##(3%$/!\\X$+!\\X ).%\\Y(/%$+! 1 "LL++ FM"FI  O/9 94& 94| J     N<:h// :@MP6 MP^ 		Y--.BC?AS31 S3A S3l zMMO r"   