1;
2; Alain C., 16 Fev. 2016
3; Very preliminary tests for HDF5 formats.
4; Extensions (data (small volume) + code) very welcome
5; (never forget than adding now test cases will avoid future silently
6; broken functionnalities !!)
7;
8; Some users are already using the HDF5 functionnalities
9; but it was reported that the STRING field is not well managed.
10;
11; -----------------------------------------------
12;
13pro TEST_HDF5_BYTE_ARRAY, cumul_errors, test=test
14;
15errors=0
16;
17file='byte_array.h5'
18fullfile=FILE_SEARCH_FOR_TESTSUITE(file, /warning)
19if (STRLEN(fullfile) EQ 0) then begin
20    cumul_errors++
21    return
22endif
23;
24file_id = H5F_OPEN(fullfile)
25data_id = H5D_OPEN(file_id, 'g1/d1')
26;
27vector=0
28ok=EXECUTE('vector = H5D_READ(data_id)')
29;
30expected=BYTE([127,1, 23])
31;
32; we have to test the values but also the TYPE
33if ~ARRAY_EQUAL(vector, expected) then begin
34    MESSAGE, /continue, 'Bad values ...'
35    errors++
36endif
37if (TYPENAME(vector) NE 'BYTE') then begin
38    MESSAGE, /continue, 'Bad TYPE ...'
39    errors++
40endif
41;
42BANNER_FOR_TESTSUITE, 'TEST_HDF5_BYTE_ARRAY', errors, /short
43;
44if KEYWORD_SET(test) then STOP
45;
46if ~ISA(cumul_errors) then cumul_errors=0
47cumul_errors=cumul_errors+errors
48;
49end
50;
51; -----------------------------------------------
52;
53pro TEST_HDF5_STRING, cumul_errors, test=test
54;
55; Test provided by R. Parker (Univ. Leicester)
56;
57errors=0
58;
59file='string.h5'
60fullfile=FILE_SEARCH_FOR_TESTSUITE(file, /warning)
61if (STRLEN(fullfile) EQ 0) then begin
62    cumul_errors++
63    return
64endif
65;
66file_id = H5F_OPEN(fullfile)
67data_id = H5D_OPEN(file_id, 'mystring')
68;
69mystring=''
70ok=EXECUTE('mystring=H5D_READ(data_id)')
71;
72expected='Peter is great.'
73;
74if ~ARRAY_EQUAL(mystring, expected) then errors=1
75;
76BANNER_FOR_TESTSUITE, 'TEST_HDF5_STRING', errors, /short
77;
78if KEYWORD_SET(test) then STOP
79;
80if ~ISA(cumul_errors) then cumul_errors=0
81cumul_errors=cumul_errors+errors
82;
83end
84;
85; -----------------------------------------------
86;
87pro TEST_HDF5_ATTR, cumul_errors, create=create
88
89   some_elem_dims = list( [], [3], [2,3] )
90   some_data_dims = list( [], [4], [4,3], [4,3,2] )
91
92   ; --- create mock attribute data
93
94   attr_data = list(123)        ; first entry is a scalar
95   elem_rank = list(0)
96   data_rank = list(0)
97
98   for el_rank=0,2 do begin
99      el_dims = some_elem_dims[el_rank]
100
101      for dt_rank=0,3 do begin
102         dt_dims = some_data_dims[dt_rank]
103
104         rank = el_rank + dt_rank
105
106         if(el_rank eq 0 and dt_rank eq 0) then continue
107
108         dims = []
109         if (el_rank gt 0) then dims = [ dims, el_dims ]
110         if (dt_rank gt 0) then dims = [ dims, dt_dims ]
111
112         ndata=1 & for i=0,n_elements(dims)-1 do ndata *= dims[i]
113
114         case (rank mod 3) of
115            0: data = intarr( ndata )
116            1: data = fltarr( ndata )
117            2: data = dblarr( ndata )
118         endcase
119
120         for i=0,ndata-1 do data[i] = i
121
122         ; --- create lists
123         attr_data.add, reform( data, dims )
124         elem_rank.add, el_rank
125         data_rank.add, dt_rank
126
127      endfor
128
129   endfor
130
131   if keyword_set(create) then begin
132
133      ; --- write mock attributes to HDF5 file (not yet implemented in GDL)
134
135      f_id = h5f_create("hdf5-attr-test.h5")
136
137      for i=0,n_elements(attr_data)-1 do begin
138
139         elem_t_id = h5t_idl_create(attr_data[i])
140
141         if elem_rank[i] gt 0 then begin ; non-scalar element datatype
142
143            t_id = h5t_array_create(elem_t_id, some_elem_dims[elem_rank[i]])
144            h5t_close, elem_t_id
145
146         endif else t_id = elem_t_id
147
148         if data_rank[i] gt 0 then $ ; non-scalar dataspace
149            s_id = h5s_create_simple(some_data_dims[data_rank[i]]) $
150         else s_id = h5s_create_scalar()
151
152         a_id = h5a_create( f_id, string(i,fo='(%"attr-%02d")'), t_id, s_id )
153
154         h5a_write, a_id, attr_data[i]
155
156         h5a_close, a_id
157         h5s_close, s_id
158         h5t_close, t_id
159
160      endfor
161
162      h5f_close, f_id
163
164   endif
165
166   ; --- read HDF5 attributes
167
168   f_id = h5f_open("hdf5-attr-test.h5")
169
170   for idx=0,n_elements(attr_data)-1 do begin
171
172      a_id = h5a_open_idx(f_id,idx)
173      read_attr_data = h5a_read(a_id)
174      h5a_close, a_id
175
176      if ( total( attr_data[idx] - read_attr_data ) gt 0. ) then $
177         cumul_errors++
178
179   endfor
180
181   h5f_close, f_id
182
183   return
184end
185;
186; -----------------------------------------------
187;
188pro TEST_HDF5_DATA, cumul_errors, create=create
189
190   some_elem_dims = list( [], [3], [2,3] )
191   some_data_dims = list( [], [5], [5,4], [5,4,3] )
192
193   ; --- create mock data
194
195   mock_data = list(123)        ; first entry is a scalar
196   elem_rank = list(0)
197   data_rank = list(0)
198
199   for el_rank=0,2 do begin
200      el_dims = some_elem_dims[el_rank]
201
202      for dt_rank=0,3 do begin
203         dt_dims = some_data_dims[dt_rank]
204
205         rank = el_rank + dt_rank
206
207         if(el_rank eq 0 and dt_rank eq 0) then continue
208
209         dims = []
210         if (el_rank gt 0) then dims = [ dims, el_dims ]
211         if (dt_rank gt 0) then dims = [ dims, dt_dims ]
212
213         ndata=1 & for i=0,n_elements(dims)-1 do ndata *= dims[i]
214
215         case (rank mod 3) of
216            0: data = intarr( ndata )
217            1: data = fltarr( ndata )
218            2: data = dblarr( ndata )
219         endcase
220
221         for i=0,ndata-1 do data[i] = i
222
223         ; --- create lists
224         mock_data.add, reform( data, dims )
225         elem_rank.add, el_rank
226         data_rank.add, dt_rank
227
228      endfor
229
230   endfor
231
232   if keyword_set(create) then begin
233
234      ; --- write mock datasets to HDF5 file (not yet implemented in GDL)
235
236      f_id = h5f_create("hdf5-data-test.h5")
237
238      for i=0,n_elements(mock_data)-1 do begin
239
240         elem_t_id = h5t_idl_create(mock_data[i])
241
242         if elem_rank[i] gt 0 then begin ; non-scalar element datatype
243
244            t_id = h5t_array_create(elem_t_id, some_elem_dims[elem_rank[i]])
245            h5t_close, elem_t_id
246
247         endif else t_id = elem_t_id
248
249         if data_rank[i] gt 0 then $ ; non-scalar dataspace
250            s_id = h5s_create_simple(some_data_dims[data_rank[i]]) $
251         else s_id = h5s_create_scalar()
252
253         d_id = h5d_create( f_id, string(i,fo='(%"dset-%02d")'), t_id, s_id )
254
255         h5d_write, d_id, mock_data[i]
256
257         h5d_close, d_id
258         h5s_close, s_id
259         h5t_close, t_id
260
261      endfor
262
263      h5f_close, f_id
264
265   endif
266
267   ; --- read HDF5 datasets
268
269   f_id = h5f_open("hdf5-data-test.h5")
270
271   for idx=1,n_elements(mock_data)-1 do begin
272
273      d_id = h5d_open(f_id,string(idx, fo='(%"dset-%02d")'))
274
275      read_mock_data = h5d_read(d_id)
276      h5d_close, d_id
277
278      if ( total( mock_data[idx] - read_mock_data ) gt 0. ) then $
279         cumul_errors++
280
281   endfor
282
283   h5f_close, f_id
284
285   return
286end
287;
288; -----------------------------------------------
289;
290pro TEST_HDF5, help=help, test=test, no_exit=no_exit
291;
292if KEYWORD_SET(help) then begin
293   print, 'pro TEST_HDF5, help=help, test=test, no_exit=no_exit'
294   return
295endif
296;
297; Do we have access to HDF5 functionnalities ??
298;
299DEFSYSV, '!gdl', exists=is_it_gdl
300;
301if (is_it_gdl EQ 1) then begin
302    ok=EXECUTE('resu=HDF5_EXISTS()')
303    if (resu EQ 0) then begin
304        MESSAGE, /continue, "GDL was compiled without HDF5 support."
305        MESSAGE, /con, "You must have HDF5 support to use this functionaly."
306        EXIT, status=77
307    endif
308endif
309;
310cumul_errors=0
311;
312TEST_HDF5_BYTE_ARRAY, cumul_errors
313;
314TEST_HDF5_STRING, cumul_errors
315;
316TEST_HDF5_ATTR, cumul_errors
317;
318TEST_HDF5_DATA, cumul_errors
319;
320BANNER_FOR_TESTSUITE, 'TEST_HDF5', cumul_errors
321;
322if (cumul_errors GT 0) AND ~KEYWORD_SET(no_exit) then EXIT, status=1
323;
324if KEYWORD_SET(test) then STOP
325;
326end
327
328