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