add: обработка кавычек

This commit is contained in:
2025-08-17 01:12:09 +03:00
parent 73fa57e47e
commit b4248db063
5 changed files with 251 additions and 6 deletions

63
tests/test__typograph.py Normal file
View File

@@ -0,0 +1,63 @@
# tests/test__typograph.py
# Тесты для модуля Typographer. Проверяют отключение модулей обработки текста.
import pytest
from etpgrf.typograph import Typographer
from etpgrf.config import SHY_CHAR, NBSP_CHAR
def test_typographer_disables_quotes_processor():
"""
Проверяет, что при quotes=False модуль обработки кавычек отключается.
"""
# Arrange
input_string = 'Текст "в кавычках", который не должен измениться.'
# Создаем два экземпляра: с None и с False для полной проверки
typo_false = Typographer(langs='ru', quotes=False)
# Act
output_false = typo_false.process(input_string)
# Assert
# 1. Проверяем внутреннее состояние: модуль действительно отключен
assert typo_false.quotes is None
# 2. Проверяем результат: типографские кавычки НЕ появились в тексте.
# Это главная и самая надежная проверка.
assert '«' not in output_false and '»' not in output_false
def test_typographer_disables_hyphenation():
"""
Проверяет, что при hyphenation=False модуль переносов отключается.
"""
# Arrange
input_string = "Длинноесловодляпроверкипереносов"
typo = Typographer(langs='ru', hyphenation=False)
# Act
output_string = typo.process(input_string)
# Assert
# 1. Проверяем внутреннее состояние
assert typo.hyphenation is None
# 2. Проверяем результат: в тексте не появилось символов мягкого переноса
assert SHY_CHAR not in output_string
def test_typographer_disables_unbreakables():
"""
Проверяет, что при unbreakables=False модуль неразрывных пробелов отключается.
"""
# Arrange
input_string = "Он сказал: в дом вошла она."
typo = Typographer(langs='ru', unbreakables=False)
# Act
output_string = typo.process(input_string)
# Assert
# 1. Проверяем внутреннее состояние
assert typo.unbreakables is None
# 2. Проверяем результат: в тексте не появилось неразрывных пробелов
assert NBSP_CHAR not in output_string

74
tests/test_quotes.py Normal file
View File

@@ -0,0 +1,74 @@
# 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