summaryrefslogtreecommitdiff
path: root/silx/io/test/test_spech5.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/io/test/test_spech5.py')
-rw-r--r--silx/io/test/test_spech5.py123
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(