104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
from app.segmentation import (
|
||
detect_language,
|
||
extract_explicit_pauses,
|
||
prepare_segments,
|
||
split_paragraphs,
|
||
)
|
||
from app.ssml import DEFAULT_PAUSE_MS, explicit_pause_char
|
||
|
||
|
||
def test_detect_language_pure_ru():
|
||
assert detect_language("Привет мир") == "ru"
|
||
|
||
|
||
def test_detect_language_pure_en():
|
||
assert detect_language("Hello world") == "en"
|
||
|
||
|
||
def test_detect_language_single_cyrillic_letter():
|
||
assert detect_language("tshirt 1") == "en"
|
||
assert detect_language("tshirt 1 е") == "ru"
|
||
|
||
|
||
def test_detect_language_latin_with_digits():
|
||
assert detect_language("iPhone 15 Pro 24/7") == "en"
|
||
|
||
|
||
def test_ru_request_segments_uniform_and_latin_free():
|
||
segments = prepare_segments("Закажи на Ozon через Python-скрипт.")
|
||
assert segments
|
||
assert all(s.lang == "ru" for s in segments)
|
||
assert not any(any(ch.isascii() and ch.isalpha() for ch in s.text) for s in segments)
|
||
joined = " ".join(s.text for s in segments)
|
||
assert "Озон" in joined or "озон" in joined
|
||
assert "Пайтон" in joined or "пайтон" in joined
|
||
|
||
|
||
def test_en_request_not_transliterated():
|
||
segments = prepare_segments("Hello world, this is a test.")
|
||
assert segments
|
||
assert all(s.lang == "en" for s in segments)
|
||
assert any("Hello" in s.text for s in segments)
|
||
|
||
|
||
def test_ru_numbers_normalized():
|
||
segments = prepare_segments("Купи 5 штук в Shopify.")
|
||
joined = " ".join(s.text for s in segments)
|
||
assert "пять" in joined.lower()
|
||
|
||
|
||
# --- 5.3: абзацы и явные паузы ---
|
||
|
||
def test_split_paragraphs_on_blank_lines():
|
||
paras = split_paragraphs("Первый абзац.\n\nВторой абзац.\n \nТретий.")
|
||
assert paras == ["Первый абзац.", "Второй абзац.", "Третий."]
|
||
|
||
|
||
def test_paragraphs_get_distinct_para_index():
|
||
segments = prepare_segments("Первое предложение.\n\nВторой абзац тут.")
|
||
assert segments
|
||
paras = {s.para for s in segments}
|
||
assert len(paras) >= 2
|
||
assert min(paras) == 0
|
||
|
||
|
||
def test_sentences_within_paragraph_share_para():
|
||
segments = prepare_segments("Раз. Два. Три.")
|
||
assert len(segments) >= 2
|
||
assert all(s.para == 0 for s in segments)
|
||
|
||
|
||
def test_delimiter_removal_does_not_break_sentence_split():
|
||
# Удаление разделителей (без подмены запятыми) не ломает разбиение на предложения.
|
||
segments = prepare_segments("Он сказал (тихо) и ушёл. Потом сразу спал.")
|
||
assert len(segments) >= 2
|
||
joined = " ".join(s.text for s in segments)
|
||
for ch in "()":
|
||
assert ch not in joined
|
||
|
||
|
||
def test_explicit_pause_default_marker_to_single_char():
|
||
out = extract_explicit_pauses("стоп ||| продолжение")
|
||
assert "|||" not in out
|
||
assert explicit_pause_char(DEFAULT_PAUSE_MS) in out
|
||
|
||
|
||
def test_explicit_pause_timed_marker_encodes_ms():
|
||
out = extract_explicit_pauses("а |||1500 б")
|
||
assert "1500" not in out
|
||
assert explicit_pause_char(1500) in out
|
||
|
||
|
||
def test_explicit_pause_clamped_to_max():
|
||
out = extract_explicit_pauses("а |||999999 б")
|
||
assert "999999" not in out
|
||
assert explicit_pause_char(5000) in out
|
||
|
||
|
||
def test_explicit_pause_survives_prepare_segments():
|
||
segments = prepare_segments("первое |||2000 второе")
|
||
joined = "".join(s.text for s in segments)
|
||
assert "|||" not in joined
|
||
assert "2000" not in joined
|
||
assert explicit_pause_char(2000) in joined
|