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