"""渲染适配器纯逻辑测试 — _parse_resolution 等纯函数.""" from __future__ import annotations from pathlib import Path import pytest from video_processing.render_adapter import ( DEFAULT_OUTPUT_HEIGHT, DEFAULT_OUTPUT_WIDTH, RenderAdapterResult, _parse_resolution, ) class TestParseResolution: """_parse_resolution 分辨率字符串解析测试.""" def test_standard_format(self): """标准 宽x高 格式.""" w, h = _parse_resolution("1920x1080") assert w == 1920 assert h == 1080 def test_portrait_format(self): """竖屏格式.""" w, h = _parse_resolution("1080x1920") assert w == 1080 assert h == 1920 def test_lowercase_x(self): """小写x.""" w, h = _parse_resolution("1280x720") assert w == 1280 assert h == 720 def test_uppercase_x_returns_default(self): """大写X不匹配小写x → 返回默认值(只支持小写x).""" w, h = _parse_resolution("1280X720") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_none_returns_default(self): """None返回默认值.""" w, h = _parse_resolution(None) assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_empty_string_returns_default(self): """空字符串返回默认值.""" w, h = _parse_resolution("") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_no_x_returns_default(self): """没有x的字符串返回默认值.""" w, h = _parse_resolution("1080p") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_invalid_width_returns_default(self): """宽度无效返回默认值.""" w, h = _parse_resolution("abcx1080") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_invalid_height_returns_default(self): """高度无效返回默认值.""" w, h = _parse_resolution("1920xabc") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_zero_width_returns_default(self): """宽度为0返回默认值.""" w, h = _parse_resolution("0x1080") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_zero_height_returns_default(self): """高度为0返回默认值.""" w, h = _parse_resolution("1920x0") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_negative_width_returns_default(self): """负宽度返回默认值.""" w, h = _parse_resolution("-100x1080") assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_with_spaces(self): """带空格的能正确strip.""" w, h = _parse_resolution(" 1920 x 1080 ") assert w == 1920 assert h == 1080 def test_multiple_x_returns_default(self): """多个x的字符串解析失败 → 返回默认值.""" w, h = _parse_resolution("100x200x300") # split("x", 1)后h部分是"200x300",int失败返回默认 assert w == DEFAULT_OUTPUT_WIDTH assert h == DEFAULT_OUTPUT_HEIGHT def test_square_resolution(self): """正方形分辨率.""" w, h = _parse_resolution("512x512") assert w == 512 assert h == 512 def test_default_values_are_reasonable(self): """默认值合理(竖屏短视频).""" assert DEFAULT_OUTPUT_WIDTH > 0 assert DEFAULT_OUTPUT_HEIGHT > 0 # 默认是竖屏 1080x1920 assert DEFAULT_OUTPUT_WIDTH == 1080 assert DEFAULT_OUTPUT_HEIGHT == 1920 class TestRenderAdapterResult: """RenderAdapterResult 数据结构测试.""" def test_failure_defaults(self): """失败结果默认值.""" result = RenderAdapterResult(success=False) assert result.success is False assert result.output_url == "" assert result.output_path is None assert result.thumbnail_url == "" assert result.duration == 0.0 assert result.file_size == 0 assert result.width == 0 assert result.height == 0 def test_success_with_values(self): """成功结果带完整值.""" result = RenderAdapterResult( success=True, output_url="https://example.com/output.mp4", output_path=Path("/tmp/output.mp4"), thumbnail_url="https://example.com/thumb.jpg", duration=30.5, file_size=1024000, width=1080, height=1920, ) assert result.success is True assert result.output_url == "https://example.com/output.mp4" assert result.output_path == Path("/tmp/output.mp4") assert result.thumbnail_url == "https://example.com/thumb.jpg" assert result.duration == pytest.approx(30.5) assert result.file_size == 1024000 assert result.width == 1080 assert result.height == 1920