You've already forked FrameTour-RenderWorker
169 lines
5.9 KiB
Python
169 lines
5.9 KiB
Python
"""测试变速特效"""
|
|
import pytest
|
|
from entity.effects.speed import SpeedEffect
|
|
from tests.utils.test_helpers import EffectTestHelper
|
|
|
|
|
|
class TestSpeedEffect:
|
|
"""测试变速特效处理器"""
|
|
|
|
def test_validate_params_valid_cases(self):
|
|
"""测试有效参数验证"""
|
|
test_cases = [
|
|
{
|
|
"params": "2.0",
|
|
"expected": True,
|
|
"description": "2倍速"
|
|
},
|
|
{
|
|
"params": "0.5",
|
|
"expected": True,
|
|
"description": "0.5倍速(慢速)"
|
|
},
|
|
{
|
|
"params": "1.0",
|
|
"expected": True,
|
|
"description": "正常速度"
|
|
},
|
|
{
|
|
"params": "10.0",
|
|
"expected": True,
|
|
"description": "10倍速"
|
|
},
|
|
{
|
|
"params": "",
|
|
"expected": True,
|
|
"description": "空参数(默认不变速)"
|
|
}
|
|
]
|
|
|
|
effect = SpeedEffect()
|
|
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": "0",
|
|
"expected": False,
|
|
"description": "零速度"
|
|
},
|
|
{
|
|
"params": "-1.0",
|
|
"expected": False,
|
|
"description": "负速度"
|
|
},
|
|
{
|
|
"params": "abc",
|
|
"expected": False,
|
|
"description": "非数字参数"
|
|
},
|
|
{
|
|
"params": "1.0,2.0",
|
|
"expected": False,
|
|
"description": "多余参数"
|
|
}
|
|
]
|
|
|
|
effect = SpeedEffect()
|
|
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_speed_change(self):
|
|
"""测试变速滤镜生成"""
|
|
effect = SpeedEffect("2.0") # 2倍速
|
|
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 "setpts=2.0*PTS" in filter_str
|
|
assert "[0:v]" in filter_str
|
|
assert "[v_eff1]" in filter_str
|
|
|
|
def test_generate_filter_args_slow_motion(self):
|
|
"""测试慢动作滤镜生成"""
|
|
effect = SpeedEffect("0.5") # 0.5倍速(慢动作)
|
|
result = EffectTestHelper.test_filter_generation(effect, "[input]", 3)
|
|
|
|
assert result["success"]
|
|
assert result["filter_count"] == 1
|
|
assert result["valid_syntax"]
|
|
assert result["output_stream"] == "[v_eff3]"
|
|
|
|
filter_str = result["filters"][0]
|
|
assert "setpts=0.5*PTS" in filter_str
|
|
assert "[input]" in filter_str
|
|
assert "[v_eff3]" in filter_str
|
|
|
|
def test_generate_filter_args_no_change(self):
|
|
"""测试无变速效果"""
|
|
test_cases = [
|
|
{"params": "", "description": "空参数"},
|
|
{"params": "1", "description": "1倍速"},
|
|
{"params": "1.0", "description": "1.0倍速"}
|
|
]
|
|
|
|
for case in test_cases:
|
|
effect = SpeedEffect(case["params"])
|
|
result = EffectTestHelper.test_filter_generation(effect, "[0:v]", 1)
|
|
|
|
assert result["success"], f"Failed for {case['description']}"
|
|
assert result["filter_count"] == 0, f"Should not generate filter for {case['description']}"
|
|
assert result["output_stream"] == "[0:v]", f"Output should equal input for {case['description']}"
|
|
|
|
def test_generate_filter_args_invalid_params(self):
|
|
"""测试无效参数的滤镜生成"""
|
|
effect = SpeedEffect("invalid")
|
|
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_effect_name(self):
|
|
"""测试获取特效名称"""
|
|
effect = SpeedEffect()
|
|
assert effect.get_effect_name() == "ospeed"
|
|
|
|
def test_various_speed_factors(self):
|
|
"""测试各种速度因子"""
|
|
speed_factors = ["0.1", "0.25", "0.75", "1.5", "3.0", "5.0"]
|
|
|
|
for speed in speed_factors:
|
|
effect = SpeedEffect(speed)
|
|
result = EffectTestHelper.test_filter_generation(effect, "[test]", 10)
|
|
|
|
if speed == "1.0":
|
|
# 1倍速不应该生成滤镜
|
|
assert result["filter_count"] == 0
|
|
assert result["output_stream"] == "[test]"
|
|
else:
|
|
# 其他速度应该生成滤镜
|
|
assert result["success"], f"Failed for speed {speed}"
|
|
assert result["filter_count"] == 1
|
|
assert result["valid_syntax"]
|
|
assert f"setpts={speed}*PTS" in result["filters"][0]
|
|
|
|
def test_effect_chaining(self):
|
|
"""测试特效链式处理"""
|
|
# 模拟在特效链中的使用
|
|
effect = SpeedEffect("2.0")
|
|
|
|
# 第一个特效
|
|
result1 = EffectTestHelper.test_filter_generation(effect, "[0:v]", 1)
|
|
assert result1["output_stream"] == "[v_eff1]"
|
|
|
|
# 作为链中的第二个特效
|
|
result2 = EffectTestHelper.test_filter_generation(effect, "[v_eff1]", 2)
|
|
assert result2["output_stream"] == "[v_eff2]"
|
|
assert "[v_eff1]" in result2["filters"][0] |