"""Tests for custom exception classes."""

import pytest

from src.core.exceptions import (
    ConfigurationError,
    DataError,
    DetectorError,
    ICTTradingException,
    ModelError,
    TradingError,
    ValidationError,
)


def test_base_exception():
    """Test base exception class."""
    exc = ICTTradingException("Test message")
    assert str(exc) == "Test message"
    assert exc.message == "Test message"
    assert exc.error_code is None
    assert exc.context == {}


def test_exception_with_error_code():
    """Test exception with error code."""
    exc = ICTTradingException("Test message", error_code="TEST_ERROR")
    assert str(exc) == "[TEST_ERROR] Test message"
    assert exc.error_code == "TEST_ERROR"


def test_exception_with_context():
    """Test exception with context."""
    context = {"key": "value", "number": 42}
    exc = ICTTradingException("Test message", context=context)
    assert exc.context == context
    assert exc.to_dict()["context"] == context


def test_exception_to_dict():
    """Test exception to_dict method."""
    exc = ICTTradingException("Test message", error_code="TEST", context={"key": "value"})
    exc_dict = exc.to_dict()
    assert exc_dict["error_type"] == "ICTTradingException"
    assert exc_dict["error_code"] == "TEST"
    assert exc_dict["message"] == "Test message"
    assert exc_dict["context"] == {"key": "value"}


def test_data_error():
    """Test DataError exception."""
    exc = DataError("Data loading failed")
    assert isinstance(exc, ICTTradingException)
    assert exc.error_code == "DATA_ERROR"


def test_detector_error():
    """Test DetectorError exception."""
    exc = DetectorError("Detection failed")
    assert isinstance(exc, ICTTradingException)
    assert exc.error_code == "DETECTOR_ERROR"


def test_model_error():
    """Test ModelError exception."""
    exc = ModelError("Model training failed")
    assert isinstance(exc, ICTTradingException)
    assert exc.error_code == "MODEL_ERROR"


def test_configuration_error():
    """Test ConfigurationError exception."""
    exc = ConfigurationError("Invalid config")
    assert isinstance(exc, ICTTradingException)
    assert exc.error_code == "CONFIG_ERROR"


def test_trading_error():
    """Test TradingError exception."""
    exc = TradingError("Trade execution failed")
    assert isinstance(exc, ICTTradingException)
    assert exc.error_code == "TRADING_ERROR"


def test_validation_error():
    """Test ValidationError exception."""
    exc = ValidationError("Validation failed")
    assert isinstance(exc, ICTTradingException)
    assert exc.error_code == "VALIDATION_ERROR"

