Files
2025-etpgrf/tests/test_symbols.py

79 lines
4.3 KiB
Python
Raw Permalink 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_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' -> '15'
("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