Files

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]