diff options
Diffstat (limited to 'hl/test/test_ds.c')
-rw-r--r-- | hl/test/test_ds.c | 254 |
1 files changed, 248 insertions, 6 deletions
diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c index f891889..8ab29da 100644 --- a/hl/test/test_ds.c +++ b/hl/test/test_ds.c @@ -20,6 +20,8 @@ /* operator functions */ static herr_t verifiy_scale(hid_t dset, unsigned dim, hid_t scale, void *visitor_data); static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale, void *visitor_data); +static herr_t match_dim_scale(hid_t did, unsigned dim, hid_t dsid, void *visitor_data); + /* prototypes */ static int test_simple(void); static int test_errors(void); @@ -74,6 +76,7 @@ static int test_simple(void) hid_t fid; /* file ID */ hid_t did; /* dataset ID */ hid_t dsid; /* DS dataset ID */ + hid_t sid; /* space ID */ int rank = RANK; /* rank of data dataset */ int rankds = 1; /* rank of DS dataset */ hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */ @@ -532,7 +535,7 @@ static int test_simple(void) * test 6: test iterate scales with a function verifiy_scale *------------------------------------------------------------------------- */ - TESTING2("iterate scales"); + TESTING2("iterate scales (verify scale)"); /* get the dataset id for "dset_a" */ if ((did = H5Dopen(fid,"dset_a"))<0) @@ -560,10 +563,11 @@ static int test_simple(void) /*------------------------------------------------------------------------- - * test 6: test iterate scales with a function read_scale + * test 7: test iterate scales with a function read_scale *------------------------------------------------------------------------- */ - TESTING2("read scale values with iterate scales"); + TESTING2("iterate scales (read scale values)"); + /* get the dataset id for "dset_a" */ if ((did = H5Dopen(fid,"dset_a"))<0) @@ -590,6 +594,162 @@ static int test_simple(void) PASSED(); /*------------------------------------------------------------------------- + * test 8: test iterate scales with a function match_dim_scale + *------------------------------------------------------------------------- + */ + TESTING2("iterate scales (verify the scale sizes match)"); + + /* get the dataset id for "dset_a" */ + if ((did = H5Dopen(fid,"dset_a"))<0) + goto out; + + /* get dataset space */ + if ((sid = H5Dget_space(did))<0) + goto out; + + /* get rank */ + if ((rank=H5Sget_simple_extent_ndims(sid))<0) + goto out; + + /* get dimensions of dataset */ + if (H5Sget_simple_extent_dims(sid,dims,NULL)<0) + goto out; + + { + int match_size; /* does this scale size matches the dataset DIM size */ + int idx=0; /* scale index to start iterating, on return, index where iterator stoped */ + + /* iterate trough all the dimensions */ + for(dim=0; dim<(unsigned)rank; dim++) + { + if ((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL))<0) + goto out; + + /* "dset_a" was defined with all dimension scales size matching the size of its dimensions */ + if (match_size==0) + goto out; + + /* both "ds1" and "ds2" are the on the first index */ + if (idx!=0) + goto out; + } + } + + + /* close */ + if (H5Dclose(did)<0) + goto out; + if (H5Sclose(sid)<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- + * test 9: test iterate scales with a function match_dim_scale + *------------------------------------------------------------------------- + */ + TESTING2("iterate scales (verify the scale sizes do not match)"); + +/*------------------------------------------------------------------------- + * create 3 datasets: 1 "data" dataset and dimension scales (some are empty) + *------------------------------------------------------------------------- + */ + if (H5LTmake_dataset_int(fid,"dset_d",rank,dims,buf)<0) + goto out; + if (H5LTmake_dataset_int(fid,"ds6_1_1",rankds,s1_dim,NULL)<0) + goto out; + if (H5LTmake_dataset_int(fid,"ds6_1_2",rankds,s1_dim,s1_wbuf)<0) + goto out; + if (H5LTmake_dataset_int(fid,"ds7_2_1",rankds,s2_dim,NULL)<0) + goto out; + +/*------------------------------------------------------------------------- + * attach them + *------------------------------------------------------------------------- + */ + if ((did = H5Dopen(fid,"dset_d"))<0) + goto out; + + if ((dsid = H5Dopen(fid,"ds6_1_1"))<0) + goto out; + if (H5DSattach_scale(did,dsid,0)<0) + goto out; + if (H5Dclose(dsid)<0) + goto out; + if ((dsid = H5Dopen(fid,"ds6_1_2"))<0) + goto out; + if (H5DSattach_scale(did,dsid,0)<0) + goto out; + if (H5Dclose(dsid)<0) + goto out; + if ((dsid = H5Dopen(fid,"ds7_2_1"))<0) + goto out; + if (H5DSattach_scale(did,dsid,1)<0) + goto out; + if (H5Dclose(dsid)<0) + goto out; + + if (H5Dclose(did)<0) + goto out; + +/*------------------------------------------------------------------------- + * verify match + *------------------------------------------------------------------------- + */ + /* get the dataset id for "dset_d" */ + if ((did = H5Dopen(fid,"dset_d"))<0) + goto out; + + /* get dataset space */ + if ((sid = H5Dget_space(did))<0) + goto out; + + /* get rank */ + if ((rank=H5Sget_simple_extent_ndims(sid))<0) + goto out; + + /* get dimensions of dataset */ + if (H5Sget_simple_extent_dims(sid,dims,NULL)<0) + goto out; + + { + int match_size; /* does this scale size matches the dataset DIM size */ + int idx; /* scale index to start iterating, on return, index where iterator stoped */ + + /* iterate trough all the dimensions */ + for(dim=0; dim<(unsigned)rank; dim++) + { + /* always start at 1st scale */ + idx=0; + + if ((match_size=H5DSiterate_scales(did,dim,&idx,match_dim_scale,NULL))<0) + goto out; + + /* "dset_d" was defined with : + dim 0: 2 scales, first is empty + dim 1: 1 scale, empty */ + switch(dim) + { + case 0: /* for DIM 0, we get a valid scale at IDX 1 */ + if (match_size!=1 && idx!=1) + goto out; + break; + case 1: /* for DIM 1, we get no valid scales */ + if (match_size!=0 && idx!=0) + goto out; + }/*switch*/ + }/*for*/ + } + + /* close */ + if (H5Dclose(did)<0) + goto out; + if (H5Sclose(sid)<0) + goto out; + + PASSED(); + +/*------------------------------------------------------------------------- * end *------------------------------------------------------------------------- */ @@ -730,7 +890,7 @@ out: * Function: verifiy_scale * * Purpose: example operator function used by H5DSiterate_scales, used - * to veify that SCALE_ID refers to a valid DS dataset + * to verify that SCALE_ID refers to a valid DS dataset * * Return: * The return values from an operator are: @@ -745,9 +905,7 @@ out: static herr_t verifiy_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor_data) { - /* define a default zero value for return. This will cause the iterator to continue */ - int ret = 0; /* unused */ @@ -863,3 +1021,87 @@ static herr_t read_scale(hid_t dset, unsigned dim, hid_t scale_id, void *visitor return FAIL; } + +/*------------------------------------------------------------------------- + * Function: match_dim_scale + * + * Purpose: example operator function used by H5DSiterate_scales, used + * to verify the the DSID scale size matches the dataset DIM size + * + * Return: + * The return values from an operator are: + * Zero causes the iterator to continue, returning zero when all group members have been processed. + * Positive causes the iterator to immediately return that positive value, indicating + * short-circuit success. The iterator can be restarted at the next group member. + * Negative causes the iterator to immediately return that value, indicating failure. + * The iterator can be restarted at the next group member. + * + *------------------------------------------------------------------------- + */ + +static herr_t match_dim_scale(hid_t did, unsigned dim, hid_t dsid, void *visitor_data) +{ + int ret = 0; /* define a default zero value for return. This will cause the iterator to continue */ + hid_t sid; /* space ID */ + hssize_t nelmts; /* size of a dimension scale array */ + int rank; /* rank of dataset */ + hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */ + hsize_t storage_size; + +/*------------------------------------------------------------------------- + * get DID (dataset) space info + *------------------------------------------------------------------------- + */ + + /* get dataset space */ + if ((sid = H5Dget_space(did))<0) + goto out; + + /* get rank */ + if ((rank=H5Sget_simple_extent_ndims(sid))<0) + goto out; + + /* get dimensions of dataset */ + if (H5Sget_simple_extent_dims(sid,dims,NULL)<0) + goto out; + + /* close the dataspace id */ + if (H5Sclose(sid)<0) + goto out; + +/*------------------------------------------------------------------------- + * get DSID (scale) space info + *------------------------------------------------------------------------- + */ + + /* get the space for the scale */ + if ((sid = H5Dget_space(dsid))<0) + goto out; + + /* get size of the DS array */ + if ((nelmts = H5Sget_simple_extent_npoints(sid))<0) + goto out; + + /* close */ + if (H5Sclose(sid)<0) + goto out; + + /* the size of the DS array must match the dimension of the dataset */ + if (nelmts == (hssize_t)dims[dim]) + ret = 1; + + /* if the scale is empty assume it cannot be used */ + if ((storage_size=H5Dget_storage_size(dsid))<0) + goto out; + + if (storage_size==0) + ret = 0; + + return ret; + +out: + H5E_BEGIN_TRY { + H5Sclose(sid); + } H5E_END_TRY; + return FAIL; +}
\ No newline at end of file |