diff options
-rw-r--r-- | test/dtypes.c | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/test/dtypes.c b/test/dtypes.c index 914b432..d7a0ef1 100644 --- a/test/dtypes.c +++ b/test/dtypes.c @@ -29,6 +29,9 @@ /* Number of elements in each test */ #define NTESTELEM 100000 +/* For test_compound_10 */ +#define ARRAY_DIM 4 + /* Define if you want to see a count of overflows */ #undef SHOW_OVERFLOWS @@ -61,6 +64,7 @@ const char *FILENAME[] = { "dtypes2", "dtypes3", "dtypes4", + "dtypes5", NULL }; @@ -1666,6 +1670,196 @@ test_compound_9(void) /*------------------------------------------------------------------------- + * Function: test_compound_10 + * + * Purpose: Tests array data type of compound type with VL string as field. + * + * Return: Success: 0 + * + * Failure: number of errors + * + * Programmer: Raymond Lu + * Tuesday, June 15, 2004 + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +static int +test_compound_10(void) +{ + typedef struct cmpd_struct { + int i1; + char* str; + hvl_t text; + int i2; + } cmpd_struct; + + cmpd_struct wdata[ARRAY_DIM]; + cmpd_struct rdata[ARRAY_DIM]; + hid_t file; + hid_t arr_tid, cmpd_tid, cstr_id, vlstr_id, dup_tid; + hid_t space_id; + hid_t dset_id; + hid_t xfer_pid; + hsize_t arr_dim[1] = {ARRAY_DIM}; /* Array dimensions */ + hsize_t dim1[1]; + void *t1, *t2; + char filename[1024]; + int len; + int i; + + TESTING("array data type of compound type with VL string"); + + for(i=0; i<ARRAY_DIM; i++) { + wdata[i].i1 = i*10+i; + wdata[i].str = strdup("C string A"); + wdata[i].str[9] += i; + wdata[i].i2 = i*1000+i*10; + + wdata[i].text.p = (void*)strdup("variable-length text A\0"); + len = wdata[i].text.len = strlen((char*)wdata[i].text.p)+1; + ((char*)(wdata[i].text.p))[len-2] += i; + ((char*)(wdata[i].text.p))[len-1] = '\0'; + } + + /* Create File */ + h5_fixname(FILENAME[4], H5P_DEFAULT, filename, sizeof filename); + if((file=H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) { + H5_FAILED(); AT(); + printf("Can't create file!\n"); + goto error; + } /* end if */ + + /* Create first compound datatype */ + if((cmpd_tid = H5Tcreate( H5T_COMPOUND, sizeof(struct cmpd_struct)))<0) { + H5_FAILED(); AT(); + printf("Can't create datatype!\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid,"i1",HOFFSET(struct cmpd_struct,i1),H5T_NATIVE_INT)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'i1'\n"); + goto error; + } /* end if */ + + cstr_id = H5Tcopy(H5T_C_S1); + if(H5Tset_size(cstr_id,H5T_VARIABLE)<0) { + H5_FAILED(); AT(); + printf("Can't set size for C string\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid,"c_string",HOFFSET(cmpd_struct,str),cstr_id)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'str'\n"); + goto error; + } /* end if */ + + /* Create vl-string data type */ + if((vlstr_id = H5Tvlen_create(H5T_NATIVE_CHAR))<0) { + H5_FAILED(); AT(); + printf("Can't create VL string\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid, "vl_string",HOFFSET(cmpd_struct, text), vlstr_id)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'text'\n"); + goto error; + } /* end if */ + + if(H5Tinsert(cmpd_tid,"i2",HOFFSET(struct cmpd_struct,i2),H5T_NATIVE_INT)<0) { + H5_FAILED(); AT(); + printf("Can't insert field 'i2'\n"); + goto error; + } /* end if */ + + /* Create the array data type for c_string data */ + if((arr_tid = H5Tarray_create(cmpd_tid,1,arr_dim, NULL))<0) { + H5_FAILED(); AT(); + printf("Can't create array type\n"); + goto error; + } /* end if */ + + dim1[0] = 1; + if((space_id=H5Screate_simple(1,dim1,NULL))<0) { + H5_FAILED(); AT(); + printf("Can't create space\n"); + goto error; + } /* end if */ + + if((dset_id = H5Dcreate(file,"Dataset",arr_tid,space_id,H5P_DEFAULT))<0) { + H5_FAILED(); AT(); + printf("Can't create dataset\n"); + goto error; + } /* end if */ + + if(H5Dwrite(dset_id,arr_tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,&wdata)<0) { + H5_FAILED(); AT(); + printf("Can't write data\n"); + goto error; + } /* end if */ + + if(H5Dread(dset_id,arr_tid,H5S_ALL,H5S_ALL,H5P_DEFAULT,&rdata)<0) { + H5_FAILED(); AT(); + printf("Can't read data\n"); + goto error; + } /* end if */ + + for(i=0; i<ARRAY_DIM; i++) { + if(rdata[i].i1!=wdata[i].i1 || rdata[i].i2!=wdata[i].i2 || + strcmp(rdata[i].str, wdata[i].str)) { + H5_FAILED(); AT(); + printf("incorrect read data\n"); + goto error; + } /* end if */ + + if(rdata[i].text.len!=wdata[i].text.len) { + H5_FAILED(); AT(); + printf("incorrect VL length\n"); + goto error; + } /* end if */ + + t1 = rdata[i].text.p; + t2 = wdata[i].text.p; + if(strcmp((char*)t1, (char*)t2)) { + H5_FAILED(); AT(); + printf("incorrect VL read data\n"); + goto error; + } + + free(t1); + free(t2); + free(wdata[i].str); + free(rdata[i].str); + } /* end for */ + + if(H5Dclose(dset_id)<0) + goto error; + if(H5Tclose(cmpd_tid)<0) + goto error; + if(H5Tclose(arr_tid)<0) + goto error; + if(H5Tclose(cstr_id)<0) + goto error; + if(H5Tclose(vlstr_id)<0) + goto error; + if(H5Sclose(space_id)<0) + goto error; + if(H5Fclose(file)<0) + goto error; + + PASSED(); + return 0; + + error: + return 1; +} + + +/*------------------------------------------------------------------------- * Function: test_query * * Purpose: Tests query functions of compound and enumeration types. @@ -6005,6 +6199,7 @@ main(void) nerrors += test_compound_7(); nerrors += test_compound_8(); nerrors += test_compound_9(); + nerrors += test_compound_10(); nerrors += test_conv_int (); nerrors += test_conv_enum_1(); nerrors += test_conv_enum_2(); @@ -6014,6 +6209,7 @@ main(void) /* Does floating point overflow generate a SIGFPE? */ generates_sigfpe(); + /* Test degenerate cases */ nerrors += test_conv_flt_1("noop", H5T_NATIVE_FLOAT, H5T_NATIVE_FLOAT); nerrors += test_conv_flt_1("noop", H5T_NATIVE_DOUBLE, H5T_NATIVE_DOUBLE); |