diff options
author | Quincey Koziol <koziol@hdfgroup.org> | 1998-04-23 22:24:52 (GMT) |
---|---|---|
committer | Quincey Koziol <koziol@hdfgroup.org> | 1998-04-23 22:24:52 (GMT) |
commit | 5d3d452005302479a6ae034db2b384be26c8a542 (patch) | |
tree | b9fe1bc8f1cd865d4ebbf3e76b8fdc2eb91bd142 | |
parent | ca0a7c164e2e492d5c48d066bacf83a92e675c2e (diff) | |
download | hdf5-5d3d452005302479a6ae034db2b384be26c8a542.zip hdf5-5d3d452005302479a6ae034db2b384be26c8a542.tar.gz hdf5-5d3d452005302479a6ae034db2b384be26c8a542.tar.bz2 |
[svn-r362] Added Attribute (H5A) test
-rw-r--r-- | test/.distdep | 72 | ||||
-rw-r--r-- | test/Makefile.in | 8 | ||||
-rw-r--r-- | test/dtypes.c | 4 | ||||
-rw-r--r-- | test/tattr.c | 1101 | ||||
-rw-r--r-- | test/testhdf5.c | 1 | ||||
-rw-r--r-- | test/testhdf5.h | 1 |
6 files changed, 1162 insertions, 25 deletions
diff --git a/test/.distdep b/test/.distdep index e7c7b05..4e012b1 100644 --- a/test/.distdep +++ b/test/.distdep @@ -4,8 +4,8 @@ testhdf5.o: \ ../src/H5private.h \ ../src/H5public.h \ ../src/H5config.h -tfile.o: \ - tfile.c \ +tattr.o: \ + tattr.c \ testhdf5.h \ ../src/H5private.h \ ../src/H5public.h \ @@ -13,12 +13,21 @@ tfile.o: \ ../src/H5Eprivate.h \ ../src/H5Epublic.h \ ../src/H5Ipublic.h \ - ../src/H5Bprivate.h \ + ../src/hdf5.h \ + ../src/H5Apublic.h \ + ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ - ../src/H5Fprivate.h \ + ../src/H5Dpublic.h \ ../src/H5Fpublic.h \ - ../src/H5Pprivate.h \ - ../src/H5Ppublic.h + ../src/H5Gpublic.h \ + ../src/H5HGpublic.h \ + ../src/H5HLpublic.h \ + ../src/H5MFpublic.h \ + ../src/H5MMpublic.h \ + ../src/H5Opublic.h \ + ../src/H5Ppublic.h \ + ../src/H5Zpublic.h \ + ../src/H5Spublic.h theap.o: \ theap.c \ testhdf5.h \ @@ -138,10 +147,11 @@ dtypes.o: \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -195,10 +205,11 @@ dsets.o: \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -216,10 +227,11 @@ cmpd_dset.o: \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -230,17 +242,17 @@ cmpd_dset.o: \ ../src/H5Opublic.h \ ../src/H5Ppublic.h \ ../src/H5Zpublic.h \ - ../src/H5Spublic.h \ - ../src/H5Tpublic.h + ../src/H5Spublic.h extend.o: \ extend.c \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -250,16 +262,18 @@ extend.o: \ ../src/H5MMpublic.h \ ../src/H5Opublic.h \ ../src/H5Ppublic.h \ - ../src/H5Zpublic.h + ../src/H5Zpublic.h \ + ../src/H5Spublic.h external.o: \ external.c \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -277,10 +291,11 @@ iopipe.o: \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -315,10 +330,11 @@ shtype.o: \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -328,16 +344,18 @@ shtype.o: \ ../src/H5MMpublic.h \ ../src/H5Opublic.h \ ../src/H5Ppublic.h \ - ../src/H5Zpublic.h + ../src/H5Zpublic.h \ + ../src/H5Spublic.h big.o: \ big.c \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -356,10 +374,11 @@ links.o: \ ../src/hdf5.h \ ../src/H5public.h \ ../src/H5config.h \ + ../src/H5Ipublic.h \ + ../src/H5Apublic.h \ ../src/H5ACpublic.h \ ../src/H5Bpublic.h \ ../src/H5Dpublic.h \ - ../src/H5Ipublic.h \ ../src/H5Epublic.h \ ../src/H5Fpublic.h \ ../src/H5Gpublic.h \ @@ -369,3 +388,18 @@ links.o: \ ../src/H5MMpublic.h \ ../src/H5Opublic.h \ ../src/H5Ppublic.h +tfile.o: \ + tfile.c \ + testhdf5.h \ + ../src/H5private.h \ + ../src/H5public.h \ + ../src/H5config.h \ + ../src/H5Eprivate.h \ + ../src/H5Epublic.h \ + ../src/H5Ipublic.h \ + ../src/H5Bprivate.h \ + ../src/H5Bpublic.h \ + ../src/H5Fprivate.h \ + ../src/H5Fpublic.h \ + ../src/H5Pprivate.h \ + ../src/H5Ppublic.h diff --git a/test/Makefile.in b/test/Makefile.in index 55da8cd..aab4e6c 100644 --- a/test/Makefile.in +++ b/test/Makefile.in @@ -30,12 +30,12 @@ MOSTLYCLEAN=cmpd_dset.h5 dataset.h5 extend.h5 istore.h5 tfile1.h5 tfile2.h5 \ # source files and is used for things like dependencies, archiving, etc. The # other source lists are for the individual tests, the files of which may # overlap with other tests. -PROG_SRC=testhdf5.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5s.c dtypes.c \ - hyperslab.c istore.c dsets.c cmpd_dset.c extend.c external.c \ - iopipe.c gheap.c shtype.c big.c links.c +PROG_SRC=testhdf5.c tattr.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5s.c \ + dtypes.c hyperslab.c istore.c dsets.c cmpd_dset.c extend.c external.c \ + iopipe.c gheap.c shtype.c big.c links.c PROG_OBJ=$(PROG_SRC:.c=.o) -TESTHDF5_SRC=testhdf5.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5s.c +TESTHDF5_SRC=testhdf5.c tattr.c tfile.c theap.c tmeta.c tohdr.c tstab.c th5s.c TESTHDF5_OBJ=$(TESTHDF5_SRC:.c=.o) GHEAP_SRC=gheap.c diff --git a/test/dtypes.c b/test/dtypes.c index f8d3d0a..445e51f 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -170,7 +170,7 @@ test_compound(void) goto error; } /* Add a couple fields */ - status = H5Tinsert(complex_id, "real", HOFFSET(tmp, re), + status = H5Tinsert(complex_id, "real", HOFFSET(complex_t, re), H5T_NATIVE_DOUBLE); if (status < 0) { puts("*FAILED*"); @@ -180,7 +180,7 @@ test_compound(void) } goto error; } - status = H5Tinsert(complex_id, "imaginary", HOFFSET(tmp, im), + status = H5Tinsert(complex_id, "imaginary", HOFFSET(complex_t, im), H5T_NATIVE_DOUBLE); if (status < 0) { puts("*FAILED*"); diff --git a/test/tattr.c b/test/tattr.c new file mode 100644 index 0000000..822472f --- /dev/null +++ b/test/tattr.c @@ -0,0 +1,1101 @@ +/**************************************************************************** + * 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: tattr +* +* Test the attribute functionality +* +*************************************************************/ + +#include <testhdf5.h> + +#include <hdf5.h> + +#define FILE "tattr.h5" +#define ATTR_NAME_LEN 16 +#define ATTR_MAX_DIMS 7 + +/* 3-D dataset with fixed dimensions */ +#define SPACE1_NAME "Space1" +#define SPACE1_RANK 3 +#define SPACE1_DIM1 3 +#define SPACE1_DIM2 15 +#define SPACE1_DIM3 13 + +/* Group Information */ +#define GROUP1_NAME "/Group1" + +/* Attribute Rank & Dimensions */ +#define ATTR1_NAME "Attr1" +#define ATTR1_RANK 1 +#define ATTR1_DIM1 3 +int32 attr_data1[ATTR1_DIM1]={512,-234,98123}; /* Test data for 1st attribute */ + +#define ATTR2_NAME "Attr2" +#define ATTR2_RANK 2 +#define ATTR2_DIM1 2 +#define ATTR2_DIM2 2 +int32 attr_data2[ATTR2_DIM1][ATTR2_DIM2]={{7614,-416},{197814,-3}}; /* Test data for 2nd attribute */ + +#define ATTR3_NAME "Attr3" +#define ATTR3_RANK 3 +#define ATTR3_DIM1 2 +#define ATTR3_DIM2 2 +#define ATTR3_DIM3 2 +double attr_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3]={{{2.3,-26.1},{0.123,-10.0}},{{981724.2,-0.91827},{2.0,23.0}}}; /* Test data for 3rd attribute */ + +#define ATTR4_NAME "Attr4" +#define ATTR4_RANK 2 +#define ATTR4_DIM1 2 +#define ATTR4_DIM2 2 +#define ATTR4_FIELDNAME1 "i" +#define ATTR4_FIELDNAME2 "d" +#define ATTR4_FIELDNAME3 "c" +struct attr4_struct { + int32 i; + double d; + char c; + } attr_data4[ATTR4_DIM1][ATTR4_DIM2]={{{3,-26.1,'d'},{-100000, 0.123,'3'}}, + {{-23,981724.2,'Q'},{0,2.0,'\n'}}}; /* Test data for 4th attribute */ + +int attr_op1(hid_t loc_id, const char *name, void *op_data); + +/**************************************************************** +** +** test_attr_basic_write(): Test basic H5A (attribute) code. +** Tests integer attributes on both datasets and groups +** +****************************************************************/ +static void +test_attr_basic_write(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t group; /* Group ID */ + hid_t sid1,sid2; /* Dataspace ID */ + hid_t attr; /* Attribute ID */ + hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; + hsize_t dims2[] = {ATTR1_DIM1}; + hsize_t dims3[] = {ATTR2_DIM1,ATTR2_DIM2}; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Attribute Functions\n")); + + /* Create file */ + fid1 = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fcreate"); + + /* Create dataspace for dataset */ + sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); + CHECK(sid1, FAIL, "H5Screate_simple"); + + /* Create a dataset */ + dataset=H5Dcreate(fid1,"Dataset1",H5T_NATIVE_UINT8,sid1,H5P_DEFAULT); + + /* Create dataspace for attribute */ + sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create an attribute for the dataset */ + attr=H5Acreate(dataset,ATTR1_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Try to create the same attribute again (should fail) */ + ret=H5Acreate(dataset,ATTR1_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + VERIFY(ret, FAIL, "H5Acreate"); + + /* Write attribute information */ + ret=H5Awrite(attr,H5T_NATIVE_INT32,&attr_data1); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Sclose(sid1); + CHECK(ret, FAIL, "H5Sclose"); + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Create group */ + group = H5Gcreate(fid1, GROUP1_NAME, 0); + CHECK(group, FAIL, "H5Gcreate"); + + /* Create dataspace for attribute */ + sid2 = H5Screate_simple(ATTR2_RANK, dims3, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create an attribute for the group */ + attr=H5Acreate(group,ATTR2_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Try to create the same attribute again (should fail) */ + ret=H5Acreate(group,ATTR2_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + VERIFY(ret, FAIL, "H5Acreate"); + + /* Write attribute information */ + ret=H5Awrite(attr,H5T_NATIVE_INT32,&attr_data2); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close Attribute dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Group */ + ret = H5Gclose(group); + CHECK(ret, FAIL, "H5Gclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_basic_write() */ + +/**************************************************************** +** +** test_attr_basic_read(): Test basic H5A (attribute) code. +** +****************************************************************/ +static void +test_attr_basic_read(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t group; /* Group ID */ + hid_t attr; /* Attribute ID */ + int32 read_data1[ATTR1_DIM1]={0}; /* Buffer for reading 1st attribute */ + int32 read_data2[ATTR2_DIM1][ATTR2_DIM2]={{0}}; /* Buffer for reading 2nd attribute */ + int i,j; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Attribute Functions\n")); + + /* Create file */ + fid1 = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset=H5Dopen(fid1,"Dataset1"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 1, "H5Anum_attrs"); + + /* Open an attribute for the dataset */ + attr=H5Aopen_name(dataset,ATTR1_NAME); + CHECK(attr, FAIL, "H5Aopen_name"); + + /* Read attribute information */ + ret=H5Aread(attr,H5T_NATIVE_INT32,&read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i=0; i<ATTR1_DIM1; i++) + if(attr_data1[i]!=read_data1[i]) { + printf("attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n",i,attr_data1[i],i,read_data1[i]); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Open the group */ + group=H5Gopen(fid1,GROUP1_NAME); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(group); + VERIFY(ret, 1, "H5Anum_attrs"); + + /* Open an attribute for the dataset */ + attr=H5Aopen_name(group,ATTR2_NAME); + CHECK(attr, FAIL, "H5Aopen_name"); + + /* Read attribute information */ + ret=H5Aread(attr,H5T_NATIVE_INT32,&read_data2); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i=0; i<ATTR2_DIM1; i++) + for(j=0; j<ATTR2_DIM2; j++) + if(attr_data2[i][j]!=read_data2[i][j]) { + printf("attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n",i,j,attr_data2[i][j],i,j,read_data1[i]); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close group */ + ret = H5Gclose(group); + CHECK(ret, FAIL, "H5Gclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_basic_read() */ + +/**************************************************************** +** +** test_attr_complex_write(): Test H5A (attribute) code. +** Tests complex datatype attributes +** +****************************************************************/ +static void +test_attr_complex_write(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t tid1; /* Attribute datatype ID */ + hid_t sid1,sid2; /* Dataspace ID */ + hid_t attr; /* Attribute ID */ + hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; + hsize_t dims2[] = {ATTR4_DIM1,ATTR4_DIM2}; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Multiple Attribute Functions\n")); + + /* Create file */ + fid1 = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fcreate"); + + /* Create dataspace for dataset */ + sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); + CHECK(sid1, FAIL, "H5Screate_simple"); + + /* Create a dataset */ + dataset=H5Dcreate(fid1,"Dataset1",H5T_NATIVE_UINT8,sid1,H5P_DEFAULT); + + /* Close dataset's dataspace */ + ret = H5Sclose(sid1); + CHECK(ret, FAIL, "H5Sclose"); + + /* Create the attribute datatype. */ + tid1 = H5Tcreate (H5T_COMPOUND, sizeof(struct attr4_struct)); + CHECK(tid1, FAIL, "H5Tcreate"); + ret = H5Tinsert(tid1, ATTR4_FIELDNAME1, HOFFSET(struct attr4_struct, i), H5T_NATIVE_INT32); + CHECK(ret, FAIL, "H5Tinsert"); + ret = H5Tinsert(tid1, ATTR4_FIELDNAME2, HOFFSET(struct attr4_struct, d), H5T_NATIVE_DOUBLE); + CHECK(ret, FAIL, "H5Tinsert"); + ret = H5Tinsert(tid1, ATTR4_FIELDNAME3, HOFFSET(struct attr4_struct, c), H5T_NATIVE_CHAR); + CHECK(ret, FAIL, "H5Tinsert"); + + /* Create dataspace for 1st attribute */ + sid2 = H5Screate_simple(ATTR4_RANK, dims2, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create complex attribute for the dataset */ + attr=H5Acreate(dataset,ATTR4_NAME,tid1,sid2,H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Try to create the same attribute again (should fail) */ + ret=H5Acreate(dataset,ATTR4_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + VERIFY(ret, FAIL, "H5Acreate"); + + /* Write complex attribute data */ + ret=H5Awrite(attr,tid1,&attr_data4); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close attribute's dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close attribute's datatype */ + ret = H5Tclose(tid1); + CHECK(ret, FAIL, "H5Tclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_complex_write() */ + +/**************************************************************** +** +** test_attr_complex_read(): Test basic H5A (attribute) code. +** +****************************************************************/ +static void +test_attr_complex_read(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t space; /* Attribute dataspace */ + hid_t type; /* Attribute datatype */ + hid_t attr; /* Attribute ID */ + char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ + int rank; /* Attribute rank */ + hsize_t dims[ATTR_MAX_DIMS]; /* Attribute dimensions */ + H5T_class_t class; /* Attribute datatype class */ + H5T_order_t order; /* Attribute datatype order */ + size_t size; /* Attribute datatype size as stored in file */ + int fields; /* # of Attribute datatype fields */ + char *fieldname; /* Name of a field */ + size_t offset; /* Attribute datatype field offset */ + hid_t field; /* Attribute field datatype */ + struct attr4_struct read_data4[ATTR4_DIM1][ATTR4_DIM2]={}; /* Buffer for reading 4th attribute */ + int i,j; + size_t name_len; /* Length of attribute name */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Attribute Functions\n")); + + /* Open file */ + fid1 = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset=H5Dopen(fid1,"Dataset1"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 1, "H5Anum_attrs"); + + /* Open 1st attribute for the dataset */ + attr=H5Aopen_idx(dataset,0); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Dataspace */ + space=H5Aget_space(attr); + CHECK(space, FAIL, "H5Aget_space"); + rank=H5Sget_ndims(space); + VERIFY(rank, ATTR4_RANK, "H5Sget_ndims"); + ret=H5Sget_dims(space,dims); + CHECK(ret, FAIL, "H5Sget_dims"); + if(dims[0]!=ATTR4_DIM1) { + printf("attribute dimensions different: dims[0]=%d, should be %d\n",(int)dims[0],ATTR4_DIM1); + num_errs++; + } /* end if */ + if(dims[1]!=ATTR4_DIM2) { + printf("attribute dimensions different: dims[1]=%d, should be %d\n",(int)dims[1],ATTR4_DIM2); + num_errs++; + } /* end if */ + H5Sclose(space); + + /* Verify Datatype */ + type=H5Aget_type(attr); + CHECK(type, FAIL, "H5Aget_type"); + class=H5Tget_class(type); + VERIFY(class, H5T_COMPOUND, "H5Tget_class"); + fields=H5Tget_nmembers(type); + VERIFY(fields, 3, "H5Tget_nmembers"); + for(i=0; i<fields; i++) { + fieldname=H5Tget_member_name(type,i); + if(!(HDstrcmp(fieldname,ATTR4_FIELDNAME1) || + HDstrcmp(fieldname,ATTR4_FIELDNAME2) || + HDstrcmp(fieldname,ATTR4_FIELDNAME3))) { + printf("invalid field name for field #%d: %s\n",i,fieldname); + num_errs++; + } /* end if */ + free(fieldname); + } /* end for */ + offset=H5Tget_member_offset(type,0); + VERIFY(offset, 0, "H5Tget_member_offset"); + offset=H5Tget_member_offset(type,1); + VERIFY(offset, 4, "H5Tget_member_offset"); + offset=H5Tget_member_offset(type,2); + VERIFY(offset, 12, "H5Tget_member_offset"); + + /* Verify each field's type, class & size */ + field=H5Tget_member_type(type,0); + CHECK(field, FAIL, "H5Tget_member_type"); + class=H5Tget_class(field); + VERIFY(class, H5T_INTEGER, "H5Tget_class"); + order=H5Tget_order(field); + VERIFY(order, H5Tget_order(H5T_NATIVE_INT32), "H5Tget_order"); + size=H5Tget_size(field); + VERIFY(size, H5Tget_size(H5T_NATIVE_INT32), "H5Tget_size"); + H5Tclose(field); + field=H5Tget_member_type(type,1); + CHECK(field, FAIL, "H5Tget_member_type"); + class=H5Tget_class(field); + VERIFY(class, H5T_FLOAT, "H5Tget_class"); + order=H5Tget_order(field); + VERIFY(order, H5Tget_order(H5T_NATIVE_DOUBLE), "H5Tget_order"); + size=H5Tget_size(field); + VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size"); + H5Tclose(field); + field=H5Tget_member_type(type,2); + CHECK(field, FAIL, "H5Tget_member_type"); + class=H5Tget_class(field); + VERIFY(class, H5T_INTEGER, "H5Tget_class"); + order=H5Tget_order(field); + VERIFY(order, H5Tget_order(H5T_NATIVE_CHAR), "H5Tget_order"); + size=H5Tget_size(field); + VERIFY(size, H5Tget_size(H5T_NATIVE_CHAR), "H5Tget_size"); + H5Tclose(field); + + /* Read attribute information */ + ret=H5Aread(attr,type,&read_data4); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i=0; i<ATTR4_DIM1; i++) + for(j=0; j<ATTR4_DIM2; j++) + if(HDmemcmp(&attr_data4[i][j],&read_data4[i][j],sizeof(struct attr4_struct))) { + printf("attribute data different: attr_data4[%d][%d].i=%d, read_data4[%d][%d].i=%d\n",i,j,attr_data4[i][j].i,i,j,read_data4[i][j].i); + printf("attribute data different: attr_data4[%d][%d].d=%f, read_data4[%d][%d].d=%f\n",i,j,attr_data4[i][j].d,i,j,read_data4[i][j].d); + printf("attribute data different: attr_data4[%d][%d].c=%c, read_data4[%d][%d].c=%c\n",i,j,attr_data4[i][j].c,i,j,read_data4[i][j].c); + num_errs++; + } /* end if */ + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR4_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR4_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR4_NAME); + num_errs++; + } /* end if */ + + /* Close attribute datatype */ + ret=H5Tclose(type); + CHECK(ret, FAIL, "H5Tclose"); + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_complex_read() */ + +/**************************************************************** +** +** test_attr_mult_write(): Test basic H5A (attribute) code. +** Tests integer attributes on both datasets and groups +** +****************************************************************/ +static void +test_attr_mult_write(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t sid1,sid2; /* Dataspace ID */ + hid_t attr; /* Attribute ID */ + hsize_t dims1[] = {SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3}; + hsize_t dims2[] = {ATTR1_DIM1}; + hsize_t dims3[] = {ATTR2_DIM1,ATTR2_DIM2}; + hsize_t dims4[] = {ATTR3_DIM1,ATTR3_DIM2,ATTR3_DIM3}; + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Multiple Attribute Functions\n")); + + /* Create file */ + fid1 = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fcreate"); + + /* Create dataspace for dataset */ + sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); + CHECK(sid1, FAIL, "H5Screate_simple"); + + /* Create a dataset */ + dataset=H5Dcreate(fid1,"Dataset1",H5T_NATIVE_UINT8,sid1,H5P_DEFAULT); + + /* Close dataset's dataspace */ + ret = H5Sclose(sid1); + CHECK(ret, FAIL, "H5Sclose"); + + /* Create dataspace for 1st attribute */ + sid2 = H5Screate_simple(ATTR1_RANK, dims2, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create 1st attribute for the dataset */ + attr=H5Acreate(dataset,ATTR1_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Try to create the same attribute again (should fail) */ + ret=H5Acreate(dataset,ATTR1_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + VERIFY(ret, FAIL, "H5Acreate"); + + /* Write 1st attribute data */ + ret=H5Awrite(attr,H5T_NATIVE_INT32,&attr_data1); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close 1st attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close attribute's dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Create dataspace for 2nd attribute */ + sid2 = H5Screate_simple(ATTR2_RANK, dims3, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create 2nd attribute for the dataset */ + attr=H5Acreate(dataset,ATTR2_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Try to create the same attribute again (should fail) */ + ret=H5Acreate(dataset,ATTR2_NAME,H5T_NATIVE_INT32,sid2,H5P_DEFAULT); + VERIFY(ret, FAIL, "H5Acreate"); + + /* Write 2nd attribute information */ + ret=H5Awrite(attr,H5T_NATIVE_INT32,&attr_data2); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close 2nd attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close 2nd attribute's dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Create dataspace for 3rd attribute */ + sid2 = H5Screate_simple(ATTR3_RANK, dims4, NULL); + CHECK(sid2, FAIL, "H5Screate_simple"); + + /* Create 3rd attribute for the dataset */ + attr=H5Acreate(dataset,ATTR3_NAME,H5T_NATIVE_DOUBLE,sid2,H5P_DEFAULT); + CHECK(attr, FAIL, "H5Acreate"); + + /* Try to create the same attribute again (should fail) */ + ret=H5Acreate(dataset,ATTR3_NAME,H5T_NATIVE_DOUBLE,sid2,H5P_DEFAULT); + VERIFY(ret, FAIL, "H5Acreate"); + + /* Write 3rd attribute information */ + ret=H5Awrite(attr,H5T_NATIVE_DOUBLE,&attr_data3); + CHECK(ret, FAIL, "H5Awrite"); + + /* Close 3rd attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close 3rd attribute's dataspace */ + ret = H5Sclose(sid2); + CHECK(ret, FAIL, "H5Sclose"); + + /* Close Dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_mult_write() */ + +/**************************************************************** +** +** test_attr_mult_read(): Test basic H5A (attribute) code. +** +****************************************************************/ +static void +test_attr_mult_read(void) +{ + hid_t fid1; /* HDF5 File IDs */ + hid_t dataset; /* Dataset ID */ + hid_t space; /* Attribute dataspace */ + hid_t type; /* Attribute datatype */ + hid_t attr; /* Attribute ID */ + char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ + char temp_name[ATTR_NAME_LEN]; /* Buffer for mangling attribute names */ + int rank; /* Attribute rank */ + hsize_t dims[ATTR_MAX_DIMS]; /* Attribute dimensions */ + H5T_class_t class; /* Attribute datatype class */ + H5T_order_t order; /* Attribute datatype order */ + size_t size; /* Attribute datatype size as stored in file */ + int32 read_data1[ATTR1_DIM1]={0}; /* Buffer for reading 1st attribute */ + int32 read_data2[ATTR2_DIM1][ATTR2_DIM2]={{0}}; /* Buffer for reading 2nd attribute */ + double read_data3[ATTR3_DIM1][ATTR3_DIM2][ATTR3_DIM3]={{{0}}}; /* Buffer for reading 3rd attribute */ + int i,j,k; + size_t name_len; /* Length of attribute name */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Attribute Functions\n")); + + /* Open file */ + fid1 = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset=H5Dopen(fid1,"Dataset1"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 3, "H5Anum_attrs"); + + /* Open 1st attribute for the dataset */ + attr=H5Aopen_idx(dataset,0); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Dataspace */ + space=H5Aget_space(attr); + CHECK(space, FAIL, "H5Aget_space"); + rank=H5Sget_ndims(space); + VERIFY(rank, ATTR1_RANK, "H5Sget_ndims"); + ret=H5Sget_dims(space,dims); + CHECK(ret, FAIL, "H5Sget_dims"); + if(dims[0]!=ATTR1_DIM1) { + printf("attribute dimensions different: dims[0]=%d, should be %d\n",(int)dims[0],ATTR1_DIM1); + num_errs++; + } /* end if */ + H5Sclose(space); + + /* Verify Datatype */ + type=H5Aget_type(attr); + CHECK(type, FAIL, "H5Aget_type"); + class=H5Tget_class(type); + VERIFY(class, H5T_INTEGER, "H5Tget_class"); + order=H5Tget_order(type); + VERIFY(order, H5Tget_order(H5T_NATIVE_INT32), "H5Tget_order"); + size=H5Tget_size(type); + VERIFY(size, H5Tget_size(H5T_NATIVE_INT32), "H5Tget_size"); + H5Tclose(type); + + /* Read attribute information */ + ret=H5Aread(attr,H5T_NATIVE_INT32,&read_data1); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i=0; i<ATTR1_DIM1; i++) + if(attr_data1[i]!=read_data1[i]) { + printf("attribute data different: attr_data1[%d]=%d, read_data1[%d]=%d\n",i,attr_data1[i],i,read_data1[i]); + num_errs++; + } /* end if */ + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR1_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR1_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR1_NAME); + num_errs++; + } /* end if */ + + /* Verify Name with too small of a buffer */ + name_len=H5Aget_name(attr,attr_name,HDstrlen(ATTR1_NAME)); + VERIFY(name_len, HDstrlen(ATTR1_NAME), "H5Aget_name"); + HDstrcpy(temp_name,ATTR1_NAME); /* make a copy of the name */ + temp_name[HDstrlen(ATTR1_NAME)-1]='\0'; /* truncate it to match the one retrieved */ + if(HDstrcmp(attr_name,temp_name)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,temp_name); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Open 2nd attribute for the dataset */ + attr=H5Aopen_idx(dataset,1); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Dataspace */ + space=H5Aget_space(attr); + CHECK(space, FAIL, "H5Aget_space"); + rank=H5Sget_ndims(space); + VERIFY(rank, ATTR2_RANK, "H5Sget_ndims"); + ret=H5Sget_dims(space,dims); + CHECK(ret, FAIL, "H5Sget_dims"); + if(dims[0]!=ATTR2_DIM1) { + printf("attribute dimensions different: dims[0]=%d, should be %d\n",(int)dims[0],ATTR2_DIM1); + num_errs++; + } /* end if */ + if(dims[1]!=ATTR2_DIM2) { + printf("attribute dimensions different: dims[1]=%d, should be %d\n",(int)dims[1],ATTR2_DIM2); + num_errs++; + } /* end if */ + H5Sclose(space); + + /* Verify Datatype */ + type=H5Aget_type(attr); + CHECK(type, FAIL, "H5Aget_type"); + class=H5Tget_class(type); + VERIFY(class, H5T_INTEGER, "H5Tget_class"); + order=H5Tget_order(type); + VERIFY(order, H5Tget_order(H5T_NATIVE_INT32), "H5Tget_order"); + size=H5Tget_size(type); + VERIFY(size, H5Tget_size(H5T_NATIVE_INT32), "H5Tget_size"); + H5Tclose(type); + + /* Read attribute information */ + ret=H5Aread(attr,H5T_NATIVE_INT32,&read_data2); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i=0; i<ATTR2_DIM1; i++) + for(j=0; j<ATTR2_DIM2; j++) + if(attr_data2[i][j]!=read_data2[i][j]) { + printf("attribute data different: attr_data2[%d][%d]=%d, read_data2[%d][%d]=%d\n",i,j,attr_data2[i][j],i,j,read_data2[i][j]); + num_errs++; + } /* end if */ + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR2_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR2_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR2_NAME); + num_errs++; + } /* end if */ + + /* Verify Name with too small of a buffer */ + name_len=H5Aget_name(attr,attr_name,HDstrlen(ATTR2_NAME)); + VERIFY(name_len, HDstrlen(ATTR2_NAME), "H5Aget_name"); + HDstrcpy(temp_name,ATTR2_NAME); /* make a copy of the name */ + temp_name[HDstrlen(ATTR2_NAME)-1]='\0'; /* truncate it to match the one retrieved */ + if(HDstrcmp(attr_name,temp_name)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,temp_name); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Open 2nd attribute for the dataset */ + attr=H5Aopen_idx(dataset,2); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Dataspace */ + space=H5Aget_space(attr); + CHECK(space, FAIL, "H5Aget_space"); + rank=H5Sget_ndims(space); + VERIFY(rank, ATTR3_RANK, "H5Sget_ndims"); + ret=H5Sget_dims(space,dims); + CHECK(ret, FAIL, "H5Sget_dims"); + if(dims[0]!=ATTR3_DIM1) { + printf("attribute dimensions different: dims[0]=%d, should be %d\n",(int)dims[0],ATTR3_DIM1); + num_errs++; + } /* end if */ + if(dims[1]!=ATTR3_DIM2) { + printf("attribute dimensions different: dims[1]=%d, should be %d\n",(int)dims[1],ATTR3_DIM2); + num_errs++; + } /* end if */ + if(dims[2]!=ATTR3_DIM3) { + printf("attribute dimensions different: dims[2]=%d, should be %d\n",(int)dims[2],ATTR3_DIM3); + num_errs++; + } /* end if */ + H5Sclose(space); + + /* Verify Datatype */ + type=H5Aget_type(attr); + CHECK(type, FAIL, "H5Aget_type"); + class=H5Tget_class(type); + VERIFY(class, H5T_FLOAT, "H5Tget_class"); + order=H5Tget_order(type); + VERIFY(order, H5Tget_order(H5T_NATIVE_DOUBLE), "H5Tget_order"); + size=H5Tget_size(type); + VERIFY(size, H5Tget_size(H5T_NATIVE_DOUBLE), "H5Tget_size"); + H5Tclose(type); + + /* Read attribute information */ + ret=H5Aread(attr,H5T_NATIVE_DOUBLE,&read_data3); + CHECK(ret, FAIL, "H5Aread"); + + /* Verify values read in */ + for(i=0; i<ATTR3_DIM1; i++) + for(j=0; j<ATTR3_DIM2; j++) + for(k=0; k<ATTR3_DIM3; k++) + if(attr_data3[i][j][k]!=read_data3[i][j][k]) { + printf("attribute data different: attr_data3[%d][%d][%d]=%f, read_data3[%d][%d][%d]=%f\n",i,j,k,attr_data3[i][j][k],i,j,k,read_data3[i][j][k]); + num_errs++; + } /* end if */ + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR3_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR3_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR3_NAME); + num_errs++; + } /* end if */ + + /* Verify Name with too small of a buffer */ + name_len=H5Aget_name(attr,attr_name,HDstrlen(ATTR3_NAME)); + VERIFY(name_len, HDstrlen(ATTR3_NAME), "H5Aget_name"); + HDstrcpy(temp_name,ATTR3_NAME); /* make a copy of the name */ + temp_name[HDstrlen(ATTR3_NAME)-1]='\0'; /* truncate it to match the one retrieved */ + if(HDstrcmp(attr_name,temp_name)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,temp_name); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Close dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_mult_read() */ + +/**************************************************************** +** +** attr_op1(): Attribute operator +** +****************************************************************/ +int attr_op1(hid_t __unused__ loc_id, const char *name, void *op_data) +{ + int *count=(int *)op_data; + int ret=0; + + switch(*count) { + case 0: + if(HDstrcmp(name,ATTR1_NAME)) { + printf("attribute name different: name=%s, should be %s\n",name,ATTR1_NAME); + num_errs++; + } /* end if */ + (*count)++; + break; + + case 1: + if(HDstrcmp(name,ATTR2_NAME)) { + printf("attribute name different: name=%s, should be %s\n",name,ATTR2_NAME); + num_errs++; + } /* end if */ + (*count)++; + break; + + case 2: + if(HDstrcmp(name,ATTR3_NAME)) { + printf("attribute name different: name=%s, should be %s\n",name,ATTR3_NAME); + num_errs++; + } /* end if */ + (*count)++; + break; + + default: + ret=-1; + break; + } /* end switch() */ + + return(ret); +} /* end attr_op1() */ + +/**************************************************************** +** +** test_attr_iterate(): Test H5A (attribute) iterator code. +** +****************************************************************/ +static void +test_attr_iterate(void) +{ + hid_t file; /* HDF5 File ID */ + hid_t dataset; /* Dataset ID */ + unsigned start; /* Starting attribute to look up */ + int count; /* operator data for the iterator */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Attribute Functions\n")); + + /* Open file */ + file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK(file, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset=H5Dopen(file,"Dataset1"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 3, "H5Anum_attrs"); + + /* Close dataset */ + start=0; + count=0; + ret = H5Aiterate(dataset,&start,attr_op1,&count); + VERIFY(ret, 0, "H5Aiterate"); + + /* Close dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(file); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_iterate() */ + +/**************************************************************** +** +** test_attr_delete(): Test H5A (attribute) code for deleting objects. +** +****************************************************************/ +static void +test_attr_delete(void) +{ + hid_t fid1; /* HDF5 File ID */ + hid_t dataset; /* Dataset ID */ + hid_t attr; /* Attribute ID */ + char attr_name[ATTR_NAME_LEN]; /* Buffer for attribute names */ + size_t name_len; /* Length of attribute name */ + herr_t ret; /* Generic return value */ + + /* Output message about test being performed */ + MESSAGE(5, ("Testing Basic Attribute Functions\n")); + + /* Open file */ + fid1 = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + CHECK(fid1, FAIL, "H5Fopen"); + + /* Open the dataset */ + dataset=H5Dopen(fid1,"Dataset1"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 3, "H5Anum_attrs"); + + /* Try to delete bogus attribute */ + ret=H5Adelete(dataset,"Bogus"); + CHECK(ret, FAIL, "H5Adelete"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 3, "H5Anum_attrs"); + + /* Delete middle (2nd) attribute */ + ret=H5Adelete(dataset,ATTR2_NAME); + CHECK(ret, FAIL, "H5Adelete"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 2, "H5Anum_attrs"); + + /* Open 1st attribute for the dataset */ + attr=H5Aopen_idx(dataset,0); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR1_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR1_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR1_NAME); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Open last (formally 3rd) attribute for the dataset */ + attr=H5Aopen_idx(dataset,1); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR3_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR3_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR3_NAME); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Delete first attribute */ + ret=H5Adelete(dataset,ATTR1_NAME); + CHECK(ret, FAIL, "H5Adelete"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 1, "H5Anum_attrs"); + + /* Open last (formally 3rd) attribute for the dataset */ + attr=H5Aopen_idx(dataset,0); + CHECK(attr, FAIL, "H5Aopen_idx"); + + /* Verify Name */ + name_len=H5Aget_name(attr,attr_name,ATTR_NAME_LEN); + VERIFY(name_len, HDstrlen(ATTR3_NAME), "H5Aget_name"); + if(HDstrcmp(attr_name,ATTR3_NAME)) { + printf("attribute name different: attr_name=%s, should be %s\n",attr_name,ATTR3_NAME); + num_errs++; + } /* end if */ + + /* Close attribute */ + ret=H5Aclose(attr); + CHECK(ret, FAIL, "H5Aclose"); + + /* Delete first attribute */ + ret=H5Adelete(dataset,ATTR3_NAME); + CHECK(ret, FAIL, "H5Adelete"); + + /* Verify the correct number of attributes */ + ret=H5Anum_attrs(dataset); + VERIFY(ret, 0, "H5Anum_attrs"); + + /* Close dataset */ + ret = H5Dclose(dataset); + CHECK(ret, FAIL, "H5Dclose"); + + /* Close file */ + ret = H5Fclose(fid1); + CHECK(ret, FAIL, "H5Fclose"); +} /* test_attr_delete() */ + +/**************************************************************** +** +** test_attr(): Main H5A (attribute) testing routine. +** +****************************************************************/ +void +test_attr(void) +{ + /* Output message about test being performed */ + MESSAGE(5, ("Testing Attributes\n")); + + /* These next two tests use the same file information */ + test_attr_basic_write(); /* Test basic H5A writing code */ + test_attr_basic_read(); /* Test basic H5A reading code */ + + /* These next two tests use the same file information */ + test_attr_complex_write(); /* Test complex datatype H5A writing code */ + test_attr_complex_read(); /* Test complex datatype H5A reading code */ + + /* These next four tests use the same file information */ + test_attr_mult_write(); /* Test H5A writing code for multiple attributes */ + test_attr_mult_read(); /* Test H5A reading code for multiple attributes */ + test_attr_iterate(); /* Test H5A iterator code */ + test_attr_delete(); /* Test H5A code for deleting attributes */ +} /* test_attr() */ + diff --git a/test/testhdf5.c b/test/testhdf5.c index 85cc2bf..23daace 100644 --- a/test/testhdf5.c +++ b/test/testhdf5.c @@ -166,6 +166,7 @@ main(int argc, char *argv[]) InitTest("ohdr", test_ohdr, "Object Headers"); InitTest("stab", test_stab, "Symbol Tables"); InitTest("h5p", test_h5p, "Dataspaces"); + InitTest("attr", test_attr, "Attributes"); Verbosity = 4; /* Default Verbosity is Low */ H5version(&major, &minor, &release, &patch); diff --git a/test/testhdf5.h b/test/testhdf5.h index 0288880..2b4df77 100644 --- a/test/testhdf5.h +++ b/test/testhdf5.h @@ -137,5 +137,6 @@ void test_stab(void); void test_h5t(void); void test_h5p(void); void test_h5d(void); +void test_attr(void); #endif /* HDF5TEST_H */ |