U
    ¸mœdôO  ã                   @   s„   d dl Z d dlZd dlmZmZmZ d dlZd dlm	Z	 G dd„ de	j
ƒZG dd„ de	j
ƒZG dd	„ d	e	j
ƒZG d
d„ de	j
ƒZdS )é    N)Úassert_array_equalÚassert_equalÚassert_raises)Úutilc                7   @   s^  e Zd ZdZdZdddgZdZeD ]ÀZeZe	dd� 
ee¡Zee d	e› d
e› de› de› d
e› d	e› de› de› de› de› d	e› de› de› de› de› d	e› de› de› de› de› d	e› de› de› de› de› d�3¡7 Zq"ej de¡dd„ ƒZej dedd… ¡dd„ ƒZej de¡d d!„ ƒZej de¡d"d#„ ƒZej de¡d$d%„ ƒZdS )&ÚTestCharacterStringú.f90Ztest_character_stringÚ1Ú3ÚstarÚ ú(*))r
   z

        subroutine Ú_input_z(c, o, n)
          character*zß, intent(in) :: c
          integer n
          !f2py integer, depend(c), intent(hide) :: n = slen(c)
          integer*1, dimension(n) :: o
          !f2py intent(out) o
          o = transfer(c, o)
        end subroutine Ú_output_zÍ, intent(out) :: c
          integer n
          integer*1, dimension(n), intent(in) :: o
          !f2py integer, depend(o), intent(hide) :: n = len(o)
          c = transfer(o, c)
        end subroutine Ú_array_input_z;(c, o, m, n)
          integer m, i, n
          character*aH  , intent(in), dimension(m) :: c
          !f2py integer, depend(c), intent(hide) :: m = len(c)
          !f2py integer, depend(c), intent(hide) :: n = f2py_itemsize(c)
          integer*1, dimension(m, n), intent(out) :: o
          do i=1,m
            o(i, :) = transfer(c(i), o(i, :))
          end do
        end subroutine Ú_array_output_z!(c, o, m, n)
          character*a  , intent(out), dimension(m) :: c
          integer n
          integer*1, dimension(m, n), intent(in) :: o
          !f2py character(f2py_len=n) :: c
          !f2py integer, depend(o), intent(hide) :: m = len(o)
          !f2py integer, depend(o), intent(hide) :: n = shape(o, 1)
          do i=1,m
            c(i) = transfer(o(i, :), c(i))
          end do
        end subroutine Ú_2d_array_input_zH(c, o, m1, m2, n)
          integer m1, m2, i, j, n
          character*aÍ  , intent(in), dimension(m1, m2) :: c
          !f2py integer, depend(c), intent(hide) :: m1 = len(c)
          !f2py integer, depend(c), intent(hide) :: m2 = shape(c, 1)
          !f2py integer, depend(c), intent(hide) :: n = f2py_itemsize(c)
          integer*1, dimension(m1, m2, n), intent(out) :: o
          do i=1,m1
            do j=1,m2
              o(i, j, :) = transfer(c(i, j), o(i, j, :))
            end do
          end do
        end subroutine z	
        Úlengthc                 C   s\   ddi  ||¡}t| j| jd | ƒ}ddddœ| }t||ƒtjttt	|ƒƒdd	�ƒ d S )
Nr   r
   r   ÚaÚabcÚabcdeabcdeabcde©r   r	   r
   Úu1©Údtype)
ÚgetÚgetattrÚmoduleÚfprefixr   ÚnpÚarrayÚlistÚmapÚord©Úselfr   ÚfsuffixÚfr   © r'   úX/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numpy/f2py/tests/test_character.pyÚ
test_inputL   s    zTestCharacterString.test_inputNéÿÿÿÿc                 C   sR   |}t | j| jd | ƒ}dddœ| }t|tjttt|ƒƒdd�ƒ| 	¡ ƒ d S )Nr   r   r   )r   r	   r   r   )
r   r   r   r   r   r   r    r!   r"   Úencoder#   r'   r'   r(   Útest_outputU   s    ÿzTestCharacterString.test_outputc                 C   sn   |}t | j| jd | ƒ}tjddddœ| ddddœ| gd	d
�}tjdd„ |D ƒdd
�}t||ƒ|ƒ d S )Nr   r   r   r   r   ÚAÚABCÚABCDEABCDEABCDEÚSr   c                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}|‘qS r'   r'   ©Ú.0Úcr'   r'   r(   Ú
<listcomp>h   s     zCTestCharacterString.test_array_input.<locals>.<listcomp>.<listcomp>r'   ©r2   Úsr'   r'   r(   r4   h   s     z8TestCharacterString.test_array_input.<locals>.<listcomp>r   ©r   r   r   r   r   r   ©r$   r   r%   r&   r   Úexpectedr'   r'   r(   Útest_array_input_   s    ÿþz$TestCharacterString.test_array_inputc                 C   sn   |}t | j| jd | ƒ}tjddddœ| ddddœ| gd	d
�}tjdd„ |D ƒdd
�}t||ƒ|ƒ d S )Nr   r   r   r   r   r-   r.   r/   r0   r   c                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}|‘qS r'   r'   r1   r'   r'   r(   r4   t   s     zDTestCharacterString.test_array_output.<locals>.<listcomp>.<listcomp>r'   r5   r'   r'   r(   r4   t   s     z9TestCharacterString.test_array_output.<locals>.<listcomp>r   r7   )r$   r   r%   r&   r9   r   r'   r'   r(   Útest_array_outputk   s    ÿþz%TestCharacterString.test_array_outputc                 C   s�   |}t | j| jd | ƒ}tjddddœ| ddddœ| gd	d
ddœ| ddddœ| ggdd�}tjdd„ |D ƒddd�}t||ƒ|ƒ d S )Nr   r   r   r   r   r-   r.   r/   r&   ZfghZfghijfghijfghijÚFZFGHZFGHIJFGHIJFGHIJr0   r   c                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}d d„ |D ƒ‘qS )c                 S   s   g | ]}|‘qS r'   r'   r1   r'   r'   r(   r4   �   s     zQTestCharacterString.test_2d_array_input.<locals>.<listcomp>.<listcomp>.<listcomp>r'   )r2   Úitemr'   r'   r(   r4   �   s     zFTestCharacterString.test_2d_array_input.<locals>.<listcomp>.<listcomp>r'   )r2   Úrowr'   r'   r(   r4   �   s     z;TestCharacterString.test_2d_array_input.<locals>.<listcomp>r   ©r   Úorderr7   r8   r'   r'   r(   Útest_2d_array_inputw   s     ÿÿþü ÿz'TestCharacterString.test_2d_array_input)Ú__name__Ú
__module__Ú__qualname__Úsuffixr   Zlength_listÚcoder   r%   Údictr   ZclengthÚtextwrapÚdedentÚpytestÚmarkÚparametrizer)   r,   r:   r;   rA   r'   r'   r'   r(   r      sˆ   
þþýþþþþýþþþþýþþþþýþþþþýþþ9

	

r   c                3   @   s¤  e Zd ZdZdZe de› de› de› de› de› de› d	e› d
e› de› de› de› de› de› de› de› de› de› de› de› de› de› de› de› de› d�1¡Zej	 
dddg¡dd „ ƒZd!d"„ Zej	 
dddd#g¡d$d%„ ƒZd&d'„ Zej	 
dddd#g¡d(d)„ ƒZd*d+„ Zd,d-„ Zd.d/„ Zej	 
dddg¡d0d1„ ƒZd2d3„ Zej	 
dddg¡d4d5„ ƒZej	 
dddg¡d6d7„ ƒZd8d9„ Zej	 d:¡d;d<„ ƒZd=d>„ Zd?S )@ÚTestCharacterr   Ztest_characterú
       subroutine z™_input(c, o)
          character, intent(in) :: c
          integer*1 o
          !f2py intent(out) o
          o = transfer(c, o)
       end subroutine z_input

       subroutine z�_output(c, o)
          character :: c
          integer*1, intent(in) :: o
          !f2py intent(out) c
          c = transfer(o, c)
       end subroutine z_output

       subroutine z“_input_output(c, o)
          character, intent(in) :: c
          character o
          !f2py intent(out) o
          o = c
       end subroutine z!_input_output

       subroutine zŒ_inout(c, n)
          character :: c, n
          !f2py intent(in) n
          !f2py intent(inout) c
          c = n
       end subroutine z_inout

       function z…_return(o) result (c)
          character :: c
          character, intent(in) :: o
          c = transfer(o, c)
       end function z_return

       subroutine zè_array_input(c, o)
          character, intent(in) :: c(3)
          integer*1 o(3)
          !f2py intent(out) o
          integer i
          do i=1,3
            o(i) = transfer(c(i), o(i))
          end do
       end subroutine z _array_input

       subroutine a'  _2d_array_input(c, o)
          character, intent(in) :: c(2, 3)
          integer*1 o(2, 3)
          !f2py intent(out) o
          integer i, j
          do i=1,2
            do j=1,3
              o(i, j) = transfer(c(i, j), o(i, j))
            end do
          end do
       end subroutine z#_2d_array_input

       subroutine zØ_array_output(c, o)
          character :: c(3)
          integer*1, intent(in) :: o(3)
          !f2py intent(out) c
          do i=1,3
            c(i) = transfer(o(i), c(i))
          end do
       end subroutine z!_array_output

       subroutine zÊ_array_inout(c, n)
          character :: c(3), n(3)
          !f2py intent(in) n(3)
          !f2py intent(inout) c(3)
          do i=1,3
            c(i) = n(i)
          end do
       end subroutine z _array_inout

       subroutine a   _2d_array_inout(c, n)
          character :: c(2, 3), n(2, 3)
          !f2py intent(in) n(2, 3)
          !f2py intent(inout) c(2. 3)
          integer i, j
          do i=1,2
            do j=1,3
              c(i, j) = n(i, j)
            end do
          end do
       end subroutine z!_2d_array_inout

       function z»_array_return(o) result (c)
          character, dimension(3) :: c
          character, intent(in) :: o(3)
          do i=1,3
            c(i) = o(i)
          end do
       end function z_array_return

       function zœ_optional(o) result (c)
          character, intent(in) :: o
          !f2py character o = "a"
          character :: c
          c = o
       end function z_optional
    r   r3   ÚS1c                 C   s¨   t | j| jd ƒ}t|tjd|d�ƒtdƒƒ t|tjd|d�ƒtdƒƒ t|tjdg|d�ƒtdƒƒ t|tjd|d�ƒtdƒƒ t|tjdgg|d�ƒtdƒƒ d S )NÚ_inputr   r   ó   ar   )r   r   r   r   r   r   r"   ©r$   r   r&   r'   r'   r(   r)   ò   s    zTestCharacter.test_inputc              
   C   s°  t | j| jd ƒ}t|dƒtdƒƒ t|dƒtdƒƒ t|dƒdƒ t|dƒdƒ t|dƒdƒ t|dƒtdƒƒ t|d	ƒtdƒƒ t|dgƒtdƒƒ t|t d¡ƒtdƒƒ t|t dg¡ƒtdƒƒ t d¡}t||ƒtdƒƒ t dg¡}t||ƒtdƒƒ z|g ƒ W n6 tk
�rF } zt|ƒ 	d
¡�s6‚ W 5 d }~X Y nX t
|j› d�ƒ‚z|dƒ W n6 tk
�rš } zt|ƒ 	d¡�sŠ‚ W 5 d }~X Y nX t
|j› d�ƒ‚d S )NrP   r   rQ   r   r   ó    ó    Úabs   abz got 0-listz! should have failed on empty listéa   z got int instancez  should have failed on int value)r   r   r   r   r"   r   r   Ú
IndexErrorÚstrÚendswithÚSystemErrorrB   Ú	TypeError©r$   r&   r   Úmsgr'   r'   r(   Útest_input_variaü   s6    
zTestCharacter.test_input_variaÚU1c                 C   sz   t | j| jd ƒ}t|tjdddg|d�ƒtjtttdƒƒdd�ƒ t|tjdd	d
g|d�ƒtjtttdƒƒdd�ƒ d S )NÚ_array_inputr   Úbr3   r   r   Úi1rQ   ó   bó   c)	r   r   r   r   r   r   r    r!   r"   rR   r'   r'   r(   r:     s    ÿÿzTestCharacter.test_array_inputc              
   C   s¾   t | j| jd ƒ}t|dddgƒtjtttdƒƒdd�ƒ t|dd	d
gƒtjtttdƒƒdd�ƒ z|ddddgƒ W n2 t	k
r¨ } zt
|ƒ d¡s˜‚ W 5 d }~X Y nX t|j› d�ƒ‚d S )Nr`   r   ra   r3   r   rb   r   rQ   rc   rd   Údú)th dimension must be fixed to 3 but got 4ú" should have failed on wrong input)r   r   r   r   r   r   r    r!   r"   Ú
ValueErrorrX   rY   rZ   rB   )r$   r&   r]   r'   r'   r(   Útest_array_input_varia(  s"    ÿÿÿ
ÿz$TestCharacter.test_array_input_variac                 C   s^   t | j| jd ƒ}tjdddgdddgg|dd	�}| |d
krDtjntj¡}t||ƒ|ƒ d S )NZ_2d_array_inputr   ra   r3   re   Úer&   r<   r?   r_   )	r   r   r   r   r   ÚviewZuint32Zuint8r   )r$   r   r&   r   r9   r'   r'   r(   rA   9  s    ÿ ÿz!TestCharacter.test_2d_array_inputc                 C   s6   t | j| jd ƒ}t|tdƒƒdƒ t|dƒdƒ d S )NÚ_outputrQ   r   rT   )r   r   r   r   r"   ©r$   r&   r'   r'   r(   r,   B  s    zTestCharacter.test_outputc                 C   s<   t | j| jd ƒ}t|tttdƒƒƒtjtdƒdd�ƒ d S )NZ_array_outputr   rO   r   )	r   r   r   r   r    r!   r"   r   r   rm   r'   r'   r(   r;   H  s    ÿzTestCharacter.test_array_outputc                 C   s@   t | j| jd ƒ}t|dƒdƒ t|dƒdƒ t|dƒdƒ d S )NZ_input_outputrQ   r   r   rT   ©r   r   r   r   rm   r'   r'   r(   Útest_input_outputN  s    zTestCharacter.test_input_outputc                 C   sª   t | j| jd ƒ}tjtdƒ|d�}||dƒ t|tjtdƒ|jd�ƒ ||dd … dƒ t|tjtdƒ|jd�ƒ tjdg|d�}||dƒ t|tjdg|jd�ƒ d S )	NÚ_inoutr   r   r-   ÚAbcé   ÚBZABc)r   r   r   r   r   r    r   r   )r$   r   r&   r   r'   r'   r(   Ú
test_inoutU  s    

zTestCharacter.test_inoutc              
   C   sÈ   t | j| jd ƒ}tjddd�}||dƒ t|tjd|jd�ƒ tjdgdd�}||dƒ t|tjdg|jd�ƒ z|ddƒ W n2 tk
r² } zt|ƒ 	d¡s¢‚ W 5 d }~X Y nX t
|j› d�ƒ‚d S )	Nrp   r   ZS3r   r-   rq   z
 got 3-strz  should have failed on str value)r   r   r   r   r   r   r   rh   rX   rY   rZ   rB   r\   r'   r'   r(   Útest_inout_variac  s    

zTestCharacter.test_inout_variac              
   C   sF  t | j| jd ƒ}tjdddg|dd�}tjddd	g|dd�}|||ƒ t||ƒ tjddd	d
g|d�}||dd … |ƒ t|tjddddg|d�ƒ tjddd	gg|dd�}|||ƒ t|tjdddgg|d�ƒ tjddd	d
g|dd�}z|||ƒ W n6 tk
�r0 } zt|ƒ d¡�s ‚ W 5 d }~X Y nX t	|j
› d�ƒ‚d S )NZ_array_inoutr-   rs   ÚCr<   r?   r   ra   r3   re   r   rr   rf   rg   )r   r   r   r   r   r   rh   rX   rY   rZ   rB   )r$   r   r&   Únr   r]   r'   r'   r(   Útest_array_inoutu  s,    


ÿ
ÿzTestCharacter.test_array_inoutc                 C   sj   t | j| jd ƒ}tjdddgdddgg|dd�}tjd	d
dgdddgg|dd�}|||ƒ t||ƒ d S )NZ_2d_array_inoutr-   rs   rv   ÚDÚEr<   r?   r   ra   r3   re   rj   r&   r7   )r$   r   r&   rw   r   r'   r'   r(   Útest_2d_array_inout‘  s    ÿ þÿ þ
z!TestCharacter.test_2d_array_inoutc                 C   s$   t | j| jd ƒ}t|dƒdƒ d S )NZ_returnr   rQ   rn   rm   r'   r'   r(   Útest_return�  s    zTestCharacter.test_returnz*fortran function returning array segfaultsc                 C   s6   t | j| jd ƒ}tjtdƒdd�}t||ƒ|ƒ d S )NZ_array_returnr   rO   r   )r   r   r   r   r   r    r   )r$   r&   r   r'   r'   r(   Útest_array_return¢  s    zTestCharacter.test_array_returnc                 C   s0   t | j| jd ƒ}t|ƒ dƒ t|dƒdƒ d S )NZ	_optionalrQ   ó   Brn   rm   r'   r'   r(   Útest_optional©  s    zTestCharacter.test_optionalN)rB   rC   rD   rE   r   rH   rI   rF   rJ   rK   rL   r)   r^   r:   ri   rA   r,   r;   ro   rt   ru   rx   r{   r|   Úskipr}   r   r'   r'   r'   r(   rM   †   s’   ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
g
	#






rM   c                   @   s¢   e Zd ZdZdZe de› de› de› de› de› de› d	e› d
e› de› de› de› de› d�¡Zdd„ Zdd„ Z	dd„ Z
dd„ Zej dddg¡dd„ ƒZdS )ÚTestMiscCharacterr   Ztest_misc_characterrN   a(  _gh18684(x, y, m)
         character(len=5), dimension(m), intent(in) :: x
         character*5, dimension(m), intent(out) :: y
         integer i, m
         !f2py integer, intent(hide), depend(x) :: m = f2py_len(x)
         do i=1,m
           y(i) = x(i)
         end do
       end subroutine z_gh18684

       subroutine z«_gh6308(x, i)
         integer i
         !f2py check(i>=0 && i<12) i
         character*5 name, x
         common name(12)
         name(i + 1) = x
       end subroutine z_gh6308

       subroutine zÐ_gh4519(x)
         character(len=*), intent(in) :: x(:)
         !f2py intent(out) x
         integer :: i
         do i=1, size(x)
           print*, "x(",i,")=", x(i)
         end do
       end subroutine z_gh4519

       pure function aq  _gh3425(x) result (y)
         character(len=*), intent(in) :: x
         character(len=len(x)) :: y
         integer :: i
         do i = 1, len(x)
           j = iachar(x(i:i))
           if (j>=iachar("a") .and. j<=iachar("z") ) then
             y(i:i) = achar(j-32)
           else
             y(i:i) = x(i:i)
           endif
         end do
       end function z_gh3425

       subroutine aO  _character_bc_new(x, y, z)
         character, intent(in) :: x
         character, intent(out) :: y
         !f2py character, depend(x) :: y = x
         !f2py character, dimension((x=='a'?1:2)), depend(x), intent(out) :: z
         character, dimension(*) :: z
         !f2py character, optional, check(x == 'a' || x == 'b') :: x = 'a'
         !f2py callstatement (*f2py_func)(&x, &y, z)
         !f2py callprotoargument character*, character*, character*
         if (y.eq.x) then
           y = x
         else
           y = 'e'
         endif
         z(1) = 'c'
       end subroutine z%_character_bc_new

       subroutine aG  _character_bc_old(x, y, z)
         character, intent(in) :: x
         character, intent(out) :: y
         !f2py character, depend(x) :: y = x[0]
         !f2py character, dimension((*x=='a'?1:2)), depend(x), intent(out) :: z
         character, dimension(*) :: z
         !f2py character, optional, check(*x == 'a' || x[0] == 'b') :: x = 'a'
         !f2py callstatement (*f2py_func)(x, y, z)
         !f2py callprotoargument char*, char*, char*
          if (y.eq.x) then
           y = x
         else
           y = 'e'
         endif
         z(1) = 'c'
       end subroutine z_character_bc_old
    c                 C   s:   t | j| jd ƒ}tjddgdd�}||ƒ}t||ƒ d S )NZ_gh18684ÚabcdeZfghijÚS5r   r7   )r$   r&   ÚxÚyr'   r'   r(   Útest_gh18684  s    zTestMiscCharacter.test_gh18684c                 C   s~   t | j| jd ƒ}t| jjjjt d¡ƒ tt| jjjƒdƒ |ddƒ t| jjjd dƒ |ddƒ t| jjjd d	ƒ d S )
NZ_gh6308rƒ   é   r‚   r   s   abcdeZ12345é   s   12345)	r   r   r   r   Z_BLNK_Únamer   r   Úlenrm   r'   r'   r(   Útest_gh6308
  s    

zTestMiscCharacter.test_gh6308c              
   C   sÌ   t | j| jd ƒ}dtdt d¡d�fdtdt d¡d�ftjdd	d
gdd�tdt d¡d�fdd	dgtdt d¡d�fddgtdt d¡d�ffD ]2\}}||ƒ}| ¡ D ]\}}tt ||ƒ|ƒ q¬q”d S )NZ_gh4519r   r'   rO   )Úshaper   ÚtextZS4r   Ú2r	   r   )é   Z34ZS2r   )é   )	r   r   r   rG   r   r   r   Úitemsr   )r$   r&   r„   r9   ÚrÚkÚvr'   r'   r(   Útest_gh4519  s    ÿÿùzTestMiscCharacter.test_gh4519c                 C   s@   t | j| jd ƒ}t|dƒdƒ t|dƒdƒ t|dƒdƒ d S )NZ_gh3425ZabCs   ABCr   rS   ZabC12ds   ABC12Drn   rm   r'   r'   r(   Útest_gh3425%  s    zTestMiscCharacter.test_gh3425ÚstateÚnewÚoldc                    sr   t | j| jd | ƒ‰ ˆ ƒ \}}t|dƒ tt|ƒdƒ ˆ dƒ\}}t|dƒ tt|ƒdƒ tt‡ fdd„ƒ d S )NZ_character_bc_rQ   rr   rc   r�   c                      s   ˆ dƒS )Nrd   r'   r'   ©r&   r'   r(   Ú<lambda>:  rS   z5TestMiscCharacter.test_character_bc.<locals>.<lambda>)r   r   r   r   rŠ   r   Ú	Exception)r$   r—   r3   r   r'   rš   r(   Útest_character_bc.  s    


z#TestMiscCharacter.test_character_bcN)rB   rC   rD   rE   r   rH   rI   rF   r†   r‹   r•   r–   rJ   rK   rL   r�   r'   r'   r'   r(   r�   °  sB   ÿÿÿÿÿÿÿÿÿÿÿÿ
M	r�   c                   @   s>   e Zd Ze dddd¡gZejjdd„ ƒZ	ejjdd„ ƒZ
d	S )
ÚTestStringScalarArrÚtestsÚsrcÚstringzscalar_string.f90c                 C   sB   | j jj| j jjfD ](}d}|j|ks*t‚d}|j|kst‚qd S )Nr'   z|S8)r   Ústring_testr¡   Zstring77rŒ   ÚAssertionErrorr   ©r$   Úoutr9   r'   r'   r(   Ú	test_char@  s    ÿzTestStringScalarArr.test_charc                 C   sB   | j jj| j jjfD ](}d}|j|ks*t‚d}|j|kst‚qd S )N)rˆ   é   z|S12)r   r¢   ZstrarrZstrarr77rŒ   r£   r   r¤   r'   r'   r(   Útest_char_arrI  s    ÿz!TestStringScalarArr.test_char_arrN)rB   rC   rD   r   ZgetpathÚsourcesrJ   rK   Zslowr¦   r¨   r'   r'   r'   r(   rž   =  s
   
rž   )rJ   rH   Znumpy.testingr   r   r   Únumpyr   Znumpy.f2py.testsr   ZF2PyTestr   rM   r�   rž   r'   r'   r'   r(   Ú<module>   s   ~  , 