test_stats.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. """Tests for Wilson score confidence interval."""
  2. from __future__ import annotations
  3. from drill.stats import wilson_ci
  4. class TestWilsonCI:
  5. def test_all_pass(self) -> None:
  6. lo, hi = wilson_ci(10, 10)
  7. assert lo > 0.69
  8. assert hi == 1.0 or hi > 0.99
  9. def test_all_fail(self) -> None:
  10. lo, hi = wilson_ci(0, 10)
  11. assert lo < 0.01 or lo == 0.0
  12. assert hi < 0.31
  13. def test_half_pass(self) -> None:
  14. lo, hi = wilson_ci(5, 10)
  15. assert 0.18 < lo < 0.25
  16. assert 0.75 < hi < 0.82
  17. def test_zero_total(self) -> None:
  18. lo, hi = wilson_ci(0, 0)
  19. assert lo == 0.0
  20. assert hi == 0.0
  21. def test_single_pass(self) -> None:
  22. lo, hi = wilson_ci(1, 1)
  23. assert lo > 0.0
  24. assert hi <= 1.0
  25. def test_single_fail(self) -> None:
  26. lo, hi = wilson_ci(0, 1)
  27. assert lo == 0.0 or lo >= 0.0
  28. assert hi < 1.0
  29. def test_large_sample(self) -> None:
  30. lo, hi = wilson_ci(80, 100)
  31. assert 0.70 < lo < 0.75
  32. assert 0.85 < hi < 0.90
  33. def test_passed_greater_than_total_clamped(self) -> None:
  34. lo, hi = wilson_ci(12, 10)
  35. assert lo > 0.0
  36. assert hi <= 1.0
  37. def test_returns_tuple_of_floats(self) -> None:
  38. result = wilson_ci(5, 10)
  39. assert isinstance(result, tuple)
  40. assert len(result) == 2
  41. assert isinstance(result[0], float)
  42. assert isinstance(result[1], float)