2
from numpy.testing import *
4
from numpy import zeros, ones, array
7
# This is the structure of the table used for plain objects:
13
# Structure of a plain array description:
19
# A plain list of tuples with values for testing:
22
([3,2], [[6.,4.],[6.,4.]], 8),
23
([4,3], [[7.,5.],[7.,5.]], 9),
27
# This is the structure of the table used for nested objects (DON'T PANIC!):
29
# +-+---------------------------------+-----+----------+-+-+
30
# |x|Info |color|info |y|z|
31
# | +-----+--+----------------+----+--+ +----+-----+ | |
32
# | |value|y2|Info2 |name|z2| |Name|Value| | |
33
# | | | +----+-----+--+--+ | | | | | | |
34
# | | | |name|value|y3|z3| | | | | | | |
35
# +-+-----+--+----+-----+--+--+----+--+-----+----+-----+-+-+
38
# The corresponding nested array description:
46
('value', 'c16', (2,)),
53
('Name', 'U8'), # Try out 'U8' when interpretation of Unicode strings is more clear
59
# x Info color info y z
60
# value y2 Info2 name z2 Name Value
62
([3,2], (6j, 6., ('nn', [6j,4j], [6.,4.], [1,2]), 'NN', True), 'cc', ('NN', 6j), [[6.,4.],[6.,4.]], 8),
63
([4,3], (7j, 7., ('oo', [7j,5j], [7.,5.], [2,1]), 'OO', False), 'dd', ('OO', 7j), [[7.,5.],[7.,5.]], 9),
67
byteorder = {'little':'<', 'big':'>'}[sys.byteorder]
69
def normalize_descr(descr):
70
"Normalize a description adding the platform byteorder."
75
if isinstance(dtype, str):
76
if dtype[0] not in ['|','<','>']:
77
onebyte = dtype[1:] == "1"
78
if onebyte or dtype[0] in ['S', 'V', 'b']:
81
dtype = byteorder + dtype
82
if len(item) > 2 and item[2] > 1:
83
nitem = (item[0], dtype, item[2])
85
nitem = (item[0], dtype)
87
elif isinstance(item[1], list):
89
for j in normalize_descr(item[1]):
91
out.append((item[0], l))
93
raise ValueError("Expected a str or list and got %s" % \
98
############################################################
100
############################################################
103
"""Check the creation of heterogeneous arrays zero-valued"""
105
def check_zeros0D(self):
106
"""Check creation of 0-dimensional objects"""
107
h = zeros((), dtype=self._descr)
108
self.assert_(normalize_descr(self._descr) == h.dtype.descr)
109
self.assert_(h.dtype.fields['x'][0].name[:4] == 'void')
110
self.assert_(h.dtype.fields['x'][0].char == 'V')
111
self.assert_(h.dtype.fields['x'][0].type == numpy.void)
112
# A small check that data is ok
113
assert_equal(h['z'], zeros((), dtype='u1'))
115
def check_zerosSD(self):
116
"""Check creation of single-dimensional objects"""
117
h = zeros((2,), dtype=self._descr)
118
self.assert_(normalize_descr(self._descr) == h.dtype.descr)
119
self.assert_(h.dtype['y'].name[:4] == 'void')
120
self.assert_(h.dtype['y'].char == 'V')
121
self.assert_(h.dtype['y'].type == numpy.void)
122
# A small check that data is ok
123
assert_equal(h['z'], zeros((2,), dtype='u1'))
125
def check_zerosMD(self):
126
"""Check creation of multi-dimensional objects"""
127
h = zeros((2,3), dtype=self._descr)
128
self.assert_(normalize_descr(self._descr) == h.dtype.descr)
129
self.assert_(h.dtype['z'].name == 'uint8')
130
self.assert_(h.dtype['z'].char == 'B')
131
self.assert_(h.dtype['z'].type == numpy.uint8)
132
# A small check that data is ok
133
assert_equal(h['z'], zeros((2,3), dtype='u1'))
136
class test_create_zeros_plain(create_zeros, NumpyTestCase):
137
"""Check the creation of heterogeneous arrays zero-valued (plain)"""
140
class test_create_zeros_nested(create_zeros, NumpyTestCase):
141
"""Check the creation of heterogeneous arrays zero-valued (nested)"""
146
"""Check the creation of heterogeneous arrays with values"""
148
def check_tuple(self):
149
"""Check creation from tuples"""
150
h = array(self._buffer, dtype=self._descr)
151
self.assert_(normalize_descr(self._descr) == h.dtype.descr)
152
if self.multiple_rows:
153
self.assert_(h.shape == (2,))
155
self.assert_(h.shape == ())
157
def check_list_of_tuple(self):
158
"""Check creation from list of tuples"""
159
h = array([self._buffer], dtype=self._descr)
160
self.assert_(normalize_descr(self._descr) == h.dtype.descr)
161
if self.multiple_rows:
162
self.assert_(h.shape == (1,2))
164
self.assert_(h.shape == (1,))
166
def check_list_of_list_of_tuple(self):
167
"""Check creation from list of list of tuples"""
168
h = array([[self._buffer]], dtype=self._descr)
169
self.assert_(normalize_descr(self._descr) == h.dtype.descr)
170
if self.multiple_rows:
171
self.assert_(h.shape == (1,1,2))
173
self.assert_(h.shape == (1,1))
176
class test_create_values_plain_single(create_values, NumpyTestCase):
177
"""Check the creation of heterogeneous arrays (plain, single row)"""
180
_buffer = PbufferT[0]
182
class test_create_values_plain_multiple(create_values, NumpyTestCase):
183
"""Check the creation of heterogeneous arrays (plain, multiple rows)"""
188
class test_create_values_nested_single(create_values, NumpyTestCase):
189
"""Check the creation of heterogeneous arrays (nested, single row)"""
192
_buffer = NbufferT[0]
194
class test_create_values_nested_multiple(create_values, NumpyTestCase):
195
"""Check the creation of heterogeneous arrays (nested, multiple rows)"""
201
############################################################
203
############################################################
205
class read_values_plain:
206
"""Check the reading of values in heterogeneous arrays (plain)"""
208
def check_access_fields(self):
209
h = array(self._buffer, dtype=self._descr)
210
if not self.multiple_rows:
211
self.assert_(h.shape == ())
212
assert_equal(h['x'], array(self._buffer[0], dtype='i4'))
213
assert_equal(h['y'], array(self._buffer[1], dtype='f8'))
214
assert_equal(h['z'], array(self._buffer[2], dtype='u1'))
216
self.assert_(len(h) == 2)
217
assert_equal(h['x'], array([self._buffer[0][0],
218
self._buffer[1][0]], dtype='i4'))
219
assert_equal(h['y'], array([self._buffer[0][1],
220
self._buffer[1][1]], dtype='f8'))
221
assert_equal(h['z'], array([self._buffer[0][2],
222
self._buffer[1][2]], dtype='u1'))
225
class test_read_values_plain_single(read_values_plain, NumpyTestCase):
226
"""Check the creation of heterogeneous arrays (plain, single row)"""
229
_buffer = PbufferT[0]
231
class test_read_values_plain_multiple(read_values_plain, NumpyTestCase):
232
"""Check the values of heterogeneous arrays (plain, multiple rows)"""
237
class read_values_nested:
238
"""Check the reading of values in heterogeneous arrays (nested)"""
241
def check_access_top_fields(self):
242
"""Check reading the top fields of a nested array"""
243
h = array(self._buffer, dtype=self._descr)
244
if not self.multiple_rows:
245
self.assert_(h.shape == ())
246
assert_equal(h['x'], array(self._buffer[0], dtype='i4'))
247
assert_equal(h['y'], array(self._buffer[4], dtype='f8'))
248
assert_equal(h['z'], array(self._buffer[5], dtype='u1'))
250
self.assert_(len(h) == 2)
251
assert_equal(h['x'], array([self._buffer[0][0],
252
self._buffer[1][0]], dtype='i4'))
253
assert_equal(h['y'], array([self._buffer[0][4],
254
self._buffer[1][4]], dtype='f8'))
255
assert_equal(h['z'], array([self._buffer[0][5],
256
self._buffer[1][5]], dtype='u1'))
259
def check_nested1_acessors(self):
260
"""Check reading the nested fields of a nested array (1st level)"""
261
h = array(self._buffer, dtype=self._descr)
262
if not self.multiple_rows:
263
assert_equal(h['Info']['value'],
264
array(self._buffer[1][0], dtype='c16'))
265
assert_equal(h['Info']['y2'],
266
array(self._buffer[1][1], dtype='f8'))
267
assert_equal(h['info']['Name'],
268
array(self._buffer[3][0], dtype='U2'))
269
assert_equal(h['info']['Value'],
270
array(self._buffer[3][1], dtype='c16'))
272
assert_equal(h['Info']['value'],
273
array([self._buffer[0][1][0],
274
self._buffer[1][1][0]],
276
assert_equal(h['Info']['y2'],
277
array([self._buffer[0][1][1],
278
self._buffer[1][1][1]],
280
assert_equal(h['info']['Name'],
281
array([self._buffer[0][3][0],
282
self._buffer[1][3][0]],
284
assert_equal(h['info']['Value'],
285
array([self._buffer[0][3][1],
286
self._buffer[1][3][1]],
289
def check_nested2_acessors(self):
290
"""Check reading the nested fields of a nested array (2nd level)"""
291
h = array(self._buffer, dtype=self._descr)
292
if not self.multiple_rows:
293
assert_equal(h['Info']['Info2']['value'],
294
array(self._buffer[1][2][1], dtype='c16'))
295
assert_equal(h['Info']['Info2']['z3'],
296
array(self._buffer[1][2][3], dtype='u4'))
298
assert_equal(h['Info']['Info2']['value'],
299
array([self._buffer[0][1][2][1],
300
self._buffer[1][1][2][1]],
302
assert_equal(h['Info']['Info2']['z3'],
303
array([self._buffer[0][1][2][3],
304
self._buffer[1][1][2][3]],
307
def check_nested1_descriptor(self):
308
"""Check access nested descriptors of a nested array (1st level)"""
309
h = array(self._buffer, dtype=self._descr)
310
self.assert_(h.dtype['Info']['value'].name == 'complex128')
311
self.assert_(h.dtype['Info']['y2'].name == 'float64')
312
self.assert_(h.dtype['info']['Name'].name == 'unicode256')
313
self.assert_(h.dtype['info']['Value'].name == 'complex128')
315
def check_nested2_descriptor(self):
316
"""Check access nested descriptors of a nested array (2nd level)"""
317
h = array(self._buffer, dtype=self._descr)
318
self.assert_(h.dtype['Info']['Info2']['value'].name == 'void256')
319
self.assert_(h.dtype['Info']['Info2']['z3'].name == 'void64')
322
class test_read_values_nested_single(read_values_nested, NumpyTestCase):
323
"""Check the values of heterogeneous arrays (nested, single row)"""
326
_buffer = NbufferT[0]
328
class test_read_values_nested_multiple(read_values_nested, NumpyTestCase):
329
"""Check the values of heterogeneous arrays (nested, multiple rows)"""
335
if __name__ == "__main__":