~ubuntu-branches/ubuntu/natty/pytables/natty-updates

« back to all changes in this revision

Viewing changes to test/test_tablesMD.py

  • Committer: Bazaar Package Importer
  • Author(s): Alexandre Fayolle
  • Date: 2006-06-28 10:45:03 UTC
  • mfrom: (1.2.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20060628104503-cc251q5o5j3e2k10
  * Fixed call to pyversions in debian/rules which failed on recent versions 
    of pyversions
  * Fixed clean rule in debian/rules which left the stamp files behind
  * Acknowledge NMU
  * Added Alexandre Fayolle to uploaders

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
import sys
2
 
import unittest
3
 
import os
4
 
import tempfile
5
 
 
6
 
import numarray
7
 
from numarray import *
8
 
import numarray.records as records
9
 
from numarray import strings
10
 
from tables import *
11
 
from tables.hdf5Extension import getIndices
12
 
 
13
 
from test_all import verbose, heavy, allequal
14
 
# If we use the test_all.allequal function, a segmentation violation appears
15
 
# but only when the test runs *alone* and *without* verbose parameters!
16
 
# However, if we use the allequal in this module, everything seems to work well
17
 
# this should be further investigated!. F. Alted 2004/01/01
18
 
 
19
 
# Update: That seems to work well now. Perhaps a bug in numarray that
20
 
# has been solved? F. Alted 2004/08/06
21
 
 
22
 
# def allequal(a,b):
23
 
#     """Checks if two numarrays are equal"""
24
 
 
25
 
#     if a.shape <> b.shape:
26
 
#         return 0
27
 
 
28
 
#     # Rank-0 case
29
 
#     if len(a.shape) == 0:
30
 
#         if str(equal(a,b)) == '1':
31
 
#             return 1
32
 
#         else:
33
 
#             return 0
34
 
#     # Multidimensional case
35
 
#     result = (a == b)
36
 
#     for i in range(len(a.shape)):
37
 
#         result = logical_and.reduce(result)
38
 
 
39
 
#     return result
40
 
 
41
 
# Test Record class
42
 
class Record(IsDescription):
43
 
    var1 = StringCol(4, "abcd", shape=(2,2))    # 4-character string array
44
 
    var2 = IntCol(((1,1),(1,1)), shape=(2,2))   # integer array
45
 
    var3 = Int16Col(2)                          # short integer 
46
 
    var4 = FloatCol(3.1)                        # double (double-precision)
47
 
    var5 = Float32Col(4.2)                      # float  (single-precision)
48
 
    var6 = UInt16Col(5)                         # unsigned short integer 
49
 
    var7 = StringCol(length=1, dflt="e")        # 1-character String
50
 
 
51
 
# From 0.3 on, you can dynamically define the tables with a dictionary
52
 
RecordDescriptionDict = {
53
 
    'var1': StringCol(length=4, shape=(2,2)),     # 4-character String
54
 
    'var2': IntCol(shape=(2,2)),                  # integer array
55
 
    'var3': Int16Col(),                           # short integer 
56
 
    'var4': FloatCol(),                           # double (double-precision)
57
 
    'var5': Float32Col(),                         # float  (single-precision)
58
 
    'var6': Int16Col(),                           # unsigned short integer 
59
 
    'var7': StringCol(length=1),                  # 1-character String
60
 
    }
61
 
 
62
 
class BasicTestCase(unittest.TestCase):
63
 
    #file  = "test.h5"
64
 
    mode  = "w" 
65
 
    title = "This is the table title"
66
 
    expectedrows = 100
67
 
    appendrows = 20
68
 
    compress = 0
69
 
    complib = "zlib"  # Default compression library
70
 
    record = Record
71
 
    recarrayinit = 0
72
 
    maxshort = 1 << 15
73
 
 
74
 
    def setUp(self):
75
 
 
76
 
        # Create an instance of an HDF5 Table
77
 
        self.file = tempfile.mktemp(".h5")
78
 
        self.fileh = openFile(self.file, self.mode)
79
 
        self.rootgroup = self.fileh.root
80
 
        self.populateFile()
81
 
        self.fileh.close()
82
 
 
83
 
    def initRecArray(self):
84
 
        record = self.recordtemplate
85
 
        row = record[0]
86
 
        buflist = []
87
 
        # Fill the recarray
88
 
        #for i in xrange(self.expectedrows+1):
89
 
        for i in xrange(self.expectedrows+1):
90
 
            tmplist = []
91
 
            # Both forms (list or chararray) works
92
 
            var1 = [['%04d' % (self.expectedrows - i)] * 2] * 2
93
 
#             var1 = strings.array([['%04d' % (self.expectedrows - i)] * 2] * 2,
94
 
#                                  itemsize = 4, shape=(2,2))
95
 
            tmplist.append(var1)
96
 
            var2 = ((i, 1), (1,1))           # *-*
97
 
            tmplist.append(var2)
98
 
            var3 = i % self.maxshort
99
 
            tmplist.append(var3)
100
 
            if isinstance(row.field('var4'), NumArray):
101
 
                tmplist.append([float(i), float(i*i)])
102
 
            else:
103
 
                tmplist.append(float(i))
104
 
            if isinstance(row.field('var5'), NumArray):
105
 
                tmplist.append(array((float(i),)*4))
106
 
            else:
107
 
                tmplist.append(float(i))
108
 
            # var6 will be like var3 but byteswaped
109
 
            tmplist.append(((var3>>8) & 0xff) + ((var3<<8) & 0xff00))
110
 
            var7 = var1[0][0][-1]
111
 
            tmplist.append(var7)
112
 
            buflist.append(tmplist)
113
 
 
114
 
        self.record=records.array(buflist, formats=record._formats,
115
 
                                   names=record._names,
116
 
                                   shape = self.expectedrows)
117
 
 
118
 
        return
119
 
                
120
 
    def populateFile(self):
121
 
        group = self.rootgroup
122
 
        if self.recarrayinit:
123
 
            # Initialize an starting buffer, if any
124
 
            self.initRecArray()
125
 
        for j in range(3):
126
 
            # Create a table
127
 
            filters = Filters(complevel = self.compress,
128
 
                              complib = self.complib)
129
 
            table = self.fileh.createTable(group, 'table'+str(j), self.record,
130
 
                                           title = self.title,
131
 
                                           filters = filters,
132
 
                                           expectedrows = self.expectedrows)
133
 
            if not self.recarrayinit:
134
 
                # Get the row object associated with the new table
135
 
                row = table.row
136
 
            
137
 
                # Fill the table
138
 
                for i in xrange(self.expectedrows):
139
 
                    row['var1'] = '%04d' % (self.expectedrows - i)
140
 
                    row['var7'] = row['var1'][0][0][-1]
141
 
                    row['var2'] = ((i, 1), (1,1))  # *-* 
142
 
                    row['var3'] = i % self.maxshort
143
 
                    if isinstance(row['var4'], NumArray):
144
 
                        row['var4'] = [float(i), float(i*i)]
145
 
                    else:
146
 
                        row['var4'] = float(i)
147
 
                    if isinstance(row['var5'], NumArray):
148
 
                        row['var5'] = array((float(i),)*4)
149
 
                    else:
150
 
                        row['var5'] = float(i)
151
 
                    # var6 will be like var3 but byteswaped
152
 
                    row['var6'] = ((row['var3']>>8) & 0xff) + \
153
 
                                  ((row['var3']<<8) & 0xff00)
154
 
                    #print("Saving -->", row)
155
 
                    row.append()
156
 
                
157
 
            # Flush the buffer for this table
158
 
            table.flush()
159
 
            # Create a new group (descendant of group)
160
 
            group2 = self.fileh.createGroup(group, 'group'+str(j))
161
 
            # Iterate over this new group (group2)
162
 
            group = group2
163
 
 
164
 
 
165
 
    def tearDown(self):
166
 
        self.fileh.close()
167
 
        #del self.fileh, self.rootgroup
168
 
        os.remove(self.file)
169
 
        
170
 
    #----------------------------------------
171
 
 
172
 
    def test01_readTable(self):
173
 
        """Checking table read and cuts"""
174
 
 
175
 
        rootgroup = self.rootgroup
176
 
        if verbose:
177
 
            print '\n', '-=' * 30
178
 
            print "Running %s.test01_readTable..." % self.__class__.__name__
179
 
 
180
 
        # Create an instance of an HDF5 Table
181
 
        self.fileh = openFile(self.file, "r")
182
 
        table = self.fileh.getNode("/table0")
183
 
 
184
 
        # Choose a small value for buffer size
185
 
        table._v_maxTuples = 3
186
 
        # Read the records and select those with "var2" file less than 20
187
 
        result = [ rec['var2'][0][0] for rec in table.iterrows()
188
 
                   if rec['var2'][0][0] < 20 ]
189
 
        if verbose:
190
 
            print "Table:", repr(table)
191
 
            print "Nrows in", table._v_pathname, ":", table.nrows
192
 
            print "Last record in table ==>", rec
193
 
            print "Total selected records in table ==> ", len(result)
194
 
        nrows = self.expectedrows - 1
195
 
        assert (rec['var1'][0][0], rec['var2'][0][0], rec['var7']) == \
196
 
               ("0001",            nrows,             "1")
197
 
        if isinstance(rec['var5'], NumArray):
198
 
            assert allequal(rec['var5'], array((float(nrows),)*4, Float32))
199
 
        else:
200
 
            assert rec['var5'] == float(nrows)
201
 
        assert len(result) == 20
202
 
        
203
 
    def test01b_readTable(self):
204
 
        """Checking table read and cuts (multidimensional columns case)"""
205
 
 
206
 
        rootgroup = self.rootgroup
207
 
        if verbose:
208
 
            print '\n', '-=' * 30
209
 
            print "Running %s.test01b_readTable..." % self.__class__.__name__
210
 
 
211
 
        # Create an instance of an HDF5 Table
212
 
        self.fileh = openFile(self.file, "r")
213
 
        table = self.fileh.getNode("/table0")
214
 
 
215
 
        # Choose a small value for buffer size
216
 
        table._v_maxTuples = 3
217
 
        # Read the records and select those with "var2" file less than 20
218
 
        result = [ rec['var5'] for rec in table.iterrows()
219
 
                   if rec['var2'][0][0] < 20 ]
220
 
        if verbose:
221
 
            print "Nrows in", table._v_pathname, ":", table.nrows
222
 
            print "Last record in table ==>", rec
223
 
            print "Total selected records in table ==> ", len(result)
224
 
        nrows = table.row.nrow()
225
 
        if isinstance(rec['var5'], NumArray):
226
 
            assert allequal(result[0], array((float(0),)*4, Float32))
227
 
            assert allequal(result[1], array((float(1),)*4, Float32))
228
 
            assert allequal(result[2], array((float(2),)*4, Float32))
229
 
            assert allequal(result[3], array((float(3),)*4, Float32))
230
 
            assert allequal(result[10], array((float(10),)*4, Float32))
231
 
            assert allequal(rec['var5'], array((float(nrows),)*4, Float32))
232
 
        else:
233
 
            assert rec['var5'] == float(nrows)
234
 
        assert len(result) == 20
235
 
 
236
 
        # Read the records and select those with "var2" file less than 20
237
 
        result = [ rec['var1'] for rec in table.iterrows()
238
 
                   if rec['var2'][0][0] < 20 ]
239
 
 
240
 
        if isinstance(rec['var1'], strings.CharArray):
241
 
            a = strings.array([['%04d' % (self.expectedrows - 0)]*2]*2)
242
 
            assert allequal(result[0], a)
243
 
            a = strings.array([['%04d' % (self.expectedrows - 1)]*2]*2)
244
 
            assert allequal(result[1], a)
245
 
            a = strings.array([['%04d' % (self.expectedrows - 2)]*2]*2)
246
 
            assert allequal(result[2], a)
247
 
            a = strings.array([['%04d' % (self.expectedrows - 3)]*2]*2)
248
 
            assert allequal(result[3], a)
249
 
            a = strings.array([['%04d' % (self.expectedrows - 10)]*2]*2)
250
 
            assert allequal(result[10], a)
251
 
            a = strings.array([['%04d' % (1)]*2]*2)
252
 
            assert allequal(rec['var1'], a)
253
 
        else:
254
 
            assert rec['var1'] == "0001"
255
 
        assert len(result) == 20
256
 
                
257
 
    def test02_AppendRows(self):
258
 
        """Checking whether appending record rows works or not"""
259
 
 
260
 
        # Now, open it, but in "append" mode
261
 
        self.fileh = openFile(self.file, mode = "a")
262
 
        self.rootgroup = self.fileh.root
263
 
        if verbose:
264
 
            print '\n', '-=' * 30
265
 
            print "Running %s.test02_AppendRows..." % self.__class__.__name__
266
 
 
267
 
        # Get a table
268
 
        table = self.fileh.getNode("/group0/table1")
269
 
        # Get their row object
270
 
        row = table.row
271
 
        if verbose:
272
 
            print "Nrows in old", table._v_pathname, ":", table.nrows
273
 
            print "Record Format ==>", table._v_fmt
274
 
            print "Record Size ==>", table.rowsize
275
 
        # Append some rows
276
 
        for i in xrange(self.appendrows):
277
 
            row['var1'] = '%04d' % (self.appendrows - i)
278
 
            row['var7'] = row['var1'][0][0][-1]
279
 
            row['var2'] = ((i, 1), (1,1))   # *-*
280
 
            row['var3'] = i % self.maxshort
281
 
            if isinstance(row['var4'], NumArray):
282
 
                row['var4'] = [float(i), float(i*i)]
283
 
            else:
284
 
                row['var4'] = float(i)
285
 
            if isinstance(row['var5'], NumArray):
286
 
                row['var5'] = array((float(i),)*4)
287
 
            else:
288
 
                row['var5'] = float(i)
289
 
            row.append()
290
 
            
291
 
        # Flush the buffer for this table and read it
292
 
        table.flush()
293
 
        result = [ row['var2'][0][0] for row in table.iterrows()
294
 
                   if row['var2'][0][0] < 20 ]
295
 
        
296
 
        nrows = self.appendrows - 1
297
 
        assert (row['var1'][0][0], row['var2'][0][0], row['var7']) == \
298
 
               ("0001", nrows, "1")
299
 
        if isinstance(row['var5'], NumArray):
300
 
            assert allequal(row['var5'], array((float(nrows),)*4, Float32))
301
 
        else:
302
 
            assert row['var5'] == float(nrows)
303
 
        if self.appendrows <= 20:
304
 
            add = self.appendrows
305
 
        else:
306
 
            add = 20
307
 
        assert len(result) == 20 + add  # because we appended new rows
308
 
        #del table
309
 
 
310
 
    # CAVEAT: The next test only works for tables with rows < 2**15
311
 
    def test03_endianess(self):
312
 
        """Checking if table is endianess aware"""
313
 
 
314
 
        rootgroup = self.rootgroup
315
 
        if verbose:
316
 
            print '\n', '-=' * 30
317
 
            print "Running %s.test03_endianess..." % self.__class__.__name__
318
 
 
319
 
        # Create an instance of an HDF5 Table
320
 
        self.fileh = openFile(self.file, "r")
321
 
        table = self.fileh.getNode("/table0")
322
 
 
323
 
        # Manually change the byteorder property for this table
324
 
        table.byteorder = {"little":"big","big":"little"}[table.byteorder]
325
 
        #table.togglebyteorder()
326
 
        
327
 
        # Read the records and select the ones with "var6" column less than 20
328
 
        result = [ rec['var2'] for rec in table.iterrows() if rec['var6'] < 20]
329
 
        if verbose:
330
 
            print "Nrows in", table._v_pathname, ":", table.nrows
331
 
            print "Last record in table ==>", rec
332
 
            print "Total selected records in table ==>", len(result)
333
 
        nrows = self.expectedrows - 1
334
 
        assert (rec['var1'][0][0], rec['var6']) == ("0001", nrows)
335
 
        assert len(result) == 20
336
 
        
337
 
class BasicWriteTestCase(BasicTestCase):
338
 
    title = "BasicWrite"
339
 
    pass
340
 
 
341
 
class DictWriteTestCase(BasicTestCase):
342
 
    # This checks also unidimensional arrays as columns
343
 
    title = "DictWrite"
344
 
    record = RecordDescriptionDict
345
 
    nrows = 21
346
 
    maxTuples = 3  # Choose a small value for the buffer size
347
 
    start = 0
348
 
    stop = 10
349
 
    step = 3
350
 
 
351
 
class RecArrayOneWriteTestCase(BasicTestCase):
352
 
    title = "RecArrayOneWrite"
353
 
    record=records.array(formats="(2,2)a4,(2,2)i4,i2,2f8,f4,i2,a1",
354
 
                         names='var1,var2,var3,var4,var5,var6,var7')
355
 
 
356
 
class RecArrayTwoWriteTestCase(BasicTestCase):
357
 
    title = "RecArrayTwoWrite"
358
 
    expectedrows = 100
359
 
    recarrayinit = 1
360
 
    recordtemplate=records.array(formats="(2,2)a4,(2,2)i4,i2,f8,f4,i2,a1",
361
 
                                 names='var1,var2,var3,var4,var5,var6,var7',
362
 
                                 shape=1)
363
 
 
364
 
class RecArrayThreeWriteTestCase(BasicTestCase):
365
 
    title = "RecArrayThreeWrite"
366
 
    expectedrows = 100
367
 
    recarrayinit = 1
368
 
    recordtemplate=records.array(formats="(2,2)a4,(2,2)i4,i2,2f8,4f4,i2,a1",
369
 
                                 names='var1,var2,var3,var4,var5,var6,var7',
370
 
                                 shape=1)
371
 
 
372
 
class CompressLZOTablesTestCase(BasicTestCase):
373
 
    title = "CompressLZOTables"
374
 
    compress = 1
375
 
    complib = "lzo"
376
 
    
377
 
class CompressUCLTablesTestCase(BasicTestCase):
378
 
    title = "CompressUCLTables"
379
 
    compress = 1
380
 
    complib = "ucl"
381
 
    
382
 
class CompressZLIBTablesTestCase(BasicTestCase):
383
 
    title = "CompressOneTables"
384
 
    compress = 1
385
 
    complib = "zlib"
386
 
 
387
 
class CompressTwoTablesTestCase(BasicTestCase):
388
 
    title = "CompressTwoTables"
389
 
    compress = 1
390
 
    # This checks also unidimensional arrays as columns
391
 
    record = RecordDescriptionDict
392
 
 
393
 
class BigTablesTestCase(BasicTestCase):
394
 
    title = "BigTables"
395
 
    # 10000 rows takes much more time than we can afford for tests
396
 
    # reducing to 1000 would be more than enough
397
 
    # F. Alted 2004-01-19
398
 
#     expectedrows = 10000
399
 
#     appendrows = 1000
400
 
    expectedrows = 1000
401
 
    appendrows = 100
402
 
 
403
 
class BasicRangeTestCase(unittest.TestCase):
404
 
    #file  = "test.h5"
405
 
    mode  = "w" 
406
 
    title = "This is the table title"
407
 
    record = Record
408
 
    maxshort = 1 << 15
409
 
    expectedrows = 100
410
 
    compress = 0
411
 
    # Default values
412
 
    nrows = 20
413
 
    maxTuples = 3  # Choose a small value for the buffer size
414
 
    start = 1
415
 
    stop = nrows
416
 
    checkrecarray = 0
417
 
    checkgetCol = 0
418
 
 
419
 
    def setUp(self):
420
 
        # Create an instance of an HDF5 Table
421
 
        self.file = tempfile.mktemp(".h5")
422
 
        self.fileh = openFile(self.file, self.mode)
423
 
        self.rootgroup = self.fileh.root
424
 
        self.populateFile()
425
 
        self.fileh.close()
426
 
 
427
 
    def populateFile(self):
428
 
        group = self.rootgroup
429
 
        for j in range(3):
430
 
            # Create a table
431
 
            table = self.fileh.createTable(group, 'table'+str(j), self.record,
432
 
                                           title = self.title,
433
 
                                           filters = Filters(self.compress),
434
 
                                           expectedrows = self.expectedrows)
435
 
            # Get the row object associated with the new table
436
 
            row = table.row
437
 
 
438
 
            # Fill the table
439
 
            for i in xrange(self.expectedrows):
440
 
                row['var1'] = '%04d' % (self.expectedrows - i)
441
 
                row['var7'] = row['var1'][0][0][-1]
442
 
                row['var2'] = i 
443
 
                row['var3'] = i % self.maxshort
444
 
                if isinstance(row['var4'], NumArray):
445
 
                    row['var4'] = [float(i), float(i*i)]
446
 
                else:
447
 
                    row['var4'] = float(i)
448
 
                if isinstance(row['var5'], NumArray):
449
 
                    row['var5'] = array((float(i),)*4)
450
 
                else:
451
 
                    row['var5'] = float(i)
452
 
                # var6 will be like var3 but byteswaped
453
 
                row['var6'] = ((row['var3'] >> 8) & 0xff) + \
454
 
                              ((row['var3'] << 8) & 0xff00)
455
 
                row.append()
456
 
                
457
 
            # Flush the buffer for this table
458
 
            table.flush()
459
 
            # Create a new group (descendant of group)
460
 
            group2 = self.fileh.createGroup(group, 'group'+str(j))
461
 
            # Iterate over this new group (group2)
462
 
            group = group2
463
 
 
464
 
 
465
 
    def tearDown(self):
466
 
        if self.fileh.isopen:
467
 
            self.fileh.close()
468
 
        #del self.fileh, self.rootgroup
469
 
        os.remove(self.file)
470
 
        
471
 
    #----------------------------------------
472
 
 
473
 
    def check_range(self):
474
 
 
475
 
        rootgroup = self.rootgroup
476
 
        # Create an instance of an HDF5 Table
477
 
        self.fileh = openFile(self.file, "r")
478
 
        table = self.fileh.getNode("/table0")
479
 
 
480
 
        table._v_maxTuples = self.maxTuples
481
 
        r = slice(self.start, self.stop, self.step)
482
 
        #resrange = r.indices(table.nrows)
483
 
        resrange = getIndices(r,table.nrows)
484
 
        reslength = len(range(*resrange))
485
 
        if self.checkrecarray:
486
 
            recarray = table.read(self.start, self.stop, self.step)
487
 
            result = []
488
 
            for nrec in range(len(recarray)):
489
 
                if recarray.field('var2')[nrec][0][0] < self.nrows:
490
 
                    result.append(recarray.field('var2')[nrec][0][0])
491
 
        elif self.checkgetCol:
492
 
            column = table.read(self.start, self.stop, self.step, 'var2')
493
 
            result = []
494
 
            for nrec in range(len(column)):
495
 
                if column[nrec][0][0] < self.nrows:    #*-*
496
 
                    result.append(column[nrec][0][0])  #*-*
497
 
        else:
498
 
            result = [ rec['var2'][0][0] for rec in
499
 
                       table.iterrows(self.start, self.stop, self.step)
500
 
                       if rec['var2'][0][0] < self.nrows ]
501
 
        
502
 
        if self.start < 0:
503
 
            startr = self.expectedrows + self.start
504
 
        else:
505
 
            startr = self.start
506
 
 
507
 
        if self.stop == None:
508
 
            stopr = startr + 1                
509
 
        elif self.stop < 0:
510
 
            stopr = self.expectedrows + self.stop
511
 
        else:
512
 
            stopr = self.stop
513
 
 
514
 
        if self.nrows < stopr:
515
 
            stopr = self.nrows
516
 
            
517
 
        if verbose:
518
 
            print "Nrows in", table._v_pathname, ":", table.nrows
519
 
            if reslength:
520
 
                if self.checkrecarray:
521
 
                    print "Last record *read* in recarray ==>", recarray[-1]
522
 
                elif self.checkgetCol:
523
 
                    print "Last value *read* in getCol ==>", column[-1]
524
 
                else:
525
 
                    print "Last record *read* in table range ==>", rec
526
 
            print "Total number of selected records ==>", len(result)
527
 
            print "Selected records:\n", result
528
 
            print "Selected records should look like:\n", \
529
 
                  range(startr, stopr, self.step)
530
 
            print "start, stop, step ==>", startr, stopr, self.step
531
 
 
532
 
        assert result == range(startr, stopr, self.step)
533
 
        if startr < stopr and not (self.checkrecarray or self.checkgetCol):
534
 
            if self.nrows < self.expectedrows:
535
 
                assert rec['var2'][0][0] == \
536
 
                       range(self.start, self.stop, self.step)[-1]
537
 
            else:
538
 
                assert rec['var2'][0][0] == range(startr, stopr, self.step)[-1]
539
 
 
540
 
        # Close the file
541
 
        self.fileh.close()
542
 
 
543
 
    def test01_range(self):
544
 
        """Checking ranges in table iterators (case1)"""
545
 
 
546
 
        if verbose:
547
 
            print '\n', '-=' * 30
548
 
            print "Running %s.test01_range..." % self.__class__.__name__
549
 
 
550
 
        # Case where step < maxTuples < 2*step
551
 
        self.nrows = 21
552
 
        self.maxTuples = 3
553
 
        self.start = 0
554
 
        self.stop = self.expectedrows
555
 
        self.step = 2
556
 
 
557
 
        self.check_range()
558
 
 
559
 
    def test02_range(self):
560
 
        """Checking ranges in table iterators (case2)"""
561
 
 
562
 
        if verbose:
563
 
            print '\n', '-=' * 30
564
 
            print "Running %s.test02_range..." % self.__class__.__name__
565
 
 
566
 
        # Case where step < maxTuples < 10*step
567
 
        self.nrows = 21
568
 
        self.maxTuples = 31
569
 
        self.start = 11
570
 
        self.stop = self.expectedrows
571
 
        self.step = 3
572
 
 
573
 
        self.check_range()
574
 
 
575
 
    def test03_range(self):
576
 
        """Checking ranges in table iterators (case3)"""
577
 
 
578
 
        if verbose:
579
 
            print '\n', '-=' * 30
580
 
            print "Running %s.test03_range..." % self.__class__.__name__
581
 
 
582
 
        # Case where step < maxTuples < 1.1*step
583
 
        self.nrows = self.expectedrows
584
 
        self.maxTuples = 11  # Choose a small value for the buffer size
585
 
        self.start = 0
586
 
        self.stop = self.expectedrows
587
 
        self.step = 10
588
 
 
589
 
        self.check_range()
590
 
 
591
 
    def test04_range(self):
592
 
        """Checking ranges in table iterators (case4)"""
593
 
 
594
 
        if verbose:
595
 
            print '\n', '-=' * 30
596
 
            print "Running %s.test04_range..." % self.__class__.__name__
597
 
 
598
 
        # Case where step == maxTuples 
599
 
        self.nrows = self.expectedrows
600
 
        self.maxTuples = 11  # Choose a small value for the buffer size
601
 
        self.start = 1
602
 
        self.stop = self.expectedrows
603
 
        self.step = 11
604
 
 
605
 
        self.check_range()
606
 
 
607
 
    def test05_range(self):
608
 
        """Checking ranges in table iterators (case5)"""
609
 
 
610
 
        if verbose:
611
 
            print '\n', '-=' * 30
612
 
            print "Running %s.test05_range..." % self.__class__.__name__
613
 
 
614
 
        # Case where step > 1.1*maxTuples 
615
 
        self.nrows = 21
616
 
        self.maxTuples = 10  # Choose a small value for the buffer size
617
 
        self.start = 1
618
 
        self.stop = self.expectedrows
619
 
        self.step = 11
620
 
 
621
 
        self.check_range()
622
 
 
623
 
    def test06_range(self):
624
 
        """Checking ranges in table iterators (case6)"""
625
 
 
626
 
        if verbose:
627
 
            print '\n', '-=' * 30
628
 
            print "Running %s.test06_range..." % self.__class__.__name__
629
 
 
630
 
        # Case where step > 3*maxTuples 
631
 
        self.nrows = 3
632
 
        self.maxTuples = 3  # Choose a small value for the buffer size
633
 
        self.start = 2
634
 
        self.stop = self.expectedrows
635
 
        self.step = 10
636
 
 
637
 
        self.check_range()
638
 
 
639
 
    def test07_range(self):
640
 
        """Checking ranges in table iterators (case7)"""
641
 
 
642
 
        if verbose:
643
 
            print '\n', '-=' * 30
644
 
            print "Running %s.test07_range..." % self.__class__.__name__
645
 
 
646
 
        # Case where start == stop 
647
 
        self.nrows = 2
648
 
        self.maxTuples = 3  # Choose a small value for the buffer size
649
 
        self.start = self.nrows
650
 
        self.stop = self.nrows
651
 
        self.step = 10
652
 
 
653
 
        self.check_range()
654
 
 
655
 
    def test08_range(self):
656
 
        """Checking ranges in table iterators (case8)"""
657
 
 
658
 
        if verbose:
659
 
            print '\n', '-=' * 30
660
 
            print "Running %s.test08_range..." % self.__class__.__name__
661
 
 
662
 
        # Case where start > stop 
663
 
        self.nrows = 2
664
 
        self.maxTuples = 3  # Choose a small value for the buffer size
665
 
        self.start = self.nrows + 1
666
 
        self.stop = self.nrows
667
 
        self.step = 1
668
 
 
669
 
        self.check_range()
670
 
 
671
 
    def test09_range(self):
672
 
        """Checking ranges in table iterators (case9)"""
673
 
 
674
 
        if verbose:
675
 
            print '\n', '-=' * 30
676
 
            print "Running %s.test09_range..." % self.__class__.__name__
677
 
 
678
 
        # Case where stop = None
679
 
        self.nrows = 100
680
 
        self.maxTuples = 3  # Choose a small value for the buffer size
681
 
        self.start = 1
682
 
        self.stop = None
683
 
        self.step = 1
684
 
 
685
 
        self.check_range()
686
 
 
687
 
    def test10_range(self):
688
 
        """Checking ranges in table iterators (case10)"""
689
 
 
690
 
        if verbose:
691
 
            print '\n', '-=' * 30
692
 
            print "Running %s.test10_range..." % self.__class__.__name__
693
 
 
694
 
        # Case where start < 0 and stop = 0
695
 
        self.nrows = self.expectedrows
696
 
        self.maxTuples = 5  # Choose a small value for the buffer size
697
 
        self.start = -6
698
 
        self.startr = self.expectedrows + self.start
699
 
        self.stop = 0
700
 
        self.stopr = self.expectedrows + self.stop
701
 
        self.step = 2
702
 
 
703
 
        self.check_range()
704
 
 
705
 
    def test11_range(self):
706
 
        """Checking ranges in table iterators (case11)"""
707
 
 
708
 
        if verbose:
709
 
            print '\n', '-=' * 30
710
 
            print "Running %s.test11_range..." % self.__class__.__name__
711
 
 
712
 
        # Case where start < 0 and stop < 0
713
 
        self.nrows = self.expectedrows
714
 
        self.maxTuples = 5  # Choose a small value for the buffer size
715
 
        self.start = -6
716
 
        self.startr = self.expectedrows + self.start
717
 
        self.stop = -2
718
 
        self.stopr = self.expectedrows + self.stop
719
 
        self.step = 1
720
 
 
721
 
        self.check_range()
722
 
 
723
 
    def test12_range(self):
724
 
        """Checking ranges in table iterators (case12)"""
725
 
 
726
 
        if verbose:
727
 
            print '\n', '-=' * 30
728
 
            print "Running %s.test12_range..." % self.__class__.__name__
729
 
 
730
 
        # Case where start < 0 and stop < 0 and start > stop
731
 
        self.nrows = self.expectedrows
732
 
        self.maxTuples = 5  # Choose a small value for the buffer size
733
 
        self.start = -1
734
 
        self.startr = self.expectedrows + self.start
735
 
        self.stop = -2
736
 
        self.stopr = self.expectedrows + self.stop
737
 
        self.step = 1
738
 
 
739
 
        self.check_range()
740
 
 
741
 
    def test13_range(self):
742
 
        """Checking ranges in table iterators (case13)"""
743
 
 
744
 
        if verbose:
745
 
            print '\n', '-=' * 30
746
 
            print "Running %s.test13_range..." % self.__class__.__name__
747
 
 
748
 
        # Case where step < 0 
749
 
        self.step = -11
750
 
        try:
751
 
            self.check_range()
752
 
        except ValueError:
753
 
            if verbose:
754
 
                (type, value, traceback) = sys.exc_info()
755
 
                print "\nGreat!, the next ValueError was catched!"
756
 
                print value
757
 
            self.fileh.close()
758
 
        else:
759
 
            print rec
760
 
            self.fail("expected a ValueError")
761
 
 
762
 
        # Case where step == 0 
763
 
        self.step = 0
764
 
        try:
765
 
            self.check_range()
766
 
        except ValueError:
767
 
            if verbose:
768
 
                (type, value, traceback) = sys.exc_info()
769
 
                print "\nGreat!, the next ValueError was catched!"
770
 
                print value
771
 
            self.fileh.close()
772
 
        else:
773
 
            print rec
774
 
            self.fail("expected a ValueError")
775
 
 
776
 
 
777
 
class IterRangeTestCase(BasicRangeTestCase):
778
 
    pass
779
 
 
780
 
class RecArrayRangeTestCase(BasicRangeTestCase):
781
 
    checkrecarray = 1
782
 
 
783
 
class getColRangeTestCase(BasicRangeTestCase):
784
 
    checkgetCol = 1
785
 
 
786
 
    def test01_nonexistentField(self):
787
 
        """Checking non-existing Field in getCol method """
788
 
 
789
 
        if verbose:
790
 
            print '\n', '-=' * 30
791
 
            print "Running %s.test01_nonexistentField..." % self.__class__.__name__
792
 
 
793
 
        # Create an instance of an HDF5 Table
794
 
        self.fileh = openFile(self.file, "r")
795
 
        self.root = self.fileh.root
796
 
        table = self.fileh.getNode("/table0")
797
 
 
798
 
        try:
799
 
            column = table.read(field='non-existent-column')
800
 
        except LookupError:
801
 
            if verbose:
802
 
                (type, value, traceback) = sys.exc_info()
803
 
                print "\nGreat!, the next LookupError was catched!"
804
 
                print value
805
 
            pass
806
 
        else:
807
 
            print rec
808
 
            self.fail("expected a LookupError")
809
 
 
810
 
 
811
 
class RecArrayIO(unittest.TestCase):
812
 
 
813
 
    def test00(self):
814
 
        "Checking saving a normal recarray"
815
 
        file = tempfile.mktemp(".h5")
816
 
        fileh = openFile(file, "w")
817
 
 
818
 
        # Create a recarray
819
 
        intlist1 = [[456,23]*3]*2
820
 
        intlist2 = array([[2,2]*3]*2)
821
 
        arrlist1 = [['dbe']*2]*3
822
 
        #arrlist2 = strings.array([['de']*2]*3)
823
 
        arrlist2 = [['de']*2]*3
824
 
        floatlist1 = [[1.2,2.3]*3]*4
825
 
        floatlist2 = array([[4.5,2.4]*3]*4)
826
 
        b = [[intlist1, arrlist1, floatlist1],[intlist2, arrlist2, floatlist2]]
827
 
        r=records.array(b, names='col1,col2,col3')
828
 
 
829
 
        # Save it in a table:
830
 
        fileh.createTable(fileh.root, 'recarray', r)
831
 
 
832
 
        # Read it again
833
 
        r2 = fileh.root.recarray.read()
834
 
 
835
 
        assert r.tostring() == r2.tostring()
836
 
        
837
 
        fileh.close()
838
 
        os.remove(file)
839
 
 
840
 
    def test01(self):
841
 
        "Checking saving a recarray with an offset in its buffer"
842
 
        file = tempfile.mktemp(".h5")
843
 
        fileh = openFile(file, "w")
844
 
 
845
 
        # Create a recarray
846
 
        intlist1 = [[456,23]*3]*2
847
 
        intlist2 = array([[2,2]*3]*2)
848
 
        arrlist1 = [['dbe']*2]*3
849
 
        #arrlist2 = strings.array([['de']*2]*3)
850
 
        arrlist2 = [['de']*2]*3
851
 
        floatlist1 = [[1.2,2.3]*3]*4
852
 
        floatlist2 = array([[4.5,2.4]*3]*4)
853
 
        b = [[intlist1, arrlist1, floatlist1],[intlist2, arrlist2, floatlist2]]
854
 
        r=records.array(b, names='col1,col2,col3')
855
 
 
856
 
        # Get an offsetted bytearray
857
 
        r1 = r[1:]
858
 
        assert r1._byteoffset > 0
859
 
        
860
 
        # Save it in a table:
861
 
        fileh.createTable(fileh.root, 'recarray', r1)
862
 
 
863
 
        # Read it again
864
 
        r2 = fileh.root.recarray.read()
865
 
 
866
 
        assert r1.tostring() == r2.tostring()
867
 
        
868
 
        fileh.close()
869
 
        os.remove(file)
870
 
 
871
 
    def test02(self):
872
 
        "Checking saving a large recarray with an offset in its buffer"
873
 
        file = tempfile.mktemp(".h5")
874
 
        fileh = openFile(file, "w")
875
 
 
876
 
        # Create a recarray
877
 
        intlist1 = [[[23,24,35]*6]*6]
878
 
        intlist2 = array([[[2,3,4]*6]*6])
879
 
        arrlist1 = [['dbe']*2]*3
880
 
        #arrlist2 = strings.array([['de']*2]*3)
881
 
        arrlist2 = [['de']*2]*3
882
 
        floatlist1 = [[1.2,2.3]*3]*4
883
 
        floatlist2 = array([[4.5,2.4]*3]*4)
884
 
        b=[[intlist1, arrlist1, floatlist1],[intlist2, arrlist2, floatlist2]]
885
 
        r=records.array(b*300, names='col1,col2,col3')
886
 
 
887
 
        # Get an offsetted recarray
888
 
        r1 = r[290:292]
889
 
        if verbose:
890
 
            print "\noffseted recarray --> ", r1
891
 
        assert r1._byteoffset > 0
892
 
        
893
 
        # Save it in a table:
894
 
        fileh.createTable(fileh.root, 'recarray', r1)
895
 
 
896
 
        # Read it again
897
 
        r2 = fileh.root.recarray.read()
898
 
 
899
 
        assert r1.tostring() == r2.tostring()
900
 
        
901
 
        fileh.close()
902
 
        os.remove(file)
903
 
 
904
 
    def test03(self):
905
 
        "Checking saving a strided recarray with an offset in its buffer"
906
 
        file = tempfile.mktemp(".h5")
907
 
        fileh = openFile(file, "w")
908
 
 
909
 
        # Create a recarray
910
 
        intlist1 = [[[23,24,35]*6]*6]
911
 
        intlist2 = array([[[2,3,4]*6]*6])
912
 
        arrlist1 = [['dbe']*2]*3
913
 
        #arrlist2 = strings.array([['de']*2]*3)
914
 
        arrlist2 = [['de']*2]*3
915
 
        floatlist1 = [[1.2,2.3]*3]*4
916
 
        floatlist2 = array([[4.5,2.4]*3]*4)
917
 
        b = [[intlist1, arrlist1, floatlist1],[intlist2, arrlist2, floatlist2]]
918
 
        r=records.array(b*300, names='col1,col2,col3', shape=300)
919
 
 
920
 
        # Get an strided recarray
921
 
        r2 = r[::2]
922
 
 
923
 
        # Get an offsetted bytearray
924
 
        r1 = r2[148:]
925
 
        if verbose:
926
 
            print "\noffseted and strided recarray --> ", r1
927
 
        assert r1._byteoffset > 0
928
 
        # Save it in a table:
929
 
        fileh.createTable(fileh.root, 'recarray', r1)
930
 
 
931
 
        # Read it again
932
 
        r2 = fileh.root.recarray.read()
933
 
 
934
 
        assert r1.tostring() == r2.tostring()
935
 
        
936
 
        fileh.close()
937
 
        os.remove(file)
938
 
 
939
 
 
940
 
class DefaultValues(unittest.TestCase):
941
 
 
942
 
    def test00(self):
943
 
        "Checking saving a Table MD with default values"
944
 
        file = tempfile.mktemp(".h5")
945
 
        #file = "/tmp/test.h5"
946
 
        fileh = openFile(file, "w")
947
 
 
948
 
        # Create a table
949
 
        table = fileh.createTable(fileh.root, 'table', Record)
950
 
 
951
 
        # Take a number of records a bit greater
952
 
        nrows = int(table._v_maxTuples * 1.1)
953
 
        # Fill the table with nrows records
954
 
        for i in xrange(nrows):
955
 
            if i == 3 or i == 4:
956
 
                table.row['var2'] = ((2,2),(2,2))  #*-* 
957
 
            # This injects the row values.
958
 
            table.row.append()
959
 
 
960
 
        # We need to flush the buffers in table in order to get an
961
 
        # accurate number of records on it.
962
 
        table.flush()
963
 
 
964
 
        # Create a recarray with the same default values
965
 
        buffer = [[[["abcd"]*2]*2, ((1,1),(1,1)), 2, 3.1, 4.2, 5, "e"]]
966
 
        r=records.array(buffer*nrows,
967
 
                        formats='(2,2)a4,(2,2)i4,i2,f8,f4,i2,a1')  #*-*
968
 
        
969
 
        # Assign the value exceptions
970
 
        r.field("c2")[3] = ((2,2), (2,2))  #*-*
971
 
        r.field("c2")[4] = ((2,2), (2,2))  #*-*
972
 
        
973
 
        # Read the table in another recarray
974
 
        r2 = table.read()
975
 
 
976
 
        # This generates too much output. Activate only when
977
 
        # self._v_maxTuples is very small (<10)
978
 
        if verbose and 0:
979
 
            print "Table values:"
980
 
            for row in table.iterrows():
981
 
                print row
982
 
            print r2
983
 
            print "Record values:"
984
 
            print r
985
 
 
986
 
        assert r.tostring() == r2.tostring()
987
 
        
988
 
        fileh.close()
989
 
        os.remove(file)
990
 
 
991
 
 
992
 
#----------------------------------------------------------------------
993
 
 
994
 
def suite():
995
 
    theSuite = unittest.TestSuite()
996
 
    niter = 1
997
 
    #heavy = 1  # Uncomment this only for testing purposes
998
 
 
999
 
    #theSuite.addTest(unittest.makeSuite(CompressUCLTablesTestCase))
1000
 
    #theSuite.addTest(unittest.makeSuite(BasicWriteTestCase))
1001
 
    #theSuite.addTest(unittest.makeSuite(RecArrayOneWriteTestCase))
1002
 
    #theSuite.addTest(unittest.makeSuite(RecArrayTwoWriteTestCase))
1003
 
    #theSuite.addTest(unittest.makeSuite(RecArrayThreeWriteTestCase))
1004
 
    #theSuite.addTest(unittest.makeSuite(DefaultValues))
1005
 
    #theSuite.addTest(unittest.makeSuite(RecArrayIO))
1006
 
    #theSuite.addTest(unittest.makeSuite(BigTablesTestCase))
1007
 
 
1008
 
    for n in range(niter):
1009
 
        theSuite.addTest(unittest.makeSuite(BasicWriteTestCase))
1010
 
        theSuite.addTest(unittest.makeSuite(DictWriteTestCase))
1011
 
        theSuite.addTest(unittest.makeSuite(RecArrayOneWriteTestCase))
1012
 
        theSuite.addTest(unittest.makeSuite(RecArrayTwoWriteTestCase))
1013
 
        theSuite.addTest(unittest.makeSuite(RecArrayThreeWriteTestCase))
1014
 
        theSuite.addTest(unittest.makeSuite(CompressLZOTablesTestCase))
1015
 
        theSuite.addTest(unittest.makeSuite(CompressUCLTablesTestCase))
1016
 
        theSuite.addTest(unittest.makeSuite(CompressZLIBTablesTestCase))
1017
 
        theSuite.addTest(unittest.makeSuite(CompressTwoTablesTestCase))
1018
 
        theSuite.addTest(unittest.makeSuite(IterRangeTestCase))
1019
 
        theSuite.addTest(unittest.makeSuite(RecArrayRangeTestCase))
1020
 
        theSuite.addTest(unittest.makeSuite(getColRangeTestCase))
1021
 
        theSuite.addTest(unittest.makeSuite(DefaultValues))
1022
 
        theSuite.addTest(unittest.makeSuite(RecArrayIO))
1023
 
    if heavy:
1024
 
        theSuite.addTest(unittest.makeSuite(BigTablesTestCase))
1025
 
            
1026
 
    return theSuite
1027
 
 
1028
 
 
1029
 
if __name__ == '__main__':
1030
 
    unittest.main( defaultTest='suite' )