"""tests/shared/srt_entries.py 的模块级测试(数据 → 测试过程 → 验证结果)。 被测模块:`tests/shared/srt_entries.py`(按秒解析 SRT 条目,供各模块测试 计算时间轴与统计),是测试公共设施中的一个独立功能单元,拥有独立测试目录。 """ from __future__ import annotations from pathlib import Path from tests.shared.srt_entries import parse_srt_entries DATA_DIR = Path(__file__).resolve().parent.parent / "data" / "alignment" def test_parses_single_cue_with_seconds() -> None: """单条字幕解析为秒级时间轴与正文。""" # 数据:一条标准 SRT。 text = "1\n00:00:01,500 --> 00:00:02,250\n你好\n" # 测试过程 entries = parse_srt_entries(text) # 验证结果 assert entries == [{"start": 1.5, "end": 2.25, "text": "你好"}] def test_keeps_empty_text_entry_with_timeline() -> None: """空正文条目仍计入并保留时间轴(翻译补空占位需要)。""" # 数据:空正文 + 有正文两条。 text = "1\n00:00:01,000 --> 00:00:02,000\n\n2\n00:00:03,000 --> 00:00:04,000\n有词\n" # 测试过程 entries = parse_srt_entries(text) # 验证结果 assert len(entries) == 2 assert entries[0]["text"] == "" assert entries[1]["text"] == "有词" def test_joins_multiline_text_with_space() -> None: """多行正文合并为空格连接(便于关键词检索与统计)。""" # 数据:两行正文。 text = "1\n00:00:01,000 --> 00:00:02,000\n第一行\n第二行\n" # 测试过程与验证结果 assert parse_srt_entries(text)[0]["text"] == "第一行 第二行" def test_stops_entry_at_next_timestamp_or_index() -> None: """条目在下一个时间轴或序号行处结束(不跨条吞并)。""" # 数据:三条紧凑排列(无多余空行)。 text = ( "1\n00:00:01,000 --> 00:00:02,000\n甲\n" "2\n00:00:03,000 --> 00:00:04,000\n乙\n" "3\n00:00:05,000 --> 00:00:06,000\n丙\n" ) # 测试过程 entries = parse_srt_entries(text) # 验证结果 assert [e["text"] for e in entries] == ["甲", "乙", "丙"] def test_parses_real_reference_subtitle_file() -> None: """真实参考字幕文件:条数等于时间轴行数(无丢失)。""" # 数据:共享数据目录下的真实参考字幕。 path = DATA_DIR / "sample.reference.srt" if not path.is_file(): import pytest pytest.skip(f"缺少数据文件 {path}") text = path.read_text(encoding="utf-8") # 测试过程 entries = parse_srt_entries(text) # 验证结果 assert len(entries) == sum(1 for line in text.splitlines() if "-->" in line) def test_empty_input_returns_empty_list() -> None: """空文本返回空列表。""" # 数据:空字符串。 # 测试过程与验证结果 assert parse_srt_entries("") == []