separate test files
This commit is contained in:
parent
afe45e2dda
commit
26eca6668c
3 changed files with 160 additions and 104 deletions
111
tests/unit/script/types/test_custom_function.py
Normal file
111
tests/unit/script/types/test_custom_function.py
Normal file
|
|
@ -0,0 +1,111 @@
|
||||||
|
import re
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from ytdl_sub.script.script import Script
|
||||||
|
from ytdl_sub.script.types.array import ResolvedArray
|
||||||
|
from ytdl_sub.script.types.resolvable import Integer
|
||||||
|
from ytdl_sub.script.utils.exceptions import CycleDetected
|
||||||
|
|
||||||
|
|
||||||
|
class TestCustomFunction:
|
||||||
|
def test_custom_function_use_input_param_multiple_times(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%custom_square": "{%mul($0, $0)}",
|
||||||
|
"output": "{%custom_square(3)}",
|
||||||
|
}
|
||||||
|
).resolve() == {"output": Integer(9)}
|
||||||
|
|
||||||
|
def test_custom_function_cycle(self):
|
||||||
|
with pytest.raises(
|
||||||
|
CycleDetected, match=re.escape("The custom function %cycle_func cannot call itself.")
|
||||||
|
):
|
||||||
|
Script(
|
||||||
|
{"%cycle_func": "{%mul(%cycle_func(1), $0)}", "output": "{%cycle_func(1)}"}
|
||||||
|
).resolve()
|
||||||
|
|
||||||
|
def test_custom_function_chained_cycle(self):
|
||||||
|
with pytest.raises(
|
||||||
|
CycleDetected,
|
||||||
|
match=re.escape(
|
||||||
|
"Custom functions contain a cycle: %cycle_func1 -> %cycle_func0 -> %cycle_func1"
|
||||||
|
),
|
||||||
|
):
|
||||||
|
Script(
|
||||||
|
{
|
||||||
|
"%cycle_func1": "{%mul(%cycle_func0(1), $0)}",
|
||||||
|
"%cycle_func0": "{%mul(%cycle_func1(1), $0)}",
|
||||||
|
"output": "{%cycle_func0(1)}",
|
||||||
|
}
|
||||||
|
).resolve()
|
||||||
|
|
||||||
|
def test_custom_function_deep_chained_cycle(self):
|
||||||
|
with pytest.raises(
|
||||||
|
CycleDetected,
|
||||||
|
match=re.escape(
|
||||||
|
"Custom functions contain a cycle: "
|
||||||
|
"%cycle_func4 -> "
|
||||||
|
"%cycle_func0 -> "
|
||||||
|
"%cycle_func1 -> "
|
||||||
|
"%cycle_func2 -> "
|
||||||
|
"%cycle_func3 -> "
|
||||||
|
"%cycle_func4"
|
||||||
|
),
|
||||||
|
):
|
||||||
|
Script(
|
||||||
|
{
|
||||||
|
"%nested_safe_func": "{%mul($0, 1)}",
|
||||||
|
"%safe_func": "{%nested_safe_func($0, 1)}",
|
||||||
|
"%cycle_func4": "{%mul(%cycle_func0(1), %safe_func($0))}",
|
||||||
|
"%cycle_func3": "{%mul(%cycle_func4(1), %safe_func($0))}",
|
||||||
|
"%cycle_func2": "{%mul(%cycle_func3(1), %safe_func($0))}",
|
||||||
|
"%cycle_func1": "{%mul(%cycle_func2(1), %safe_func($0))}",
|
||||||
|
"%cycle_func0": "{%mul(%cycle_func1(1), %safe_func($0))}",
|
||||||
|
"output": "{%cycle_func0(1)}",
|
||||||
|
}
|
||||||
|
).resolve()
|
||||||
|
|
||||||
|
def test_lambda_with_custom_function(self):
|
||||||
|
assert Script(
|
||||||
|
{"%times_two": "{%mul($0, 2)}", "wip": "{%array_apply([1, 2, 3], %times_two)}"}
|
||||||
|
).resolve() == {"wip": ResolvedArray([Integer(2), Integer(4), Integer(6)])}
|
||||||
|
|
||||||
|
def test_conditional_lambda_with_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%times_three": "{%mul($0, 3)}",
|
||||||
|
"%times_two": "{%mul($0, 2)}",
|
||||||
|
"wip": "{%array_apply([1, 2, 3], %if(False, %times_two, %times_three))}",
|
||||||
|
}
|
||||||
|
).resolve() == {"wip": ResolvedArray([Integer(3), Integer(6), Integer(9)])}
|
||||||
|
|
||||||
|
def test_nested_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%times_three": "{%mul($0, 3)}",
|
||||||
|
"%times_two": "{%mul($0, 2)}",
|
||||||
|
"identity": "{%times_three(%times_two(1))}",
|
||||||
|
}
|
||||||
|
).resolve() == {"identity": Integer(6)}
|
||||||
|
|
||||||
|
def test_nested_custom_functions_within_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%power_2": "{%mul($0, 2)}",
|
||||||
|
"%power_3": "{%mul(%power_2($0), 2)}",
|
||||||
|
"%power_4": "{%mul(%power_3($0), 2)}",
|
||||||
|
"power_of_4": "{%power_4(2)}",
|
||||||
|
}
|
||||||
|
).resolve() == {"power_of_4": Integer(16)}
|
||||||
|
|
||||||
|
def test_nested_lambda_custom_functions_within_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%nest4": "{%mul($0, 2)}",
|
||||||
|
"%nest3": "{%array_at(%array_apply([$0], %nest4), 0)}",
|
||||||
|
"%nest2": "{%array_at(%array_apply([$0], %nest3), 0)}",
|
||||||
|
"%nest1": "{%array_at(%array_apply([$0], %nest2), 0)}",
|
||||||
|
"output": "{%array_at(%array_apply([2], %nest1), 0)}",
|
||||||
|
}
|
||||||
|
).resolve() == {"output": Integer(4)}
|
||||||
|
|
@ -4,11 +4,8 @@ import pytest
|
||||||
|
|
||||||
from ytdl_sub.script.parser import FUNCTION_INVALID_CHAR
|
from ytdl_sub.script.parser import FUNCTION_INVALID_CHAR
|
||||||
from ytdl_sub.script.script import Script
|
from ytdl_sub.script.script import Script
|
||||||
from ytdl_sub.script.types.array import ResolvedArray
|
|
||||||
from ytdl_sub.script.types.resolvable import Boolean
|
from ytdl_sub.script.types.resolvable import Boolean
|
||||||
from ytdl_sub.script.types.resolvable import Integer
|
|
||||||
from ytdl_sub.script.types.resolvable import String
|
from ytdl_sub.script.types.resolvable import String
|
||||||
from ytdl_sub.script.utils.exceptions import CycleDetected
|
|
||||||
from ytdl_sub.script.utils.exceptions import FunctionDoesNotExist
|
from ytdl_sub.script.utils.exceptions import FunctionDoesNotExist
|
||||||
from ytdl_sub.script.utils.exceptions import FunctionRuntimeException
|
from ytdl_sub.script.utils.exceptions import FunctionRuntimeException
|
||||||
from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments
|
from ytdl_sub.script.utils.exceptions import IncompatibleFunctionArguments
|
||||||
|
|
@ -117,104 +114,3 @@ class TestFunction:
|
||||||
match=re.escape(str(FUNCTION_INVALID_CHAR)),
|
match=re.escape(str(FUNCTION_INVALID_CHAR)),
|
||||||
):
|
):
|
||||||
Script({"dne": "{%throw}"}).resolve()
|
Script({"dne": "{%throw}"}).resolve()
|
||||||
|
|
||||||
def test_custom_function_use_input_param_multiple_times(self):
|
|
||||||
assert Script(
|
|
||||||
{
|
|
||||||
"%custom_square": "{%mul($0, $0)}",
|
|
||||||
"output": "{%custom_square(3)}",
|
|
||||||
}
|
|
||||||
).resolve() == {"output": Integer(9)}
|
|
||||||
|
|
||||||
def test_custom_function_cycle(self):
|
|
||||||
with pytest.raises(
|
|
||||||
CycleDetected, match=re.escape("The custom function %cycle_func cannot call itself.")
|
|
||||||
):
|
|
||||||
Script(
|
|
||||||
{"%cycle_func": "{%mul(%cycle_func(1), $0)}", "output": "{%cycle_func(1)}"}
|
|
||||||
).resolve()
|
|
||||||
|
|
||||||
def test_custom_function_chained_cycle(self):
|
|
||||||
with pytest.raises(
|
|
||||||
CycleDetected,
|
|
||||||
match=re.escape(
|
|
||||||
"Custom functions contain a cycle: %cycle_func1 -> %cycle_func0 -> %cycle_func1"
|
|
||||||
),
|
|
||||||
):
|
|
||||||
Script(
|
|
||||||
{
|
|
||||||
"%cycle_func1": "{%mul(%cycle_func0(1), $0)}",
|
|
||||||
"%cycle_func0": "{%mul(%cycle_func1(1), $0)}",
|
|
||||||
"output": "{%cycle_func0(1)}",
|
|
||||||
}
|
|
||||||
).resolve()
|
|
||||||
|
|
||||||
def test_custom_function_deep_chained_cycle(self):
|
|
||||||
with pytest.raises(
|
|
||||||
CycleDetected,
|
|
||||||
match=re.escape(
|
|
||||||
"Custom functions contain a cycle: "
|
|
||||||
"%cycle_func4 -> "
|
|
||||||
"%cycle_func0 -> "
|
|
||||||
"%cycle_func1 -> "
|
|
||||||
"%cycle_func2 -> "
|
|
||||||
"%cycle_func3 -> "
|
|
||||||
"%cycle_func4"
|
|
||||||
),
|
|
||||||
):
|
|
||||||
Script(
|
|
||||||
{
|
|
||||||
"%nested_safe_func": "{%mul($0, 1)}",
|
|
||||||
"%safe_func": "{%nested_safe_func($0, 1)}",
|
|
||||||
"%cycle_func4": "{%mul(%cycle_func0(1), %safe_func($0))}",
|
|
||||||
"%cycle_func3": "{%mul(%cycle_func4(1), %safe_func($0))}",
|
|
||||||
"%cycle_func2": "{%mul(%cycle_func3(1), %safe_func($0))}",
|
|
||||||
"%cycle_func1": "{%mul(%cycle_func2(1), %safe_func($0))}",
|
|
||||||
"%cycle_func0": "{%mul(%cycle_func1(1), %safe_func($0))}",
|
|
||||||
"output": "{%cycle_func0(1)}",
|
|
||||||
}
|
|
||||||
).resolve()
|
|
||||||
|
|
||||||
def test_lambda_with_custom_function(self):
|
|
||||||
assert Script(
|
|
||||||
{"%times_two": "{%mul($0, 2)}", "wip": "{%array_apply([1, 2, 3], %times_two)}"}
|
|
||||||
).resolve() == {"wip": ResolvedArray([Integer(2), Integer(4), Integer(6)])}
|
|
||||||
|
|
||||||
def test_conditional_lambda_with_custom_functions(self):
|
|
||||||
assert Script(
|
|
||||||
{
|
|
||||||
"%times_three": "{%mul($0, 3)}",
|
|
||||||
"%times_two": "{%mul($0, 2)}",
|
|
||||||
"wip": "{%array_apply([1, 2, 3], %if(False, %times_two, %times_three))}",
|
|
||||||
}
|
|
||||||
).resolve() == {"wip": ResolvedArray([Integer(3), Integer(6), Integer(9)])}
|
|
||||||
|
|
||||||
def test_nested_custom_functions(self):
|
|
||||||
assert Script(
|
|
||||||
{
|
|
||||||
"%times_three": "{%mul($0, 3)}",
|
|
||||||
"%times_two": "{%mul($0, 2)}",
|
|
||||||
"identity": "{%times_three(%times_two(1))}",
|
|
||||||
}
|
|
||||||
).resolve() == {"identity": Integer(6)}
|
|
||||||
|
|
||||||
def test_nested_custom_functions_within_custom_functions(self):
|
|
||||||
assert Script(
|
|
||||||
{
|
|
||||||
"%power_2": "{%mul($0, 2)}",
|
|
||||||
"%power_3": "{%mul(%power_2($0), 2)}",
|
|
||||||
"%power_4": "{%mul(%power_3($0), 2)}",
|
|
||||||
"power_of_4": "{%power_4(2)}",
|
|
||||||
}
|
|
||||||
).resolve() == {"power_of_4": Integer(16)}
|
|
||||||
|
|
||||||
def test_nested_lambda_custom_functions_within_custom_functions(self):
|
|
||||||
assert Script(
|
|
||||||
{
|
|
||||||
"%nest4": "{%mul($0, 2)}",
|
|
||||||
"%nest3": "{%array_at(%array_apply([$0], %nest4), 0)}",
|
|
||||||
"%nest2": "{%array_at(%array_apply([$0], %nest3), 0)}",
|
|
||||||
"%nest1": "{%array_at(%array_apply([$0], %nest2), 0)}",
|
|
||||||
"output": "{%array_at(%array_apply([2], %nest1), 0)}",
|
|
||||||
}
|
|
||||||
).resolve() == {"output": Integer(4)}
|
|
||||||
|
|
|
||||||
49
tests/unit/script/types/test_lambda_function.py
Normal file
49
tests/unit/script/types/test_lambda_function.py
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
from ytdl_sub.script.script import Script
|
||||||
|
from ytdl_sub.script.types.array import ResolvedArray
|
||||||
|
from ytdl_sub.script.types.resolvable import Integer
|
||||||
|
|
||||||
|
|
||||||
|
class TestLambdaFunction:
|
||||||
|
def test_lambda_with_custom_function(self):
|
||||||
|
assert Script(
|
||||||
|
{"%times_two": "{%mul($0, 2)}", "wip": "{%array_apply([1, 2, 3], %times_two)}"}
|
||||||
|
).resolve() == {"wip": ResolvedArray([Integer(2), Integer(4), Integer(6)])}
|
||||||
|
|
||||||
|
def test_conditional_lambda_with_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%times_three": "{%mul($0, 3)}",
|
||||||
|
"%times_two": "{%mul($0, 2)}",
|
||||||
|
"wip": "{%array_apply([1, 2, 3], %if(False, %times_two, %times_three))}",
|
||||||
|
}
|
||||||
|
).resolve() == {"wip": ResolvedArray([Integer(3), Integer(6), Integer(9)])}
|
||||||
|
|
||||||
|
def test_nested_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%times_three": "{%mul($0, 3)}",
|
||||||
|
"%times_two": "{%mul($0, 2)}",
|
||||||
|
"identity": "{%times_three(%times_two(1))}",
|
||||||
|
}
|
||||||
|
).resolve() == {"identity": Integer(6)}
|
||||||
|
|
||||||
|
def test_nested_custom_functions_within_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%power_2": "{%mul($0, 2)}",
|
||||||
|
"%power_3": "{%mul(%power_2($0), 2)}",
|
||||||
|
"%power_4": "{%mul(%power_3($0), 2)}",
|
||||||
|
"power_of_4": "{%power_4(2)}",
|
||||||
|
}
|
||||||
|
).resolve() == {"power_of_4": Integer(16)}
|
||||||
|
|
||||||
|
def test_nested_lambda_custom_functions_within_custom_functions(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"%nest4": "{%mul($0, 2)}",
|
||||||
|
"%nest3": "{%array_at(%array_apply([$0], %nest4), 0)}",
|
||||||
|
"%nest2": "{%array_at(%array_apply([$0], %nest3), 0)}",
|
||||||
|
"%nest1": "{%array_at(%array_apply([$0], %nest2), 0)}",
|
||||||
|
"output": "{%array_at(%array_apply([2], %nest1), 0)}",
|
||||||
|
}
|
||||||
|
).resolve() == {"output": Integer(4)}
|
||||||
Loading…
Reference in a new issue