You've already forked FrameTour-RenderWorker
158 lines
6.3 KiB
Python
158 lines
6.3 KiB
Python
"""测试缩放特效"""
|
|
|
|
import pytest
|
|
from entity.effects.zoom import ZoomEffect
|
|
from tests.utils.test_helpers import EffectTestHelper, FFmpegValidator
|
|
|
|
|
|
class TestZoomEffect:
|
|
"""测试缩放特效处理器"""
|
|
|
|
def test_validate_params_valid_cases(self):
|
|
"""测试有效参数验证"""
|
|
test_cases = [
|
|
{"params": "0,2.0,3.0", "expected": True, "description": "标准缩放参数"},
|
|
{
|
|
"params": "1.5,1.5,0",
|
|
"expected": True,
|
|
"description": "静态缩放(duration=0)",
|
|
},
|
|
{
|
|
"params": "0,1.0,5.0",
|
|
"expected": True,
|
|
"description": "无缩放效果(factor=1.0)",
|
|
},
|
|
{"params": "10,0.5,2.0", "expected": True, "description": "缩小效果"},
|
|
]
|
|
|
|
effect = ZoomEffect()
|
|
results = EffectTestHelper.test_effect_params_validation(effect, test_cases)
|
|
|
|
for result in results:
|
|
assert result["passed"], f"Failed case: {result['description']} - {result}"
|
|
|
|
def test_validate_params_invalid_cases(self):
|
|
"""测试无效参数验证"""
|
|
test_cases = [
|
|
{"params": "", "expected": False, "description": "空参数"},
|
|
{"params": "1,2", "expected": False, "description": "参数不足"},
|
|
{"params": "-1,2.0,3.0", "expected": False, "description": "负开始时间"},
|
|
{"params": "0,0,3.0", "expected": False, "description": "零缩放因子"},
|
|
{"params": "0,-2.0,3.0", "expected": False, "description": "负缩放因子"},
|
|
{"params": "0,2.0,-1.0", "expected": False, "description": "负持续时间"},
|
|
{"params": "abc,2.0,3.0", "expected": False, "description": "非数字参数"},
|
|
]
|
|
|
|
effect = ZoomEffect()
|
|
results = EffectTestHelper.test_effect_params_validation(effect, test_cases)
|
|
|
|
for result in results:
|
|
assert result["passed"], f"Failed case: {result['description']} - {result}"
|
|
|
|
def test_generate_filter_args_static_zoom(self):
|
|
"""测试静态缩放滤镜生成"""
|
|
effect = ZoomEffect("0,2.0,0") # duration=0表示静态缩放
|
|
result = EffectTestHelper.test_filter_generation(effect, "[0:v]", 1)
|
|
|
|
assert result["success"], f"Filter generation failed: {result.get('error')}"
|
|
assert result["filter_count"] == 1
|
|
assert result["valid_syntax"]
|
|
assert result["output_stream"] == "[v_eff1]"
|
|
|
|
# 检查滤镜内容
|
|
filter_str = result["filters"][0]
|
|
assert "trim=start=0" in filter_str
|
|
assert "zoompan=z=2.0" in filter_str
|
|
assert "[v_eff1]" in filter_str
|
|
|
|
def test_generate_filter_args_dynamic_zoom(self):
|
|
"""测试动态缩放滤镜生成"""
|
|
effect = ZoomEffect("1.0,1.5,2.0") # 从1秒开始,持续2秒的1.5倍缩放
|
|
result = EffectTestHelper.test_filter_generation(effect, "[0:v]", 2)
|
|
|
|
assert result["success"], f"Filter generation failed: {result.get('error')}"
|
|
assert result["filter_count"] == 1
|
|
assert result["valid_syntax"]
|
|
assert result["output_stream"] == "[v_eff2]"
|
|
|
|
# 检查滤镜内容
|
|
filter_str = result["filters"][0]
|
|
assert "zoompan=z=" in filter_str
|
|
assert "between(t\\\\,1.0\\\\,3.0)" in filter_str # 检查时间范围
|
|
assert "[v_eff2]" in filter_str
|
|
|
|
def test_generate_filter_args_no_zoom(self):
|
|
"""测试无缩放效果(factor=1.0)"""
|
|
effect = ZoomEffect("0,1.0,3.0") # 缩放因子为1.0,应该不生成滤镜
|
|
result = EffectTestHelper.test_filter_generation(effect, "[0:v]", 1)
|
|
|
|
assert result["success"]
|
|
assert result["filter_count"] == 0
|
|
assert result["output_stream"] == "[0:v]" # 输出应该等于输入
|
|
|
|
def test_generate_filter_args_invalid_params(self):
|
|
"""测试无效参数的滤镜生成"""
|
|
effect = ZoomEffect("invalid,params")
|
|
result = EffectTestHelper.test_filter_generation(effect, "[0:v]", 1)
|
|
|
|
assert result["success"]
|
|
assert result["filter_count"] == 0
|
|
assert result["output_stream"] == "[0:v]" # 无效参数时应该返回原输入
|
|
|
|
def test_get_zoom_center_default(self):
|
|
"""测试默认缩放中心点"""
|
|
effect = ZoomEffect("0,2.0,3.0")
|
|
center_x, center_y = effect._get_zoom_center()
|
|
|
|
assert center_x == "iw/2"
|
|
assert center_y == "ih/2"
|
|
|
|
def test_get_zoom_center_with_pos_json(self):
|
|
"""测试基于posJson的缩放中心点"""
|
|
ext_data = {
|
|
"posJson": '{"ltX": 100, "ltY": 100, "rbX": 200, "rbY": 200, "imgWidth": 400, "imgHeight": 300}'
|
|
}
|
|
effect = ZoomEffect("0,2.0,3.0", ext_data)
|
|
center_x, center_y = effect._get_zoom_center()
|
|
|
|
# 中心点应该是矩形的中心
|
|
# center_x_ratio = (100 + 200) / (2 * 400) = 0.375
|
|
# center_y_ratio = (100 + 200) / (2 * 300) = 0.5
|
|
assert "iw*0.375" in center_x
|
|
assert "ih*0.5" in center_y
|
|
|
|
def test_get_zoom_center_invalid_pos_json(self):
|
|
"""测试无效posJson时的缩放中心点"""
|
|
ext_data = {"posJson": '{"imgWidth": 0, "imgHeight": 0}'} # 无效尺寸
|
|
effect = ZoomEffect("0,2.0,3.0", ext_data)
|
|
center_x, center_y = effect._get_zoom_center()
|
|
|
|
# 应该回退到默认中心点
|
|
assert center_x == "iw/2"
|
|
assert center_y == "ih/2"
|
|
|
|
def test_get_effect_name(self):
|
|
"""测试获取特效名称"""
|
|
effect = ZoomEffect()
|
|
assert effect.get_effect_name() == "zoom"
|
|
|
|
def test_complex_zoom_scenario(self):
|
|
"""测试复杂缩放场景"""
|
|
# 带有复杂posJson数据的动态缩放
|
|
ext_data = {
|
|
"posJson": '{"ltX": 50, "ltY": 75, "rbX": 350, "rbY": 225, "imgWidth": 400, "imgHeight": 300}'
|
|
}
|
|
effect = ZoomEffect("2.5,3.0,1.5", ext_data)
|
|
result = EffectTestHelper.test_filter_generation(effect, "[input]", 5)
|
|
|
|
assert result["success"]
|
|
assert result["filter_count"] == 1
|
|
assert result["valid_syntax"]
|
|
assert result["output_stream"] == "[v_eff5]"
|
|
|
|
filter_str = result["filters"][0]
|
|
assert "zoompan=z=" in filter_str
|
|
assert "between(t\\\\,2.5\\\\,4.0)" in filter_str # 2.5 + 1.5 = 4.0
|
|
assert "[input]" in filter_str
|
|
assert "[v_eff5]" in filter_str
|