from src.risk.coin_leakage_gate import CoinLeakageGate, TradeRecord


def test_coin_leakage_gate_reduces_risk_above_half_recent_share():
    trades = [TradeRecord(coin="WLD") for _ in range(11)] + [TradeRecord(coin="BTC") for _ in range(9)]
    gate = CoinLeakageGate(reduce_threshold=0.50, block_threshold=0.60, reduced_multiplier=0.25)

    decision = gate.evaluate("WLD", trades, window=20)

    assert decision.allowed is True
    assert decision.risk_multiplier == 0.25
    assert decision.top_coin == "WLD"


def test_coin_leakage_gate_blocks_above_sixty_percent_recent_share():
    trades = [TradeRecord(coin="WLD") for _ in range(19)] + [TradeRecord(coin="BTC") for _ in range(11)]
    gate = CoinLeakageGate(reduce_threshold=0.50, block_threshold=0.60, reduced_multiplier=0.25)

    decision = gate.evaluate("WLD", trades, window=30)

    assert decision.allowed is False
    assert decision.risk_multiplier == 0
    assert decision.reason == "coin_leakage_block"


def test_coin_leakage_gate_does_not_penalize_other_coins_when_wld_dominates():
    trades = [TradeRecord(coin="WLD") for _ in range(19)] + [TradeRecord(coin="BTC") for _ in range(11)]
    gate = CoinLeakageGate(reduce_threshold=0.50, block_threshold=0.60, reduced_multiplier=0.25)

    decision = gate.evaluate("ETH", trades, window=30)

    assert decision.allowed is True
    assert decision.risk_multiplier == 1
