U
    ?hā  ć                   @   s   d dl mZ d dl mZ d dlmZ d dl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 )é    )Śir)Śbinding)Ś	datamodelNc                   @   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   ŚModuleŚmoduler   Zdefault_managerŚfe_type)Śself© r   śN/var/www/html/venv/lib/python3.8/site-packages/numba/core/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   sJ   | D ]@}t |ttfr*t ||dV  q|d kr:|V  q||V  q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 r   )Śtype)Śxr   r   r   Ś<lambda>,   ó    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_returnr   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/   r0   Śretr1   r2   r   r   r   r3   =   s    zDataModelTester.test_as_returnN)	Ś__name__Ś
__module__Ś__qualname__Ś__doc__r'   r	   r   r   r3   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_datar   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/   r0   Śdatar1   r2   r   r   r   r:   ]   s"    ’’zSupportAsDataMixin.test_as_dataN)r5   r6   r7   r8   r:   r   r   r   r   r9   X   s   r9   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 5 Q R X |  t” | j	 ||”}W 5 Q R X d S )Nr:   r   )r   r   r   r    r   r!   r"   r#   r$   r   r%   ZassertRaisesŚNotImplementedErrorr;   r<   )r
   r-   r.   r/   r0   r=   Zrev_datar   r   r   Śtest_as_data_not_supportedy   s    z0NotSupportAsDataMixin.test_as_data_not_supportedN)r5   r6   r7   r8   r@   r   r   r   r   r>   u   s   r>   c                   @   s   e Zd ZdS )Ś"DataModelTester_SupportAsDataMixinN©r5   r6   r7   r   r   r   r   rA      s   rA   c                   @   s   e Zd ZdS )Ś%DataModelTester_NotSupportAsDataMixinNrB   r   r   r   r   rC      s   rC   Tc                 C   s   | rt S tS dS )z;A helper for returning a unittest TestCase for testing
    N)rA   rC   )Zsupport_as_datar   r   r   Śtest_factory   s    rD   )T)Zllvmliter   r   r*   Z
numba.corer   ZunittestZTestCaser   Śobjectr9   r>   rA   rC   rD   r   r   r   r   Ś<module>   s   P’’