from dataclasses import replace

import pandas as pd

from psx_signal.config import UniverseSelectionConfig
from psx_signal.data.universe import UniverseSelector


def test_universe_uses_only_information_available_at_as_of_date() -> None:
    dates = pd.bdate_range("2024-01-01", periods=8)
    rows = []
    for symbol, volume in (("AAA", 100), ("BBB", 200)):
        for day in dates:
            rows.append({"symbol": symbol, "date": day, "close": 10.0, "volume": volume})
    frame = pd.DataFrame(rows)
    config = UniverseSelectionConfig(size=1, minimum_history_days=3, minimum_trading_frequency=0.5, liquidity_lookback_days=3)
    selector = UniverseSelector(config)
    before = selector.select(frame, dates[4], pd.Series(dates))
    future = pd.DataFrame([{"symbol": "AAA", "date": dates[-1] + pd.Timedelta(days=1), "close": 10.0, "volume": 999999}])
    after = selector.select(pd.concat([frame, future]), dates[4], pd.Series(dates))
    assert before["symbol"].tolist() == ["BBB"]
    pd.testing.assert_frame_equal(before, after)

