"""
Тесты _compute_structural_breaks: проверяет, что std считается от доходностей, не от цен.
"""
import numpy as np


def test_structural_breaks_uses_returns_not_prices():
    """
    Проверяет, что волатильность считается от доходностей (np.diff),
    а не от цен. Если бы считалось от цен — std был бы огромным
    на трендовых данных, и breaks были бы в основном 0.
    """
    from models.experts import _compute_structural_breaks

    # Сильный тренд вверх + шум (цены растут, std цен большой)
    n = 100
    t = np.arange(n, dtype=float)
    close = 100 + t * 0.5 + np.random.default_rng(42).normal(0, 0.1, n)
    breaks = _compute_structural_breaks(close, window=10)

    assert breaks.shape == (n,), f"Expected ({n},), got {breaks.shape}"
    assert np.all(np.isfinite(breaks)), "All values must be finite"
    assert np.all(np.abs(breaks) <= 1.0), "Breaks must be clipped to [-1, 1]"
    # На тренде без разрывов breaks должны быть небольшими
    assert np.mean(np.abs(breaks[40:])) < 0.5, "On steady trend, breaks should be small"
