123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # This file is part of h5py, a Python interface to the HDF5 library.
- #
- # http://www.h5py.org
- #
- # Copyright 2008-2013 Andrew Collette and contributors
- #
- # License: Standard 3-clause BSD; see "license.txt" for full license terms
- # and contributor agreement.
- """
- Tests for the (internal) selections module
- """
- import numpy as np
- import h5py
- import h5py._hl.selections as sel
- import h5py._hl.selections2 as sel2
- from .common import TestCase, ut
- class BaseSelection(TestCase):
- def setUp(self):
- self.f = h5py.File(self.mktemp(), 'w')
- self.dsid = self.f.create_dataset('x', ()).id
- def tearDown(self):
- if self.f:
- self.f.close()
- class TestTypeGeneration(BaseSelection):
- """
- Internal feature: Determine output types from dataset dtype and fields.
- """
- def test_simple(self):
- """ Non-compound types are handled appropriately """
- dt = np.dtype('i')
- out, format = sel2.read_dtypes(dt, ())
- self.assertEqual(out, format)
- self.assertEqual(out, np.dtype('i'))
- def test_simple_fieldexc(self):
- """ Field names for non-field types raises ValueError """
- dt = np.dtype('i')
- with self.assertRaises(ValueError):
- out, format = sel2.read_dtypes(dt, ('a',))
- def test_compound_simple(self):
- """ Compound types with elemental subtypes """
- dt = np.dtype( [('a','i'), ('b','f'), ('c','|S10')] )
- # Implicit selection of all fields -> all fields
- out, format = sel2.read_dtypes(dt, ())
- self.assertEqual(out, format)
- self.assertEqual(out, dt)
- # Explicit selection of fields -> requested fields
- out, format = sel2.read_dtypes(dt, ('a','b'))
- self.assertEqual(out, format)
- self.assertEqual(out, np.dtype( [('a','i'), ('b','f')] ))
- # Explicit selection of exactly one field -> no fields
- out, format = sel2.read_dtypes(dt, ('a',))
- self.assertEqual(out, np.dtype('i'))
- self.assertEqual(format, np.dtype( [('a','i')] ))
- # Field does not apear in named typed
- with self.assertRaises(ValueError):
- out, format = sel2.read_dtypes(dt, ('j', 'k'))
- class TestScalarSliceRules(BaseSelection):
- """
- Internal feature: selections rules for scalar datasets
- """
- def test_args(self):
- """ Permissible arguments for scalar slicing """
- shape, selection = sel2.read_selections_scalar(self.dsid, ())
- self.assertEqual(shape, None)
- self.assertEqual(selection.get_select_npoints(), 1)
- shape, selection = sel2.read_selections_scalar(self.dsid, (Ellipsis,))
- self.assertEqual(shape, ())
- self.assertEqual(selection.get_select_npoints(), 1)
- with self.assertRaises(ValueError):
- shape, selection = sel2.read_selections_scalar(self.dsid, (1,))
- dsid = self.f.create_dataset('y', (1,)).id
- with self.assertRaises(RuntimeError):
- shape, selection = sel2.read_selections_scalar(dsid, (1,))
- class TestSelection(BaseSelection):
- """ High-level routes to generate a selection
- """
- def test_selection(self):
- dset = self.f.create_dataset('dset', (100,100))
- regref = dset.regionref[0:100, 0:100]
- # args is list, return a FancySelection
- st = sel.select((10,), list([1,2,3]), dset)
- self.assertIsInstance(st, sel.FancySelection)
- # args is a Boolean mask, return a PointSelection
- st1 = sel.select((5,), np.array([True,False,False,False,True]), dset)
- self.assertIsInstance(st1, sel.PointSelection)
- # args is int, return a SimpleSelection
- st2 = sel.select((10,), 1, dset)
- self.assertIsInstance(st2, sel.SimpleSelection)
- # args is RegionReference, return a Selection instance
- st3 = sel.select((100,100), regref, dset)
- self.assertIsInstance(st3, sel.Selection)
- # args is RegionReference, but dataset is None
- with self.assertRaises(TypeError):
- sel.select((100,), regref, None)
- # args is RegionReference, but its shape doesn't match dataset shape
- with self.assertRaises(TypeError):
- sel.select((100,), regref, dset)
- # args is a single Selection instance, return the arg
- st4 = sel.select((100,100), st3, dset)
- self.assertEqual(st4,st3)
- # args is a single Selection instance, but args shape doesn't match Shape
- with self.assertRaises(TypeError):
- sel.select((100,), st3, dset)
|