2525__license__ = "MIT"
2626__date__ = "19/02/2019"
2727
28- import os
29- import tempfile
3028import pytest
31- from contextlib import contextmanager
3229
3330import numpy
3431from ..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
267261class TestDataViewer (_TestAbstractDataViewer ):
268262 __test__ = True # because _TestAbstractDataViewer is ignored
0 commit comments