"""#2464 кластер H: докстринг `_timing_overlap` обещал не ту формулу. Было записано `exp(−|Δмесяцев| / half_life)` и тут же — «расхождение в half_life мес → 0.5». Эти два утверждения несовместимы: `exp(−1) ≈ 0.368`, а не 0.5. Код при этом верен — он считает `0.5 ** (Δ/half_life)` и даёт ровно 0.5 на половинном периоде. Расходился докстринг. Тест закрепляет СВОЙСТВО, а не текст комментария: на Δ = half_life значение равно 0.5, и оно НЕ равно exp(−1). Второе утверждение существенно — без него тест прошёл бы и на экспоненциальной формуле, если бы кто-то «починил» код по старому докстрингу. """ from __future__ import annotations import math from datetime import date from app.services.forecasting.special_indices import _timing_overlap def test_half_life_gives_exactly_one_half() -> None: same = date(2026, 1, 1) later = date(2026, 7, 1) # ровно 6 месяцев value = _timing_overlap(later, same, half_life_months=6.0) assert value is not None assert abs(value - 0.5) < 1e-9, "на половинном периоде значение обязано быть 0.5" assert abs(value - math.exp(-1)) > 0.1, ( "значение совпало с exp(−1) — значит формула экспоненциальная, " "а докстринг обещает половинное затухание" ) def test_simultaneous_launch_is_one() -> None: same = date(2026, 1, 1) assert _timing_overlap(same, same, half_life_months=6.0) == 1.0 def test_missing_date_returns_none_not_a_number() -> None: """Контроль: недоступную ось не фабрикуем (обещание того же докстринга).""" assert _timing_overlap(None, date(2026, 1, 1)) is None assert _timing_overlap(date(2026, 1, 1), None) is None