Files
2025-etpgrf/tests/test_quotes.py

74 lines
4.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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”.'),
# Точка ВНУТРИ кавычек - неправильная пунктуация, закрывающая кавычка не обрабатывается (согласно README)
('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