# tests/test_quotes.py
# Тесты для модуля QuotesProcessor. Проверяют обработку кавычек в тексте.

import pytest
from etpgrf.quotes import QuotesProcessor

# Набор тестовых случаев в формате:
# (язык, входная_строка, ожидаемый_результат)
QUOTES_TEST_CASES = [
    # --- Базовые случаи ---
    ('ru', 'Текст \"в кавычках\"', 'Текст «в кавычках»'),
    ('en', 'Text \"in quotes\"', 'Text “in quotes”'),
    ('ru', '(\"в скобках\")', '(«в скобках»)'),

    # --- Случаи, которые не должны меняться ---
    ('ru', 'Текст без кавычек.', 'Текст без кавычек.'),
    ('ru', 'Уже есть «ёлочки» и „лапки“', 'Уже есть «ёлочки» и „лапки“'),
    ('en', 'Already have “curly” and ‘single’ quotes', 'Already have “curly” and ‘single’ quotes'),

    # --- Сложные случаи и исключения (QuotesProcessor должен их игнорировать) ---
    ('ru', 'Размер экрана 17"', 'Размер экрана 17"'),
    ('en', 'Screen size 17"', 'Screen size 17"'),
    ('ru', 'Код print("Hello, World!")', 'Код print(«Hello, World!»)'), # Скобки помогают определить контекст
    ('ru', ' " одинокая кавычка " ', ' " одинокая кавычка " '), # Кавычки окружены пробелами
    ('ru', 'слово"вплотную', 'слово"вплотную'),
    ('ru', 'вплотную"слово', 'вплотную"слово'),

    # --- Вложенность и несколько пар ---
    ('ru', 'Он сказал: "Привет, мир!"', 'Он сказал: «Привет, мир!»'),
    ('ru', 'Она ответила: "И тебе "привет"!"', 'Она ответила: «И тебе «привет»!»'),

    # --- Обработка пунктуации ---
    # Точка СНАРУЖИ кавычек - правильная пунктуация, корректно обрабатывается
    ('ru', 'Текст "в кавычках".', 'Текст «в кавычках».'),
    ('en', '"Word".', '“Word”.'),
    # Точка ВНУТРИ кавычек
    ('ru', 'Текст "в кавычках."', 'Текст «в кавычках.»'),
    ('en', '"Word."', '“Word.”'),
    # Знаки ?, !, … ВНУТРИ кавычек - правильная пунктуация, корректно обрабатывается
    ('ru', '"Слово?"', '«Слово?»'),
    ('en', '"Word?"', '“Word?”'),
    ('ru', '"Слово!"', '«Слово!»'),
    ('en', '"Word!"', '“Word!”'),
    ('ru', '"Слово…"', '«Слово…»'),
    ('en', '"Word…"', '“Word…”'),
    # Запятая СНАРУЖИ кавычек
    ('ru', '"Слово", - сказал он.', '«Слово», - сказал он.'),
    # Цифры в кавычках не обрабатываются
    ('ru', 'Цифры "123" в кавычках', 'Цифры "123" в кавычках'),
    ('en', 'Numbers "123" in quotes', 'Numbers "123" in quotes'),

    # --- Языки и приоритеты ---
    (None, 'Текст "в кавычках"', 'Текст «в кавычках»'),  # Язык не указан -> используется DEFAULT_LANGS[0] ('ru')
    ('ru-en', 'Текст "в кавычках"', 'Текст «в кавычках»'),  # 'ru' первый в списке -> используются русские кавычки
    ('en-ru', 'Text "in quotes"', 'Text “in quotes”'),  # 'en' первый в списке -> используются английские кавычки
]


@pytest.mark.parametrize("lang, input_string, expected_output", QUOTES_TEST_CASES)
def test_quotes_processor(lang, input_string, expected_output):
    """
    Проверяет работу QuotesProcessor в изоляции.
    """
    # Arrange (подготовка)
    # Создаем экземпляр процессора только для этого теста
    processor = QuotesProcessor(langs=lang)

    # Act (действие)
    # Выполняем обработку
    actual_output = processor.process(input_string)

    # Assert (проверка)
    # Сравниваем результат с ожидаемым
    assert actual_output == expected_output