add: SymbolsProcessor - обработка тире и псевдографики
This commit is contained in:
@@ -3,7 +3,28 @@
|
||||
|
||||
import pytest
|
||||
from etpgrf.typograph import Typographer
|
||||
from etpgrf.config import SHY_CHAR, NBSP_CHAR
|
||||
from etpgrf.config import CHAR_SHY, CHAR_NBSP, CHAR_COPY, CHAR_MDASH, CHAR_ARROW_L
|
||||
|
||||
|
||||
def test_typographer_disables_symbols_processor():
|
||||
"""
|
||||
Проверяет, что при symbols=False модуль обработки символов отключается.
|
||||
"""
|
||||
# Arrange
|
||||
input_string = "Текст --- с символами (c) и стрелками A --> B."
|
||||
typo = Typographer(langs='ru-en', symbols=False)
|
||||
|
||||
# Act
|
||||
output_string = typo.process(input_string)
|
||||
|
||||
# Assert
|
||||
# 1. Проверяем внутреннее состояние: модуль действительно отключен
|
||||
assert typo.symbols is None
|
||||
# 2. Проверяем результат: символы НЕ появились в тексте.
|
||||
# Это главная и самая надежная проверка.
|
||||
assert CHAR_MDASH not in output_string # длинное тире
|
||||
assert CHAR_COPY not in output_string # символ копирайта
|
||||
assert CHAR_ARROW_L not in output_string # стрелка
|
||||
|
||||
|
||||
def test_typographer_disables_quotes_processor():
|
||||
@@ -42,7 +63,7 @@ def test_typographer_disables_hyphenation():
|
||||
# 1. Проверяем внутреннее состояние
|
||||
assert typo.hyphenation is None
|
||||
# 2. Проверяем результат: в тексте не появилось символов мягкого переноса
|
||||
assert SHY_CHAR not in output_string
|
||||
assert CHAR_SHY not in output_string
|
||||
|
||||
|
||||
def test_typographer_disables_unbreakables():
|
||||
@@ -60,4 +81,4 @@ def test_typographer_disables_unbreakables():
|
||||
# 1. Проверяем внутреннее состояние
|
||||
assert typo.unbreakables is None
|
||||
# 2. Проверяем результат: в тексте не появилось неразрывных пробелов
|
||||
assert NBSP_CHAR not in output_string
|
||||
assert CHAR_NBSP not in output_string
|
79
tests/test_symbols.py
Normal file
79
tests/test_symbols.py
Normal file
@@ -0,0 +1,79 @@
|
||||
# tests/test_symbols.py
|
||||
# Тестирует модуль SymbolsProcessor. Проверяет обработку псевдографики в тексте (тире, стрелки, спецсимволы).
|
||||
|
||||
import pytest
|
||||
from etpgrf.symbols import SymbolsProcessor
|
||||
from etpgrf.config import (
|
||||
CHAR_NDASH, CHAR_MDASH, CHAR_HELLIP, CHAR_COPY, CHAR_REG, CHAR_COPYP,
|
||||
CHAR_TRADE, CHAR_AP, CHAR_ARROW_L, CHAR_ARROW_R, CHAR_ARROW_LR,
|
||||
CHAR_ARROW_L_DOUBLE, CHAR_ARROW_R_DOUBLE, CHAR_ARROW_LR_DOUBLE,
|
||||
CHAR_ARROW_L_LONG_DOUBLE, CHAR_ARROW_R_LONG_DOUBLE, CHAR_ARROW_LR_LONG_DOUBLE,
|
||||
)
|
||||
|
||||
SYMBOLS_TEST_CASES = [
|
||||
# 1. --- Простые замены из STR_TO_SYMBOL_REPLACEMENTS ---
|
||||
# Тире и многоточие
|
||||
("Текст --- текст", f"Текст {CHAR_MDASH} текст"),
|
||||
("Текст---текст", f"Текст{CHAR_MDASH}текст"),
|
||||
("Текст -- текст", f"Текст {CHAR_NDASH} текст"),
|
||||
("Текст--текст", f"Текст{CHAR_NDASH}текст"),
|
||||
("Текст...", f"Текст{CHAR_HELLIP}"),
|
||||
|
||||
# Спецсимволы
|
||||
("(c) 2025 Компания правообладатель", f"{CHAR_COPY} 2025 Компания правообладатель"),
|
||||
("(C) 2025 Компания правообладатель", f"{CHAR_COPY} 2025 Компания правообладатель"),
|
||||
("Товар(r)", f"Товар{CHAR_REG}"),
|
||||
("Товар(R)", f"Товар{CHAR_REG}"),
|
||||
("(p) 2025 Звукозапись", f"{CHAR_COPYP} 2025 Звукозапись"),
|
||||
("(P) 2025 Звукозапись", f"{CHAR_COPYP} 2025 Звукозапись"),
|
||||
("Продукт(tm)", f"Продукт{CHAR_TRADE}"),
|
||||
("Продукт(TM)", f"Продукт{CHAR_TRADE}"),
|
||||
|
||||
|
||||
# Стрелки
|
||||
("A <--> B", f"A {CHAR_ARROW_LR} B"),
|
||||
("A <-- B", f"A {CHAR_ARROW_L} B"),
|
||||
("A --> B", f"A {CHAR_ARROW_R} B"),
|
||||
("A <==> B", f"A {CHAR_ARROW_LR_DOUBLE} B"),
|
||||
("A <== B", f"A {CHAR_ARROW_L_DOUBLE} B"),
|
||||
("A ==> B", f"A {CHAR_ARROW_R_DOUBLE} B"),
|
||||
("A <===> B", f"A {CHAR_ARROW_LR_LONG_DOUBLE} B"),
|
||||
("A <=== B", f"A {CHAR_ARROW_L_LONG_DOUBLE} B"),
|
||||
("A ===> B", f"A {CHAR_ARROW_R_LONG_DOUBLE} B"),
|
||||
|
||||
# Математические
|
||||
("a ~= b", f"a {CHAR_AP} b"),
|
||||
|
||||
# 2. --- Диапазоны чисел (обработка дефиса после простых замен) ---
|
||||
("1941-1945 гг.", f"1941{CHAR_NDASH}1945 гг."),
|
||||
("страницы 10-12", f"страницы 10{CHAR_NDASH}12"),
|
||||
("I-V век", f"I{CHAR_NDASH}V век"),
|
||||
("ix-vi до н.э.", f"ix{CHAR_NDASH}vi до н.э."),
|
||||
|
||||
# 3. --- Комбинированные и пограничные случаи ---
|
||||
# Сначала сработает простая замена '---' -> '—', потом диапазон '1-5' -> '1–5'
|
||||
("1-5 --- это диапазон (c)", f"1{CHAR_NDASH}5 {CHAR_MDASH} это диапазон {CHAR_COPY}"),
|
||||
# Простая замена '--' -> '–' не должна мешать диапазону '1-5'
|
||||
("1-5 -- это диапазон", f"1{CHAR_NDASH}5 {CHAR_NDASH} это диапазон"),
|
||||
("-10 -- -5 -- это диапазон", f"-10 {CHAR_NDASH} -5 – это диапазон"),
|
||||
# Проверка порядка: '---' должно замениться до '--'
|
||||
("A---B--C", f"A{CHAR_MDASH}B{CHAR_NDASH}C"),
|
||||
# Проверка, что замена не жадная и заменяет все вхождения
|
||||
("далее...", f"далее{CHAR_HELLIP}"),
|
||||
("...и...и...", f"{CHAR_HELLIP}и{CHAR_HELLIP}и{CHAR_HELLIP}"),
|
||||
("A-->B-->C", f"A{CHAR_ARROW_R}B{CHAR_ARROW_R}C"),
|
||||
("A<--B<--C", f"A{CHAR_ARROW_L}B{CHAR_ARROW_L}C"),
|
||||
("A<-->B<-->C", f"A{CHAR_ARROW_LR}B{CHAR_ARROW_LR}C"),
|
||||
("A<==>B<==>C", f"A{CHAR_ARROW_LR_DOUBLE}B{CHAR_ARROW_LR_DOUBLE}C"),
|
||||
("A<===>B<===>C", f"A{CHAR_ARROW_LR_LONG_DOUBLE}B{CHAR_ARROW_LR_LONG_DOUBLE}C"),
|
||||
# Очень длинные, комбинированные стрелки
|
||||
("A <----> B", f"A {CHAR_ARROW_L}{CHAR_ARROW_R} B"),
|
||||
("A <======> B", f"A {CHAR_ARROW_L_LONG_DOUBLE}{CHAR_ARROW_R_LONG_DOUBLE} B"),
|
||||
]
|
||||
|
||||
|
||||
@pytest.mark.parametrize("input_string, expected_output", SYMBOLS_TEST_CASES)
|
||||
def test_symbols_processor(input_string, expected_output):
|
||||
processor = SymbolsProcessor()
|
||||
actual_output = processor.process(input_string)
|
||||
assert actual_output == expected_output
|
Reference in New Issue
Block a user