Skip to content

Commit 62eb444

Browse files
authored
Merge pull request #4454 from silx-kit/dataviewer-pytest
silx.gui.data.test.test_dataviewer: migrate to pytest
2 parents f0cd247 + 935ff0b commit 62eb444

1 file changed

Lines changed: 151 additions & 157 deletions

File tree

src/silx/gui/data/test/test_dataviewer.py

Lines changed: 151 additions & 157 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,7 @@
2525
__license__ = "MIT"
2626
__date__ = "19/02/2019"
2727

28-
import os
29-
import tempfile
3028
import pytest
31-
from contextlib import contextmanager
3229

3330
import numpy
3431
from ..DataViewer import DataViewer
@@ -60,136 +57,173 @@ def getDataPriority(self, data, info):
6057
return 0
6158

6259

63-
class _TestAbstractDataViewer(TestCaseQt):
64-
__test__ = False # ignore abstract class
60+
# https://docs.pytest.org/en/stable/how-to/fixtures.html#parametrizing-fixtures
61+
@pytest.fixture(params=[DataViewer, DataViewerFrame])
62+
def data_viewer_widget(request):
63+
widget = request.param(parent=None)
64+
yield widget
65+
66+
67+
def test_text_data(data_viewer_widget):
68+
data_list = ["aaa", int, 8, object]
69+
for data in data_list:
70+
data_viewer_widget.setData(data)
71+
assert DataViews.RAW_MODE == data_viewer_widget.displayMode()
72+
73+
74+
def test_plot_1d_data(data_viewer_widget):
75+
data = numpy.arange(3**1)
76+
data.shape = [3] * 1
77+
data_viewer_widget.setData(data)
78+
availableModes = {v.modeId() for v in data_viewer_widget.currentAvailableViews()}
79+
assert DataViews.RAW_MODE == data_viewer_widget.displayMode()
80+
assert DataViews.PLOT1D_MODE in availableModes
81+
82+
83+
def test_image_data(data_viewer_widget):
84+
data = numpy.arange(3**2)
85+
data.shape = [3] * 2
86+
data_viewer_widget.setData(data)
87+
availableModes = {v.modeId() for v in data_viewer_widget.currentAvailableViews()}
88+
assert DataViews.RAW_MODE == data_viewer_widget.displayMode()
89+
assert DataViews.PLOT2D_MODE in availableModes
90+
91+
92+
def test_image_bool(data_viewer_widget):
93+
data = numpy.zeros((10, 10), dtype=bool)
94+
data[::2, ::2] = True
95+
data_viewer_widget.setData(data)
96+
availableModes = {v.modeId() for v in data_viewer_widget.currentAvailableViews()}
97+
assert DataViews.RAW_MODE == data_viewer_widget.displayMode()
98+
assert DataViews.PLOT2D_MODE in availableModes
99+
100+
101+
def test_image_complex_data(data_viewer_widget):
102+
data = numpy.arange(3**2, dtype=numpy.complex64)
103+
data.shape = [3] * 2
104+
data_viewer_widget.setData(data)
105+
availableModes = {v.modeId() for v in data_viewer_widget.currentAvailableViews()}
106+
assert DataViews.RAW_MODE == data_viewer_widget.displayMode()
107+
assert DataViews.COMPLEX_PLOT2D_MODE in availableModes
108+
109+
110+
def test_plot_3d_data(data_viewer_widget):
111+
data = numpy.arange(3**3)
112+
data.shape = [3] * 3
113+
data_viewer_widget.setData(data)
114+
availableModes = {v.modeId() for v in data_viewer_widget.currentAvailableViews()}
115+
try:
116+
import silx.gui.plot3d # noqa
117+
118+
assert DataViews.PLOT3D_MODE in availableModes
119+
except ImportError:
120+
assert DataViews.PLOT2D_MODE in availableModes
121+
assert DataViews.RAW_MODE == data_viewer_widget.displayMode()
65122

66-
def create_widget(self):
67-
# Avoid to raise an error when testing the full module
68-
self.skipTest("Not implemented")
69123

70-
@contextmanager
71-
def h5_temporary_file(self):
72-
# create tmp file
73-
fd, tmp_name = tempfile.mkstemp(suffix=".h5")
74-
os.close(fd)
75-
data = numpy.arange(3 * 3 * 3)
76-
data.shape = 3, 3, 3
77-
# create h5 data
78-
h5file = h5py.File(tmp_name, "w")
124+
def test_array_1d_data(data_viewer_widget):
125+
data = numpy.array(["aaa"] * (3**1))
126+
data.shape = [3] * 1
127+
data_viewer_widget.setData(data)
128+
assert DataViews.RAW_MODE == data_viewer_widget.displayedView().modeId()
129+
130+
131+
def test_array_2d_data(data_viewer_widget):
132+
data = numpy.array(["aaa"] * (3**2))
133+
data.shape = [3] * 2
134+
data_viewer_widget.setData(data)
135+
assert DataViews.RAW_MODE == data_viewer_widget.displayedView().modeId()
136+
137+
138+
def test_array_4d_data(data_viewer_widget):
139+
data = numpy.array(["aaa"] * (3**4))
140+
data.shape = [3] * 4
141+
data_viewer_widget.setData(data)
142+
assert DataViews.RAW_MODE == data_viewer_widget.displayedView().modeId()
143+
144+
145+
def test_record_4d_data(data_viewer_widget):
146+
data = numpy.zeros(3**4, dtype="3int8, float32, (2,3)float64")
147+
data.shape = [3] * 4
148+
data_viewer_widget.setData(data)
149+
assert DataViews.RAW_MODE == data_viewer_widget.displayedView().modeId()
150+
151+
152+
def test_3d_h5_dataset(data_viewer_widget, tmp_path):
153+
data = numpy.arange(3 * 3 * 3)
154+
data.shape = 3, 3, 3
155+
with h5py.File(tmp_path / "tmp.h5", "w") as h5file:
79156
h5file["data"] = data
80-
yield h5file
81-
# clean up
82-
h5file.close()
83-
os.unlink(tmp_name)
84157

85-
def test_text_data(self):
86-
data_list = ["aaa", int, 8, self]
87-
widget = self.create_widget()
88-
for data in data_list:
89-
widget.setData(data)
90-
self.assertEqual(DataViews.RAW_MODE, widget.displayMode())
158+
with h5py.File(tmp_path / "tmp.h5", "r") as h5file:
159+
dataset = h5file["data"]
160+
data_viewer_widget.setData(dataset)
91161

92-
def test_plot_1d_data(self):
93-
data = numpy.arange(3**1)
94-
data.shape = [3] * 1
95-
widget = self.create_widget()
96-
widget.setData(data)
97-
availableModes = {v.modeId() for v in widget.currentAvailableViews()}
98-
self.assertEqual(DataViews.RAW_MODE, widget.displayMode())
99-
self.assertIn(DataViews.PLOT1D_MODE, availableModes)
100162

101-
def test_image_data(self):
102-
data = numpy.arange(3**2)
103-
data.shape = [3] * 2
104-
widget = self.create_widget()
105-
widget.setData(data)
106-
availableModes = {v.modeId() for v in widget.currentAvailableViews()}
107-
self.assertEqual(DataViews.RAW_MODE, widget.displayMode())
108-
self.assertIn(DataViews.PLOT2D_MODE, availableModes)
163+
def test_data_event(data_viewer_widget):
164+
listener = SignalListener()
165+
data_viewer_widget.dataChanged.connect(listener)
166+
data_viewer_widget.setData(10)
167+
data_viewer_widget.setData(None)
168+
assert listener.callCount() == 2
109169

110-
def test_image_bool(self):
111-
data = numpy.zeros((10, 10), dtype=bool)
112-
data[::2, ::2] = True
113-
widget = self.create_widget()
114-
widget.setData(data)
115-
availableModes = {v.modeId() for v in widget.currentAvailableViews()}
116-
self.assertEqual(DataViews.RAW_MODE, widget.displayMode())
117-
self.assertIn(DataViews.PLOT2D_MODE, availableModes)
118170

119-
def test_image_complex_data(self):
120-
data = numpy.arange(3**2, dtype=numpy.complex64)
121-
data.shape = [3] * 2
122-
widget = self.create_widget()
123-
widget.setData(data)
124-
availableModes = {v.modeId() for v in widget.currentAvailableViews()}
125-
self.assertEqual(DataViews.RAW_MODE, widget.displayMode())
126-
self.assertIn(DataViews.COMPLEX_PLOT2D_MODE, availableModes)
171+
def test_display_mode_event(data_viewer_widget):
172+
listener = SignalListener()
173+
data_viewer_widget.displayedViewChanged.connect(listener)
174+
data_viewer_widget.setData(10)
175+
data_viewer_widget.setData(None)
176+
modes = [v.modeId() for v in listener.arguments(argumentIndex=0)]
177+
assert modes == [DataViews.RAW_MODE, DataViews.EMPTY_MODE]
178+
listener.clear()
127179

128-
def test_plot_3d_data(self):
129-
data = numpy.arange(3**3)
130-
data.shape = [3] * 3
131-
widget = self.create_widget()
132-
widget.setData(data)
133-
availableModes = {v.modeId() for v in widget.currentAvailableViews()}
134-
try:
135-
import silx.gui.plot3d # noqa
136180

137-
self.assertIn(DataViews.PLOT3D_MODE, availableModes)
138-
except ImportError:
139-
self.assertIn(DataViews.PLOT2D_MODE, availableModes)
140-
self.assertEqual(DataViews.RAW_MODE, widget.displayMode())
181+
def test_create_default_views(data_viewer_widget):
182+
views = data_viewer_widget.createDefaultViews()
183+
assert len(views) > 0
141184

142-
def test_array_1d_data(self):
143-
data = numpy.array(["aaa"] * (3**1))
144-
data.shape = [3] * 1
145-
widget = self.create_widget()
146-
widget.setData(data)
147-
self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId())
148185

149-
def test_array_2d_data(self):
150-
data = numpy.array(["aaa"] * (3**2))
151-
data.shape = [3] * 2
152-
widget = self.create_widget()
153-
widget.setData(data)
154-
self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId())
186+
def test_add_view(data_viewer_widget):
187+
view = _DataViewMock(data_viewer_widget)
188+
data_viewer_widget.addView(view)
189+
assert view in data_viewer_widget.availableViews()
190+
assert view in data_viewer_widget.currentAvailableViews()
155191

156-
def test_array_4d_data(self):
157-
data = numpy.array(["aaa"] * (3**4))
158-
data.shape = [3] * 4
159-
widget = self.create_widget()
160-
widget.setData(data)
161-
self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId())
162192

163-
def test_record_4d_data(self):
164-
data = numpy.zeros(3**4, dtype="3int8, float32, (2,3)float64")
165-
data.shape = [3] * 4
166-
widget = self.create_widget()
167-
widget.setData(data)
168-
self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId())
193+
def test_remove_view(data_viewer_widget):
194+
data_viewer_widget.setData("foobar")
195+
view = data_viewer_widget.currentAvailableViews()[0]
196+
data_viewer_widget.removeView(view)
197+
assert view not in data_viewer_widget.availableViews()
198+
assert view not in data_viewer_widget.currentAvailableViews()
169199

170-
def test_3d_h5_dataset(self):
171-
with self.h5_temporary_file() as h5file:
172-
dataset = h5file["data"]
173-
widget = self.create_widget()
174-
widget.setData(dataset)
175200

176-
def test_data_event(self):
177-
listener = SignalListener()
178-
widget = self.create_widget()
179-
widget.dataChanged.connect(listener)
180-
widget.setData(10)
181-
widget.setData(None)
182-
self.assertEqual(listener.callCount(), 2)
201+
def test_replace_view(data_viewer_widget):
202+
view = _DataViewMock(data_viewer_widget)
203+
data_viewer_widget.replaceView(DataViews.RAW_MODE, view)
204+
assert data_viewer_widget.getViewFromModeId(DataViews.RAW_MODE) is None
205+
assert view in data_viewer_widget.availableViews()
206+
assert view in data_viewer_widget.currentAvailableViews()
183207

184-
def test_display_mode_event(self):
185-
listener = SignalListener()
186-
widget = self.create_widget()
187-
widget.displayedViewChanged.connect(listener)
188-
widget.setData(10)
189-
widget.setData(None)
190-
modes = [v.modeId() for v in listener.arguments(argumentIndex=0)]
191-
self.assertEqual(modes, [DataViews.RAW_MODE, DataViews.EMPTY_MODE])
192-
listener.clear()
208+
209+
def test_replace_view_in_composite(data_viewer_widget):
210+
# replace a view that is a child of a composite view
211+
view = _DataViewMock(data_viewer_widget)
212+
replaced = data_viewer_widget.replaceView(DataViews.NXDATA_INVALID_MODE, view)
213+
assert replaced
214+
nxdata_view = data_viewer_widget.getViewFromModeId(DataViews.NXDATA_MODE)
215+
assert DataViews.NXDATA_INVALID_MODE not in [
216+
v.modeId() for v in nxdata_view.getViews()
217+
]
218+
assert view in nxdata_view.getViews()
219+
220+
221+
class _TestAbstractDataViewer(TestCaseQt):
222+
__test__ = False # ignore abstract class
223+
224+
def create_widget(self):
225+
# Avoid to raise an error when testing the full module
226+
self.skipTest("Not implemented")
193227

194228
def test_change_display_mode(self):
195229
listener = SignalListener()
@@ -200,7 +234,7 @@ def test_change_display_mode(self):
200234
widget.setData(data)
201235

202236
widget.setDisplayMode(DataViews.PLOT1D_MODE)
203-
self.assertEqual(widget.displayedView().modeId(), DataViews.PLOT1D_MODE)
237+
assert widget.displayedView().modeId() == DataViews.PLOT1D_MODE
204238
self.qWait(200)
205239
assert listener.arguments() == [((0, 0, 0, slice(None)), None)]
206240
listener.clear()
@@ -223,46 +257,6 @@ def test_change_display_mode(self):
223257
assert listener.arguments() == [(None, None)]
224258
listener.clear()
225259

226-
def test_create_default_views(self):
227-
widget = self.create_widget()
228-
views = widget.createDefaultViews()
229-
self.assertTrue(len(views) > 0)
230-
231-
def test_add_view(self):
232-
widget = self.create_widget()
233-
view = _DataViewMock(widget)
234-
widget.addView(view)
235-
self.assertTrue(view in widget.availableViews())
236-
self.assertTrue(view in widget.currentAvailableViews())
237-
238-
def test_remove_view(self):
239-
widget = self.create_widget()
240-
widget.setData("foobar")
241-
view = widget.currentAvailableViews()[0]
242-
widget.removeView(view)
243-
self.assertTrue(view not in widget.availableViews())
244-
self.assertTrue(view not in widget.currentAvailableViews())
245-
246-
def test_replace_view(self):
247-
widget = self.create_widget()
248-
view = _DataViewMock(widget)
249-
widget.replaceView(DataViews.RAW_MODE, view)
250-
self.assertIsNone(widget.getViewFromModeId(DataViews.RAW_MODE))
251-
self.assertTrue(view in widget.availableViews())
252-
self.assertTrue(view in widget.currentAvailableViews())
253-
254-
def test_replace_view_in_composite(self):
255-
# replace a view that is a child of a composite view
256-
widget = self.create_widget()
257-
view = _DataViewMock(widget)
258-
replaced = widget.replaceView(DataViews.NXDATA_INVALID_MODE, view)
259-
self.assertTrue(replaced)
260-
nxdata_view = widget.getViewFromModeId(DataViews.NXDATA_MODE)
261-
self.assertNotIn(
262-
DataViews.NXDATA_INVALID_MODE, [v.modeId() for v in nxdata_view.getViews()]
263-
)
264-
self.assertTrue(view in nxdata_view.getViews())
265-
266260

267261
class TestDataViewer(_TestAbstractDataViewer):
268262
__test__ = True # because _TestAbstractDataViewer is ignored

0 commit comments

Comments
 (0)