import pandas as pd

from psx_signal.features import build_features


def test_feature_values_do_not_change_when_future_rows_are_removed(market_data: pd.DataFrame) -> None:
    benchmark = market_data[market_data["symbol"] == "KSE100"]
    securities = market_data[market_data["symbol"] != "KSE100"]
    cutoff = securities["date"].sort_values().unique()[279]
    full = build_features(securities, benchmark)
    truncated = build_features(securities[securities["date"] <= cutoff], benchmark[benchmark["date"] <= cutoff])
    left = full[full["date"] == cutoff].sort_values("symbol").reset_index(drop=True)
    right = truncated[truncated["date"] == cutoff].sort_values("symbol").reset_index(drop=True)
    shared_numeric = left.select_dtypes("number").columns.intersection(right.select_dtypes("number").columns)
    pd.testing.assert_frame_equal(left[shared_numeric], right[shared_numeric], check_dtype=False, rtol=1e-12)


def test_market_regime_is_joined_on_same_as_of_date(market_data: pd.DataFrame) -> None:
    benchmark = market_data[market_data["symbol"] == "KSE100"]
    securities = market_data[market_data["symbol"] != "KSE100"]
    features = build_features(securities, benchmark)
    date = features["date"].max()
    actual = features.loc[features["date"] == date, "regime_return_1d"].unique()
    expected = benchmark.sort_values("date")["close"].pct_change(fill_method=None).iloc[-1]
    assert len(actual) == 1
    assert actual[0] == expected

