| """Tests for shared analysis utilities (gini_coefficient, etc.).""" |
|
|
| from __future__ import annotations |
|
|
| import pytest |
|
|
| from obliteratus.analysis.utils import gini_coefficient |
|
|
|
|
| class TestGiniCoefficient: |
| """Tests for the Gini coefficient computation.""" |
|
|
| def test_empty_list(self): |
| assert gini_coefficient([]) == 0.0 |
|
|
| def test_single_value(self): |
| assert gini_coefficient([42.0]) == 0.0 |
|
|
| def test_uniform_distribution(self): |
| """All-equal values β Gini = 0.""" |
| assert gini_coefficient([1.0, 1.0, 1.0, 1.0]) == pytest.approx(0.0, abs=1e-10) |
|
|
| def test_maximally_concentrated(self): |
| """One value, rest zero β Gini β 1.""" |
| result = gini_coefficient([100.0, 0.0, 0.0, 0.0]) |
| assert result > 0.7 |
|
|
| def test_all_zeros(self): |
| assert gini_coefficient([0.0, 0.0, 0.0]) == 0.0 |
|
|
| def test_two_equal_values(self): |
| assert gini_coefficient([5.0, 5.0]) == pytest.approx(0.0, abs=1e-10) |
|
|
| def test_two_unequal_values(self): |
| """[0, 10] β Gini = 0.5 for n=2.""" |
| result = gini_coefficient([0.0, 10.0]) |
| assert result == pytest.approx(0.5, abs=0.01) |
|
|
| def test_moderate_inequality(self): |
| """Moderate spread β Gini between 0 and 1.""" |
| result = gini_coefficient([1.0, 2.0, 3.0, 4.0, 5.0]) |
| assert 0.1 < result < 0.5 |
|
|
| def test_result_in_valid_range(self): |
| """Gini is always in [0, 1].""" |
| for vals in [[1, 2, 3], [0, 0, 100], [5, 5, 5], [1], [0.1, 0.9]]: |
| result = gini_coefficient(vals) |
| assert 0.0 <= result <= 1.0, f"Gini({vals}) = {result} out of range" |
|
|
| def test_large_uniform(self): |
| """Large uniform distribution β Gini β 0.""" |
| vals = [1.0] * 1000 |
| assert gini_coefficient(vals) == pytest.approx(0.0, abs=1e-10) |
|
|
| def test_large_concentrated(self): |
| """Large distribution with one outlier β high Gini.""" |
| vals = [0.0] * 999 + [1000.0] |
| result = gini_coefficient(vals) |
| assert result > 0.99 |
|
|
| def test_order_invariant(self): |
| """Gini should not depend on input order.""" |
| a = gini_coefficient([1.0, 3.0, 5.0, 7.0]) |
| b = gini_coefficient([7.0, 1.0, 5.0, 3.0]) |
| assert a == pytest.approx(b) |
|
|