Skip to content

Commit 75673b8

Browse files
committed
updated github action to only use the new default non gpu tests
1 parent af766b9 commit 75673b8

11 files changed

Lines changed: 142 additions & 130 deletions

test_all.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
uv run pytest
44
uv run pytest -m opengl
55
uv run pytest -m webgpu
6+
uv run pytest -m qt

tests/conftest.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ def pytest_configure(config):
99
"""Configure pytest with custom markers."""
1010
config.addinivalue_line("markers", "opengl: mark test as using an OpenGL context")
1111
config.addinivalue_line("markers", "webgpu: mark test as using a WebGPU device")
12+
config.addinivalue_line("markers", "qt: mark test as using qt for ")
1213

1314

1415
def pytest_collection_modifyitems(config, items):
@@ -27,14 +28,18 @@ def pytest_collection_modifyitems(config, items):
2728
item.add_marker(pytest.mark.opengl)
2829
elif "webgpu_device" in fixtures:
2930
item.add_marker(pytest.mark.webgpu)
31+
elif "qt_app" in fixtures:
32+
item.add_marker(pytest.mark.qt)
3033
return
3134

3235
# If no marker is specified, manually partition the tests.
3336
remaining_items = []
3437
deselected_items = []
3538
for item in items:
3639
fixtures = getattr(item, "fixturenames", [])
37-
is_graphics = "opengl_context" in fixtures or "webgpu_device" in fixtures
40+
41+
is_graphics = "opengl_context" in fixtures or "webgpu_device" in fixtures or "qt_app" in fixtures
42+
3843
if is_graphics:
3944
deselected_items.append(item)
4045
else:
@@ -46,6 +51,10 @@ def pytest_collection_modifyitems(config, items):
4651
config.hook.pytest_deselected(items=deselected_items)
4752

4853

54+
@pytest.fixture(scope="session")
55+
def qt_app(): ...
56+
57+
4958
@pytest.fixture(scope="session")
5059
def opengl_context():
5160
if not glfw.init():

tests/test_lookat_widget.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22
from PySide6.QtCore import Qt
33
from PySide6.QtTest import QTest
44
from PySide6.QtWidgets import QFrame, QVBoxLayout
5+
56
from ncca.ngl import Mat4, Vec3, look_at
67
from ncca.ngl.widgets import LookAtWidget
78

89

9-
def test_lookatwidget_initial_value(qtbot):
10+
def test_lookatwidget_initial_value(qt_app, qtbot):
1011
"""Test default initialization values."""
1112
widget = LookAtWidget()
1213
qtbot.addWidget(widget)
@@ -18,7 +19,7 @@ def test_lookatwidget_initial_value(qtbot):
1819
assert widget.get_name() == ""
1920

2021

21-
def test_lookatwidget_constructor_with_parameters(qtbot):
22+
def test_lookatwidget_constructor_with_parameters(qt_app, qtbot):
2223
"""Test initialization with custom parameters."""
2324
eye = Vec3(5, 5, 5)
2425
look = Vec3(1, 1, 1)
@@ -33,7 +34,7 @@ def test_lookatwidget_constructor_with_parameters(qtbot):
3334
assert widget._toggle_button.text() == name
3435

3536

36-
def test_set_eye(qtbot):
37+
def test_set_eye(qt_app, qtbot):
3738
"""Test setting the eye position."""
3839
widget = LookAtWidget()
3940
qtbot.addWidget(widget)
@@ -44,7 +45,7 @@ def test_set_eye(qtbot):
4445
assert widget.get_eye() == new_eye
4546

4647

47-
def test_set_look(qtbot):
48+
def test_set_look(qt_app, qtbot):
4849
"""Test setting the look-at position."""
4950
widget = LookAtWidget()
5051
qtbot.addWidget(widget)
@@ -55,7 +56,7 @@ def test_set_look(qtbot):
5556
assert widget.get_look() == new_look
5657

5758

58-
def test_set_up(qtbot):
59+
def test_set_up(qt_app, qtbot):
5960
"""Test setting the up vector via index."""
6061
widget = LookAtWidget()
6162
qtbot.addWidget(widget)
@@ -73,7 +74,7 @@ def test_set_up(qtbot):
7374
assert widget.get_up() == Vec3(0, 0, 1)
7475

7576

76-
def test_set_name(qtbot):
77+
def test_set_name(qt_app, qtbot):
7778
"""Test setting the widget name."""
7879
widget = LookAtWidget()
7980
qtbot.addWidget(widget)
@@ -85,7 +86,7 @@ def test_set_name(qtbot):
8586
assert widget._toggle_button.text() == new_name
8687

8788

88-
def test_property_accessors(qtbot):
89+
def test_property_accessors(qt_app, qtbot):
8990
"""Test Qt Property wrappers."""
9091
widget = LookAtWidget()
9192
qtbot.addWidget(widget)
@@ -103,7 +104,7 @@ def test_property_accessors(qtbot):
103104
assert widget.get_name() == "PropertyCamera"
104105

105106

106-
def test_value_changed_signal_on_eye_change(qtbot):
107+
def test_value_changed_signal_on_eye_change(qt_app, qtbot):
107108
"""Test that valueChanged signal emits when eye position changes."""
108109
widget = LookAtWidget()
109110
qtbot.addWidget(widget)
@@ -115,7 +116,7 @@ def test_value_changed_signal_on_eye_change(qtbot):
115116
assert isinstance(signal.args[0], Mat4)
116117

117118

118-
def test_value_changed_signal_on_look_change(qtbot):
119+
def test_value_changed_signal_on_look_change(qt_app, qtbot):
119120
"""Test that valueChanged signal emits when look position changes."""
120121
widget = LookAtWidget()
121122
qtbot.addWidget(widget)
@@ -127,7 +128,7 @@ def test_value_changed_signal_on_look_change(qtbot):
127128
assert isinstance(signal.args[0], Mat4)
128129

129130

130-
def test_value_changed_signal_on_up_change(qtbot):
131+
def test_value_changed_signal_on_up_change(qt_app, qtbot):
131132
"""Test that valueChanged signal emits when up vector changes."""
132133
widget = LookAtWidget()
133134
qtbot.addWidget(widget)
@@ -139,7 +140,7 @@ def test_value_changed_signal_on_up_change(qtbot):
139140
assert isinstance(signal.args[0], Mat4)
140141

141142

142-
def test_view_matrix_calculation(qtbot):
143+
def test_view_matrix_calculation(qt_app, qtbot):
143144
"""Test that the view matrix is calculated correctly."""
144145
eye = Vec3(0, 0, 5)
145146
look = Vec3(0, 0, 0)
@@ -160,7 +161,7 @@ def test_view_matrix_calculation(qtbot):
160161
assert view_matrix[i][j] == pytest.approx(expected_matrix[i][j])
161162

162163

163-
def test_view_matrix_updates_on_parameter_change(qtbot):
164+
def test_view_matrix_updates_on_parameter_change(qt_app, qtbot):
164165
"""Test that view matrix updates when parameters change."""
165166
widget = LookAtWidget()
166167
qtbot.addWidget(widget)
@@ -176,7 +177,7 @@ def test_view_matrix_updates_on_parameter_change(qtbot):
176177
assert initial_view != updated_view
177178

178179

179-
def test_toggle_collapsed_expand(qtbot):
180+
def test_toggle_collapsed_expand(qt_app, qtbot):
180181
"""Test expanding the collapsible section."""
181182
widget = LookAtWidget()
182183
qtbot.addWidget(widget)
@@ -189,7 +190,7 @@ def test_toggle_collapsed_expand(qtbot):
189190
assert widget._toggle_button.arrowType() == Qt.ArrowType.DownArrow
190191

191192

192-
def test_toggle_collapsed_collapse(qtbot):
193+
def test_toggle_collapsed_collapse(qt_app, qtbot):
193194
"""Test collapsing the collapsible section."""
194195
widget = LookAtWidget()
195196
qtbot.addWidget(widget)
@@ -202,7 +203,7 @@ def test_toggle_collapsed_collapse(qtbot):
202203
assert widget._toggle_button.arrowType() == Qt.ArrowType.RightArrow
203204

204205

205-
def test_toggle_collapsed_toggle_sequence(qtbot):
206+
def test_toggle_collapsed_toggle_sequence(qt_app, qtbot):
206207
"""Test toggling between collapsed and expanded states."""
207208
widget = LookAtWidget()
208209
qtbot.addWidget(widget)
@@ -221,7 +222,7 @@ def test_toggle_collapsed_toggle_sequence(qtbot):
221222
assert widget._content_widget.isVisible()
222223

223224

224-
def test_world_up_vectors(qtbot):
225+
def test_world_up_vectors(qt_app, qtbot):
225226
"""Test that world_up class variable contains correct vectors."""
226227
widget = LookAtWidget()
227228
qtbot.addWidget(widget)
@@ -231,7 +232,7 @@ def test_world_up_vectors(qtbot):
231232
assert LookAtWidget.world_up[2] == Vec3(0, 0, 1) # z-up
232233

233234

234-
def test_combobox_items(qtbot):
235+
def test_combobox_items(qt_app, qtbot):
235236
"""Test that the up vector combobox has correct items."""
236237
widget = LookAtWidget()
237238
qtbot.addWidget(widget)
@@ -242,7 +243,7 @@ def test_combobox_items(qtbot):
242243
assert widget._up.itemText(2) == "z-up"
243244

244245

245-
def test_matrix_recalculation_with_different_up_vectors(qtbot):
246+
def test_matrix_recalculation_with_different_up_vectors(qt_app, qtbot):
246247
"""Test that changing up vector produces different view matrices."""
247248
widget = LookAtWidget(eye=Vec3(5, 5, 5), look=Vec3(0, 0, 0))
248249
qtbot.addWidget(widget)
@@ -265,7 +266,7 @@ def test_matrix_recalculation_with_different_up_vectors(qtbot):
265266
assert matrix_x_up != matrix_z_up
266267

267268

268-
def test_multiple_value_changed_emissions(qtbot):
269+
def test_multiple_value_changed_emissions(qt_app, qtbot):
269270
"""Test that multiple changes emit multiple signals."""
270271
widget = LookAtWidget()
271272
qtbot.addWidget(widget)

tests/test_pyside_event_handling_mixin.py

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
and camera state management functionality.
66
"""
77

8-
from unittest.mock import Mock, patch
8+
from unittest.mock import MagicMock, Mock
99

1010
import pytest
1111
from PySide6.QtCore import QPointF, Qt
@@ -30,7 +30,7 @@ def close(self) -> None:
3030

3131

3232
@pytest.fixture
33-
def event_window():
33+
def event_window(qt_app):
3434
"""Create a test window with event handling"""
3535
window = MockEventHandlingWindow()
3636
window.setup_event_handling()
@@ -53,7 +53,7 @@ def test_setup_event_handling_default_values(event_window):
5353
assert event_window.zoom_sensitivity == PySideEventHandlingMixin.DEFAULT_ZOOM_SENSITIVITY
5454

5555

56-
def test_setup_event_handling_custom_values():
56+
def test_setup_event_handling_custom_values(qt_app):
5757
"""Test setup_event_handling with custom parameters"""
5858
window = MockEventHandlingWindow()
5959
initial_pos = Vec3(1, 2, 3)
@@ -104,24 +104,29 @@ def test_key_press_event_escape(event_window):
104104
assert event_window.update_called is True
105105

106106

107-
@patch("OpenGL.GL.glPolygonMode")
108-
def test_key_press_event_wireframe_mode(mock_gl_polygon_mode, event_window):
107+
def test_key_press_event_wireframe_mode(event_window, monkeypatch):
109108
"""Test W key switches to wireframe mode"""
110109
event = Mock()
111110
event.key.return_value = Qt.Key_W
112111

112+
mock_gl_polygon_mode = MagicMock()
113+
# Use fixture-provided monkeypatch to set attribute (non-raising to avoid import issues)
114+
monkeypatch.setattr("OpenGL.GL.glPolygonMode", mock_gl_polygon_mode, raising=False)
115+
113116
event_window.keyPressEvent(event)
114117

115118
mock_gl_polygon_mode.assert_called_once()
116119
assert event_window.update_called is True
117120

118121

119-
@patch("OpenGL.GL.glPolygonMode")
120-
def test_key_press_event_solid_mode(mock_gl_polygon_mode, event_window):
122+
def test_key_press_event_solid_mode(event_window, monkeypatch):
121123
"""Test S key switches to solid fill mode"""
122124
event = Mock()
123125
event.key.return_value = Qt.Key_S
124126

127+
mock_gl_polygon_mode = MagicMock()
128+
monkeypatch.setattr("OpenGL.GL.glPolygonMode", mock_gl_polygon_mode, raising=False)
129+
125130
event_window.keyPressEvent(event)
126131

127132
mock_gl_polygon_mode.assert_called_once()
@@ -146,19 +151,18 @@ def test_key_press_event_space_reset(event_window):
146151
assert event_window.update_called is True
147152

148153

149-
def test_key_press_event_other_key(event_window):
154+
def test_key_press_event_other_key(event_window, monkeypatch):
150155
"""Test other keys call parent keyPressEvent"""
151156
event = Mock()
152157
event.key.return_value = Qt.Key_A
153158

154-
# Mock super() call
155-
with patch("builtins.super") as mock_super:
156-
mock_parent = Mock()
157-
mock_super.return_value = mock_parent
159+
# Mock super() call by temporarily replacing builtins.super via monkeypatch
160+
mock_parent = Mock()
161+
monkeypatch.setattr("builtins.super", lambda *args, **kwargs: mock_parent, raising=False)
158162

159-
event_window.keyPressEvent(event)
163+
event_window.keyPressEvent(event)
160164

161-
mock_parent.keyPressEvent.assert_called_once_with(event)
165+
mock_parent.keyPressEvent.assert_called_once_with(event)
162166

163167

164168
def test_mouse_press_event_left_button(event_window):
@@ -337,14 +341,14 @@ def test_wheel_event_zero_delta(event_window):
337341
assert event_window.update_called is True
338342

339343

340-
def test_constants():
344+
def test_constants(qt_app):
341345
"""Test default sensitivity constants"""
342346
assert PySideEventHandlingMixin.DEFAULT_ROTATION_SENSITIVITY == pytest.approx(0.5)
343347
assert PySideEventHandlingMixin.DEFAULT_TRANSLATION_SENSITIVITY == pytest.approx(0.01)
344348
assert PySideEventHandlingMixin.DEFAULT_ZOOM_SENSITIVITY == pytest.approx(0.1)
345349

346350

347-
def test_mouse_movement_rotation_with_different_sensitivity():
351+
def test_mouse_movement_rotation_with_different_sensitivity(qt_app):
348352
"""Test mouse rotation with different sensitivity values"""
349353
window = MockEventHandlingWindow()
350354
window.setup_event_handling(rotation_sensitivity=2.0)
@@ -366,7 +370,7 @@ def test_mouse_movement_rotation_with_different_sensitivity():
366370
assert window.spin_y_face == 20
367371

368372

369-
def test_mouse_movement_translation_with_different_sensitivity():
373+
def test_mouse_movement_translation_with_different_sensitivity(qt_app):
370374
"""Test mouse translation with different sensitivity values"""
371375
window = MockEventHandlingWindow()
372376
window.setup_event_handling(translation_sensitivity=0.5)
@@ -388,7 +392,7 @@ def test_mouse_movement_translation_with_different_sensitivity():
388392
assert window.model_position.y == pytest.approx(10.0)
389393

390394

391-
def test_event_handling_target_protocol():
395+
def test_event_handling_target_protocol(qt_app):
392396
"""Test that the protocol is properly defined"""
393397

394398
# This should not raise any errors

0 commit comments

Comments
 (0)