B
    u9aR$                 @   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
 ejdkZdZG dd dejZed	krxe  dS )
z9
Test the implementation of the PEP 540: the UTF-8 Mode.
    N)support)assert_python_okassert_python_failurewin32)CZPOSIXc               @   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dS )'UTF8ModeTests 0)
PYTHONUTF8PYTHONLEGACYWINDOWSFSENCODINGZPYTHONCOERCECLOCALEc             C   s   t t jd }|tkS )N)locale	setlocaleLC_CTYPEPOSIX_LOCALES)selfloc r   $/usr/lib/python3.7/test_utf8_mode.pyposix_locale   s    zUTF8ModeTests.posix_localeF)failurec            O   sF   t | jf|}|r&t||}|d }nt||}|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   sJ   d}x@t D ]8}| j|d" | jd||d}| |d W d Q R X q
W d S )Nz&import sys; print(sys.flags.utf8_mode))LC_ALLz-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 )
Nz&import sys; print(sys.flags.utf8_mode)z-Xutf8z-cr!   zutf8=1zutf8=0r	   )r   )r   r#   
MS_WINDOWS)r   r$   r   r   r   r   test_xoption0   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r| j ddd|ddd	}| |d |  s| j d
d|dd}| |d | j d|ddd}| d|  d S )Nz&import sys; print(sys.flags.utf8_mode)z-cr!   )r
   r	   z-Xzutf8=0r&   )r
   r   z-EZxxxT)r
   r   z-invalid PYTHONUTF8 environment variable value)r   r#   r'   r   ZassertInr   )r   r$   r   r   r   r   test_env_varD   s"    zUTF8ModeTests.test_env_varc             C   s^   t d}trd}nd}| ddd|}| || trZ| jddd|ddd	}| |d
 d S )Nz
            import sys
            print("{}/{}".format(sys.getfilesystemencoding(),
                                 sys.getfilesystemencodeerrors()))
        zutf-8/surrogatepasszutf-8/surrogateescapez-Xr&   z-cstrictr!   )r
   r   zmbcs/replace)textwrapdedentr'   r   r#   )r   r$   expectedr   r   r   r   test_filesystemencodingd   s    z%UTF8ModeTests.test_filesystemencodingc             C   s   t d}| jddd|dd}| | ddd	g | jddd|d
d}| | dddg | jddd|dd}| | ddd	g 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}")
        z-Xr&   z-cr   )ZPYTHONIOENCODINGzstdin: utf-8/surrogateescapezstdout: utf-8/surrogateescapezstderr: utf-8/backslashreplacelatin1zstdin: latin1/strictzstdout: latin1/strictzstderr: latin1/backslashreplacez:namereplacezstdin: utf-8/namereplacezstdout: utf-8/namereplace)r+   r,   r   r#   
splitlines)r   r$   r   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}")
        z-cr!   )r
   zUTF-8/strict)r+   r,   __file__r   r#   )r   r$   filenamer   r   r   r   test_io   s
    zUTF8ModeTests.test_ioNc             C   s   t }g }|r|d| |r0|d| td|d|f }| jd||dd}|sbd}|sjd	}| || 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, z-cr!   )r
   zUTF-8r*   /)r2   appendr+   r,   joinr   r#   )r   moduleencodingerrorsr3   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/   )r9   namereplace)r:   )r9   r:   )r;   )r   r8   r   r   r   check_io_encoding   s    zUTF8ModeTests.check_io_encodingc             C   s   |  d d S )Nio)r=   )r   r   r   r   test_io_encoding   s    zUTF8ModeTests.test_io_encodingc             C   s   |  d d S )NZ_pyio)r=   )r   r   r   r   r?      s    c          
   C   sj   d}|  ddd|}| |d xDtD ]<}| j|d& | j ddd||d}| |d W d Q R X q&W d S )Nz[import locale; print(locale.getpreferredencoding(False), locale.getpreferredencoding(True))z-Xr&   z-czUTF-8 UTF-8)r    )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 x4tD ],}j|d	 |d|g|d	 W d Q R X qFW tjd
kstjr|}n|}x4tD ],}j|d	 |d|g|d	 W d Q R X qW d S )Nu   hé€zutf-8asciisurrogateescapezYimport locale, sys; print("%s:%s" % (locale.getpreferredencoding(), ascii(sys.argv[1:])))c                s>   j d| d f|}|dd  }|t|| d S )Nz-Xz-c:r   )r   	partitionr   r#   rA   )Zutf8_optr-   r   r   r   )argr$   r   r   r   check   s    z*UTF8ModeTests.test_cmd_line.<locals>.checkr&   )r    darwinzutf8=0)encoder   r   r"   sysplatformr   Z
is_android)r   Zarg_utf8Z	arg_asciirF   r   Zc_argr   )rE   r$   r   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)z-Xr&   z-Oz-cr!   z-OO2z/import sys; print(sys.flags.ignore_environment)z-E)r   r#   )r   r$   r   r   r   r   test_optim_level   s    zUTF8ModeTests.test_optim_level)NN)__name__
__module____qualname__r   r   r   unittestZskipIfr'   r%   r(   r)   r.   r1   r4   r;   r=   r?   r@   rK   rM   r   r   r   r   r      s$   
	 

r   __main__)__doc__r   osrI   r+   rQ   Ztestr   Ztest.support.script_helperr   r   rJ   r'   r   ZTestCaser   rN   mainr   r   r   r   <module>   s   
 l