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:
@ -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
|
||||
|
Reference in New Issue
Block a user