diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 00e4627690695cfef7d7d0937af0f84e5b63bd09..0000000000000000000000000000000000000000 --- a/tests/conftest.py +++ /dev/null @@ -1,51 +0,0 @@ -"""Common strategies""" -from typing import cast - -import numpy as np -from hypothesis import strategies as hst -from hypothesis.extra import numpy as hnp -from hypothesis.strategies import composite, DrawFn, SearchStrategy -from numpy._typing import NDArray - -from zema_emc_annotated.data_types import UncertainArray - - -@composite -def uncertain_arrays( - draw: DrawFn, - greater_than: float = -1e2, - less_than: float = 1e2, - samples: int | None = None, - scaler: int | None = None, -) -> SearchStrategy[UncertainArray]: - if samples is None: - samples = draw(hst.integers(min_value=1, max_value=10)) - if scaler is None: - scaler = draw(hst.integers(min_value=1, max_value=10)) - values: NDArray[np.float64] = cast( - NDArray[np.float64], - draw( - hnp.arrays( - dtype=np.float64, - shape=(samples, scaler * 11), - elements=hst.floats(min_value=greater_than, max_value=less_than), - ) - ), - ) - std_uncertainties = cast( - NDArray[np.float64], - draw( - hnp.arrays( - dtype=np.float64, - shape=values.shape, - elements=hst.floats( - min_value=np.abs(values).min() * 1e-3, - max_value=np.abs(values).min() * 1e2, - ), - ) - ), - ) - return cast( - SearchStrategy[UncertainArray], - UncertainArray(values, std_uncertainties), - ) diff --git a/tests/test_zema_dataset.py b/tests/test_zema_dataset.py index a8a603d306fc91aab49dafe989504e30b3966f9b..544c4144daa46edf0faa9c17cf2b0c9941845bcb 100644 --- a/tests/test_zema_dataset.py +++ b/tests/test_zema_dataset.py @@ -4,7 +4,7 @@ from pathlib import Path import numpy as np import pytest -from hypothesis import assume, given, settings, strategies as hst +from hypothesis import given, settings, strategies as hst from zema_emc_annotated import dataset from zema_emc_annotated.data_types import UncertainArray @@ -16,7 +16,6 @@ from zema_emc_annotated.dataset import ( ZEMA_QUANTITIES, ZeMASamples, ) -from .conftest import uncertain_arrays def test_dataset_has_docstring() -> None: @@ -163,28 +162,8 @@ def test_check_and_load_cache_has_docstring() -> None: assert ZeMASamples._check_and_load_cache.__doc__ is not None -def test_check_and_load_cache_expects_parameter_n_samples() -> None: - assert "n_samples" in signature(ZeMASamples._check_and_load_cache).parameters - - -def test_check_and_load_cache_expects_parameter_n_samples_as_int() -> None: - assert ( - signature(ZeMASamples._check_and_load_cache).parameters["n_samples"].annotation - is int - ) - - -def test_check_and_load_cache_expects_parameter_size_scaler() -> None: - assert "size_scaler" in signature(ZeMASamples._check_and_load_cache).parameters - - -def test_check_and_load_cache_expects_parameter_size_scaler_as_int() -> None: - assert ( - signature(ZeMASamples._check_and_load_cache) - .parameters["size_scaler"] - .annotation - is int - ) +def test_check_and_load_cache_expects_parameter_normalize() -> None: + assert "normalize" in signature(ZeMASamples._check_and_load_cache).parameters def test_zema_samples_has_attribute_cache_path() -> None: @@ -195,33 +174,30 @@ def test_dataset_cache_path_is_callable() -> None: assert callable(ZeMASamples._cache_path) -def test_cache_path_has_docstring() -> None: - assert ZeMASamples._cache_path.__doc__ is not None - +def test_cache_path_expects_parameter_normalize() -> None: + assert "normalize" in signature(ZeMASamples._cache_path).parameters -def test_cache_path_expects_parameter_n_samples() -> None: - assert "n_samples" in signature(ZeMASamples._cache_path).parameters - -def test_cache_path_expects_parameter_size_scaler() -> None: - assert "size_scaler" in signature(ZeMASamples._cache_path).parameters +def test_check_and_load_cache_expects_parameter_normalize_as_bool() -> None: + assert ( + signature(ZeMASamples._check_and_load_cache).parameters["normalize"].annotation + is bool + ) -def test_cache_path_expects_parameter_n_samples_as_int() -> None: - assert signature(ZeMASamples._cache_path).parameters["n_samples"].annotation is int +def test_cache_path_has_docstring() -> None: + assert ZeMASamples._cache_path.__doc__ is not None -def test_cache_path_expects_parameter_size_scaler_as_int() -> None: - assert ( - signature(ZeMASamples._cache_path).parameters["size_scaler"].annotation is int +def test_cache_path_actually_returns_path() -> None: + assert isinstance( + ZeMASamples()._cache_path( + signature(ZeMASamples).parameters["normalize"].default + ), + Path, ) -@given(hst.integers(), hst.integers()) -def test_cache_path_actually_returns_path(n_samples: int, size_scaler: int) -> None: - assert isinstance(ZeMASamples._cache_path(n_samples, size_scaler), Path) - - def test_zema_samples_has_attribute_store_cache() -> None: assert hasattr(ZeMASamples, "_store_cache") @@ -234,47 +210,57 @@ def test_store_cache_has_docstring() -> None: assert ZeMASamples._store_cache.__doc__ is not None -def test_store_cache_expects_parameter_uncertain_values() -> None: - assert "uncertain_values" in signature(ZeMASamples._store_cache).parameters +def test_store_cache_expects_parameter_normalize() -> None: + assert "normalize" in signature(ZeMASamples._store_cache).parameters -@given(uncertain_arrays(samples=11)) +@pytest.mark.webtest +@given(hst.integers(min_value=1, max_value=10)) @settings(deadline=None) -def test_store_cache_runs_for_random_uncertain_values( - uncertain_array: UncertainArray, -) -> None: - ZeMASamples._store_cache(uncertain_array) +def test_store_cache_stores_pickle_file_for_random_input(size_scaler: int) -> None: + zema_samples = ZeMASamples(11, size_scaler) assert os.path.exists( - ZeMASamples._cache_path(11, int(uncertain_array.values.shape[1] / 11)) + zema_samples._cache_path(signature(ZeMASamples).parameters["normalize"].default) ) -@given(hst.integers(), hst.integers()) +@pytest.mark.webtest +@given(hst.integers(min_value=1, max_value=10), hst.integers(min_value=1, max_value=10)) +@settings(deadline=None) def test_check_and_load_cache_runs_for_random_uncertain_values_and_returns( n_samples: int, size_scaler: int ) -> None: - result = ZeMASamples._check_and_load_cache(n_samples, size_scaler) + result = ZeMASamples(n_samples, size_scaler)._check_and_load_cache( + signature(ZeMASamples).parameters["normalize"].default + ) assert result is None or isinstance(result, UncertainArray) -@given(uncertain_arrays(samples=12)) +@pytest.mark.webtest +@given(hst.integers(min_value=1, max_value=10)) +@settings(deadline=None) def test_check_and_load_cache_returns_something_for_existing_file( - uncertain_array: UncertainArray, + size_scaler: int, ) -> None: - ZeMASamples._store_cache(uncertain_array) + zema_samples = ZeMASamples(12, size_scaler) assert ( - ZeMASamples._check_and_load_cache(12, int(uncertain_array.values.shape[1] / 11)) + zema_samples._check_and_load_cache( + signature(ZeMASamples).parameters["normalize"].default + ) is not None ) -def test_store_cache_expects_parameter_uncertain_values_as_uncertain_array() -> None: +def test_store_cache_expects_parameter_normalize_as_bool() -> None: assert ( - signature(ZeMASamples._store_cache).parameters["uncertain_values"].annotation - is UncertainArray + signature(ZeMASamples._store_cache).parameters["normalize"].annotation is bool ) +def test_cache_path_expects_parameter_normalize_as_bool() -> None: + assert signature(ZeMASamples._cache_path).parameters["normalize"].annotation is bool + + def test_cache_path_expects_stats_to_return_path() -> None: assert signature(ZeMASamples._cache_path).return_annotation is Path @@ -385,11 +371,39 @@ def test_extract_samples_returns_values_and_uncertainties_which_are_not_similar( @pytest.mark.webtest -# @given(hst.integers(min_value=2, max_value=10), hst.integers(min_value=2, max_value=10)) -# @settings(deadline=None) -def test_extract_samples_returns_normalized_values( - # n_samples: int, size_scaler: int +def test_zema_samples_fails_for_more_than_4766_samples() -> None: + with pytest.raises( + ValueError, + match=r"all the input array dimensions except for the concatenation axis must " + r"match exactly.*", + ): + ZeMASamples(4767) + + +@pytest.mark.webtest +def test_zema_samples_creates_pickle_files() -> None: + for size_scaler in (1, 10, 100, 1000, 2000): + for normalize in (True, False): + assert ZeMASamples(size_scaler=size_scaler, normalize=normalize) + + +@pytest.mark.webtest +@given(hst.integers(min_value=1, max_value=10), hst.integers(min_value=1, max_value=10)) +@settings(deadline=None) +def test_zema_samples_normalized_mean_is_smaller_or_equal( + n_samples: int, size_scaler: int +) -> None: + normalized_result = ZeMASamples(n_samples, size_scaler, True) + not_normalized_result = ZeMASamples(n_samples, size_scaler) + assert not_normalized_result.values.mean() >= normalized_result.values.mean() + + +@pytest.mark.webtest +@given(hst.integers(min_value=1, max_value=10), hst.integers(min_value=1, max_value=10)) +@settings(deadline=None) +def test_zema_samples_normalized_std_is_smaller_or_equal( + n_samples: int, size_scaler: int ) -> None: - # result = ZeMASamples(n_samples, size_scaler, True) - result = ZeMASamples(2, 5, True) - assert result.values.shape[1] == 11 * 5 + normalized_result = ZeMASamples(n_samples, size_scaler, True) + not_normalized_result = ZeMASamples(n_samples, size_scaler) + assert not_normalized_result.values.std() >= normalized_result.values.std()