summaryrefslogtreecommitdiff
path: root/src/silx/gui/data/test/test_textformatter.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/silx/gui/data/test/test_textformatter.py')
-rw-r--r--src/silx/gui/data/test/test_textformatter.py212
1 files changed, 212 insertions, 0 deletions
diff --git a/src/silx/gui/data/test/test_textformatter.py b/src/silx/gui/data/test/test_textformatter.py
new file mode 100644
index 0000000..49b8283
--- /dev/null
+++ b/src/silx/gui/data/test/test_textformatter.py
@@ -0,0 +1,212 @@
+# /*##########################################################################
+#
+# Copyright (c) 2016-2023 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 shutil
+import tempfile
+
+import numpy
+
+from silx.gui.utils.testutils import TestCaseQt
+from silx.gui.utils.testutils import SignalListener
+from ..TextFormatter import TextFormatter
+
+import h5py
+import pytest
+
+
+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, '"\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="i\u2661cookies")
+ result = self.read_dataset(d)
+ self.assertEqual(len(result), 11)
+ self.assertEqual(result, '"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=str)
+ d = numpy.array(["i\u2661cookies"], dtype=dtype)
+ d = self.create_dataset(data=d)
+ result = self.read_dataset(d)
+ self.assertEqual(len(result), 13)
+ self.assertEqual(result, '["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]")
+
+
+@pytest.mark.parametrize(
+ "data, expected",
+ [
+ (b"bytes", '"bytes"'),
+ ("unicode", '"unicode"'),
+ ((b"elem0", b"elem1"), '["elem0" "elem1"]'),
+ (("elem0", "elem1"), '["elem0" "elem1"]'),
+ ],
+)
+def test_formatter_h5py_attr(tmp_h5py_file, data, expected):
+ """Test formatter with h5py attributes"""
+ tmp_h5py_file.attrs["attr"] = data
+ formatter = TextFormatter()
+ result = formatter.toString(tmp_h5py_file.attrs["attr"])
+ assert result == expected