o
    IXh')                     @   s   d 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	m
Z
 ddlmZ ejdkZdZejdkZG d	d
 d
ejZedkrIe  dS dS )z9
Test the implementation of the PEP 540: the UTF-8 Mode.
    N)support)assert_python_okassert_python_failure)	os_helperwin32)CZPOSIXvxworksc                   @   s   e Zd ZddddZdd Zdddd	Zeed
dd Z	dd Z
dd Zdd Zdd Zdd Zd*ddZdd Zdd Zdd Zd d! Zeed"d#d$ Zd%d& Zeed'd(d) ZdS )+UTF8ModeTests 0)
PYTHONUTF8PYTHONLEGACYWINDOWSFSENCODINGZPYTHONCOERCECLOCALEc                 C   s   t t jd }|tv S )N)locale	setlocaleLC_CTYPEPOSIX_LOCALES)selfloc r   =/opt/python-3.10.19/usr/lib/python3.10/test/test_utf8_mode.pyposix_locale   s   zUTF8ModeTests.posix_localeF)failurec                O   sR   t | jfi |}|rt|i |}|d }nt|i |}|d }| dS )N      z
)dictDEFAULT_ENVr   r   decoderstrip)r   r   argskwoutr   r   r   
get_output   s   
zUTF8ModeTests.get_outputzWindows has no POSIX localec              	   C   sZ   d}t D ]&}| j|d | jd||d}| |d W d    n1 s%w   Y  qd S )N&import sys; print(sys.flags.utf8_mode)LC_ALL-c1)r   subTestr!   assertEqual)r   coder   r    r   r   r   test_posix_locale(   s   zUTF8ModeTests.test_posix_localec                 C   s   d}|  ddd|}| |d |  ddd|}| |d |  ddd|}| |d tr@| j ddd|dd	}| |d d S d S )
Nr"   -Xutf8r%   r&   zutf8=1utf8=0r   )r   )r!   r(   
MS_WINDOWSr   r)   r    r   r   r   test_xoption1   s   zUTF8ModeTests.test_xoptionc                 C   s   d}| j d|dd}| |d | j d|dd}| |d | j ddd|dd}| |d trA| j ddd|ddd	}| |d |  sT| j d
d|dd}| |d | j d|ddd}| d|  d S )Nr"   r%   r&   r   r   r+   r-   r,   r   r   -EZxxxT)r   r   z-invalid PYTHONUTF8 environment variable value)r!   r(   r.   r   ZassertInr   r/   r   r   r   test_env_varE   s&   zUTF8ModeTests.test_env_varc                 C   sb   t d}tr
d}nd}| ddd|}| || tr/| jddd|ddd	}| |d
 d S d S )Nz
            import sys
            print("{}/{}".format(sys.getfilesystemencoding(),
                                 sys.getfilesystemencodeerrors()))
        zutf-8/surrogatepasszutf-8/surrogateescaper+   r,   r%   strictr&   r2   zmbcs/replace)textwrapdedentr.   r!   r(   )r   r)   expectedr    r   r   r   test_filesystemencodinge   s   
z%UTF8ModeTests.test_filesystemencodingc                 C   s   t d}| jddd|dd}| | g d | jddd|dd}| | g d	 | jddd|d
d}| | g d d S )Nz
            import sys
            print(f"stdin: {sys.stdin.encoding}/{sys.stdin.errors}")
            print(f"stdout: {sys.stdout.encoding}/{sys.stdout.errors}")
            print(f"stderr: {sys.stderr.encoding}/{sys.stderr.errors}")
        r+   r,   r%   r
   )ZPYTHONIOENCODING)zstdin: utf-8/surrogateescapezstdout: utf-8/surrogateescapestderr: utf-8/backslashreplacelatin1)zstdin: iso8859-1/strictzstdout: iso8859-1/strictz"stderr: iso8859-1/backslashreplacez:namereplace)zstdin: utf-8/namereplacezstdout: utf-8/namereplacer:   )r6   r7   r!   r(   
splitlinesr/   r   r   r   
test_stdio|   s&   



zUTF8ModeTests.test_stdioc                 C   s0   t d}t}| jd||dd}| |d d S )Nz
            import sys
            filename = sys.argv[1]
            with open(filename) as fp:
                print(f"{fp.encoding}/{fp.errors}")
        r%   r&   r1   zUTF-8/strict)r6   r7   __file__r!   r(   )r   r)   filenamer    r   r   r   test_io   s   
zUTF8ModeTests.test_ioNc                 C   s   t }g }|r|d| |r|d| td|d|f }| jd||dd}|s1d}|s5d	}| || d
|  d S )Nz	encoding=zerrors=z
            import sys
            from %s import open
            filename = sys.argv[1]
            with open(filename, %s) as fp:
                print(f"{fp.encoding}/{fp.errors}")
        z, r%   r&   r1   zUTF-8r5   /)r>   appendr6   r7   joinr!   r(   )r   moduleencodingerrorsr?   r   r)   r    r   r   r   _check_io_encoding   s"   
z UTF8ModeTests._check_io_encodingc                 C   s0   | j |dd | j |dd | j |ddd d S )Nr;   rE   namereplace)rF   )rE   rF   )rG   )r   rD   r   r   r   check_io_encoding   s
   
zUTF8ModeTests.check_io_encodingc                 C      |  d d S )NiorJ   r   r   r   r   test_io_encoding      zUTF8ModeTests.test_io_encodingc                 C   rK   )NZ_pyiorM   rN   r   r   r   test_pyio_encoding   rP   z UTF8ModeTests.test_pyio_encodingc              	   C   sz   d}|  ddd|}| |d tD ](}| j|d | j ddd||d}| |d W d    n1 s5w   Y  qd S )Nz[import locale; print(locale.getpreferredencoding(False), locale.getpreferredencoding(True))r+   r,   r%   zUTF-8 UTF-8r#   )r!   r(   r   r'   )r   r)   r    r   r   r   r    test_locale_getpreferredencoding   s   z.UTF8ModeTests.test_locale_getpreferredencodingztest specific to Unixc              	      s  d d  d} dd}d fdd}|d|g tD ] }j|d	 |d|g|d	 W d    n1 s=w   Y  q"tjd
ksMtjsMtrP|}ntj	dr\ d}n|}tD ] }j|d	 |d|g|d	 W d    n1 s{w   Y  q`d S )Nu   hé€zutf-8asciisurrogateescapezYimport locale, sys; print("%s:%s" % (locale.getpreferredencoding(), ascii(sys.argv[1:])))c                    sB   j d| d fi |}|dd  }|t|| d S )Nr+   r%   :r   )r!   	partitionr   r(   rS   )Zutf8_optr8   r   r    r   argr)   r   r   r   check   s   z*UTF8ModeTests.test_cmd_line.<locals>.checkr,   r#   darwinZaixz
iso-8859-1r-   )
encoder   r   r'   sysplatformr   Z
is_androidVXWORKS
startswith)r   Zarg_utf8Z	arg_asciirY   r   Zc_argr   rW   r   test_cmd_line   s,   

zUTF8ModeTests.test_cmd_linec                 C   sf   d}|  dddd|}| |d |  dddd|}| |d d	}|  ddd
d|}| |d d S )Nz%import sys; print(sys.flags.optimize)r+   r,   z-Or%   r&   z-OO2z/import sys; print(sys.flags.ignore_environment)r3   )r!   r(   r/   r   r   r   test_optim_level   s   zUTF8ModeTests.test_optim_levelz@os.device_encoding() doesn't implement the UTF-8 Mode on Windowsc                 C   s   t j s
| d d}| tj| d|d}t jddd|g}tj	|dd	}| 
|jd
| t|dd}|  }W d    n1 sGw   Y  | 
|d d S )Nzsys.stdout is not a TTYzout.txtz5import os, sys; fd = sys.stdout.fileno(); out = open(z], "w", encoding="utf-8"); print(os.isatty(fd), os.device_encoding(fd), file=out); out.close()r+   r,   r%   T)textr   rH   z
True UTF-8)r\   stdoutisattyZskipTestZ
addCleanupr   unlink
executable
subprocessrunr(   
returncodeopenreadr   )r   r?   r)   cmdprocfpr    r   r   r   test_device_encoding   s   

z"UTF8ModeTests.test_device_encoding)NN)__name__
__module____qualname__r   r   r!   unittestZskipIfr.   r*   r0   r4   r9   r=   r@   rG   rJ   rO   rQ   rR   r`   rb   rp   r   r   r   r   r	      s4    


 



r	   __main__)__doc__r   rh   r\   r6   rt   testr   Ztest.support.script_helperr   r   Ztest.supportr   r]   r.   r   r^   ZTestCaser	   rq   mainr   r   r   r   <module>   s$    

  