Spaces:
Paused
Paused
| """ | |
| Pytest configuration and fixtures for the Numpy test suite. | |
| """ | |
| import os | |
| import tempfile | |
| import hypothesis | |
| import pytest | |
| import numpy | |
| from numpy.core._multiarray_tests import get_fpu_mode | |
| _old_fpu_mode = None | |
| _collect_results = {} | |
| # Use a known and persistent tmpdir for hypothesis' caches, which | |
| # can be automatically cleared by the OS or user. | |
| hypothesis.configuration.set_hypothesis_home_dir( | |
| os.path.join(tempfile.gettempdir(), ".hypothesis") | |
| ) | |
| # We register two custom profiles for Numpy - for details see | |
| # https://hypothesis.readthedocs.io/en/latest/settings.html | |
| # The first is designed for our own CI runs; the latter also | |
| # forces determinism and is designed for use via np.test() | |
| hypothesis.settings.register_profile( | |
| name="numpy-profile", deadline=None, print_blob=True, | |
| ) | |
| hypothesis.settings.register_profile( | |
| name="np.test() profile", | |
| deadline=None, print_blob=True, database=None, derandomize=True, | |
| suppress_health_check=hypothesis.HealthCheck.all(), | |
| ) | |
| # Note that the default profile is chosen based on the presence | |
| # of pytest.ini, but can be overriden by passing the | |
| # --hypothesis-profile=NAME argument to pytest. | |
| _pytest_ini = os.path.join(os.path.dirname(__file__), "..", "pytest.ini") | |
| hypothesis.settings.load_profile( | |
| "numpy-profile" if os.path.isfile(_pytest_ini) else "np.test() profile" | |
| ) | |
| def pytest_configure(config): | |
| config.addinivalue_line("markers", | |
| "valgrind_error: Tests that are known to error under valgrind.") | |
| config.addinivalue_line("markers", | |
| "leaks_references: Tests that are known to leak references.") | |
| config.addinivalue_line("markers", | |
| "slow: Tests that are very slow.") | |
| config.addinivalue_line("markers", | |
| "slow_pypy: Tests that are very slow on pypy.") | |
| def pytest_addoption(parser): | |
| parser.addoption("--available-memory", action="store", default=None, | |
| help=("Set amount of memory available for running the " | |
| "test suite. This can result to tests requiring " | |
| "especially large amounts of memory to be skipped. " | |
| "Equivalent to setting environment variable " | |
| "NPY_AVAILABLE_MEM. Default: determined" | |
| "automatically.")) | |
| def pytest_sessionstart(session): | |
| available_mem = session.config.getoption('available_memory') | |
| if available_mem is not None: | |
| os.environ['NPY_AVAILABLE_MEM'] = available_mem | |
| #FIXME when yield tests are gone. | |
| def pytest_itemcollected(item): | |
| """ | |
| Check FPU precision mode was not changed during test collection. | |
| The clumsy way we do it here is mainly necessary because numpy | |
| still uses yield tests, which can execute code at test collection | |
| time. | |
| """ | |
| global _old_fpu_mode | |
| mode = get_fpu_mode() | |
| if _old_fpu_mode is None: | |
| _old_fpu_mode = mode | |
| elif mode != _old_fpu_mode: | |
| _collect_results[item] = (_old_fpu_mode, mode) | |
| _old_fpu_mode = mode | |
| def check_fpu_mode(request): | |
| """ | |
| Check FPU precision mode was not changed during the test. | |
| """ | |
| old_mode = get_fpu_mode() | |
| yield | |
| new_mode = get_fpu_mode() | |
| if old_mode != new_mode: | |
| raise AssertionError("FPU precision mode changed from {0:#x} to {1:#x}" | |
| " during the test".format(old_mode, new_mode)) | |
| collect_result = _collect_results.get(request.node) | |
| if collect_result is not None: | |
| old_mode, new_mode = collect_result | |
| raise AssertionError("FPU precision mode changed from {0:#x} to {1:#x}" | |
| " when collecting the test".format(old_mode, | |
| new_mode)) | |
| def add_np(doctest_namespace): | |
| doctest_namespace['np'] = numpy | |
| def env_setup(monkeypatch): | |
| monkeypatch.setenv('PYTHONHASHSEED', '0') | |