# tests/test_typograph.py # Тестирует основной класс Typographer и его конвейер обработки. import pytest from etpgrf import Typographer from etpgrf.config import CHAR_NBSP, CHAR_THIN_SP TYPOGRAPHER_HTML_TEST_CASES = [ # --- Базовая обработка без HTML --- ('mnemonic', 'Простой текст с "кавычками".', f'Простой текст с «кавычками».'), ('mixed', 'Простой текст с "кавычками".', f'Простой текст с «кавычками».'), ('unicode', 'Простой текст с "кавычками".', f'Простой текст с{CHAR_NBSP}«кавычками».'), # --- Базовая обработка с HTML --- ('mnemonic', '
Простой параграф с «кавычками».
', 'Простой параграф с «кавычками».
'), ('mixed', 'Простой параграф с "кавычками".
', 'Простой параграф с «кавычками».
'), ('unicode', 'Простой параграф с "кавычками".
', f'Простой параграф с{CHAR_NBSP}«кавычками».
'), # --- Рекурсивный обход --- ('mnemonic', 'Текст, а внутри для проверки "жирный" текст.
Текст, а внутри для проверки «жирный» текст.
Текст, а внутри для проверки "жирный" текст.
Текст, а внутри для проверки «жирный» текст.
Текст, а внутри для проверки "жирный" текст.
Текст, а{CHAR_NBSP}внутри для{CHAR_NBSP}проверки «жирный» текст.
Текст с предлогом в доме.
Текст с предлогом в доме.
Текст с предлогом в доме.
Текст с предлогом в доме.
Текст с предлогом в доме.
Текст с{CHAR_NBSP}предлогом в{CHAR_NBSP}доме.
Союз и слово и еще один союз а текст.
', 'Союз и слово и еще один союз а текст.
'), ('mixed', 'Союз и слово и еще один союз а текст.
', 'Союз и слово и еще один союз а текст.
'), ('unicode', 'Союз и слово и еще один союз а текст.
', f'Союз и{CHAR_NBSP}слово и{CHAR_NBSP}еще один союз а{CHAR_NBSP}текст.
'), # # --- Проверка "небезопасных" тегов --- # ( # 'Небезопасные теги не должны обрабатываться.', # 'Текст "до".
- 10
"тоже не трогать"
',
# 'Текст «до».
- 10
"тоже не трогать"
'
# ),
# # --- Проверка атрибутов ---
# (
# 'Атрибуты тегов не должны обрабатываться.',
# 'Текст "снаружи"',
# 'Текст «снаружи»'
# ),
# # --- Комплексный интеграционный тест ---
# (
# 'Все правила вместе в HTML.',
# 'Он сказал: "В 1941-1945 гг. -- было 100 тыс. руб. и т. д."
', # f'Он сказал: «В 1941–1945{CHAR_NBSP}гг.{CHAR_NBSP}— было 100{CHAR_NBSP}тыс.{CHAR_THIN_SP}руб. и{CHAR_NBSP}т.{CHAR_THIN_SP}д.»
' # ), # # --- Проверка пустого текста и узлов с пробелами --- # ( # 'Пустые и пробельные узлы.', # '
Слово
', # '
Слово
' # ), ] @pytest.mark.parametrize("mode, input_html, expected_html", TYPOGRAPHER_HTML_TEST_CASES) def test_typographer_html_processing(mode, input_html, expected_html): """ Проверяет полный конвейер Typographer при обработке HTML. """ typo = Typographer(langs='ru', process_html=True, mode=mode) actual_html = typo.process(input_html) assert actual_html == expected_html def test_typographer_plain_text_processing(): """ Проверяет, что в режиме process_html=False типограф маскирует HTML-теги и обрабатывает весь текст. """ typo = Typographer(langs='ru', process_html=False) input_text = 'Текст "без" HTML, но с предлогом в доме.' expected_text = '<i>Текст «без» <b>HTML</b>, но с предлогом в доме.</i>' actual_text = typo.process(input_text) assert actual_text == expected_text