diff options
Diffstat (limited to 'silx/gui/data/test')
-rw-r--r-- | silx/gui/data/test/__init__.py | 45 | ||||
-rw-r--r-- | silx/gui/data/test/test_arraywidget.py | 329 | ||||
-rw-r--r-- | silx/gui/data/test/test_dataviewer.py | 314 | ||||
-rw-r--r-- | silx/gui/data/test/test_numpyaxesselector.py | 161 | ||||
-rw-r--r-- | silx/gui/data/test/test_textformatter.py | 212 |
5 files changed, 0 insertions, 1061 deletions
diff --git a/silx/gui/data/test/__init__.py b/silx/gui/data/test/__init__.py deleted file mode 100644 index 08c044b..0000000 --- a/silx/gui/data/test/__init__.py +++ /dev/null @@ -1,45 +0,0 @@ -# coding: utf-8 -# /*########################################################################## -# -# Copyright (c) 2016-2017 European Synchrotron Radiation Facility -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# ###########################################################################*/ -import unittest - -from . import test_arraywidget -from . import test_numpyaxesselector -from . import test_dataviewer -from . import test_textformatter - -__authors__ = ["V. Valls", "P. Knobel"] -__license__ = "MIT" -__date__ = "24/01/2017" - - -def suite(): - test_suite = unittest.TestSuite() - test_suite.addTests( - [test_arraywidget.suite(), - test_numpyaxesselector.suite(), - test_dataviewer.suite(), - test_textformatter.suite(), - ]) - return test_suite diff --git a/silx/gui/data/test/test_arraywidget.py b/silx/gui/data/test/test_arraywidget.py deleted file mode 100644 index 87081ed..0000000 --- a/silx/gui/data/test/test_arraywidget.py +++ /dev/null @@ -1,329 +0,0 @@ -# coding: utf-8 -# /*########################################################################## -# -# Copyright (c) 2016-2021 European Synchrotron Radiation Facility -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# ###########################################################################*/ -__authors__ = ["P. Knobel"] -__license__ = "MIT" -__date__ = "05/12/2016" - -import os -import tempfile -import unittest - -import numpy - -from silx.gui import qt -from silx.gui.data import ArrayTableWidget -from silx.gui.data.ArrayTableModel import ArrayTableModel -from silx.gui.utils.testutils import TestCaseQt - -import h5py - - -class TestArrayWidget(TestCaseQt): - """Basic test for ArrayTableWidget with a numpy array""" - def setUp(self): - super(TestArrayWidget, self).setUp() - self.aw = ArrayTableWidget.ArrayTableWidget() - - def tearDown(self): - del self.aw - super(TestArrayWidget, self).tearDown() - - def testShow(self): - """test for errors""" - self.aw.show() - self.qWaitForWindowExposed(self.aw) - - def testSetData0D(self): - a = 1 - self.aw.setArrayData(a) - b = self.aw.getData(copy=True) - - self.assertTrue(numpy.array_equal(a, b)) - - # scalar/0D data has no frame index - self.assertEqual(len(self.aw.model._index), 0) - # and no perspective - self.assertEqual(len(self.aw.model._perspective), 0) - - def testSetData1D(self): - a = [1, 2] - self.aw.setArrayData(a) - b = self.aw.getData(copy=True) - - self.assertTrue(numpy.array_equal(a, b)) - - # 1D data has no frame index - self.assertEqual(len(self.aw.model._index), 0) - # and no perspective - self.assertEqual(len(self.aw.model._perspective), 0) - - def testSetData4D(self): - a = numpy.reshape(numpy.linspace(0.213, 1.234, 1250), - (5, 5, 5, 10)) - self.aw.setArrayData(a) - - # default perspective (0, 1) - self.assertEqual(list(self.aw.model._perspective), - [0, 1]) - self.aw.setPerspective((1, 3)) - self.assertEqual(list(self.aw.model._perspective), - [1, 3]) - - b = self.aw.getData(copy=True) - self.assertTrue(numpy.array_equal(a, b)) - - # 4D data has a 2-tuple as frame index - self.assertEqual(len(self.aw.model._index), 2) - # default index is (0, 0) - self.assertEqual(list(self.aw.model._index), - [0, 0]) - self.aw.setFrameIndex((3, 1)) - - self.assertEqual(list(self.aw.model._index), - [3, 1]) - - def testColors(self): - a = numpy.arange(256, dtype=numpy.uint8) - self.aw.setArrayData(a) - - bgcolor = numpy.empty(a.shape + (3,), dtype=numpy.uint8) - # Black & white palette - bgcolor[..., 0] = a - bgcolor[..., 1] = a - bgcolor[..., 2] = a - - fgcolor = numpy.bitwise_xor(bgcolor, 255) - - self.aw.setArrayColors(bgcolor, fgcolor) - - # test colors are as expected in model - for i in range(256): - # all RGB channels for BG equal to data value - self.assertEqual( - self.aw.model.data(self.aw.model.index(0, i), - role=qt.Qt.BackgroundRole), - qt.QColor(i, i, i), - "Unexpected background color" - ) - - # all RGB channels for FG equal to XOR(data value, 255) - self.assertEqual( - self.aw.model.data(self.aw.model.index(0, i), - role=qt.Qt.ForegroundRole), - qt.QColor(i ^ 255, i ^ 255, i ^ 255), - "Unexpected text color" - ) - - # test colors are reset to None when a new data array is loaded - # with different shape - self.aw.setArrayData(numpy.arange(300)) - - for i in range(300): - # all RGB channels for BG equal to data value - self.assertIsNone( - self.aw.model.data(self.aw.model.index(0, i), - role=qt.Qt.BackgroundRole)) - - def testDefaultFlagNotEditable(self): - """editable should be False by default, in setArrayData""" - self.aw.setArrayData([[0]]) - idx = self.aw.model.createIndex(0, 0) - # model is editable - self.assertFalse( - self.aw.model.flags(idx) & qt.Qt.ItemIsEditable) - - def testFlagEditable(self): - self.aw.setArrayData([[0]], editable=True) - idx = self.aw.model.createIndex(0, 0) - # model is editable - self.assertTrue( - self.aw.model.flags(idx) & qt.Qt.ItemIsEditable) - - def testFlagNotEditable(self): - self.aw.setArrayData([[0]], editable=False) - idx = self.aw.model.createIndex(0, 0) - # model is editable - self.assertFalse( - self.aw.model.flags(idx) & qt.Qt.ItemIsEditable) - - def testReferenceReturned(self): - """when setting the data with copy=False and - retrieving it with getData(copy=False), we should recover - the same original object. - """ - # n-D (n >=2) - a0 = numpy.reshape(numpy.linspace(0.213, 1.234, 1000), - (10, 10, 10)) - self.aw.setArrayData(a0, copy=False) - a1 = self.aw.getData(copy=False) - - self.assertIs(a0, a1) - - # 1D - b0 = numpy.linspace(0.213, 1.234, 1000) - self.aw.setArrayData(b0, copy=False) - b1 = self.aw.getData(copy=False) - self.assertIs(b0, b1) - - def testClipping(self): - """Test clipping of large arrays""" - self.aw.show() - self.qWaitForWindowExposed(self.aw) - - data = numpy.arange(ArrayTableModel.MAX_NUMBER_OF_SECTIONS + 10) - - for shape in [(1, -1), (-1, 1)]: - with self.subTest(shape=shape): - self.aw.setArrayData(data.reshape(shape), editable=True) - self.qapp.processEvents() - - -class TestH5pyArrayWidget(TestCaseQt): - """Basic test for ArrayTableWidget with a dataset. - - Test flags, for dataset open in read-only or read-write modes""" - def setUp(self): - super(TestH5pyArrayWidget, self).setUp() - self.aw = ArrayTableWidget.ArrayTableWidget() - self.data = numpy.reshape(numpy.linspace(0.213, 1.234, 1000), - (10, 10, 10)) - # create an h5py file with a dataset - self.tempdir = tempfile.mkdtemp() - self.h5_fname = os.path.join(self.tempdir, "array.h5") - h5f = h5py.File(self.h5_fname, mode='w') - h5f["my_array"] = self.data - h5f["my_scalar"] = 3.14 - h5f["my_1D_array"] = numpy.array(numpy.arange(1000)) - h5f.close() - - def tearDown(self): - del self.aw - os.unlink(self.h5_fname) - os.rmdir(self.tempdir) - super(TestH5pyArrayWidget, self).tearDown() - - def testShow(self): - self.aw.show() - self.qWaitForWindowExposed(self.aw) - - def testReadOnly(self): - """Open H5 dataset in read-only mode, ensure the model is not editable.""" - h5f = h5py.File(self.h5_fname, "r") - a = h5f["my_array"] - # ArrayTableModel relies on following condition - self.assertTrue(a.file.mode == "r") - - self.aw.setArrayData(a, copy=False, editable=True) - - self.assertIsInstance(a, h5py.Dataset) # simple sanity check - # internal representation must be a reference to original data (copy=False) - self.assertIsInstance(self.aw.model._array, h5py.Dataset) - self.assertTrue(self.aw.model._array.file.mode == "r") - - b = self.aw.getData() - self.assertTrue(numpy.array_equal(self.data, b)) - - # model must have detected read-only dataset and disabled editing - self.assertFalse(self.aw.model._editable) - idx = self.aw.model.createIndex(0, 0) - self.assertFalse( - self.aw.model.flags(idx) & qt.Qt.ItemIsEditable) - - # force editing read-only datasets raises IOError - self.assertRaises(IOError, self.aw.model.setData, - idx, 123.4, role=qt.Qt.EditRole) - h5f.close() - - def testReadWrite(self): - h5f = h5py.File(self.h5_fname, "r+") - a = h5f["my_array"] - self.assertTrue(a.file.mode == "r+") - - self.aw.setArrayData(a, copy=False, editable=True) - b = self.aw.getData(copy=False) - self.assertTrue(numpy.array_equal(self.data, b)) - - idx = self.aw.model.createIndex(0, 0) - # model is editable - self.assertTrue( - self.aw.model.flags(idx) & qt.Qt.ItemIsEditable) - h5f.close() - - def testSetData0D(self): - h5f = h5py.File(self.h5_fname, "r+") - a = h5f["my_scalar"] - self.aw.setArrayData(a) - b = self.aw.getData(copy=True) - - self.assertTrue(numpy.array_equal(a, b)) - - h5f.close() - - def testSetData1D(self): - h5f = h5py.File(self.h5_fname, "r+") - a = h5f["my_1D_array"] - self.aw.setArrayData(a) - b = self.aw.getData(copy=True) - - self.assertTrue(numpy.array_equal(a, b)) - - h5f.close() - - def testReferenceReturned(self): - """when setting the data with copy=False and - retrieving it with getData(copy=False), we should recover - the same original object. - - This only works for array with at least 2D. For 1D and 0D - arrays, a view is created at some point, which in the case - of an hdf5 dataset creates a copy.""" - h5f = h5py.File(self.h5_fname, "r+") - - # n-D - a0 = h5f["my_array"] - self.aw.setArrayData(a0, copy=False) - a1 = self.aw.getData(copy=False) - self.assertIs(a0, a1) - - # 1D - b0 = h5f["my_1D_array"] - self.aw.setArrayData(b0, copy=False) - b1 = self.aw.getData(copy=False) - self.assertIs(b0, b1) - - h5f.close() - - -def suite(): - test_suite = unittest.TestSuite() - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestArrayWidget)) - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestH5pyArrayWidget)) - return test_suite - - -if __name__ == '__main__': - unittest.main(defaultTest='suite') diff --git a/silx/gui/data/test/test_dataviewer.py b/silx/gui/data/test/test_dataviewer.py deleted file mode 100644 index dd01dd6..0000000 --- a/silx/gui/data/test/test_dataviewer.py +++ /dev/null @@ -1,314 +0,0 @@ -# coding: utf-8 -# /*########################################################################## -# -# Copyright (c) 2016-2020 European Synchrotron Radiation Facility -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# ###########################################################################*/ -__authors__ = ["V. Valls"] -__license__ = "MIT" -__date__ = "19/02/2019" - -import os -import tempfile -import unittest -from contextlib import contextmanager - -import numpy -from ..DataViewer import DataViewer -from ..DataViews import DataView -from .. import DataViews - -from silx.gui import qt - -from silx.gui.data.DataViewerFrame import DataViewerFrame -from silx.gui.utils.testutils import SignalListener -from silx.gui.utils.testutils import TestCaseQt - -import h5py - - -class _DataViewMock(DataView): - """Dummy view to display nothing""" - - def __init__(self, parent): - DataView.__init__(self, parent) - - def axesNames(self, data, info): - return [] - - def createWidget(self, parent): - return qt.QLabel(parent) - - def getDataPriority(self, data, info): - return 0 - - -class AbstractDataViewerTests(TestCaseQt): - - def create_widget(self): - # Avoid to raise an error when testing the full module - self.skipTest("Not implemented") - - @contextmanager - def h5_temporary_file(self): - # create tmp file - fd, tmp_name = tempfile.mkstemp(suffix=".h5") - os.close(fd) - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - # create h5 data - h5file = h5py.File(tmp_name, "w") - h5file["data"] = data - yield h5file - # clean up - h5file.close() - os.unlink(tmp_name) - - def test_text_data(self): - data_list = ["aaa", int, 8, self] - widget = self.create_widget() - for data in data_list: - widget.setData(data) - self.assertEqual(DataViews.RAW_MODE, widget.displayMode()) - - def test_plot_1d_data(self): - data = numpy.arange(3 ** 1) - data.shape = [3] * 1 - widget = self.create_widget() - widget.setData(data) - availableModes = set([v.modeId() for v in widget.currentAvailableViews()]) - self.assertEqual(DataViews.RAW_MODE, widget.displayMode()) - self.assertIn(DataViews.PLOT1D_MODE, availableModes) - - def test_image_data(self): - data = numpy.arange(3 ** 2) - data.shape = [3] * 2 - widget = self.create_widget() - widget.setData(data) - availableModes = set([v.modeId() for v in widget.currentAvailableViews()]) - self.assertEqual(DataViews.RAW_MODE, widget.displayMode()) - self.assertIn(DataViews.IMAGE_MODE, availableModes) - - def test_image_bool(self): - data = numpy.zeros((10, 10), dtype=bool) - data[::2, ::2] = True - widget = self.create_widget() - widget.setData(data) - availableModes = set([v.modeId() for v in widget.currentAvailableViews()]) - self.assertEqual(DataViews.RAW_MODE, widget.displayMode()) - self.assertIn(DataViews.IMAGE_MODE, availableModes) - - def test_image_complex_data(self): - data = numpy.arange(3 ** 2, dtype=numpy.complex64) - data.shape = [3] * 2 - widget = self.create_widget() - widget.setData(data) - availableModes = set([v.modeId() for v in widget.currentAvailableViews()]) - self.assertEqual(DataViews.RAW_MODE, widget.displayMode()) - self.assertIn(DataViews.IMAGE_MODE, availableModes) - - def test_plot_3d_data(self): - data = numpy.arange(3 ** 3) - data.shape = [3] * 3 - widget = self.create_widget() - widget.setData(data) - availableModes = set([v.modeId() for v in widget.currentAvailableViews()]) - try: - import silx.gui.plot3d # noqa - self.assertIn(DataViews.PLOT3D_MODE, availableModes) - except ImportError: - self.assertIn(DataViews.STACK_MODE, availableModes) - self.assertEqual(DataViews.RAW_MODE, widget.displayMode()) - - def test_array_1d_data(self): - data = numpy.array(["aaa"] * (3 ** 1)) - data.shape = [3] * 1 - widget = self.create_widget() - widget.setData(data) - self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId()) - - def test_array_2d_data(self): - data = numpy.array(["aaa"] * (3 ** 2)) - data.shape = [3] * 2 - widget = self.create_widget() - widget.setData(data) - self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId()) - - def test_array_4d_data(self): - data = numpy.array(["aaa"] * (3 ** 4)) - data.shape = [3] * 4 - widget = self.create_widget() - widget.setData(data) - self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId()) - - def test_record_4d_data(self): - data = numpy.zeros(3 ** 4, dtype='3int8, float32, (2,3)float64') - data.shape = [3] * 4 - widget = self.create_widget() - widget.setData(data) - self.assertEqual(DataViews.RAW_MODE, widget.displayedView().modeId()) - - def test_3d_h5_dataset(self): - with self.h5_temporary_file() as h5file: - dataset = h5file["data"] - widget = self.create_widget() - widget.setData(dataset) - - def test_data_event(self): - listener = SignalListener() - widget = self.create_widget() - widget.dataChanged.connect(listener) - widget.setData(10) - widget.setData(None) - self.assertEqual(listener.callCount(), 2) - - def test_display_mode_event(self): - listener = SignalListener() - widget = self.create_widget() - widget.displayedViewChanged.connect(listener) - widget.setData(10) - widget.setData(None) - modes = [v.modeId() for v in listener.arguments(argumentIndex=0)] - self.assertEqual(modes, [DataViews.RAW_MODE, DataViews.EMPTY_MODE]) - listener.clear() - - def test_change_display_mode(self): - data = numpy.arange(10 ** 4) - data.shape = [10] * 4 - widget = self.create_widget() - widget.setData(data) - widget.setDisplayMode(DataViews.PLOT1D_MODE) - self.assertEqual(widget.displayedView().modeId(), DataViews.PLOT1D_MODE) - widget.setDisplayMode(DataViews.IMAGE_MODE) - self.assertEqual(widget.displayedView().modeId(), DataViews.IMAGE_MODE) - widget.setDisplayMode(DataViews.RAW_MODE) - self.assertEqual(widget.displayedView().modeId(), DataViews.RAW_MODE) - widget.setDisplayMode(DataViews.EMPTY_MODE) - self.assertEqual(widget.displayedView().modeId(), DataViews.EMPTY_MODE) - - def test_create_default_views(self): - widget = self.create_widget() - views = widget.createDefaultViews() - self.assertTrue(len(views) > 0) - - def test_add_view(self): - widget = self.create_widget() - view = _DataViewMock(widget) - widget.addView(view) - self.assertTrue(view in widget.availableViews()) - self.assertTrue(view in widget.currentAvailableViews()) - - def test_remove_view(self): - widget = self.create_widget() - widget.setData("foobar") - view = widget.currentAvailableViews()[0] - widget.removeView(view) - self.assertTrue(view not in widget.availableViews()) - self.assertTrue(view not in widget.currentAvailableViews()) - - def test_replace_view(self): - widget = self.create_widget() - view = _DataViewMock(widget) - widget.replaceView(DataViews.RAW_MODE, - view) - self.assertIsNone(widget.getViewFromModeId(DataViews.RAW_MODE)) - self.assertTrue(view in widget.availableViews()) - self.assertTrue(view in widget.currentAvailableViews()) - - def test_replace_view_in_composite(self): - # replace a view that is a child of a composite view - widget = self.create_widget() - view = _DataViewMock(widget) - replaced = widget.replaceView(DataViews.NXDATA_INVALID_MODE, - view) - self.assertTrue(replaced) - nxdata_view = widget.getViewFromModeId(DataViews.NXDATA_MODE) - self.assertNotIn(DataViews.NXDATA_INVALID_MODE, - [v.modeId() for v in nxdata_view.getViews()]) - self.assertTrue(view in nxdata_view.getViews()) - - -class TestDataViewer(AbstractDataViewerTests): - def create_widget(self): - return DataViewer() - - -class TestDataViewerFrame(AbstractDataViewerTests): - def create_widget(self): - return DataViewerFrame() - - -class TestDataView(TestCaseQt): - - def createComplexData(self): - line = [1, 2j, 3 + 3j, 4] - image = [line, line, line, line] - cube = [image, image, image, image] - data = numpy.array(cube, dtype=numpy.complex64) - return data - - def createDataViewWithData(self, dataViewClass, data): - viewer = dataViewClass(None) - widget = viewer.getWidget() - viewer.setData(data) - return widget - - def testCurveWithComplex(self): - data = self.createComplexData() - dataViewClass = DataViews._Plot1dView - widget = self.createDataViewWithData(dataViewClass, data[0, 0]) - self.qWaitForWindowExposed(widget) - - def testImageWithComplex(self): - data = self.createComplexData() - dataViewClass = DataViews._Plot2dView - widget = self.createDataViewWithData(dataViewClass, data[0]) - self.qWaitForWindowExposed(widget) - - def testCubeWithComplex(self): - self.skipTest("OpenGL widget not yet tested") - try: - import silx.gui.plot3d # noqa - except ImportError: - self.skipTest("OpenGL not available") - data = self.createComplexData() - dataViewClass = DataViews._Plot3dView - widget = self.createDataViewWithData(dataViewClass, data) - self.qWaitForWindowExposed(widget) - - def testImageStackWithComplex(self): - data = self.createComplexData() - dataViewClass = DataViews._StackView - widget = self.createDataViewWithData(dataViewClass, data) - self.qWaitForWindowExposed(widget) - - -def suite(): - test_suite = unittest.TestSuite() - loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase - test_suite.addTest(loadTestsFromTestCase(TestDataViewer)) - test_suite.addTest(loadTestsFromTestCase(TestDataViewerFrame)) - test_suite.addTest(loadTestsFromTestCase(TestDataView)) - return test_suite - - -if __name__ == '__main__': - unittest.main(defaultTest='suite') diff --git a/silx/gui/data/test/test_numpyaxesselector.py b/silx/gui/data/test/test_numpyaxesselector.py deleted file mode 100644 index d37cff7..0000000 --- a/silx/gui/data/test/test_numpyaxesselector.py +++ /dev/null @@ -1,161 +0,0 @@ -# coding: utf-8 -# /*########################################################################## -# -# Copyright (c) 2016-2019 European Synchrotron Radiation Facility -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# ###########################################################################*/ -__authors__ = ["V. Valls"] -__license__ = "MIT" -__date__ = "29/01/2018" - -import os -import tempfile -import unittest -from contextlib import contextmanager - -import numpy - -from silx.gui.data.NumpyAxesSelector import NumpyAxesSelector -from silx.gui.utils.testutils import SignalListener -from silx.gui.utils.testutils import TestCaseQt - -import h5py - - -class TestNumpyAxesSelector(TestCaseQt): - - def test_creation(self): - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - widget = NumpyAxesSelector() - widget.setVisible(True) - - def test_none(self): - data = numpy.arange(3 * 3 * 3) - widget = NumpyAxesSelector() - widget.setData(data) - widget.setData(None) - result = widget.selectedData() - self.assertIsNone(result) - - def test_output_samedim(self): - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - expectedResult = data - - widget = NumpyAxesSelector() - widget.setAxisNames(["x", "y", "z"]) - widget.setData(data) - result = widget.selectedData() - self.assertTrue(numpy.array_equal(result, expectedResult)) - - def test_output_moredim(self): - data = numpy.arange(3 * 3 * 3 * 3) - data.shape = 3, 3, 3, 3 - expectedResult = data - - widget = NumpyAxesSelector() - widget.setAxisNames(["x", "y", "z", "boum"]) - widget.setData(data[0]) - result = widget.selectedData() - self.assertIsNone(result) - widget.setData(data) - result = widget.selectedData() - self.assertTrue(numpy.array_equal(result, expectedResult)) - - def test_output_lessdim(self): - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - expectedResult = data[0] - - widget = NumpyAxesSelector() - widget.setAxisNames(["y", "x"]) - widget.setData(data) - result = widget.selectedData() - self.assertTrue(numpy.array_equal(result, expectedResult)) - - def test_output_1dim(self): - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - expectedResult = data[0, 0, 0] - - widget = NumpyAxesSelector() - widget.setData(data) - result = widget.selectedData() - self.assertTrue(numpy.array_equal(result, expectedResult)) - - @contextmanager - def h5_temporary_file(self): - # create tmp file - fd, tmp_name = tempfile.mkstemp(suffix=".h5") - os.close(fd) - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - # create h5 data - h5file = h5py.File(tmp_name, "w") - h5file["data"] = data - yield h5file - # clean up - h5file.close() - os.unlink(tmp_name) - - def test_h5py_dataset(self): - with self.h5_temporary_file() as h5file: - dataset = h5file["data"] - expectedResult = dataset[0] - - widget = NumpyAxesSelector() - widget.setData(dataset) - widget.setAxisNames(["y", "x"]) - result = widget.selectedData() - self.assertTrue(numpy.array_equal(result, expectedResult)) - - def test_data_event(self): - data = numpy.arange(3 * 3 * 3) - widget = NumpyAxesSelector() - listener = SignalListener() - widget.dataChanged.connect(listener) - widget.setData(data) - widget.setData(None) - self.assertEqual(listener.callCount(), 2) - - def test_selected_data_event(self): - data = numpy.arange(3 * 3 * 3) - data.shape = 3, 3, 3 - widget = NumpyAxesSelector() - listener = SignalListener() - widget.selectionChanged.connect(listener) - widget.setData(data) - widget.setAxisNames(["x"]) - widget.setData(None) - self.assertEqual(listener.callCount(), 3) - listener.clear() - - -def suite(): - test_suite = unittest.TestSuite() - test_suite.addTest( - unittest.defaultTestLoader.loadTestsFromTestCase(TestNumpyAxesSelector)) - return test_suite - - -if __name__ == '__main__': - unittest.main(defaultTest='suite') diff --git a/silx/gui/data/test/test_textformatter.py b/silx/gui/data/test/test_textformatter.py deleted file mode 100644 index d3050bf..0000000 --- a/silx/gui/data/test/test_textformatter.py +++ /dev/null @@ -1,212 +0,0 @@ -# coding: utf-8 -# /*########################################################################## -# -# Copyright (c) 2016-2019 European Synchrotron Radiation Facility -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -# -# ###########################################################################*/ -__authors__ = ["V. Valls"] -__license__ = "MIT" -__date__ = "12/12/2017" - -import unittest -import shutil -import tempfile - -import numpy -import six - -from silx.gui.utils.testutils import TestCaseQt -from silx.gui.utils.testutils import SignalListener -from ..TextFormatter import TextFormatter -from silx.io.utils import h5py_read_dataset - -import h5py - - -class TestTextFormatter(TestCaseQt): - - def test_copy(self): - formatter = TextFormatter() - copy = TextFormatter(formatter=formatter) - self.assertIsNot(formatter, copy) - copy.setFloatFormat("%.3f") - self.assertEqual(formatter.integerFormat(), copy.integerFormat()) - self.assertNotEqual(formatter.floatFormat(), copy.floatFormat()) - self.assertEqual(formatter.useQuoteForText(), copy.useQuoteForText()) - self.assertEqual(formatter.imaginaryUnit(), copy.imaginaryUnit()) - - def test_event(self): - listener = SignalListener() - formatter = TextFormatter() - formatter.formatChanged.connect(listener) - formatter.setFloatFormat("%.3f") - formatter.setIntegerFormat("%03i") - formatter.setUseQuoteForText(False) - formatter.setImaginaryUnit("z") - self.assertEqual(listener.callCount(), 4) - - def test_int(self): - formatter = TextFormatter() - formatter.setIntegerFormat("%05i") - result = formatter.toString(512) - self.assertEqual(result, "00512") - - def test_float(self): - formatter = TextFormatter() - formatter.setFloatFormat("%.3f") - result = formatter.toString(1.3) - self.assertEqual(result, "1.300") - - def test_complex(self): - formatter = TextFormatter() - formatter.setFloatFormat("%.1f") - formatter.setImaginaryUnit("i") - result = formatter.toString(1.0 + 5j) - result = result.replace(" ", "") - self.assertEqual(result, "1.0+5.0i") - - def test_string(self): - formatter = TextFormatter() - formatter.setIntegerFormat("%.1f") - formatter.setImaginaryUnit("z") - result = formatter.toString("toto") - self.assertEqual(result, '"toto"') - - def test_numpy_void(self): - formatter = TextFormatter() - result = formatter.toString(numpy.void(b"\xFF")) - self.assertEqual(result, 'b"\\xFF"') - - def test_char_cp1252(self): - # degree character in cp1252 - formatter = TextFormatter() - result = formatter.toString(numpy.bytes_(b"\xB0")) - self.assertEqual(result, u'"\u00B0"') - - -class TestTextFormatterWithH5py(TestCaseQt): - - @classmethod - def setUpClass(cls): - super(TestTextFormatterWithH5py, cls).setUpClass() - - cls.tmpDirectory = tempfile.mkdtemp() - cls.h5File = h5py.File("%s/formatter.h5" % cls.tmpDirectory, mode="w") - cls.formatter = TextFormatter() - - @classmethod - def tearDownClass(cls): - super(TestTextFormatterWithH5py, cls).tearDownClass() - cls.h5File.close() - cls.h5File = None - shutil.rmtree(cls.tmpDirectory) - - def create_dataset(self, data, dtype=None): - testName = "%s" % self.id() - dataset = self.h5File.create_dataset(testName, data=data, dtype=dtype) - return dataset - - def read_dataset(self, d): - return self.formatter.toString(d[()], dtype=d.dtype) - - def testAscii(self): - d = self.create_dataset(data=b"abc") - result = self.read_dataset(d) - self.assertEqual(result, '"abc"') - - def testUnicode(self): - d = self.create_dataset(data=u"i\u2661cookies") - result = self.read_dataset(d) - self.assertEqual(len(result), 11) - self.assertEqual(result, u'"i\u2661cookies"') - - def testBadAscii(self): - d = self.create_dataset(data=b"\xF0\x9F\x92\x94") - result = self.read_dataset(d) - self.assertEqual(result, 'b"\\xF0\\x9F\\x92\\x94"') - - def testVoid(self): - d = self.create_dataset(data=numpy.void(b"abc\xF0")) - result = self.read_dataset(d) - self.assertEqual(result, 'b"\\x61\\x62\\x63\\xF0"') - - def testEnum(self): - dtype = h5py.special_dtype(enum=('i', {"RED": 0, "GREEN": 1, "BLUE": 42})) - d = numpy.array(42, dtype=dtype) - d = self.create_dataset(data=d) - result = self.read_dataset(d) - self.assertEqual(result, 'BLUE(42)') - - def testRef(self): - dtype = h5py.special_dtype(ref=h5py.Reference) - d = numpy.array(self.h5File.ref, dtype=dtype) - d = self.create_dataset(data=d) - result = self.read_dataset(d) - self.assertEqual(result, 'REF') - - def testArrayAscii(self): - d = self.create_dataset(data=[b"abc"]) - result = self.read_dataset(d) - self.assertEqual(result, '["abc"]') - - def testArrayUnicode(self): - dtype = h5py.special_dtype(vlen=six.text_type) - d = numpy.array([u"i\u2661cookies"], dtype=dtype) - d = self.create_dataset(data=d) - result = self.read_dataset(d) - self.assertEqual(len(result), 13) - self.assertEqual(result, u'["i\u2661cookies"]') - - def testArrayBadAscii(self): - d = self.create_dataset(data=[b"\xF0\x9F\x92\x94"]) - result = self.read_dataset(d) - self.assertEqual(result, '[b"\\xF0\\x9F\\x92\\x94"]') - - def testArrayVoid(self): - d = self.create_dataset(data=numpy.void([b"abc\xF0"])) - result = self.read_dataset(d) - self.assertEqual(result, '[b"\\x61\\x62\\x63\\xF0"]') - - def testArrayEnum(self): - dtype = h5py.special_dtype(enum=('i', {"RED": 0, "GREEN": 1, "BLUE": 42})) - d = numpy.array([42, 1, 100], dtype=dtype) - d = self.create_dataset(data=d) - result = self.read_dataset(d) - self.assertEqual(result, '[BLUE(42) GREEN(1) 100]') - - def testArrayRef(self): - dtype = h5py.special_dtype(ref=h5py.Reference) - d = numpy.array([self.h5File.ref, None], dtype=dtype) - d = self.create_dataset(data=d) - result = self.read_dataset(d) - self.assertEqual(result, '[REF NULL_REF]') - - -def suite(): - loadTests = unittest.defaultTestLoader.loadTestsFromTestCase - test_suite = unittest.TestSuite() - test_suite.addTest(loadTests(TestTextFormatter)) - test_suite.addTest(loadTests(TestTextFormatterWithH5py)) - return test_suite - - -if __name__ == '__main__': - unittest.main(defaultTest='suite') |