88from AnyQt .QtWidgets import QFileDialog
99
1010from Orange .data import Table
11- from Orange .data .io import TabReader , PickleReader , ExcelReader
11+ from Orange .data .io import TabReader , PickleReader , ExcelReader , FileFormat
1212from Orange .tests import named_file
1313from Orange .widgets .data .owsave import OWSave , OWSaveBase
1414from Orange .widgets .utils .save .tests .test_owsavebase import \
@@ -23,6 +23,15 @@ def _w(s): # pylint: disable=invalid-name
2323 return s .replace ("/" , os .sep )
2424
2525
26+ class MockFormat (FileFormat ):
27+ EXTENSIONS = ('.mock' ,)
28+ DESCRIPTION = "Mock file format"
29+
30+ @staticmethod
31+ def write_file (filename , data ):
32+ pass
33+
34+
2635class OWSaveTestBase (WidgetTest , SaveWidgetsTestBaseMixin ):
2736 def setUp (self ):
2837 with open_widget_classes ():
@@ -91,7 +100,7 @@ def test_initial_start_dir(self):
91100 @patch ("Orange.widgets.utils.save.owsavebase.QFileDialog.getSaveFileName" )
92101 def test_save_file_sets_name (self , _filedialog ):
93102 widget = self .widget
94- filters = iter (widget .filters )
103+ filters = iter (widget .get_filters () )
95104 filter1 = next (filters )
96105 filter2 = next (filters )
97106
@@ -259,20 +268,20 @@ def test_valid_filters_for_sparse(self):
259268 widget = self .widget
260269
261270 widget .data = None
262- self .assertEqual (widget .filters , widget .valid_filters ())
271+ self .assertEqual (widget .get_filters () , widget .valid_filters ())
263272
264273 widget .data = self .iris
265- self .assertEqual (widget .filters , widget .valid_filters ())
274+ self .assertEqual (widget .get_filters () , widget .valid_filters ())
266275
267276 widget .data .X = sp .csr_matrix (widget .data .X )
268277 valid = widget .valid_filters ()
269- self .assertNotEqual (widget .filters , {})
278+ self .assertNotEqual (widget .get_filters () , {})
270279 # false positive, pylint: disable=no-member
271280 self .assertTrue (all (v .SUPPORT_SPARSE_DATA for v in valid .values ()))
272281
273282 def test_valid_default_filter (self ):
274283 widget = self .widget
275- for widget .filter , writer in widget .filters .items ():
284+ for widget .filter , writer in widget .get_filters () .items ():
276285 if not writer .SUPPORT_SPARSE_DATA :
277286 break
278287
@@ -284,13 +293,19 @@ def test_valid_default_filter(self):
284293
285294 widget .data .X = sp .csr_matrix (widget .data .X )
286295 self .assertTrue (
287- widget .filters [widget .default_valid_filter ()].SUPPORT_SPARSE_DATA )
296+ widget .get_filters ()[widget .default_valid_filter ()]
297+ .SUPPORT_SPARSE_DATA )
298+
299+ def test_add_on_writers (self ):
300+ # test adding file formats after registering the widget
301+ self .assertIn (MockFormat , self .widget .valid_filters ().values ())
302+ # this test doesn't call it - test_save_uncompressed does
288303
289304 def test_send_report (self ):
290305 widget = self .widget
291306
292307 widget .report_items = Mock ()
293- for writer in widget .filters .values ():
308+ for writer in widget .get_filters () .values ():
294309 widget .writer = writer
295310 for widget .add_type_annotations in (False , True ):
296311 widget .filename = f"foo.{ writer .EXTENSIONS [0 ]} "
@@ -355,14 +370,14 @@ def test_migration_to_version_2(self):
355370 settings = {** const_settings ,
356371 'compress' : True , 'compression' : 'lzma (.xz)' }
357372 OWSave .migrate_settings (settings )
358- self .assertTrue (settings ["filter" ] in OWSave .filters )
373+ self .assertTrue (settings ["filter" ] in OWSave .get_filters () )
359374
360375 # Unsupported file format (is this possible?)
361376 settings = {** const_settings ,
362377 'compress' : True , 'compression' : 'lzma (.xz)' ,
363378 'filetype' : 'Bar file (.bar)' }
364379 OWSave .migrate_settings (settings )
365- self .assertTrue (settings ["filter" ] in OWSave .filters )
380+ self .assertTrue (settings ["filter" ] in OWSave .get_filters () )
366381
367382
368383class TestFunctionalOWSave (WidgetTest ):
@@ -377,7 +392,7 @@ def test_save_uncompressed(self):
377392 spiris = Table ("iris" )
378393 spiris .X = sp .csr_matrix (spiris .X )
379394
380- for selected_filter , writer in widget .filters .items ():
395+ for selected_filter , writer in widget .get_filters () .items ():
381396 widget .write = writer
382397 ext = writer .EXTENSIONS [0 ]
383398 with named_file ("" , suffix = ext ) as filename :
@@ -386,20 +401,22 @@ def test_save_uncompressed(self):
386401
387402 self .send_signal (widget .Inputs .data , self .iris )
388403 widget .save_file_as ()
389- self .assertEqual (len (Table (filename )), 150 )
404+ if hasattr (writer , "read" ):
405+ self .assertEqual (len (Table (filename )), 150 )
390406
391407 if writer .SUPPORT_SPARSE_DATA :
392408 self .send_signal (widget .Inputs .data , spiris )
393409 widget .save_file ()
394- self .assertEqual (len (Table (filename )), 150 )
410+ if hasattr (writer , "read" ):
411+ self .assertEqual (len (Table (filename )), 150 )
395412
396413
397414@unittest .skipUnless (sys .platform == "linux" , "Tests for dialog on Linux" )
398415class TestOWSaveLinuxDialog (OWSaveTestBase ):
399416 def test_get_save_filename_linux (self ):
400417 widget = self .widget
401418 widget .initial_start_dir = lambda : "baz"
402- widget .filters = dict .fromkeys ("abc" )
419+ widget .get_filters = lambda : dict .fromkeys ("abc" )
403420 widget .filter = "b"
404421 dlg = widget .SaveFileDialog = Mock () # pylint: disable=invalid-name
405422 instance = dlg .return_value
@@ -413,7 +430,7 @@ def test_get_save_filename_linux(self):
413430 instance .exec .return_value = QFileDialog .Rejected
414431 self .assertEqual (widget .get_save_filename (), ("" , "" ))
415432
416- @patch .object (OWSaveBase , "filters" , OWSave .filters )
433+ @patch .object (OWSaveBase , "filters" , OWSave .get_filters () )
417434 def test_save_file_dialog_enforces_extension_linux (self ):
418435 dialog = OWSave .SaveFileDialog (
419436 OWSave , None , "Save File" , "foo.bar" ,
@@ -468,7 +485,8 @@ def remove_star(filt):
468485 def test_get_save_filename_darwin (self , dlg ):
469486 widget = self .widget
470487 widget .initial_start_dir = lambda : "baz"
471- widget .filters = dict .fromkeys (("aa (*.a)" , "bb (*.b)" , "cc (*.c)" ))
488+ widget .get_filters = \
489+ lambda : dict .fromkeys (("aa (*.a)" , "bb (*.b)" , "cc (*.c)" ))
472490 widget .filter = "bb (*.b)"
473491 instance = dlg .return_value
474492 instance .exec .return_value = dlg .Accepted = QFileDialog .Accepted
@@ -489,10 +507,10 @@ def test_get_save_filename_darwin(self, dlg):
489507 def test_save_file_dialog_enforces_extension_darwin (self , dlg ):
490508 widget = self .widget
491509 filter1 = "" # prevent pylint warning 'undefined-loop-variable'
492- for filter1 in widget .filters :
510+ for filter1 in widget .get_filters () :
493511 if OWSaveBase ._extension_from_filter (filter1 ) == ".tab" :
494512 break
495- for filter2 in widget .filters :
513+ for filter2 in widget .get_filters () :
496514 if OWSaveBase ._extension_from_filter (filter2 ) == ".csv.gz" :
497515 break
498516
@@ -536,7 +554,7 @@ def selected_files():
536554 widget = self .widget
537555 widget .initial_start_dir = lambda : "baz"
538556 filter1 = "" # prevent pylint warning 'undefined-loop-variable'
539- for filter1 in widget .filters :
557+ for filter1 in widget .get_filters () :
540558 if OWSaveBase ._extension_from_filter (filter1 ) == ".tab" :
541559 break
542560
0 commit comments