|
| 1 | +from typing import Optional, Tuple, Union |
| 2 | + |
| 3 | +import numpy as np |
| 4 | +import pytest |
| 5 | + |
| 6 | +from robustbase.utils.median import median |
| 7 | + |
| 8 | +X_EMPTY = [] |
| 9 | +X_ODD_N = [5.5, 3.2, -10.0, -2.1, 8.4] |
| 10 | +X_EVEN_N = [5.5, 3.2, -10.0, -2.1, 8.4, 0.0] |
| 11 | + |
| 12 | + |
| 13 | +@pytest.mark.parametrize("as_array", [False, True]) |
| 14 | +@pytest.mark.parametrize( |
| 15 | + "comb", |
| 16 | + [ |
| 17 | + (X_EMPTY, False, False, None), |
| 18 | + (X_EMPTY, True, False, None), |
| 19 | + (X_EMPTY, False, True, None), |
| 20 | + (X_EMPTY, True, True, None), |
| 21 | + (X_ODD_N, False, False, 3.2), |
| 22 | + (X_ODD_N, True, False, 3.2), |
| 23 | + (X_ODD_N, False, True, 3.2), |
| 24 | + (X_ODD_N, True, True, 3.2), |
| 25 | + (X_EVEN_N, False, False, 1.6), |
| 26 | + (X_EVEN_N, True, False, 0.0), |
| 27 | + (X_EVEN_N, False, True, 3.2), |
| 28 | + (X_EVEN_N, True, True, 0.0), |
| 29 | + ], |
| 30 | +) |
| 31 | +def test_median( |
| 32 | + comb: Tuple[Union[list, np.ndarray], bool, bool, Optional[float]], |
| 33 | + as_array: bool, |
| 34 | +): |
| 35 | + x, low, high, expected = comb |
| 36 | + if as_array: |
| 37 | + x = np.array(x) |
| 38 | + |
| 39 | + # for empty samples, an error should be raised |
| 40 | + if expected is None: |
| 41 | + with pytest.raises(ValueError): |
| 42 | + median(x, low=low, high=high) |
| 43 | + |
| 44 | + return |
| 45 | + |
| 46 | + # otherwise, the expected median should be returned |
| 47 | + assert median(x, low=low, high=high) == expected |
0 commit comments