summaryrefslogtreecommitdiff
path: root/silx/gui/data/test
diff options
context:
space:
mode:
Diffstat (limited to 'silx/gui/data/test')
-rw-r--r--silx/gui/data/test/__init__.py45
-rw-r--r--silx/gui/data/test/test_arraywidget.py329
-rw-r--r--silx/gui/data/test/test_dataviewer.py314
-rw-r--r--silx/gui/data/test/test_numpyaxesselector.py161
-rw-r--r--silx/gui/data/test/test_textformatter.py212
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')