diff options
Diffstat (limited to 'silx/io/test/test_spech5.py')
-rw-r--r-- | silx/io/test/test_spech5.py | 123 |
1 files changed, 102 insertions, 21 deletions
diff --git a/silx/io/test/test_spech5.py b/silx/io/test/test_spech5.py index ac250ab..1d04c6f 100644 --- a/silx/io/test/test_spech5.py +++ b/silx/io/test/test_spech5.py @@ -25,12 +25,16 @@ import gc from numpy import array_equal import os +import io import sys import tempfile import unittest import datetime from functools import partial +from silx.test import utils + +from .. import spech5 from ..spech5 import (SpecH5, SpecH5Group, SpecH5Dataset, spec_date_to_iso8601) from .. import specfile @@ -42,7 +46,7 @@ except ImportError: __authors__ = ["P. Knobel"] __license__ = "MIT" -__date__ = "11/05/2017" +__date__ = "26/07/2017" sftext = """#F /tmp/sf.dat #E 1455180875 @@ -107,6 +111,12 @@ sftext = """#F /tmp/sf.dat #L a b 1 2 +#S 1001 ccccc +#G1 0. 0. 0. 0 0 0 2.232368448 2.232368448 1.206680489 90 90 60 1 1 2 -1 2 2 26.132 7.41 -88.96 1.11 1.000012861 15.19 26.06 67.355 -88.96 1.11 1.000012861 15.11 0.723353 0.723353 +#G3 0. 0. 0. 0. 0.0 0. 0. 0. 0. +#L a b +1 2 + """ @@ -254,9 +264,6 @@ class TestSpecH5(unittest.TestCase): # full path to element in group (OK) self.assertIn("/1.1/instrument/positioners/Sslit1 HOff", self.sfh5["/1.1/instrument"]) - # full path to element outside group (illegal) - self.assertNotIn("/1.1/instrument/positioners/Sslit1 HOff", - self.sfh5["/1.1/measurement"]) def testDataColumn(self): self.assertAlmostEqual(sum(self.sfh5["/1.2/measurement/duo"]), @@ -306,9 +313,20 @@ class TestSpecH5(unittest.TestCase): # spech5 does not define external link, so there is no way # a group can *get* a SpecH5 class + @unittest.skipIf(h5py is None, "test requires h5py (not installed)") + def testGetApi(self): + result = self.sfh5.get("1.1", getclass=True, getlink=True) + self.assertIs(result, h5py.HardLink) + result = self.sfh5.get("1.1", getclass=False, getlink=True) + self.assertIsInstance(result, h5py.HardLink) + result = self.sfh5.get("1.1", getclass=True, getlink=False) + self.assertIs(result, h5py.Group) + result = self.sfh5.get("1.1", getclass=False, getlink=False) + self.assertIsInstance(result, spech5.SpecH5Group) + def testGetItemGroup(self): group = self.sfh5["25.1"]["instrument"] - self.assertEqual(group["positioners"].keys(), + self.assertEqual(list(group["positioners"].keys()), ["Pslit HGap", "MRTSlit UP", "MRTSlit DOWN", "Sslit1 VOff", "Sslit1 HOff", "Sslit1 VGap"]) with self.assertRaises(KeyError): @@ -389,8 +407,8 @@ class TestSpecH5(unittest.TestCase): self.sfh5["/1.2/instrument/mca_0/elapsed_time"]) def testListScanIndices(self): - self.assertEqual(self.sfh5.keys(), - ["1.1", "25.1", "1.2", "1000.1"]) + self.assertEqual(list(self.sfh5.keys()), + ["1.1", "25.1", "1.2", "1000.1", "1001.1"]) self.assertEqual(self.sfh5["1.2"].attrs, {"NX_class": "NXentry", }) @@ -477,30 +495,80 @@ class TestSpecH5(unittest.TestCase): self.assertEqual(self.sfh5["/25.1/title"], b"25 ascan c3th 1.33245 1.52245 40 0.15") + def testValues(self): + group = self.sfh5["/25.1"] + self.assertTrue(hasattr(group, "values")) + self.assertTrue(callable(group.values)) + self.assertIn(self.sfh5["/25.1/title"], + self.sfh5["/25.1"].values()) + # visit and visititems ignore links def testVisit(self): name_list = [] self.sfh5.visit(name_list.append) - self.assertIn('/1.2/instrument/positioners/Pslit HGap', name_list) - self.assertIn("/1.2/instrument/specfile/scan_header", name_list) - self.assertEqual(len(name_list), 100) #, "actual name list: %s" % "\n".join(name_list)) + self.assertIn('1.2/instrument/positioners/Pslit HGap', name_list) + self.assertIn("1.2/instrument/specfile/scan_header", name_list) + self.assertEqual(len(name_list), 117) + + # test also visit of a subgroup, with various group name formats + name_list_leading_and_trailing_slash = [] + self.sfh5['/1.2/instrument/'].visit(name_list_leading_and_trailing_slash.append) + name_list_leading_slash = [] + self.sfh5['/1.2/instrument'].visit(name_list_leading_slash.append) + name_list_trailing_slash = [] + self.sfh5['1.2/instrument/'].visit(name_list_trailing_slash.append) + name_list_no_slash = [] + self.sfh5['1.2/instrument'].visit(name_list_no_slash.append) + + # no differences expected in the output names + self.assertEqual(name_list_leading_and_trailing_slash, + name_list_leading_slash) + self.assertEqual(name_list_leading_slash, + name_list_trailing_slash) + self.assertEqual(name_list_leading_slash, + name_list_no_slash) + self.assertIn("positioners/Pslit HGap", name_list_no_slash) + self.assertIn("positioners", name_list_no_slash) def testVisitItems(self): dataset_name_list = [] - def func(name, obj): - if isinstance(obj, SpecH5Dataset): - dataset_name_list.append(name) - - self.sfh5.visititems(func) - self.assertIn('/1.2/instrument/positioners/Pslit HGap', dataset_name_list) - self.assertEqual(len(dataset_name_list), 73) + def func_generator(l): + """return a function appending names to list l""" + def func(name, obj): + if isinstance(obj, SpecH5Dataset): + l.append(name) + return func + + self.sfh5.visititems(func_generator(dataset_name_list)) + self.assertIn('1.2/instrument/positioners/Pslit HGap', dataset_name_list) + self.assertEqual(len(dataset_name_list), 85) + + # test also visit of a subgroup, with various group name formats + name_list_leading_and_trailing_slash = [] + self.sfh5['/1.2/instrument/'].visititems(func_generator(name_list_leading_and_trailing_slash)) + name_list_leading_slash = [] + self.sfh5['/1.2/instrument'].visititems(func_generator(name_list_leading_slash)) + name_list_trailing_slash = [] + self.sfh5['1.2/instrument/'].visititems(func_generator(name_list_trailing_slash)) + name_list_no_slash = [] + self.sfh5['1.2/instrument'].visititems(func_generator(name_list_no_slash)) + + # no differences expected in the output names + self.assertEqual(name_list_leading_and_trailing_slash, + name_list_leading_slash) + self.assertEqual(name_list_leading_slash, + name_list_trailing_slash) + self.assertEqual(name_list_leading_slash, + name_list_no_slash) + self.assertIn("positioners/Pslit HGap", name_list_no_slash) def testNotSpecH5(self): fd, fname = tempfile.mkstemp() os.write(fd, b"Not a spec file!") os.close(fd) self.assertRaises(specfile.SfErrFileOpen, SpecH5, fname) + self.assertRaises(IOError, SpecH5, fname) os.unlink(fname) def testSample(self): @@ -511,6 +579,21 @@ class TestSpecH5(unittest.TestCase): self.assertIn("unit_cell_abc", self.sfh5["/1000.1/sample"]) self.assertIn("unit_cell_alphabetagamma", self.sfh5["/1000.1/sample"]) + # All 0 values + self.assertNotIn("sample", self.sfh5["/1001.1"]) + with self.assertRaises(KeyError): + uc = self.sfh5["/1001.1/sample/unit_cell"] + + @utils.test_logging(spech5.logger1.name, warning=2) + def testOpenFileDescriptor(self): + """Open a SpecH5 file from a file descriptor""" + with io.open(self.sfh5.filename) as f: + sfh5 = SpecH5(f) + self.assertIsNotNone(sfh5) + name_list = [] + # check if the object is working + self.sfh5.visit(name_list.append) + sftext_multi_mca_headers = """ #S 1 aaaaaa @@ -767,7 +850,7 @@ class TestSpecH5SlashInLabels(unittest.TestCase): def testLabels(self): """Ensure `/` is substituted with `%` and ensure legitimate `%` in names are still working""" - self.assertEqual(self.sfh5["1.1/measurement/"].keys(), + self.assertEqual(list(self.sfh5["1.1/measurement/"].keys()), ["GONY%mm", "PD3%A"]) # substituted "%" @@ -784,7 +867,7 @@ class TestSpecH5SlashInLabels(unittest.TestCase): def testMotors(self): """Ensure `/` is substituted with `%` and ensure legitimate `%` in names are still working""" - self.assertEqual(self.sfh5["1.1/instrument/positioners"].keys(), + self.assertEqual(list(self.sfh5["1.1/instrument/positioners"].keys()), ["Pslit%HGap", "MRTSlit%UP"]) # substituted "%" self.assertIn("Pslit%HGap", @@ -799,8 +882,6 @@ class TestSpecH5SlashInLabels(unittest.TestCase): self.sfh5["1.1/instrument/positioners"]) - - def suite(): test_suite = unittest.TestSuite() test_suite.addTest( |