summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--test/tarray.c293
1 files changed, 293 insertions, 0 deletions
diff --git a/test/tarray.c b/test/tarray.c
index 0af9451..41e92d3 100644
--- a/test/tarray.c
+++ b/test/tarray.c
@@ -1517,6 +1517,297 @@ test_array_vlen_array(void)
} /* end test_array_vlen_array() */
+#define FIELDNAME "ArrayofStructures"
+#define LENGTH 5
+#define ALEN 10
+#define RANK 1
+#define NMAX 100
+
+typedef struct
+{
+ int nsubfields;
+ char *name[NMAX];
+ off_t offset[NMAX];
+ hid_t datatype[NMAX];
+
+} CmpDTSinfo;
+
+/****************************************************************
+**
+** test_array_bkg(): Test basic array datatype code.
+** Tests reading compound datatype with array fields and
+** writing partial fields.
+**
+****************************************************************/
+static void
+test_array_bkg(void)
+{
+ herr_t status = -1;
+
+ hid_t fid, array_dt;
+ hid_t space;
+ hid_t type;
+ hid_t dataset;
+
+ hsize_t dim[] = {LENGTH};
+ hsize_t dima[] = {ALEN};
+
+ int i, j;
+ int ndims[3] = {1,1,1};
+
+ typedef struct
+ {
+ int a[ALEN];
+ float b[ALEN];
+ double c[ALEN];
+ } CmpField;
+
+ CmpField cf[LENGTH];
+ CmpField cfr[LENGTH];
+ CmpDTSinfo dtsinfo;
+
+ typedef struct
+ {
+ float b[ALEN];
+ } fld_t;
+
+ fld_t fld[LENGTH];
+ fld_t fldr[LENGTH];
+
+ /* Output message about test being performed */
+ MESSAGE(5, ("Testing Partial I/O of Array Fields in Compound Datatype Functionality\n"));
+
+ /* Initialize the data */
+ /* ------------------- */
+ for (i = 0; i < LENGTH; i++)
+ {
+ for (j = 0; j < ALEN; j++)
+ {
+ cf[i].a[j] = 100*(i+1) + j;
+ cf[i].b[j] = 100.*(i+1) + 0.01*j;
+ cf[i].c[j] = 100.*(i+1) + 0.02*j;
+ }
+ }
+
+
+ /* Set the number of data members */
+ /* ------------------------------ */
+ dtsinfo.nsubfields = 3;
+
+ /* Initialize the offsets */
+ /* ----------------------- */
+ dtsinfo.offset[0] = HOFFSET(CmpField, a);
+ dtsinfo.offset[1] = HOFFSET(CmpField, b);
+ dtsinfo.offset[2] = HOFFSET(CmpField, c);
+
+ /* Initialize the data type IDs */
+ /* ---------------------------- */
+ dtsinfo.datatype[0] = H5T_NATIVE_INT;
+ dtsinfo.datatype[1] = H5T_NATIVE_FLOAT;
+ dtsinfo.datatype[2] = H5T_NATIVE_DOUBLE;
+
+
+ /* Initialize the names of data members */
+ /* ------------------------------------ */
+ for (i = 0; i < dtsinfo.nsubfields; i++)
+ dtsinfo.name[i] = (char *)calloc(20, sizeof(char));
+
+ strcpy(dtsinfo.name[0], "One");
+ strcpy(dtsinfo.name[1], "Two");
+ strcpy(dtsinfo.name[2], "Three");
+
+
+ /* Create file */
+ /* ----------- */
+ fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ CHECK(fid, FAIL, "H5Fcreate");
+
+ /* Create data space */
+ /* ----------------- */
+ space = H5Screate_simple(RANK, dim, NULL);
+ CHECK(space, FAIL, "H5Screate_simple");
+
+ /* Create the memory data type */
+ /* --------------------------- */
+ type = H5Tcreate(H5T_COMPOUND, sizeof(CmpField));
+ CHECK(type, FAIL, "H5Tcreate");
+
+
+ /* Add members to the compound data type */
+ /* -------------------------------------- */
+ for ( i = 0; i < dtsinfo.nsubfields; i++)
+ {
+ array_dt = H5Tarray_create (dtsinfo.datatype[i], ndims[i], dima, NULL);
+ CHECK(array_dt, FAIL, "H5Tarray_create");
+
+ status = H5Tinsert (type, dtsinfo.name[i], dtsinfo.offset[i], array_dt);
+ CHECK(status, FAIL, "H5Tinsert");
+
+ status = H5Tclose(array_dt);
+ CHECK(status, FAIL, "H5Tclose");
+ }
+
+ /* Create the dataset */
+ /* ------------------ */
+ dataset = H5Dcreate(fid, FIELDNAME, type, space, H5P_DEFAULT);
+ CHECK(dataset, FAIL, "H5Dcreate");
+
+ /* Write data to the dataset */
+ /* ------------------------- */
+ status = H5Dwrite(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cf);
+ CHECK(status, FAIL, "H5Dwrite");
+
+ status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cfr);
+ CHECK(status, FAIL, "H5Dread");
+
+ /* Verify correct data */
+ /* ------------------- */
+ for (i = 0; i < LENGTH; i++) {
+ for (j = 0; j < ALEN; j++) {
+ if(cf[i].a[j]!=cfr[i].a[j]) {
+ num_errs++;
+ printf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n",(int)i,(int)j,(int)cf[i].a[j],(int)i,(int)j,(int)cfr[i].a[j]);
+ continue;
+ }
+ if(cf[i].b[j]!=cfr[i].b[j]) {
+ num_errs++;
+ printf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].b[j],(int)i,(int)j,(float)cfr[i].b[j]);
+ continue;
+ }
+ if(cf[i].c[j]!=cfr[i].c[j]) {
+ num_errs++;
+ printf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].c[j],(int)i,(int)j,(float)cfr[i].c[j]);
+ continue;
+ }
+ }
+ }
+
+
+ /* Release memory resources */
+ /* ------------------------ */
+ for (i = 0; i < dtsinfo.nsubfields; i++)
+ free(dtsinfo.name[i]);
+
+
+ /* Release IDs */
+ /* ----------- */
+ status = H5Tclose(type);
+ CHECK(status, FAIL, "H5Tclose");
+
+ status = H5Sclose(space);
+ CHECK(status, FAIL, "H5Sclose");
+
+ status = H5Dclose(dataset);
+ CHECK(status, FAIL, "H5Dclose");
+
+ status = H5Fclose(fid);
+ CHECK(status, FAIL, "H5Fclose");
+
+
+/******************************/
+/* Reopen the file and update */
+/******************************/
+
+ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ CHECK(fid, FAIL, "H5Fopen");
+
+ dataset = H5Dopen(fid, FIELDNAME );
+ CHECK(dataset, FAIL, "H5Dopen");
+
+ type = H5Tcreate(H5T_COMPOUND, sizeof(fld_t));
+ CHECK(type, FAIL, "H5Tcreate");
+
+ array_dt = H5Tarray_create (H5T_NATIVE_FLOAT, 1, dima, NULL);
+ CHECK(array_dt, FAIL, "H5Tarray_create");
+
+ status = H5Tinsert (type, "Two", HOFFSET(fld_t, b), array_dt);
+ CHECK(status, FAIL, "H5Tinsert");
+
+ /* Initialize the data to overwrite */
+ /* -------------------------------- */
+ for (i=0; i< LENGTH; i++)
+ for (j = 0; j < ALEN; j++)
+ cf[i].b[j]=fld[i].b[j] = 1.313;
+
+ status = H5Dwrite (dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, fld);
+ CHECK(status, FAIL, "H5Dwrite");
+
+ status = H5Dread (dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, fldr);
+ CHECK(status, FAIL, "H5Dread");
+
+ for (i=0; i< LENGTH; i++)
+ for (j = 0; j < ALEN; j++)
+ if(fld[i].b[j]!=fldr[i].b[j]) {
+ num_errs++;
+ printf("Field data doesn't match, fld[%d].b[%d]=%f, fldr[%d].b[%d]=%f\n",(int)i,(int)j,(float)fld[i].b[j],(int)i,(int)j,(float)fldr[i].b[j]);
+ continue;
+ }
+
+ status = H5Dclose(dataset);
+ CHECK(status, FAIL, "H5Dclose");
+
+ status = H5Tclose (type);
+ CHECK(status, FAIL, "H5Tclose");
+
+ status = H5Tclose (array_dt);
+ CHECK(status, FAIL, "H5Tclose");
+
+ status = H5Fclose(fid);
+ CHECK(status, FAIL, "H5Fclose");
+
+/****************************************************/
+/* Reopen the file and print out all the data again */
+/****************************************************/
+
+ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT);
+ CHECK(fid, FAIL, "H5Fopen");
+
+ dataset = H5Dopen(fid, FIELDNAME );
+ CHECK(dataset, FAIL, "H5Dopen");
+
+ type = H5Dget_type(dataset);
+ CHECK(type, FAIL, "H5Dget_type");
+
+
+ /* Reset the data to read in */
+ /* ------------------------- */
+ memset(cfr, 0, sizeof(CmpField)*LENGTH);
+
+ status = H5Dread(dataset, type, H5S_ALL, H5S_ALL, H5P_DEFAULT, cfr);
+ CHECK(status, FAIL, "H5Dread");
+
+ /* Verify correct data */
+ /* ------------------- */
+ for (i = 0; i < LENGTH; i++) {
+ for (j = 0; j < ALEN; j++) {
+ if(cf[i].a[j]!=cfr[i].a[j]) {
+ num_errs++;
+ printf("Field a data doesn't match, cf[%d].a[%d]=%d, cfr[%d].a[%d]=%d\n",(int)i,(int)j,(int)cf[i].a[j],(int)i,(int)j,(int)cfr[i].a[j]);
+ continue;
+ }
+ if(cf[i].b[j]!=cfr[i].b[j]) {
+ num_errs++;
+ printf("Field b data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].b[j],(int)i,(int)j,(float)cfr[i].b[j]);
+ continue;
+ }
+ if(cf[i].c[j]!=cfr[i].c[j]) {
+ num_errs++;
+ printf("Field c data doesn't match, cf[%d].b[%d]=%f, cfr[%d].b[%d]=%f\n",(int)i,(int)j,(float)cf[i].c[j],(int)i,(int)j,(float)cfr[i].c[j]);
+ continue;
+ }
+ }
+ }
+
+ status = H5Dclose(dataset);
+ CHECK(status, FAIL, "H5Dclose");
+
+ status = H5Tclose (type);
+ CHECK(status, FAIL, "H5Tclose");
+
+ status = H5Fclose(fid);
+ CHECK(status, FAIL, "H5Fclose");
+} /* end test_array_bkg() */
+
/****************************************************************
**
** test_compat(): Test array datatype compatibility code.
@@ -1874,6 +2165,8 @@ test_array(void)
test_array_vlen_atomic(); /* Test 1-D array of atomic VL datatypes */
test_array_vlen_array(); /* Test 1-D array of 1-D array VL datatypes */
+ test_array_bkg(); /* Read compound datatype with array fields and background fields read */
+
/* This test uses a custom file */
test_compat(); /* Test compatibility changes for compound datatype fields */
} /* test_array() */