From 81a7dc558b6bab6864c4f5182525528fbb1d52fd Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Thu, 19 Mar 2026 23:33:43 +0800 Subject: [PATCH] test(12-01): add failing tests for SemanticSegmenter - Test merging short segments into paragraphs - Test segmentation on topic change (time gap) - Test max paragraph length constraint - Test empty segments handling Co-Authored-By: Claude Opus 4.6 --- tests/test_srt_processor.py | 89 +++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/tests/test_srt_processor.py b/tests/test_srt_processor.py index 62a92c0..c178b62 100644 --- a/tests/test_srt_processor.py +++ b/tests/test_srt_processor.py @@ -149,3 +149,92 @@ class TestParseSrtFile: with pytest.raises(FileNotFoundError): parse_srt_file(Path("/nonexistent/file.srt")) + + +# ============================================================================= +# Test 2: Semantic Segmenter +# ============================================================================= + +@pytest.fixture +def short_segments(): + """连续短句字幕分段""" + from kb_workflow.srt.parser import Segment + return [ + Segment(id=1, start_time=0.0, end_time=2.0, text="这是第一句短句"), + Segment(id=2, start_time=2.0, end_time=4.0, text="这是第二句短句"), + Segment(id=3, start_time=4.0, end_time=6.0, text="这是第三句短句"), + ] + + +@pytest.fixture +def segments_with_gap(): + """带有长停顿的字幕分段""" + from kb_workflow.srt.parser import Segment + return [ + Segment(id=1, start_time=0.0, end_time=5.0, text="第一段内容在这里"), + Segment(id=2, start_time=5.0, end_time=10.0, text="继续第一段"), + # 5秒停顿 + Segment(id=3, start_time=15.0, end_time=20.0, text="第二段从这里开始"), + Segment(id=4, start_time=20.0, end_time=25.0, text="继续第二段"), + ] + + +@pytest.fixture +def long_text_segment(): + """长文本分段(超过500字符)""" + from kb_workflow.srt.parser import Segment + long_text = "这是一段很长的文本," * 50 # 约600字符 + return [ + Segment(id=1, start_time=0.0, end_time=60.0, text=long_text), + ] + + +class TestSemanticSegmenter: + """测试语义分段器""" + + def test_merge_short_segments(self, short_segments): + """Test 1: 连续短句被合并为段落""" + from kb_workflow.srt.segmenter import SemanticSegmenter + + segmenter = SemanticSegmenter() + paragraphs = segmenter.segment(short_segments) + + # 所有短句应该被合并 + assert len(paragraphs) >= 1 + # 验证所有内容都被保留 + merged_text = ' '.join(paragraphs) + assert "第一句短句" in merged_text + assert "第二句短句" in merged_text + assert "第三句短句" in merged_text + + def test_segment_on_topic_change(self, segments_with_gap): + """Test 2: 主题变化时自动分段(基于时间间隔)""" + from kb_workflow.srt.segmenter import SemanticSegmenter + + segmenter = SemanticSegmenter(gap_threshold=3.0) + paragraphs = segmenter.segment(segments_with_gap) + + # 应该分成两段(因为中间有5秒停顿) + assert len(paragraphs) == 2 + assert "第一段" in paragraphs[0] + assert "第二段" in paragraphs[1] + + def test_max_paragraph_length(self, long_text_segment): + """Test 3: 单个段落不超过 500 字符""" + from kb_workflow.srt.segmenter import SemanticSegmenter + + segmenter = SemanticSegmenter(max_paragraph_chars=500) + paragraphs = segmenter.segment(long_text_segment) + + # 每个段落不应该超过限制 + for para in paragraphs: + assert len(para) <= 520 # 允许小范围超出(最后一块) + + def test_empty_segments(self): + """空分段列表返回空列表""" + from kb_workflow.srt.segmenter import SemanticSegmenter + + segmenter = SemanticSegmenter() + paragraphs = segmenter.segment([]) + + assert paragraphs == []