134 lines
4.1 KiB
Python
134 lines
4.1 KiB
Python
"""Tests for core.combination_engine module."""
|
|
|
|
import pytest
|
|
from core.combination_engine import cartesian, linear_zip, get_axis_labels
|
|
|
|
|
|
def _make_param(name, values, title="KSampler", widget="steps"):
|
|
return {
|
|
"name": name,
|
|
"parsed_values": values,
|
|
"target_node_title": title,
|
|
"target_widget_name": widget,
|
|
}
|
|
|
|
|
|
class TestCartesian:
|
|
def test_single_param(self):
|
|
params = [_make_param("steps", [10, 20, 30])]
|
|
result = cartesian(params)
|
|
assert len(result) == 3
|
|
assert result[0][0] == ("steps", 10, {"target_node_title": "KSampler", "target_widget_name": "steps"})
|
|
assert result[1][0][1] == 20
|
|
assert result[2][0][1] == 30
|
|
|
|
def test_two_params(self):
|
|
params = [
|
|
_make_param("steps", [10, 20]),
|
|
_make_param("cfg", [5, 7, 9], widget="cfg"),
|
|
]
|
|
result = cartesian(params)
|
|
assert len(result) == 6 # 2 x 3
|
|
|
|
# Verify all combinations present
|
|
values = [(c[0][1], c[1][1]) for c in result]
|
|
assert (10, 5) in values
|
|
assert (10, 7) in values
|
|
assert (10, 9) in values
|
|
assert (20, 5) in values
|
|
assert (20, 7) in values
|
|
assert (20, 9) in values
|
|
|
|
def test_three_params(self):
|
|
params = [
|
|
_make_param("a", [1, 2]),
|
|
_make_param("b", [3, 4]),
|
|
_make_param("c", [5, 6]),
|
|
]
|
|
result = cartesian(params)
|
|
assert len(result) == 8 # 2 x 2 x 2
|
|
|
|
def test_empty_params(self):
|
|
assert cartesian([]) == []
|
|
|
|
def test_empty_values(self):
|
|
params = [_make_param("steps", [])]
|
|
assert cartesian(params) == []
|
|
|
|
def test_mixed_empty_and_values(self):
|
|
params = [
|
|
_make_param("steps", [10, 20]),
|
|
_make_param("cfg", []),
|
|
]
|
|
result = cartesian(params)
|
|
assert len(result) == 2 # Only "steps" is active
|
|
|
|
def test_preserves_target_info(self):
|
|
params = [
|
|
_make_param("steps", [10], title="MySampler", widget="my_steps"),
|
|
]
|
|
result = cartesian(params)
|
|
assert result[0][0][2] == {
|
|
"target_node_title": "MySampler",
|
|
"target_widget_name": "my_steps",
|
|
}
|
|
|
|
|
|
class TestLinearZip:
|
|
def test_equal_length(self):
|
|
params = [
|
|
_make_param("steps", [10, 20, 30]),
|
|
_make_param("cfg", [5, 7, 9], widget="cfg"),
|
|
]
|
|
result = linear_zip(params)
|
|
assert len(result) == 3
|
|
assert result[0][0][1] == 10 and result[0][1][1] == 5
|
|
assert result[1][0][1] == 20 and result[1][1][1] == 7
|
|
assert result[2][0][1] == 30 and result[2][1][1] == 9
|
|
|
|
def test_unequal_length_cycles(self):
|
|
params = [
|
|
_make_param("steps", [10, 20, 30]),
|
|
_make_param("cfg", [5, 7], widget="cfg"),
|
|
]
|
|
result = linear_zip(params)
|
|
assert len(result) == 3 # Length of longest
|
|
assert result[0][1][1] == 5
|
|
assert result[1][1][1] == 7
|
|
assert result[2][1][1] == 5 # Cycled back
|
|
|
|
def test_single_param(self):
|
|
params = [_make_param("steps", [10, 20])]
|
|
result = linear_zip(params)
|
|
assert len(result) == 2
|
|
|
|
def test_empty(self):
|
|
assert linear_zip([]) == []
|
|
|
|
def test_one_value_cycles(self):
|
|
params = [
|
|
_make_param("steps", [10, 20, 30]),
|
|
_make_param("cfg", [5], widget="cfg"),
|
|
]
|
|
result = linear_zip(params)
|
|
assert len(result) == 3
|
|
assert all(c[1][1] == 5 for c in result) # cfg always 5
|
|
|
|
|
|
class TestGetAxisLabels:
|
|
def test_basic(self):
|
|
params = [
|
|
_make_param("steps", [10, 20]),
|
|
_make_param("cfg", [5, 7, 9], widget="cfg"),
|
|
]
|
|
combos = cartesian(params)
|
|
labels = get_axis_labels(combos, ["steps", "cfg"])
|
|
assert labels["steps"] == [10, 20]
|
|
assert labels["cfg"] == [5, 7, 9]
|
|
|
|
def test_preserves_order(self):
|
|
params = [_make_param("steps", [30, 10, 20])]
|
|
combos = cartesian(params)
|
|
labels = get_axis_labels(combos, ["steps"])
|
|
assert labels["steps"] == [30, 10, 20]
|