0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-13 19:21:50 +02:00

test(collapsible_panel_manager): fixture changed to not use .show()

This commit is contained in:
2024-12-11 15:24:59 +01:00
parent a434d3ee57
commit ff654b56ae

View File

@ -1,6 +1,6 @@
import pytest
from qtpy.QtCore import QEasingCurve
from qtpy.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
from qtpy.QtWidgets import QPushButton, QVBoxLayout, QWidget
from bec_widgets.qt_utils.collapsible_panel_manager import (
CollapsiblePanelManager,
@ -8,8 +8,6 @@ from bec_widgets.qt_utils.collapsible_panel_manager import (
)
from bec_widgets.widgets.containers.layout_manager.layout_manager import LayoutManagerWidget
# NOTE the following fixtures has to be done with using .show() method, otherwise qt .isVisible() check will not work!
@pytest.fixture
def reference_widget(qtbot):
@ -18,7 +16,8 @@ def reference_widget(qtbot):
btn = QPushButton("Reference")
layout.addWidget(btn)
qtbot.addWidget(widget)
widget.show()
widget.setVisible(True)
qtbot.waitExposed(widget)
return widget
@ -26,8 +25,9 @@ def reference_widget(qtbot):
def layout_manager(qtbot, reference_widget):
manager = LayoutManagerWidget()
qtbot.addWidget(manager)
manager.show()
manager.add_widget(reference_widget, row=0, col=0)
manager.setVisible(True)
qtbot.waitExposed(manager)
return manager
@ -38,12 +38,13 @@ def panel_manager(layout_manager, reference_widget):
@pytest.fixture
def test_panel_widget():
def test_panel_widget(qtbot):
widget = QWidget()
qtbot.addWidget(widget)
return widget
def test_dimension_animator_width_setting(test_panel_widget):
def test_dimension_animator_width_setting(qtbot, test_panel_widget):
animator = DimensionAnimator(test_panel_widget, "left")
animator.panel_width = 100
assert animator.panel_width == 100
@ -59,14 +60,13 @@ def test_dimension_animator_height_setting(qtbot, test_panel_widget):
def test_add_panel(panel_manager, test_panel_widget):
panel_manager.add_panel("left", test_panel_widget, target_size=200)
# After adding, panel should be hidden and have max width set to 0 (if left/right)
assert panel_manager.panels["left"]["widget"] == test_panel_widget
# Initially hidden
assert not test_panel_widget.isVisible()
assert test_panel_widget.maximumWidth() == 0
def test_add_panel_no_target_size(panel_manager, test_panel_widget):
# Using default target size for direction "top"
panel_manager.add_panel("top", test_panel_widget)
assert panel_manager.panels["top"]["target_size"] == 150
assert not test_panel_widget.isVisible()
@ -80,30 +80,24 @@ def test_add_panel_invalid_direction(panel_manager, test_panel_widget):
def test_toggle_panel_show(panel_manager, test_panel_widget):
panel_manager.add_panel("left", test_panel_widget, target_size=200)
# Initially hidden
assert not test_panel_widget.isVisible()
panel_manager.toggle_panel("left", animation=False)
# After toggle, panel should become visible
assert test_panel_widget.isVisible()
def test_toggle_panel_hide(panel_manager, test_panel_widget):
panel_manager.add_panel("left", test_panel_widget, target_size=200)
panel_manager.toggle_panel("left", animation=False)
# Now panel is visible
assert test_panel_widget.isVisible()
# Toggle again to hide
panel_manager.toggle_panel("left", animation=False)
# Should be invisible after second toggle
assert not test_panel_widget.isVisible()
def test_toggle_panel_scale(panel_manager, test_panel_widget, reference_widget):
reference_widget.resize(800, 600) # Set a known size
reference_widget.resize(800, 600)
panel_manager.add_panel("right", test_panel_widget)
# Toggling with scale=0.25 on a right panel should set final width ~ 800 * 0.25 = 200
panel_manager.toggle_panel("right", scale=0.25, animation=False)
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumWidth() == 200
@ -111,22 +105,17 @@ def test_toggle_panel_scale(panel_manager, test_panel_widget, reference_widget):
def test_toggle_panel_ensure_max(panel_manager, test_panel_widget):
panel_manager.add_panel("bottom", test_panel_widget, target_size=150)
# Ensure fixed height after show
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumHeight() == 150
# Hide again
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
assert not test_panel_widget.isVisible()
# After hide, reset to flexible height
assert test_panel_widget.maximumHeight() == 16777215
def test_toggle_panel_easing_curve(panel_manager, test_panel_widget):
panel_manager.add_panel("top", test_panel_widget, target_size=100, duration=500)
# Just ensure no errors raised when using different easing curves
panel_manager.toggle_panel("top", easing_curve=QEasingCurve.OutBounce, animation=True)
# Hard to test animation directly, but we can check if animation object is stored
assert panel_manager.animations.get(test_panel_widget) is not None
@ -139,30 +128,23 @@ def test_toggle_nonexistent_panel(panel_manager):
def test_toggle_panel_without_animation(panel_manager, test_panel_widget):
panel_manager.add_panel("left", test_panel_widget, target_size=200)
panel_manager.toggle_panel("left", animation=False)
# Visible and max width set
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumWidth() == 200
# Toggle again without animation to hide instantly
panel_manager.toggle_panel("left", animation=False)
assert not test_panel_widget.isVisible()
def test_after_hide_reset(panel_manager, test_panel_widget):
# Test internal method by simulating scenario
panel_manager.add_panel("left", test_panel_widget, target_size=200)
# Show panel with ensure_max
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
assert test_panel_widget.isVisible()
# Hide panel with ensure_max
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
assert not test_panel_widget.isVisible()
# After hide reset should restore flexible sizing
assert test_panel_widget.minimumWidth() == 0
assert test_panel_widget.maximumWidth() == 0
def test_toggle_panel_repeated(panel_manager, test_panel_widget):
# Repeated toggles should show/hide correctly
panel_manager.add_panel("right", test_panel_widget, target_size=200)
panel_manager.toggle_panel("right", animation=False)
assert test_panel_widget.isVisible()
@ -174,7 +156,6 @@ def test_toggle_panel_repeated(panel_manager, test_panel_widget):
def test_toggle_panel_with_custom_duration(panel_manager, test_panel_widget):
panel_manager.add_panel("bottom", test_panel_widget, target_size=150, duration=1000)
# Toggle with overriding duration
panel_manager.toggle_panel("bottom", duration=2000, animation=True)
animation = panel_manager.animations.get(test_panel_widget)
assert animation is not None
@ -184,18 +165,15 @@ def test_toggle_panel_with_custom_duration(panel_manager, test_panel_widget):
def test_toggle_panel_ensure_max_scale(panel_manager, test_panel_widget, reference_widget):
reference_widget.resize(1000, 800)
panel_manager.add_panel("top", test_panel_widget)
# With scale=0.5 on top panel, target size = 800 * 0.5 = 400
panel_manager.toggle_panel("top", ensure_max=True, scale=0.5, animation=False)
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumHeight() == 400
def test_no_animation_mode(panel_manager, test_panel_widget):
# When animation=False, panel should jump instantly to final state
panel_manager.add_panel("left", test_panel_widget, target_size=200)
panel_manager.toggle_panel("left", animation=False)
assert test_panel_widget.isVisible()
# Check again for no animation hide
panel_manager.toggle_panel("left", animation=False)
assert not test_panel_widget.isVisible()
@ -205,17 +183,14 @@ def test_toggle_panel_nondefault_easing(panel_manager, test_panel_widget):
panel_manager.toggle_panel("right", easing_curve=QEasingCurve.InCurve, animation=True)
animation = panel_manager.animations.get(test_panel_widget)
assert animation is not None
# Just ensuring no exceptions and property is set
assert animation.easingCurve() == QEasingCurve.InCurve
def test_toggle_panel_ensure_max_no_animation(panel_manager, test_panel_widget):
panel_manager.add_panel("bottom", test_panel_widget, target_size=150)
# Ensure max with no animation
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumHeight() == 150
# Toggle off ensure max with no animation
panel_manager.toggle_panel("bottom", ensure_max=True, animation=False)
assert not test_panel_widget.isVisible()
assert test_panel_widget.maximumHeight() == 16777215
@ -223,11 +198,9 @@ def test_toggle_panel_ensure_max_no_animation(panel_manager, test_panel_widget):
def test_toggle_panel_new_target_size(panel_manager, test_panel_widget):
panel_manager.add_panel("left", test_panel_widget, target_size=200)
# Toggle with different target_size on the fly
panel_manager.toggle_panel("left", target_size=300, animation=False)
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumWidth() == 300
# Hide panel
panel_manager.toggle_panel("left", animation=False)
assert not test_panel_widget.isVisible()
@ -246,7 +219,6 @@ def test_toggle_panel_wrong_direction(panel_manager):
def test_toggle_panel_no_panels(panel_manager):
# Attempting to toggle a panel that was never added
with pytest.raises(ValueError) as exc:
panel_manager.toggle_panel("top")
assert "No panel found in direction 'top'." in str(exc.value)
@ -258,19 +230,16 @@ def test_multiple_panels_interaction(panel_manager):
panel_manager.add_panel("left", widget_left, target_size=200)
panel_manager.add_panel("right", widget_right, target_size=300)
# Toggle left on
panel_manager.toggle_panel("left", animation=False)
assert widget_left.isVisible()
# Toggle right on
panel_manager.toggle_panel("right", animation=False)
assert widget_right.isVisible()
# Hide left
panel_manager.toggle_panel("left", animation=False)
assert not widget_left.isVisible()
assert widget_right.isVisible()
# Hide right
panel_manager.toggle_panel("right", animation=False)
assert not widget_right.isVisible()
@ -286,11 +255,9 @@ def test_panel_manager_custom_easing(panel_manager, test_panel_widget):
def test_toggle_panel_scale_no_animation(panel_manager, test_panel_widget, reference_widget):
reference_widget.resize(400, 300)
panel_manager.add_panel("bottom", test_panel_widget)
# scale=0.5 for bottom means target_size=300*0.5=150
panel_manager.toggle_panel("bottom", scale=0.5, animation=False)
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumHeight() == 150
# Hide again
panel_manager.toggle_panel("bottom", animation=False)
assert not test_panel_widget.isVisible()
@ -299,28 +266,22 @@ def test_after_hide_reset_properties(panel_manager, test_panel_widget):
panel_manager.add_panel("left", test_panel_widget, target_size=200)
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
panel_manager.toggle_panel("left", ensure_max=True, animation=False)
# After hide reset, properties should revert to flexible sizing
assert not test_panel_widget.isVisible()
assert test_panel_widget.minimumWidth() == 0
# If the direction is left, we also check maximumWidth after hiding
assert test_panel_widget.maximumWidth() == 0
def test_toggle_panel_no_animation_show_only(panel_manager, test_panel_widget):
# Show panel only, no animation
panel_manager.add_panel("right", test_panel_widget, target_size=100)
panel_manager.toggle_panel("right", animation=False)
# Check visible and dimension
assert test_panel_widget.isVisible()
assert test_panel_widget.maximumWidth() == 100
def test_toggle_panel_no_animation_hide_only(panel_manager, test_panel_widget):
# Show first
panel_manager.add_panel("left", test_panel_widget, target_size=100)
panel_manager.toggle_panel("left", animation=False)
assert test_panel_widget.isVisible()
# Now hide without animation
panel_manager.toggle_panel("left", animation=False)
assert not test_panel_widget.isVisible()
@ -341,20 +302,7 @@ def test_toggle_panel_ensure_max_width(panel_manager, test_panel_widget):
def test_toggle_panel_invalid_direction_twice(panel_manager, test_panel_widget):
# Add a valid panel
panel_manager.add_panel("left", test_panel_widget, target_size=200)
# Try toggling invalid direction again
with pytest.raises(ValueError) as exc_info:
panel_manager.toggle_panel("invalid_direction")
assert "No panel found in direction 'invalid_direction'." in str(exc_info.value)
def test_ensure_max_hiding_animation(panel_manager, test_panel_widget):
# Test that ensure_max mode sets a DimensionAnimator and uses it
panel_manager.add_panel("top", test_panel_widget, target_size=150)
panel_manager.toggle_panel("top", ensure_max=True, animation=True)
assert test_panel_widget.isVisible()
# Hide with animation
panel_manager.toggle_panel("top", ensure_max=True, animation=True)
anim = panel_manager.animations.get(test_panel_widget)
assert anim is not None