diff options
-rw-r--r-- | test/trefer.c | 232 |
1 files changed, 232 insertions, 0 deletions
diff --git a/test/trefer.c b/test/trefer.c new file mode 100644 index 0000000..1fece32 --- /dev/null +++ b/test/trefer.c @@ -0,0 +1,232 @@ +/**************************************************************************** + * NCSA HDF * + * Software Development Group * + * National Center for Supercomputing Applications * + * University of Illinois at Urbana-Champaign * + * 605 E. Springfield, Champaign IL 61820 * + * * + * For conditions of distribution and use, see the accompanying * + * hdf/COPYING file. * + * * + ****************************************************************************/ + +#ifdef RCSID +static char RcsId[] = "$Revision$"; +#endif + +/* $Id$ */ + +/*********************************************************** +* +* Test program: trefer +* +* Test the Reference functionality +* +*************************************************************/ + +#include <testhdf5.h> + +#include <hdf5.h> + +#define FILE "trefer.h5" + +/* 1-D dataset with fixed dimensions */ +#define SPACE1_NAME "Space1" +#define SPACE1_RANK 1 +#define SPACE1_DIM1 4 + +/**************************************************************** +** +** test_reference_obj(): Test basic H5R (reference) object reference code. +** Tests references to various kinds of objects +** +****************************************************************/ +static void +test_reference_obj(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t group; /* Group ID */ + hid_t sid1; /* Dataspace ID */ + hsize_t dims1[] = {SPACE1_DIM1}; + href_t *wbuf, /* buffer to write to disk */ + *rbuf, /* buffer read from disk */ + *tbuf; /* temp. buffer read from disk */ + H5R_type_t reftype; /* Reference type created */ + uint32 *tu32; /* Temporary pointer to uint32 data */ + intn i; /* counting variables */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Object Reference Functions\n")); + + /* Allocate write & read buffers */ + wbuf=malloc(sizeof(href_t)*SPACE1_DIM1); + rbuf=malloc(sizeof(href_t)*SPACE1_DIM1); + tbuf=malloc(sizeof(href_t)*SPACE1_DIM1); + + /* Create file */ + fid1 = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fcreate"); + + /* Create dataspace for datasets */ + sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); + CHECK(sid1, FAIL, "H5Screate_simple"); + + /* Create a group */ + group=H5Gcreate(fid1,"Group1",-1); + CHECK(group, FAIL, "H5Gcreate"); + + /* Close group */ + ret = H5Gclose(group); + CHECK(ret, FAIL, "H5Gclose"); + + /* Create a dataset */ + dataset=H5Dcreate(fid1,"Dataset1",H5T_STD_U32LE,sid1,H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dcreate"); + + for(tu32=(uint32 *)wbuf,i=0; i<SPACE1_DIM1; i++) + *tu32++=i*3; + + /* Write selection to disk */ + ret=H5Dwrite(dataset,H5T_STD_U32LE,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf); + CHECK(ret, FAIL, "H5Dwrite"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Create another dataset */ + dataset=H5Dcreate(fid1,"Dataset2",H5T_NATIVE_UCHAR,sid1,H5P_DEFAULT); + CHECK(dataset, FAIL, "H5Dcreate"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Create a dataset */ + dataset=H5Dcreate(fid1,"Dataset3",H5T_NATIVE_PTR_OBJ,sid1,H5P_DEFAULT); + CHECK(ret, FAIL, "H5Dcreate"); + + /* Create references */ + ret = H5Rcreate(&wbuf[0],fid1,"/Dataset1",H5R_OBJECT,-1); + CHECK(ret, FAIL, "H5Rcreate"); + reftype = H5Rget_type(&wbuf[0]); + VERIFY(reftype, H5R_OBJECT, "H5Rget_type"); + + ret = H5Rcreate(&wbuf[1],fid1,"/Dataset2",H5R_OBJECT,-1); + CHECK(ret, FAIL, "H5Rcreate"); + reftype = H5Rget_type(&wbuf[1]); + VERIFY(reftype, H5R_OBJECT, "H5Rget_type"); + + ret = H5Rcreate(&wbuf[2],fid1,"/Group1",H5R_OBJECT,-1); + CHECK(ret, FAIL, "H5Rcreate"); + reftype = H5Rget_type(&wbuf[2]); + VERIFY(reftype, H5R_OBJECT, "H5Rget_type"); + + /* Write selection to disk */ + ret=H5Dwrite(dataset,H5T_NATIVE_PTR_OBJ,H5S_ALL,H5S_ALL,H5P_DEFAULT,wbuf); + CHECK(ret, FAIL, "H5Dwrite"); + + /* Close disk dataspace */ + ret = H5Sclose(sid1); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); + + /* Re-open the file */ + fid1 = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset=H5Dopen(fid1,"/Dataset3"); + CHECK(ret, FAIL, "H5Dcreate"); + + /* Read selection from disk */ + ret=H5Dread(dataset,H5T_NATIVE_PTR_OBJ,H5S_ALL,H5S_ALL,H5P_DEFAULT,rbuf); + CHECK(ret, FAIL, "H5Dread"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Check references */ + reftype = H5Rget_type(&rbuf[0]); + VERIFY(reftype, H5R_OBJECT, "H5Rget_type"); + + reftype = H5Rget_type(&rbuf[1]); + VERIFY(reftype, H5R_OBJECT, "H5Rget_type"); + + reftype = H5Rget_type(&rbuf[2]); + VERIFY(reftype, H5R_OBJECT, "H5Rget_type"); + + /* Try to open objects */ + dataset = H5Rdereference(&rbuf[0]); + CHECK(dataset, FAIL, "H5Rdereference"); + + /* Check information in referenced dataset */ + + /* Read from disk */ + ret=H5Dread(dataset,H5T_STD_U32LE,H5S_ALL,H5S_ALL,H5P_DEFAULT,tbuf); + CHECK(ret, FAIL, "H5Dread"); + + for(tu32=(uint32 *)tbuf,i=0; i<SPACE1_DIM1; i++,tu32++) + VERIFY(*tu32, (uint32)(i*3), "Data"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); + + + /* Free memory buffers */ + free(wbuf); + free(rbuf); +} /* test_reference_obj() */ + +/**************************************************************** +** +** test_reference(): Main H5R reference testing routine. +** +****************************************************************/ +void +test_reference(void) +{ + /* Output message about test being performed */ + MESSAGE(5, ("Testing References\n")); + + /* These next tests use the same file */ + test_reference_obj(); /* Test basic H5R object reference code */ + +} /* test_reference() */ + + +/*------------------------------------------------------------------------- + * Function: cleanup_reference + * + * Purpose: Cleanup temporary test files + * + * Return: none + * + * Programmer: Quincey Koziol + * September 8, 1998 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +void +cleanup_reference(void) +{ + remove(FILE); +} + |