[svn-r10014] Purpose:

new test

Description:
add a test for the get number of scales function

Solution:

Platforms tested:
linux
solaris

Misc. update:
This commit is contained in:
Pedro Vicente Nunes 2005-02-16 10:34:33 -05:00
parent adf0f3e317
commit b625ca2b74
3 changed files with 169 additions and 304 deletions

View File

@ -15,8 +15,6 @@
#include "H5LT.h"
#include <stdlib.h>
/*-------------------------------------------------------------------------
* Function: H5DSset_scale
*
@ -739,6 +737,127 @@ out:
}
/*-------------------------------------------------------------------------
* Function: H5DSget_nscales
*
* Purpose: get the number of scales linked to the IDX dimension of DNAME
*
* Return:
* Success: SUCCESS: both the DS and the dataset exist
* Failure: FAIL: if either one of them does not exist
*
* Programmer: pvn@ncsa.uiuc.edu
*
* Date: January 13, 2005
*
* Comments:
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t H5DSget_nscales(hid_t did,
unsigned int dim,
int *nscales)
{
int has_dimlist;
hid_t sid; /* space ID */
hid_t tid; /* attribute type ID */
hid_t aid; /* attribute ID */
int rank; /* rank of dataset */
hvl_t *buf; /* VL buffer to store in the attribute */
hobj_ref_t ref; /* reference to the DS */
int i, n;
/*-------------------------------------------------------------------------
* the attribute "DIMENSION_LIST" on the >>data<< dataset must exist
*-------------------------------------------------------------------------
*/
/* get dataset space */
if ((sid = H5Dget_space(did))<0)
goto out;
/* get rank */
if ((rank=H5Sget_simple_extent_ndims(sid))<0)
goto out;
/* close dataset space */
if (H5Sclose(sid)<0)
goto out;
/* DIM range checking */
if (dim>=(unsigned int )rank)
goto out;
/* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0)
return FAIL;
/* it does not exist */
if (has_dimlist == 0)
goto out;
/*-------------------------------------------------------------------------
* the attribute exists, open it
*-------------------------------------------------------------------------
*/
else if ( has_dimlist == 1 )
{
if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0)
goto out;
if ((tid = H5Aget_type(aid))<0)
goto out;
if ((sid = H5Aget_space(aid))<0)
goto out;
/* allocate and initialize the VL */
buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
if (buf == NULL)
goto out;
/* read */
if (H5Aread(aid,tid,buf)<0)
goto out;
for(i=0,n=0; i<(int)buf[dim].len; i++)
{
ref = ((hobj_ref_t *)buf[dim].p)[i];
if (ref) n++;
}
/* return value */
*nscales =n;
/* close */
if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0)
goto out;
if (H5Sclose(sid)<0)
goto out;
if (H5Tclose(tid)<0)
goto out;
if (H5Aclose(aid)<0)
goto out;
if (buf)
free(buf);
} /* has_dimlist */
return SUCCESS;
/* error zone, gracefully close */
out:
H5E_BEGIN_TRY {
H5Dclose(did);
H5Sclose(sid);
H5Aclose(aid);
H5Tclose(tid);
} H5E_END_TRY;
return FAIL;
}
/*-------------------------------------------------------------------------
* Function: H5DSset_label
@ -1135,293 +1254,6 @@ out:
}
/*-------------------------------------------------------------------------
* Function: H5DShas_scale
*
* Purpose: check if the dataset DID has associated
* valid dimension scales; valid means the dimension scales exist and they
* are as many as the dataset rank
*
* Return: 1, has, 0, not, FAIL, error
*
* Programmer: pvn@ncsa.uiuc.edu
*
* Date: January 04, 2005
*
* Comments:
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t H5DShas_scale(hid_t did)
{
int has_dimlist; /* do we have the "DIMENSION_LIST" attribute */
hid_t sid; /* space ID */
hid_t dsid; /* DS dataset ID */
hid_t dssid; /* DS space ID */
hid_t tid; /* attribute type ID */
hid_t aid; /* attribute ID */
hssize_t dsnelmts; /* size of a dimension scale array */
herr_t has_ds; /* boolean return value */
int rank; /* rank of dataset */
hsize_t dims[H5S_MAX_RANK]; /* dimensions of dataset */
hvl_t *buf; /* VL buffer stored in the attribute */
hobj_ref_t ref; /* reference to the DS */
int i;
has_ds = 1;
/* 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;
/* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0)
goto out;
if (has_dimlist == 0)
has_ds = 0;
else if (has_dimlist == 1 )
{
if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0)
goto out;
if ((tid = H5Aget_type(aid))<0)
goto out;
if ((sid = H5Aget_space(aid))<0)
goto out;
/* allocate and initialize the VL */
buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
if (buf == NULL)
goto out;
/* read */
if (H5Aread(aid,tid,buf)<0)
goto out;
/*-------------------------------------------------------------------------
* check if we have at least one entry for each dimension
*-------------------------------------------------------------------------
*/
for(i=0; i<rank; i++)
{
if (buf[i].len == 0)
has_ds = 0;
}
/*-------------------------------------------------------------------------
* check if the DSs are valid
*-------------------------------------------------------------------------
*/
for(i=0; i<rank; i++)
{
if (buf[i].len)
{
/* get the reference */
ref = ((hobj_ref_t *)buf[i].p)[0];
if (ref==0)
has_ds = 0;
if (ref)
{
/* get the DS id */
if ((dsid = H5Rdereference(did,H5R_OBJECT,&ref))<0)
goto out;
/* check information in referenced dataset */
if ((dssid = H5Dget_space(dsid))<0)
goto out;
/* get size of the DS array */
if ((dsnelmts = H5Sget_simple_extent_npoints(dssid))<0)
goto out;
/* the size of the DS array must match the dimension of the dataset */
if (dsnelmts != (hssize_t)dims[i])
has_ds = 0;
/* close the dereferenced dataset */
if (H5Dclose(dsid)<0)
goto out;
if (H5Sclose(dssid)<0)
goto out;
}
}
}
/* close */
if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0)
goto out;
if (H5Sclose(sid)<0)
goto out;
if (H5Tclose(tid)<0)
goto out;
if (H5Aclose(aid)<0)
goto out;
/* free the VL buffer */
if (buf)
free(buf);
} /* has_dimlist */
return has_ds;
/* error zone, gracefully close */
out:
H5E_BEGIN_TRY {
H5Sclose(sid);
H5Tclose(tid);
H5Aclose(aid);
} H5E_END_TRY;
return FAIL;
}
/*-------------------------------------------------------------------------
* Function: H5DSget_nscales
*
* Purpose: get the number of scales linked to the IDX dimension of DNAME
*
* Return:
* Success: SUCCESS: both the DS and the dataset exist
* Failure: FAIL: if either one of them does not exist
*
* Programmer: pvn@ncsa.uiuc.edu
*
* Date: January 13, 2005
*
* Comments:
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
herr_t H5DSget_nscales(hid_t did,
unsigned int dim,
int *nscales)
{
int has_dimlist;
hid_t sid; /* space ID */
hid_t tid; /* attribute type ID */
hid_t aid; /* attribute ID */
int rank; /* rank of dataset */
hvl_t *buf; /* VL buffer to store in the attribute */
hobj_ref_t ref; /* reference to the DS */
int i, n;
/*-------------------------------------------------------------------------
* the attribute "DIMENSION_LIST" on the >>data<< dataset must exist
*-------------------------------------------------------------------------
*/
/* get dataset space */
if ((sid = H5Dget_space(did))<0)
goto out;
/* get rank */
if ((rank=H5Sget_simple_extent_ndims(sid))<0)
goto out;
/* close dataset space */
if (H5Sclose(sid)<0)
goto out;
/* DIM range checking */
if (dim>=(unsigned int )rank)
goto out;
/* try to find the attribute "DIMENSION_LIST" on the >>data<< dataset */
if ((has_dimlist = H5LT_find_attribute(did,DIMENSION_LIST))<0)
return FAIL;
/* it does not exist */
if (has_dimlist == 0)
goto out;
/*-------------------------------------------------------------------------
* the attribute exists, open it
*-------------------------------------------------------------------------
*/
else if ( has_dimlist == 1 )
{
if ((aid = H5Aopen_name(did,DIMENSION_LIST))<0)
goto out;
if ((tid = H5Aget_type(aid))<0)
goto out;
if ((sid = H5Aget_space(aid))<0)
goto out;
/* allocate and initialize the VL */
buf = (hvl_t*)malloc((size_t)rank * sizeof(hvl_t));
if (buf == NULL)
goto out;
/* read */
if (H5Aread(aid,tid,buf)<0)
goto out;
for(i=0,n=0; i<(int)buf[dim].len; i++)
{
ref = ((hobj_ref_t *)buf[dim].p)[i];
if (ref) n++;
}
/* return value */
*nscales =n;
/* close */
if (H5Dvlen_reclaim(tid,sid,H5P_DEFAULT,buf)<0)
goto out;
if (H5Sclose(sid)<0)
goto out;
if (H5Tclose(tid)<0)
goto out;
if (H5Aclose(aid)<0)
goto out;
if (buf)
free(buf);
} /* has_dimlist */
return SUCCESS;
/* error zone, gracefully close */
out:
H5E_BEGIN_TRY {
H5Dclose(did);
H5Sclose(sid);
H5Aclose(aid);
H5Tclose(tid);
} H5E_END_TRY;
return FAIL;
}
/*-------------------------------------------------------------------------
* Function: H5DSiterate_scales
*

View File

@ -51,6 +51,10 @@ herr_t H5DSdetach_scale(hid_t did,
hid_t dsid,
unsigned int idx);
herr_t H5DSget_nscales(hid_t did,
unsigned int dim,
int *nscales);
herr_t H5DSset_label(hid_t did,
char *label,
unsigned int idx);
@ -65,12 +69,6 @@ herr_t H5DSget_scale_name(hid_t did,
herr_t H5DSis_scale(hid_t did);
herr_t H5DShas_scale(hid_t did);
herr_t H5DSget_nscales(hid_t did,
unsigned int dim,
int *nscales);
herr_t H5DSiterate_scales(hid_t did,
unsigned int dim,

View File

@ -86,7 +86,8 @@ static int test_simple(void)
char s1_label[16]; /* read label for DS 1 */
char s2_label[16]; /* read label for DS 2 */
unsigned int dim; /* dataset dimension index */
int scale_idx;
int scale_idx; /* scale index */
int nscales; /* number of scales in DIM */
printf("Testing API functions\n");
@ -277,11 +278,11 @@ static int test_simple(void)
/*-------------------------------------------------------------------------
* test 2: has scales
* test 2: get number of scales
*-------------------------------------------------------------------------
*/
TESTING2("has scales");
TESTING2("get number of scales");
/*-------------------------------------------------------------------------
* verify that "dset_a" has dimension scales
@ -292,8 +293,18 @@ static int test_simple(void)
if ((did = H5Dopen(fid,"dset_a"))<0)
goto out;
/* verify that "dset_a" has dimension scales */
if ((H5DShas_scale(did))==0)
/* verify that "dset_a" has 1 dimension scale at DIM 0 */
dim=0;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=1)
goto out;
/* verify that "dset_a" has 3 dimension scales at DIM 1 */
dim=1;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=3)
goto out;
/* close dataset ID of "dset_a" */
@ -310,8 +321,18 @@ static int test_simple(void)
if ((did = H5Dopen(fid,"dset_b"))<0)
goto out;
/* verify that "dset_b" does not have a complete definition of dimension scales */
if ((H5DShas_scale(did))==1)
/* verify that "dset_b" has 1 dimension scale at DIM 0 */
dim=0;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=1)
goto out;
/* verify that "dset_b" has 0 dimension scales at DIM 1 */
dim=1;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=0)
goto out;
/* close dataset ID of "dset_b" */
@ -376,7 +397,17 @@ static int test_simple(void)
if ((did = H5Dopen(fid,"dset_c"))<0)
goto out;
if ((H5DShas_scale(did))==0)
/* verify that "dset_c" has 1 dimension scale at DIM 0 */
dim=0;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=1)
goto out;
/* verify that "dset_c" has 1 dimension scale at DIM 1 */
dim=1;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=1)
goto out;
if (H5Dclose(did)<0)
goto out;
@ -413,7 +444,11 @@ static int test_simple(void)
if ((did = H5Dopen(fid,"dset_c"))<0)
goto out;
if ((H5DShas_scale(did))==1)
/* verify that "dset_c" has 0 dimension scale at DIM 0 */
dim=0;
if (H5DSget_nscales(did,dim,&nscales)<0)
goto out;
if (nscales!=0)
goto out;
if (H5Dclose(did)<0)
goto out;