| import os |
| import shutil |
| import sys |
| import tempfile |
| from importlib import import_module |
|
|
| import pytest |
|
|
| |
| from .ipunittest import ipdoctest, ipdocstring |
|
|
| def skipif(skip_condition, msg=None): |
| """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. |
| """ |
| if msg is None: |
| msg = "Test skipped due to test condition." |
|
|
| assert isinstance(skip_condition, bool) |
| return pytest.mark.skipif(skip_condition, reason=msg) |
|
|
|
|
| |
| |
| def skip(msg=None): |
| """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. |
| """ |
| if msg and not isinstance(msg, str): |
| raise ValueError( |
| "invalid object passed to `@skip` decorator, did you " |
| "meant `@skip()` with brackets ?" |
| ) |
| return skipif(True, msg) |
|
|
|
|
| def onlyif(condition, msg): |
| """The reverse from skipif, see skipif for details.""" |
|
|
| return skipif(not condition, msg) |
|
|
|
|
| |
| |
| def module_not_available(module): |
| """Can 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. |
| """ |
| try: |
| mod = import_module(module) |
| mod_not_avail = False |
| except ImportError: |
| mod_not_avail = True |
|
|
| return mod_not_avail |
|
|
|
|
| |
| |
|
|
| |
| skip_win32 = skipif(sys.platform == "win32", "This test does not run under Windows") |
|
|
|
|
| |
| skip_if_not_win32 = skipif(sys.platform != "win32", "This test only runs under Windows") |
| skip_if_not_osx = skipif( |
| not sys.platform.startswith("darwin"), "This test only runs under macOS" |
| ) |
|
|
| _x11_skip_cond = ( |
| sys.platform not in ("darwin", "win32") and os.environ.get("DISPLAY", "") == "" |
| ) |
| _x11_skip_msg = "Skipped under *nix when X11/XOrg not available" |
|
|
| skip_if_no_x11 = skipif(_x11_skip_cond, _x11_skip_msg) |
|
|
| |
|
|
| |
| skip_without = lambda mod: skipif( |
| module_not_available(mod), "This test requires %s" % mod |
| ) |
|
|
| skipif_not_numpy = skip_without("numpy") |
|
|
| skipif_not_matplotlib = skip_without("matplotlib") |
|
|
| |
| |
| null_deco = lambda f: f |
|
|
| |
| |
| try: |
| f = tempfile.NamedTemporaryFile(prefix="tmp€") |
| except UnicodeEncodeError: |
| unicode_paths = False |
| |
| else: |
| unicode_paths = True |
| f.close() |
|
|
| onlyif_unicode_paths = onlyif( |
| unicode_paths, |
| ("This test is only applicable where we can use unicode in filenames."), |
| ) |
|
|
|
|
| def onlyif_cmds_exist(*commands): |
| """ |
| Decorator to skip test when at least one of `commands` is not found. |
| """ |
| for cmd in commands: |
| reason = f"This test runs only if command '{cmd}' is installed" |
| if not shutil.which(cmd): |
| return pytest.mark.skip(reason=reason) |
| return null_deco |
|
|