B
      \4  ć               @   s¤   d dl mZmZ d dlmZ d dlmZ d dlmZ d dlm	Z
 G dd de
jZG dd	 d	eZG d
d deZG dd deeZG dd deeZdddZdS )é    )Śprint_functionŚabsolute_import)Śir)Śbinding)Ś	datamodel)Śunittest_supportc               @   s,   e Zd ZdZeZdd Zdd Zdd ZdS )	ŚDataModelTesterzE
    Test the implementation of a DataModel for a frontend type.
    c             C   s   t  ” | _tj| j | _d S )N)r   ZModuleŚmoduler   Zdefault_managerŚfe_type)Śself© r   ś6lib/python3.7/site-packages/numba/datamodel/testing.pyŚsetUp   s    
zDataModelTester.setUpc       
         s  t  t  ” g ”}t j| j|dd}t  ” }| | ” ” t  | j	 
” d”}| j	 ||”}|  |td” t|ttfr¶d
 fdd	 t |dd d	}t | j	 ” }|  ||” n|  |j| j	 ” ” | j	 ||”}|  |j| j	 
” ” | ”  t t| j”}	t|	 dS )zi
        - Is as_arg() and from_arg() implemented?
        - Are they the inverse of each other?
        Śtest_as_arg)ŚnameNz(as_argument returned NotImplementedErrorc             3   sN   xH| D ]@}t |ttfr,t ||dV  q|d kr<|V  q||V  qW d S )N)Śfunc)Ś
isinstanceŚtupleŚlist)Śargsr   Śarg)Śrecur_tuplizer   r   r   $   s    
z2DataModelTester.test_as_arg.<locals>.recur_tuplizec             S   s   | j S )N)Śtype)Śxr   r   r   Ś<lambda>.   s    z-DataModelTester.test_as_arg.<locals>.<lambda>)r   )N)r   ŚFunctionTypeŚVoidTypeŚFunctionr	   Ś	IRBuilderŚposition_at_endŚappend_basic_blockŚConstantr   Śget_value_typeZas_argumentŚassertIsNotŚNotImplementedr   r   r   Zget_argument_typeŚassertEqualr   Zfrom_argumentŚret_voidŚllŚparse_assemblyŚstr)
r   ŚfntyŚfunctionŚbuilderŚundef_valuer   ZargtypesZexptypesŚ	rev_valueŚmaterializedr   )r   r   r      s(    
zDataModelTester.test_as_argc             C   sĄ   t  t  ” g ”}t j| j|dd}t  ” }| | ” ” t  | j	 
” d”}| j	 ||”}|  |td” |  |j| j	 ” ” | j	 ||”}|  |j| j	 
” ” | ”  t t| j”}t| dS )zo
        - Is as_return() and from_return() implemented?
        - Are they the inverse of each other?
        Śtest_as_return)r   Nz&as_return returned NotImplementedError)r   r   r   r   r	   r   r   r    r!   r   r"   Z	as_returnr#   r$   r%   r   Zget_return_typeZfrom_returnr&   r'   r(   r)   )r   r*   r+   r,   r-   Zretr.   r/   r   r   r   r0   ?   s    zDataModelTester.test_as_returnN)	Ś__name__Ś
__module__Ś__qualname__Ś__doc__r$   r
   r   r   r0   r   r   r   r   r   
   s
   +r   c               @   s   e Zd ZdZdd ZdS )ŚSupportAsDataMixinz#Test as_data() and from_data()
    c             C   sĄ   t  t  ” g ”}t j| j|dd}t  ” }| | ” ” t  | j	 
” d ”}| j	 ||”}|  |td” |  |j| j	 ” ” | j	 ||”}|  |j| j	 
” ” | ”  t t| j”}t| d S )NŚtest_as_data)r   zas_data returned NotImplemented)r   r   r   r   r	   r   r   r    r!   r   r"   Śas_datar#   r$   r%   r   Zget_data_typeŚ	from_datar&   r'   r(   r)   )r   r*   r+   r,   r-   Śdatar.   r/   r   r   r   r6   _   s    zSupportAsDataMixin.test_as_dataN)r1   r2   r3   r4   r6   r   r   r   r   r5   Z   s   r5   c               @   s   e Zd ZdZdd ZdS )ŚNotSupportAsDataMixinz@Ensure as_data() and from_data() raise NotImplementedError.
    c          	   C   s   t  t  ” g ”}t j| j|dd}t  ” }| | ” ” t  | j	 
” d ”}|  t” | j	 ||”}W d Q R X |  t” | j	 ||”}W d Q R X d S )Nr6   )r   )r   r   r   r   r	   r   r   r    r!   r   r"   ZassertRaisesŚNotImplementedErrorr7   r8   )r   r*   r+   r,   r-   r9   Zrev_datar   r   r   Śtest_as_data_not_supported{   s    z0NotSupportAsDataMixin.test_as_data_not_supportedN)r1   r2   r3   r4   r<   r   r   r   r   r:   w   s   r:   c               @   s   e Zd ZdS )Ś"DataModelTester_SupportAsDataMixinN)r1   r2   r3   r   r   r   r   r=      s   r=   c               @   s   e Zd ZdS )Ś%DataModelTester_NotSupportAsDataMixinN)r1   r2   r3   r   r   r   r   r>      s   r>   Tc             C   s   | rt S tS dS )z;A helper for returning a unittest TestCase for testing
    N)r=   r>   )Zsupport_as_datar   r   r   Śtest_factory   s    r?   N)T)Z
__future__r   r   Zllvmliter   r   r'   Znumbar   r   ZunittestZTestCaser   Śobjectr5   r:   r=   r>   r?   r   r   r   r   Ś<module>   s   P