
    z%iK                     6   d dl Z d dlZd dl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 ddgZdZdZdZg d	Zej"                  j%                  d
      r#e	j&                  rdZdZniej)                  d       nWej"                  j%                  d      rdZdZn7ej"                  dk(  rdZn%ej"                  dk(  rdZnej"                  dk(  rdZdZd	Z eej"                  dvxr  ee d      xr	  ee d            Zd ZdZ ede      Z G d de      ZdZdZdada da!d Z" G d dejF                        Z$ G d d e$      Z%e	jL                   ejN                   ejP                  d!      d"       G d# d$e$                    Z)d% Z*e+d&k(  r ejX                          yy)'    N)
namedtuple)support)run_python_until_endCzinvalid.asciiasciiT)zC.UTF-8zC.utf8UTF-8linuxutf-8POSIXaixz	iso8859-1darwincygwinFvxworks)r   r	   nl_langinfoCODESETc                 ~    d}t         r|dz  }|j                  |       }t        d|d      \  }}|j                  dk(  S )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        O/home/uftp/.pyenv/versions/3.12.0/lib/python3.12/test/test_c_locale_coercion.py_set_locale_in_subprocessr    W   sC    MG!SS
..
%C)$LNFF99>    zBfsencoding stdin_info stdout_info stderr_info lang lc_ctype lc_allEncodingDetailsc                   R    e Zd Zdj                  g d      Zed        Zed        Zy)r"   ;)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                 B   |dz   }d|j                  d      gz  }|j                  |j                  d             |j                  dd      }|rt        }n|j                  dd      }|j                  dd      }	|||	f}
t	         | |g||
 j                               S )	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env_vars_streamstream_infoexpected_langexpected_lc_ctypeexpected_lc_allenv_infos              r   get_expected_detailsz$EncodingDetails.get_expected_detailsr   s     "E) (9:;;7>>*<=> VY7 3 (Z C",,x; "3_DC=k=H=EEGHHr!   c                 z   t        ddd| j                  fi |\  }}|j                  dk(  s|j                  |       |j                  j                  d      j                         }t         | | j                               }|j                  j                  d      j                         j                         }||fS )aj  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
splitlinesr/   r0   errrstrip)r1   r5   r   r   stdout_lineschild_encoding_detailsstderr_liness          r   get_child_detailsz!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__joinr>   classmethodr<   rH    r!   r   r"   r"   e   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                     t         y g a t        D ]#  } t        |       st         j                  |        % t         r"t         d   at
        j                  t              at        j                  rt        dt                t        dt               t        dt               t        dt               t        dt               t        dt               t        dt               y y )	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,   r.   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   setUpModuler[      s    
 $ ) 4$]3$$]34 /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                       e Zd Zd Zy)_LocaleHandlingTestCasec                     t         j                  |      }|\  }}t         j                  ||||      }	| j                  ||	       |g }| j                  ||       y)a5  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"   rH   r<   assertEqual)
selfr5   expected_fs_encodingexpected_stream_encodingexpected_warningsr2   r   encoding_detailsrG   expected_detailss
             r   _check_child_encoding_detailsz5_LocaleHandlingTestCase._check_child_encoding_details   sm     !228<)/&,*?? $	
 	)+;<$ "'89r!   N)rI   rJ   rK   rf   rN   r!   r   r]   r]      s    :r!   r]   c                   "    e Zd Zed        Zd Zy)LocaleConfigurationTestsc                 :    t         st        j                  d      y )Nz No C-with-UTF-8 locale available)rP   unittestSkipTest)r1   s    r   
setUpClassz#LocaleConfigurationTests.setUpClass   s     !##$FGG !r!   c           
         d | _         d}d}ddddd}dD ]_  }t        D ]T  }|dk(  r|dk(  r| j                  ||      5  |j                         }|||<   | j	                  |||d d	       d d d        V a y # 1 sw Y   cxY w)
Nr
   r   r)   r*   r+   r   r)   r*   r)   r   )env_varconfigured_localeF)rc   r2   )maxDiffrP   subTestcopyrf   )r`   ra   rb   base_var_dictrp   locale_to_setvar_dicts          r   )test_external_target_locale_configurationzBLocaleConfigurationTests.test_external_target_locale_configuration   s     &#*  #%	
 , 	PG!2 P f$')A\\'4A " C P,113H(5HW%66x7K7OIMIN	 7 P	P PP	PP Ps   ,A88BN)rI   rJ   rK   rM   rl   rx   rN   r!   r   rh   rh      s     H HPr!   rh   PY_COERCE_C_LOCALEz(C locale coercion disabled at build timec                   <    e Zd Z	 	 d	dZd Zd Zd Zd Zd Zd Z	y)
LocaleCoercionTestsNc           
      $   d| _         t        st        }t        }d}|rt        g}ddddd}|j                  |       |||d<   | j                  d|      5  t        r|}|}	nd}d}	t        j                  r|t        gk(  rd}| j                  |||||	       ddd       t        D ]P  }
dD ]I  }| j                  ||
|	      5  |j                         }|
||<   | j                  |||||       ddd       K R y# 1 sw Y   cxY w# 1 sw Y   dxY w)
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   rn   r   T)default_localer   ro   )rp   nominal_localer   )rr   rP   rX   rW   LEGACY_LOCALE_WARNINGupdaters   rY   r   
is_androidrS   rf   rV   rt   )r`   r3   r4   coerce_c_localerc   r2   
extra_varsru   _expected_warnings_coercion_expectedrv   rp   rw   s                r   _check_c_locale_coercionz,LocaleCoercionTests._check_c_locale_coercion  sz   "  7K?O % %:$;! #%	
 	Z(&3BM/0 \\.=  ? 	C0%6"%6"%)"%*"
 ""&+?*@@%)"..}/:/>/A/A	C	C, ; 	JM/ J\\'1>6E " G 
J  -113H(5HW%66x7B7F7H7H	J
J 
JJ	J-	C 	C0
J 
Js   AC:+D:DDc                 ,    | j                  ddd        y )Nr
   r   r   r`   s    r    test_PYTHONCOERCECLOCALE_not_setz4LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_seti  s    %%gw%Mr!   c                 :    dD ]  }| j                  dd|        y )N)r   1truefalser
   r   r   )r`   settings     r   !test_PYTHONCOERCECLOCALE_not_zeroz5LocaleCoercionTests.test_PYTHONCOERCECLOCALE_not_zerom  s*     2 	UG))'7G)T	Ur!   c                 8    | j                  dddt        g       y )Nr
   warn)r   rc   )r   rS   r   s    r   $test_PYTHONCOERCECLOCALE_set_to_warnz8LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_warns  s#    %%gw6<9M8N 	& 	Pr!   c                 z    | j                  t        t        dd       | j                  t        t        ddd       y )N0F)r   r2   r   r   r+   r2   )r   rX   rW   r   s    r   $test_PYTHONCOERCECLOCALE_set_to_zeroz8LocaleCoercionTests.test_PYTHONCOERCECLOCALE_set_to_zeroz  sE    %%&C&G698= 	& 	?
 	%%&C&G69-08=	 	& 	?r!   c                     | j                  t        t        d dd       | j                  t        t        ddt        gd       y )Nr   Fr   r   )r   r+   rc   r2   )r   rX   rW   r   r   s    r   test_LC_ALL_set_to_Cz(LocaleCoercionTests.test_LC_ALL_set_to_C  sN    %%&C&G6:-08=	 	& 	? 	%%&C&G6<-09N8O8= 	& 	?r!   c                    t        j                  t         j                  d       }| j                  t         j                  t         j                  |       	 t        j                  t         j                  d      }dk(  r| j                  d       |t        v r| j                  d|z         d}t        t        j                  d      }t        j                  t        j                  d|gt        j                  |d	
      }| j!                  |j"                  j%                         |       y # t         j                  $ r$}| j                  t        |             Y d }~d }~ww xY w)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_LOCALESr/   osenviron
subprocessrunsys
executablePIPEr_   r   rD   )r`   old_loclocecoder   r   s          r   #test_PYTHONCOERCECLOCALE_set_to_onez7LocaleCoercionTests.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")NT)
rI   rJ   rK   r   r   r   r   r   r   r   rN   r!   r   r{   r{     s3     4837	HJTNUP??3r!   r{   c                  ,    t        j                          y )N)r   reap_childrenrN   r!   r   tearDownModuler     s    r!   __main__)-r   r   r   r   	sysconfigrj   collectionsr   testr   test.support.script_helperr   rV   rW   rX   rY   r   platform
startswithr   r,   rQ   boolhasattrr   r    _fields_EncodingDetailsr"   r   rR   rP   r.   rS   r[   TestCaser]   rh   cpython_only
skipUnlessget_config_varr{   r   rI   mainrN   r!   r   <module>r      s    	  
   "  ; "%o 6  %, ! '  %) !/ <<7#,3)(/% 	&,,W5\\U#(3%$/!\\X$+!\\X ).%\\Y(/%$+! 1 "LL++ FM"FI  O/9 54& 54t J     N<:h// :<)P6 )PZ 	-Y--.BC?AO31 O3A O3d zHMMO r!   