o
    װi                     @   st   d dl Z d dlZd dlZd dlmZ d dlmZ dd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zdd ZdS )    N)_bundle)_pytest_implc                 C   s4   t | tr| jS t| drt | jtr| jS t| S )N__name__)
isinstancetyper   hasattrstrrepr)obj r   O/home/ubuntu/.local/lib/python3.10/site-packages/cupy/testing/_parameterized.py_param_to_str	   s
   
r   c                 C   sf   d}t | |kr
| S |t | d }|t | | }| d | | | | d   } t | |ks1J | S )Nz...   )len)smaxlenellipsisn1n2r   r   r   _shorten   s   r   c                    sD   d d} fddt | D }td||}d| ||}|S )Nd   i  c                    s&   g | ]\}}d  |tt| qS )z{}={})formatr   r   ).0kvSINGLE_PARAM_MAXLENr   r   
<listcomp>#   s    z$_make_class_name.<locals>.<listcomp>z, z{}_param_{}_{{{}}})sorteditemsr   joinr   )base_class_namei_paramparamPARAMS_MAXLEN
param_strscls_namer   r   r   _make_class_name   s   

r'   c                 c   s&    t |D ]\}}t| ||V  qd S N)	enumerate_parameterize_test_case)baseparamsir#   r   r   r   !_parameterize_test_case_generator,   s   r.   c                    st   t  j|} fdd}d|i}t D ]\}ttjr.fdd}| ||< q||< q||dd fS )Nc                    s     | }d|f S )Nz<%s  parameter: %s>)__repr__)selfname)r+   r#   r   r   r/   6   s   
z)_parameterize_test_case.<locals>.__repr__r/   c                     s     fdd} | S )Nc                    s    |i |S r(   r   )r0   argskwargsfr   r   new_vA   s   z<_parameterize_test_case.<locals>.create_new_v.<locals>.new_vr   )r6   )r   r4   r   create_new_v>   s   z-_parameterize_test_case.<locals>.create_new_vc                 S   s   | S r(   r   )methodr   r   r   <lambda>I   s    z)_parameterize_test_case.<locals>.<lambda>)r'   r   r   r   r   typesFunctionType)r+   r-   r#   r&   r/   mbr   r7   r   )r+   r#   r   r   r*   3   s   
r*   c                     s    fdd}|S )a  Generates test classes with given sets of additional attributes

    >>> @parameterize({"a": 1}, {"b": 2, "c": 3})
    ... class TestX(unittest.TestCase):
    ...     def test_y(self):
    ...         pass

    generates two classes `TestX_param_0_...`, `TestX_param_1_...` and
    removes the original class `TestX`.

    The specification is subject to change, which applies to all the non-NumPy
    `testing` features.

    c                    sF   t | tjr r
J tfdd}|| S tji  }|| S )Nc                    s
   t |  S r(   )r.   )r+   )r,   r   r   r9   _   s   
 z)parameterize.<locals>.f.<locals>.<lambda>)
issubclassunittestTestCaser   make_decoratorr   parameterize)clsdecor3   r,   r   r   r5   [   s   
zparameterize.<locals>.fr   )r,   r3   r5   r   rD   r   rA   L   s   rA   c                    sD   t tsJ t fdd D }tj| } fdd|D S )Nc                    s   g | ]} | qS r   r   )r   key)	parameterr   r   r   j   s    zproduct.<locals>.<listcomp>c                    s   g | ]	}t t |qS r   )dictzip)r   vals)keysr   r   r   l   s    )r   rG   r   	itertoolsproduct)rF   valuesvalues_productr   )rJ   rF   r   rL   f   s
   
rL   c                  G   s   dd t j|  D S )Nc                 S   s   g | ]	}d d |D qS )c                 S   s$   i | ]}|  D ]\}}||qqS r   )r   )r   dicr   r   r   r   r   
<dictcomp>r   s   $ z+product_dict.<locals>.<listcomp>.<dictcomp>r   )r   dictsr   r   r   r   q   s    z product_dict.<locals>.<listcomp>)rK   rL   )
parametersr   r   r   product_dicto   s   rS   )rK   r:   r>   cupy.testingr   r   r   r   r'   r.   r*   rA   rL   rS   r   r   r   r   <module>   s    		