asnyc background
This commit is contained in:
@@ -419,3 +419,195 @@ class TestAlignmentManager:
|
||||
|
||||
assert abs(gap1 - 50) < 0.01
|
||||
assert abs(gap2 - 50) < 0.01
|
||||
|
||||
def test_maximize_pattern_empty_list(self):
|
||||
"""Test maximize_pattern with empty list"""
|
||||
changes = AlignmentManager.maximize_pattern([], (297, 210))
|
||||
assert changes == []
|
||||
|
||||
def test_maximize_pattern_single_element(self):
|
||||
"""Test maximize_pattern with single element"""
|
||||
# Small element in the middle of the page
|
||||
elem = ImageData(x=100, y=80, width=20, height=15)
|
||||
page_size = (297, 210) # A4 landscape in mm
|
||||
|
||||
changes = AlignmentManager.maximize_pattern([elem], page_size, min_gap=2.0)
|
||||
|
||||
# Element should grow significantly
|
||||
assert elem.size[0] > 20
|
||||
assert elem.size[1] > 15
|
||||
|
||||
# Should maintain aspect ratio
|
||||
original_aspect = 20 / 15
|
||||
new_aspect = elem.size[0] / elem.size[1]
|
||||
assert abs(original_aspect - new_aspect) < 0.01
|
||||
|
||||
# Should not exceed page boundaries (with min_gap)
|
||||
assert elem.position[0] >= 2.0
|
||||
assert elem.position[1] >= 2.0
|
||||
assert elem.position[0] + elem.size[0] <= 297 - 2.0
|
||||
assert elem.position[1] + elem.size[1] <= 210 - 2.0
|
||||
|
||||
# Check undo information
|
||||
assert len(changes) == 1
|
||||
assert changes[0][0] == elem
|
||||
assert changes[0][1] == (100, 80) # old position
|
||||
assert changes[0][2] == (20, 15) # old size
|
||||
|
||||
def test_maximize_pattern_two_elements_horizontal(self):
|
||||
"""Test maximize_pattern with two elements side by side"""
|
||||
elem1 = ImageData(x=50, y=80, width=20, height=20)
|
||||
elem2 = ImageData(x=200, y=80, width=20, height=20)
|
||||
page_size = (297, 210) # A4 landscape in mm
|
||||
|
||||
changes = AlignmentManager.maximize_pattern([elem1, elem2], page_size, min_gap=2.0)
|
||||
|
||||
# Both elements should grow
|
||||
assert elem1.size[0] > 20 and elem1.size[1] > 20
|
||||
assert elem2.size[0] > 20 and elem2.size[1] > 20
|
||||
|
||||
# Elements should not overlap (min_gap = 2.0)
|
||||
gap_x = max(
|
||||
elem2.position[0] - (elem1.position[0] + elem1.size[0]),
|
||||
elem1.position[0] - (elem2.position[0] + elem2.size[0])
|
||||
)
|
||||
gap_y = max(
|
||||
elem2.position[1] - (elem1.position[1] + elem1.size[1]),
|
||||
elem1.position[1] - (elem2.position[1] + elem2.size[1])
|
||||
)
|
||||
|
||||
# Either horizontal or vertical gap should be >= min_gap
|
||||
assert gap_x >= 2.0 or gap_y >= 2.0
|
||||
|
||||
# Both elements should respect page boundaries
|
||||
for elem in [elem1, elem2]:
|
||||
assert elem.position[0] >= 2.0
|
||||
assert elem.position[1] >= 2.0
|
||||
assert elem.position[0] + elem.size[0] <= 297 - 2.0
|
||||
assert elem.position[1] + elem.size[1] <= 210 - 2.0
|
||||
|
||||
def test_maximize_pattern_three_elements_grid(self):
|
||||
"""Test maximize_pattern with three elements in a grid pattern"""
|
||||
elem1 = ImageData(x=50, y=50, width=15, height=15)
|
||||
elem2 = ImageData(x=150, y=50, width=15, height=15)
|
||||
elem3 = ImageData(x=100, y=120, width=15, height=15)
|
||||
page_size = (297, 210) # A4 landscape in mm
|
||||
|
||||
changes = AlignmentManager.maximize_pattern([elem1, elem2, elem3], page_size, min_gap=2.0)
|
||||
|
||||
# All elements should grow
|
||||
for elem in [elem1, elem2, elem3]:
|
||||
assert elem.size[0] > 15
|
||||
assert elem.size[1] > 15
|
||||
|
||||
# Check no overlaps with min_gap
|
||||
elements = [elem1, elem2, elem3]
|
||||
for i, elem_a in enumerate(elements):
|
||||
for j, elem_b in enumerate(elements):
|
||||
if i >= j:
|
||||
continue
|
||||
|
||||
# Calculate gaps between rectangles
|
||||
gap_x = max(
|
||||
elem_b.position[0] - (elem_a.position[0] + elem_a.size[0]),
|
||||
elem_a.position[0] - (elem_b.position[0] + elem_b.size[0])
|
||||
)
|
||||
gap_y = max(
|
||||
elem_b.position[1] - (elem_a.position[1] + elem_a.size[1]),
|
||||
elem_a.position[1] - (elem_b.position[1] + elem_b.size[1])
|
||||
)
|
||||
|
||||
# At least one gap should be >= min_gap
|
||||
assert gap_x >= 2.0 or gap_y >= 2.0
|
||||
|
||||
# Check undo information
|
||||
assert len(changes) == 3
|
||||
|
||||
def test_maximize_pattern_respects_boundaries(self):
|
||||
"""Test that maximize_pattern respects page boundaries"""
|
||||
elem = ImageData(x=10, y=10, width=10, height=10)
|
||||
page_size = (100, 100)
|
||||
min_gap = 5.0
|
||||
|
||||
changes = AlignmentManager.maximize_pattern([elem], page_size, min_gap=min_gap)
|
||||
|
||||
# Element should not exceed boundaries
|
||||
assert elem.position[0] >= min_gap
|
||||
assert elem.position[1] >= min_gap
|
||||
assert elem.position[0] + elem.size[0] <= page_size[0] - min_gap
|
||||
assert elem.position[1] + elem.size[1] <= page_size[1] - min_gap
|
||||
|
||||
def test_maximize_pattern_maintains_aspect_ratio(self):
|
||||
"""Test that maximize_pattern maintains element aspect ratios"""
|
||||
elem1 = ImageData(x=50, y=50, width=30, height=20) # 3:2 aspect
|
||||
elem2 = ImageData(x=150, y=50, width=20, height=30) # 2:3 aspect
|
||||
page_size = (297, 210)
|
||||
|
||||
original_aspect1 = elem1.size[0] / elem1.size[1]
|
||||
original_aspect2 = elem2.size[0] / elem2.size[1]
|
||||
|
||||
changes = AlignmentManager.maximize_pattern([elem1, elem2], page_size, min_gap=2.0)
|
||||
|
||||
# Aspect ratios should be maintained
|
||||
new_aspect1 = elem1.size[0] / elem1.size[1]
|
||||
new_aspect2 = elem2.size[0] / elem2.size[1]
|
||||
|
||||
assert abs(original_aspect1 - new_aspect1) < 0.01
|
||||
assert abs(original_aspect2 - new_aspect2) < 0.01
|
||||
|
||||
def test_maximize_pattern_with_constrained_space(self):
|
||||
"""Test maximize_pattern when elements are tightly packed"""
|
||||
# Create 4 elements in corners with limited space
|
||||
elem1 = ImageData(x=10, y=10, width=10, height=10)
|
||||
elem2 = ImageData(x=140, y=10, width=10, height=10)
|
||||
elem3 = ImageData(x=10, y=90, width=10, height=10)
|
||||
elem4 = ImageData(x=140, y=90, width=10, height=10)
|
||||
page_size = (160, 110)
|
||||
|
||||
changes = AlignmentManager.maximize_pattern(
|
||||
[elem1, elem2, elem3, elem4],
|
||||
page_size,
|
||||
min_gap=2.0
|
||||
)
|
||||
|
||||
# All elements should grow
|
||||
for elem in [elem1, elem2, elem3, elem4]:
|
||||
assert elem.size[0] > 10
|
||||
assert elem.size[1] > 10
|
||||
|
||||
# Verify no overlaps
|
||||
elements = [elem1, elem2, elem3, elem4]
|
||||
for i, elem_a in enumerate(elements):
|
||||
for j, elem_b in enumerate(elements):
|
||||
if i >= j:
|
||||
continue
|
||||
|
||||
gap_x = max(
|
||||
elem_b.position[0] - (elem_a.position[0] + elem_a.size[0]),
|
||||
elem_a.position[0] - (elem_b.position[0] + elem_b.size[0])
|
||||
)
|
||||
gap_y = max(
|
||||
elem_b.position[1] - (elem_a.position[1] + elem_a.size[1]),
|
||||
elem_a.position[1] - (elem_b.position[1] + elem_b.size[1])
|
||||
)
|
||||
|
||||
assert gap_x >= 2.0 or gap_y >= 2.0
|
||||
|
||||
def test_maximize_pattern_with_different_element_types(self):
|
||||
"""Test maximize_pattern works with different element types"""
|
||||
elem1 = ImageData(x=50, y=50, width=20, height=20)
|
||||
elem2 = PlaceholderData(placeholder_type="image", x=150, y=50, width=20, height=20)
|
||||
elem3 = TextBoxData(text_content="Test", x=100, y=120, width=20, height=20)
|
||||
page_size = (297, 210)
|
||||
|
||||
changes = AlignmentManager.maximize_pattern([elem1, elem2, elem3], page_size, min_gap=2.0)
|
||||
|
||||
# All elements should grow
|
||||
assert elem1.size[0] > 20
|
||||
assert elem2.size[0] > 20
|
||||
assert elem3.size[0] > 20
|
||||
|
||||
# Check undo information has correct element types
|
||||
assert isinstance(changes[0][0], ImageData)
|
||||
assert isinstance(changes[1][0], PlaceholderData)
|
||||
assert isinstance(changes[2][0], TextBoxData)
|
||||
|
||||
Reference in New Issue
Block a user