o
    1&i                      @   s   d dl Z d dlmZ d dl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 d dlmZ d dlmZ ed ZG dd	 d	eZG d
d deZdS )    N)mock)njit)TestCase)_TIMEOUT)metadatag      N@c                   @   s   e Zd Zdd Zdd ZdS )_DummyClassc                 C   s
   || _ d S Nvalue)selfr
    r   GC:\wamp64\www\opt\env\Lib\site-packages\numba/tests/test_entrypoints.py__init__      
z_DummyClass.__init__c                 C   s
   d| j  S )Nz_DummyClass(%f, %f)r	   r   r   r   r   __repr__   r   z_DummyClass.__repr__N)__name__
__module____qualname__r   r   r   r   r   r   r      s    r   c                   @   sV   e Zd ZdZdd Zdd ZdZee	j
ddekd	d
d Zdd Zdd ZdS )TestEntrypointszE
    Test registration of init() functions from Numba extensions
    c                 C   s   t jdd}zT|tj|j< tddd}t jjtdd|fid# dd	l	m
} d
|_|  |j  |  |j  W d    n1 sFw   Y  W |jtjv rYtj|j= d S d S |jtjv rftj|j= w )NZ_test_numba_extensionr   initz_test_numba_extension:init_funcnumba_extensionsentry_pointsreturn_valuer   entrypointsF)r   Mocksysmodulesr   importlib_metadata
EntryPointpatchobject
numba.corer   _already_initializedinit_all	init_funcassert_called_once)r   modmy_entrypointr   r   r   r   test_init_entrypoint!   s.   
z$TestEntrypoints.test_init_entrypointc              	   C   s&  t jdd}|jdi dtdi zt|tj|j< tddd}t j	j
tdd|fid	C d
dlm} d|_tjdd}|  W d    n1 sKw   Y  d}|D ]
}|t|v r^ nqTtd|j  W d    n1 srw   Y  W |jtjv rtj|j= d S d S |jtjv rtj|j= w )NZ_test_numba_bad_extensionr   zinit_func.side_effectbrokenr   z#_test_numba_bad_extension:init_funcr   r   r   r   r   FT)recordz2Numba extension module '_test_numba_bad_extension'z"Expected warning message not foundr   )r   r   Zconfigure_mock
ValueErrorr   r    r   r!   r"   r#   r$   r%   r   r&   warningscatch_warningsr'   strr(   r)   )r   r*   r+   r   wZbad_strxr   r   r   test_entrypoint_toleranceG   s@   
z)TestEntrypoints.test_entrypoint_toleranceZ	RUN_ENTRY_EP_MAGIC_TOKENNzneeds tokenc                    s   dd l   fdd}td}||_zG|tj|j< tddd}t	j
jtdd|fid	 td
d }td}|| W d    n1 sEw   Y  W |jtjv rXtj|j= d S d S |jtjv retj|j= w )Nr   c                     s   G fdddj jjjtfdd} jG  fdddjjj j	fdd}j
fd	d
}d S )Nc                       s   e Zd Z fddZ  ZS )zaTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyTypec                    s   t  | jdd d S )N	DummyType)name)superr   r   )r7   	__class__r   r   r      s   zjTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyType.__init__r   r   r   r   __classcell__r   r7   r:   r   r7      s    r7   c                    s     S r   r   )valcr=   r   r   typer_DummyClass   s   zhTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.typer_DummyClassc                       s    e Zd Z fddZ  ZS )zbTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyModelc                    s&   dj jfg}t | ||| d S )Nr
   )typesZfloat64r9   r   )r   ZdmmZfe_typemembers)
DummyModelr:   numbar   r   r      s   
zkTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.DummyModel.__init__r;   r   )rD   rE   r>   r   rD      s    rD   c                    st   |j |d} jj| }||j|j}|j ||_|j 	| |j 
 } jj|j|} jj| |dS )Nr
   )is_error)pyapiZobject_getattr_stringcorecgutilscreate_struct_proxycontextbuilderZfloat_as_doubler
   decrefZerr_occurredZis_not_null	extendingZNativeValueZ	_getvalue)typobjr@   	value_objdummy_struct_proxydummy_structZerr_flagrF   rE   r   r   unbox_dummy   s   
zcTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.unbox_dummyc           	         sn    j j| }||j|j}|j|j}|jt	}|j
|}|j||f}|j| |j| |S r   )rH   rI   rJ   rK   rL   rG   Zfloat_from_doubler
   Zserialize_objectr   ZunserializeZcall_function_objargsrM   )	rO   r?   r@   rR   rS   rQ   Zserialized_clazzZ	class_objresrT   r   r   	box_dummy   s   zaTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_function.<locals>.box_dummy)rB   TyperN   Ztypeof_implregisterr   Zregister_modelmodelsZStructModelZunboxbox)rA   rU   rW   rT   )rD   r7   r   init_function}   s   


zNTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.init_functionZ_test_numba_init_sequencer   z#_test_numba_init_sequence:init_funcr   r   r   c                 S   s   | S r   r   )r4   r   r   r   foo   s   zDTestEntrypoints.test_entrypoint_handles_type_extensions.<locals>.foo
   )rE   rB   
ModuleTyper(   r   r    r   r!   r"   r   r#   r$   r   r   )r   r\   r*   r+   r]   Zivalr   rT   r   'test_entrypoint_handles_type_extensionsv   s4   
+

z7TestEntrypoints.test_entrypoint_handles_type_extensionsc                 C   s~   t j|t jt j|d}tt|j}z'|  | \}}|j	dkr-t
d|j	| f | | fW |  S |  w )N)stdoutstderrenvr   z/process failed with code %s: stderr follows
%s
)
subprocessPopenPIPE	threadingTimer_TEST_TIMEOUTkillstartcommunicate
returncodeAssertionErrordecodecancel)r   cmdlinerc   popentimeoutouterrr   r   r   run_cmd   s"   
zTestEntrypoints.run_cmdc           
      C   sr   t j }t| j|d< | j}t| j}d}d|||f }tj	dd|g}| 
||\}}d}	|	r7t|| d S d S )Nr6   r`   z%s.%s.%sz-mznumba.runtestsF)osenvironcopyr2   r6   r   typer   r   
executablerv   print)
r   Zenv_copyZthemodZtheclsZmethnameZinjected_methodrq   rt   ru   _DEBUGr   r   r   "test_entrypoint_extension_sequence   s   

z2TestEntrypoints.test_entrypoint_extension_sequence)r   r   r   __doc__r,   r5   r6   unittestZskipIfrw   rx   getr`   rv   r~   r   r   r   r   r      s    &-
Mr   )r   r   r   rB   r0   rw   rd   rg   rE   r   Znumba.tests.supportr   Znumba.testing.mainr   Z_RUNNER_TIMEOUT	importlibr   r!   ri   r$   r   r   r   r   r   r   <module>   s    