o
    ˷e                     @   sr  d 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mZ dd Zd)d	d
Zd)ddZdd Zdd ZeejdkdZeejddZeejdkdZeejdkdZeejd dZejdvo|ejdddkZdZeeeZdd ZedZed Z d!d Z!zej"d"d#Z#W n e$y   d$Z%Y nw d%Z%e#&  ee%d&Z'd'd( Z(dS )*a  Decorators for labeling test objects.

Decorators that merely return a modified version of the original function
object are straightforward.  Decorators that return a new function object need
to use nose.tools.make_decorator(original_function)(decorator) in returning the
decorator, in order to preserve metadata such as function name, setup and
teardown functions and so on - see nose.tools for more information.

This module provides a set of useful decorators meant to be ready to use in
your own tests.  See the bottom of the file for the ready-made ones, and if you
find yourself writing a new one that may be of generic use, add it here.

Included decorators:


Lightweight testing that remains unittest-compatible.

- An @as_unittest decorator can be used to tag any normal parameter-less
  function as a unittest TestCase.  Then, both nose and normal unittest will
  recognize it as such.  This will make it easier to migrate away from Nose if
  we ever need/want to while maintaining very lightweight tests.

NOTE: This file contains IPython-specific decorators. Using the machinery in
IPython.external.decorators, we import either numpy.testing.decorators if numpy is
available, OR use equivalent code in IPython.external._decorators, which
we've copied verbatim from numpy.

    N)import_module)	decorator   )	ipdoctestipdocstringc                    s"   G  fdddt j} j|_|S )zDDecorator to make a simple function into a normal test via unittest.c                       s   e Zd Z fddZdS )zas_unittest.<locals>.Testerc                    s
      d S N )selffuncr   Q/var/www/ideatree/venv/lib/python3.10/site-packages/IPython/testing/decorators.pytest7   s   
z as_unittest.<locals>.Tester.testN)__name__
__module____qualname__r   r   r
   r   r   Tester6   s    r   )unittestTestCaser   )r   r   r   r
   r   as_unittest4   s   r   c                 C   s2   |du rd}ddl }t| tsJ |jj| |dS )a  Make function raise SkipTest exception if skip_condition is true

    Parameters
    ----------

    skip_condition : bool or callable
      Flag to determine whether to skip test. If the condition is a
      callable, it is used at runtime to dynamically make the decision. This
      is useful for tests that may require costly imports, to delay the cost
      until the test suite is actually executed.
    msg : string
      Message to give on raising a SkipTest exception.

    Returns
    -------
    decorator : function
      Decorator, which, when applied to a function, causes SkipTest
      to be raised when the skip_condition was True, and the function
      to be called normally otherwise.
    Nz#Test skipped due to test condition.r   reason)pytest
isinstanceboolmarkskipif)skip_conditionmsgr   r   r   r   r   A   s
   r   c                 C   s    | rt | tstdtd| S )aY  Decorator factory - mark a test function for skipping from test suite.

    Parameters
    ----------
      msg : string
        Optional message to be added.

    Returns
    -------
       decorator : function
         Decorator, which, when applied to a function, causes SkipTest
         to be raised, with the optional message added.
      zSinvalid object passed to `@skip` decorator, did you meant `@skip()` with brackets ?T)r   str
ValueErrorr   )r   r   r   r   skipa   s   
r    c                 C   s   t |  |S )z0The reverse from skipif, see skipif for details.)r   )	conditionr   r   r   r   onlyifu   s   r"   c                 C   s,   z	t | }d}W |S  ty   d}Y |S w )zCan module be imported?  Returns true if module does NOT import.

    This is used to make a decorator to skip tests that require module to be
    available, but delay the 'import numpy' to test execution time.
    FT)r   ImportError)modulemodmod_not_availr   r   r   module_not_available|   s   r'   win32z$This test does not run under Windowslinuxz"This test does not run under Linuxdarwinz!This test does not run under OS Xz!This test only runs under WindowszThis test only runs under Linux)r*   r(   DISPLAY z.Skipped under *nix when X11/XOrg not availablec                 C   s   t t| d|  S )NzThis test requires %s)r   r'   )r%   r   r   r   <lambda>   s    r-   numpy
matplotlibc                 C   s   | S r   r   )fr   r   r   r-      s    u   tmp€)prefixFTzCThis test is only applicable where we can use unicode in filenames.c                  G   sX   t jdddu sJ d| D ]}d| d}t|s)ddl}|jj|d  S qtS )zN
    Decorator to skip test when at least one of `commands` is not found.
    IPTEST_WORKING_DIRNz#iptest deprecated since IPython 8.0z This test runs only if command 'z' is installedr   r   )	osenvirongetshutilwhichr   r   r    	null_deco)commandscmdr   r   r   r   r   onlyif_cmds_exist   s   
r;   r   ))__doc__r3   r6   systempfiler   warnings	importlibr   r   
ipunittestr   r   r   r   r    r"   r'   platform
skip_win32
startswith
skip_linuxskip_osxskip_if_not_win32skip_if_not_linuxr4   r5   _x11_skip_cond_x11_skip_msgskip_if_no_x11skip_withoutskipif_not_numpyskipif_not_matplotlibr8   NamedTemporaryFiler0   UnicodeEncodeErrorunicode_pathscloseonlyif_unicode_pathsr;   r   r   r   r   <module>   s\    

 




