"""Tests for Grid strategy."""

import pytest
from decimal import Decimal
from src.strategies.grid.grid_strategy import GridStrategy


def test_grid_strategy_initialization():
    """Test Grid strategy initializes correctly."""
    strategy = GridStrategy("Test Grid", {
        "grid_spacing": 1,
        "num_levels": 10,
        "profit_target": 2
    })
    assert strategy.name == "Test Grid"
    assert strategy.grid_spacing == Decimal("0.01")
    assert strategy.num_levels == 10


def test_grid_levels_calculation():
    """Test grid levels are calculated correctly."""
    strategy = GridStrategy("Test Grid", {
        "grid_spacing": 1,
        "num_levels": 5,
        "center_price": 100
    })
    
    strategy._update_grid_levels(Decimal("100"))
    assert len(strategy.buy_levels) == 5
    assert len(strategy.sell_levels) == 5
    
    # Buy levels should be below center
    assert all(level < Decimal("100") for level in strategy.buy_levels)
    # Sell levels should be above center
    assert all(level > Decimal("100") for level in strategy.sell_levels)


def test_grid_buy_signal():
    """Test grid generates buy signal at lower level."""
    strategy = GridStrategy("Test Grid", {
        "grid_spacing": 1,
        "num_levels": 5,
        "center_price": 100,
        "position_size": Decimal("0.1")
    })
    
    # Price at buy level
    signal = strategy.on_tick("BTC/USD", Decimal("99"), "1h", {})
    assert signal is not None
    assert signal.signal_type.value == "buy"


def test_grid_profit_taking():
    """Test grid takes profit at target."""
    strategy = GridStrategy("Test Grid", {
        "grid_spacing": 1,
        "num_levels": 5,
        "profit_target": 2
    })
    
    # Simulate position
    entry_price = Decimal("100")
    strategy.positions[entry_price] = Decimal("0.1")
    
    # Price with profit
    signal = strategy.on_tick("BTC/USD", Decimal("102"), "1h", {})
    assert signal is not None
    assert signal.signal_type.value == "sell"
    assert entry_price not in strategy.positions  # Position removed
