summaryrefslogtreecommitdiffstats
path: root/c++/test
diff options
context:
space:
mode:
authorMohamad Chaarawi <chaarawi@hdfgroup.org>2013-10-16 18:28:24 (GMT)
committerMohamad Chaarawi <chaarawi@hdfgroup.org>2013-10-16 18:28:24 (GMT)
commit75a5c72ace679984de255dcbfad4eaea2ceb5e43 (patch)
treeed579265369516084642533c5261476515f9d818 /c++/test
parentb780d0d79d9cc198b03952179d283f3aa814f45e (diff)
parentae573ecf56160fb3383b4ca7b8811a2085d2762f (diff)
downloadhdf5-75a5c72ace679984de255dcbfad4eaea2ceb5e43.zip
hdf5-75a5c72ace679984de255dcbfad4eaea2ceb5e43.tar.gz
hdf5-75a5c72ace679984de255dcbfad4eaea2ceb5e43.tar.bz2
[svn-r24303] update from VOL branch that has been updated with trunk.
resolve conflicts, etc..
Diffstat (limited to 'c++/test')
-rw-r--r--c++/test/Makefile.in1
-rw-r--r--c++/test/dsets.cpp11
-rw-r--r--c++/test/h5cpputil.cpp24
-rw-r--r--c++/test/h5cpputil.h2
-rw-r--r--c++/test/tfile.cpp55
-rw-r--r--c++/test/th5s.cpp5
-rw-r--r--c++/test/trefer.cpp676
7 files changed, 635 insertions, 139 deletions
diff --git a/c++/test/Makefile.in b/c++/test/Makefile.in
index 0084bfe..17264b9 100644
--- a/c++/test/Makefile.in
+++ b/c++/test/Makefile.in
@@ -259,6 +259,7 @@ LIPO = @LIPO@
LL_PATH = @LL_PATH@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
+LT_ADD_LIBHDF5_DEPENDENCY = @LT_ADD_LIBHDF5_DEPENDENCY@
LT_STATIC_EXEC = @LT_STATIC_EXEC@
MAINT = @MAINT@
MAKEINFO = @MAKEINFO@
diff --git a/c++/test/dsets.cpp b/c++/test/dsets.cpp
index 643762b..811d8c7 100644
--- a/c++/test/dsets.cpp
+++ b/c++/test/dsets.cpp
@@ -283,13 +283,13 @@ test_simple_io( H5File& file)
*-------------------------------------------------------------------------
*/
static herr_t
-test_datasize()
+test_datasize(FileAccPropList &fapl)
{
SUBTEST("DataSet::getInMemDataSize()");
try
{
// Open FILE1.
- H5File file(FILE1, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, FileAccPropList::DEFAULT);
+ H5File file(FILE1, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl);
// Open dataset DSET_SIMPLE_IO_NAME.
DataSet dset = file.openDataSet (DSET_SIMPLE_IO_NAME);
@@ -1058,7 +1058,7 @@ void test_dset()
// Cause the library to emit initial messages
Group grp = file.createGroup( "emit diagnostics", 0);
- grp.setComment( ".", "Causes diagnostic messages to be emitted");
+ grp.setComment("Causes diagnostic messages to be emitted");
nerrors += test_create(file)<0 ?1:0;
nerrors += test_simple_io(file)<0 ?1:0;
@@ -1067,9 +1067,12 @@ void test_dset()
nerrors += test_multiopen (file)<0 ?1:0;
nerrors += test_types(file)<0 ?1:0;
+ // Close group "emit diagnostics".
+ grp.close();
+
// Close the file before testing data size.
file.close();
- nerrors += test_datasize() <0 ? 1:0;
+ nerrors += test_datasize(fapl) <0 ? 1:0;
}
catch (Exception E)
{
diff --git a/c++/test/h5cpputil.cpp b/c++/test/h5cpputil.cpp
index c6a7a2a..cd85b6e 100644
--- a/c++/test/h5cpputil.cpp
+++ b/c++/test/h5cpputil.cpp
@@ -107,6 +107,30 @@ void issue_fail_msg(const char* where, int line, const char* file_name,
}
/*-------------------------------------------------------------------------
+ * Function: issue_fail_msg
+ *
+ * Purpose: Displays that a function has failed with its location.
+ *
+ * Return: None
+ *
+ * Programmer: Binh-Minh Ribler (copied and modified macro CHECK from C)
+ * Monday, December 20, 2004
+ *
+ *-------------------------------------------------------------------------
+ */
+void issue_fail_msg(const char* where, int line, const char* file_name,
+ const char* func_name, const char* message)
+{
+ //if (GetTestVerbosity()>=VERBO_HI)
+ {
+ cerr << endl;
+ cerr << ">>> FAILED in " << where << ": " << func_name << endl <<
+ " at line " << line << " in " << file_name << endl <<
+ " C library detail: " << message << endl << endl;
+ }
+}
+
+/*-------------------------------------------------------------------------
* Function: check_values
*
* Purpose: Checks a read value against the written value. If they are
diff --git a/c++/test/h5cpputil.h b/c++/test/h5cpputil.h
index 02f3d0d..e6aba79 100644
--- a/c++/test/h5cpputil.h
+++ b/c++/test/h5cpputil.h
@@ -42,6 +42,8 @@ int check_values (hsize_t i, hsize_t j, int apoint, int acheck);
int test_report (int, const H5std_string&);
void issue_fail_msg(const char* where, int line, const char* file_name,
const char* message="");
+void issue_fail_msg(const char* where, int line, const char* file_name,
+ const char* func_name, const char* message);
class InvalidActionException : public Exception {
public:
diff --git a/c++/test/tfile.cpp b/c++/test/tfile.cpp
index 65b8e57..965065a 100644
--- a/c++/test/tfile.cpp
+++ b/c++/test/tfile.cpp
@@ -108,16 +108,10 @@ static void test_file_create()
// Create file FILE1
file1 = new H5File (FILE1, H5F_ACC_EXCL);
- // try to create the same file with H5F_ACC_TRUNC. This should fail
- // because file1 is the same file and is currently open.
-
-/* These three are failing with new/PGI compiler, HDFFV-8067
- The line "H5File file2 (FILE1, H5F_ACC_TRUNC); // should throw E"
- Results in this message:
- "terminate called without an active exception
- Command terminated by signal 6"
- Commenting it out until it's fixed LK 20120626.
-*/
+ // Try to create the same file with H5F_ACC_TRUNC. This should fail
+ // because file1 is the same file and is currently open. Skip it on
+ // OpenVMS because it creates another version of the file.
+#ifndef H5_HAVE_FILE_VERSIONS
try {
H5File file2 (FILE1, H5F_ACC_TRUNC); // should throw E
@@ -126,6 +120,7 @@ static void test_file_create()
}
catch( FileIException E ) // catch truncating existing file
{} // do nothing, FAIL expected
+#endif // H5_HAVE_FILE_VERSIONS
// Close file1
delete file1;
@@ -141,11 +136,14 @@ static void test_file_create()
}
catch( FileIException E ) // catching creating existing file
{} // do nothing, FAIL expected
+
// Test create with H5F_ACC_TRUNC. This will truncate the existing file.
file1 = new H5File (FILE1, H5F_ACC_TRUNC);
- // Try to truncate first file again. This should fail because file1
- // is the same file and is currently open.
+ // Try to create first file again. This should fail because file1
+ // is the same file and is currently open. Skip it on OpenVMS because
+ // it creates another version of the file.
+#ifndef H5_HAVE_FILE_VERSIONS
try {
H5File file2 (FILE1, H5F_ACC_TRUNC); // should throw E
@@ -156,7 +154,7 @@ static void test_file_create()
{} // do nothing, FAIL expected
// Try with H5F_ACC_EXCL. This should fail too because the file already
- // exists.
+ // exists. Skip it on OpenVMS because it creates another version of the file.
try {
H5File file3 (FILE1, H5F_ACC_EXCL); // should throw E
@@ -165,6 +163,7 @@ static void test_file_create()
}
catch( FileIException E ) // catching H5F_ACC_EXCL on existing file
{} // do nothing, FAIL expected
+#endif /*H5_HAVE_FILE_VERSIONS*/
// Get the file-creation template
FileCreatPropList tmpl1 = file1->getCreatePlist();
@@ -387,7 +386,7 @@ static void test_file_size()
// Check if it's reasonable. It's 0 now.
if (free_space < 0 || free_space > 4*KB)
- issue_fail_msg("test_file_size()", __LINE__, __FILE__, "getFreeSpace returned unreasonable value");
+ issue_fail_msg("test_file_size()", __LINE__, __FILE__, "getFreeSpace returned unreasonable value");
PASSED();
} // end of try block
@@ -433,54 +432,54 @@ typedef struct s1_t {
static void test_file_name()
{
- // Output message about test being performed
+ // Output message about test being performed.
SUBTEST("File Name");
H5std_string file_name;
try {
- // Create a file using default properties
+ // Create a file using default properties.
H5File file4(FILE4, H5F_ACC_TRUNC);
- // Get file name from the file instance
+ // Get file name from the file instance.
file_name = file4.getFileName();
verify_val(file_name, FILE4, "H5File::getFileName", __LINE__, __FILE__);
- // Create a group in the root group
+ // Create a group in the root group.
Group group(file4.createGroup(GROUPNAME, 0));
- // Get and verify file name via a group
+ // Get and verify file name via a group.
file_name = group.getFileName();
verify_val(file_name, FILE4, "Group::getFileName", __LINE__, __FILE__);
- // Create the data space
+ // Create the data space.
hsize_t dims[RANK] = {NX, NY};
DataSpace space(RANK, dims);
- // Create a new dataset
+ // Create a new dataset.
DataSet dataset(file4.createDataSet (DSETNAME, PredType::NATIVE_INT, space));
- // Get and verify file name via a dataset
+ // Get and verify file name via a dataset.
file_name = dataset.getFileName();
verify_val(file_name, FILE4, "DataSet::getFileName", __LINE__, __FILE__);
- // Create an attribute for the dataset
+ // Create an attribute for the dataset.
Attribute attr(dataset.createAttribute(DATTRNAME, PredType::NATIVE_INT, space));
- // Get and verify file name
+ // Get and verify file name via an attribute.
file_name = attr.getFileName();
verify_val(file_name, FILE4, "Attribute::getFileName", __LINE__, __FILE__);
- // Create a compound datatype
+ // Create a compound datatype.
CompType comp_type (sizeof(s1_t));
- // Insert fields
+ // Insert fields.
comp_type.insertMember("a", HOFFSET(s1_t, a), PredType::NATIVE_INT);
comp_type.insertMember("b", HOFFSET(s1_t, b), PredType::NATIVE_FLOAT);
- // Save it on file
+ // Save it on file.
comp_type.commit(file4, DTYPENAME);
- // Get and verify file name
+ // Get and verify file name via a committed datatype.
comp_type.getFileName();
verify_val(file_name, FILE4, "CompType::getFileName", __LINE__, __FILE__);
PASSED();
diff --git a/c++/test/th5s.cpp b/c++/test/th5s.cpp
index 7947a9b..cfdeb1f 100644
--- a/c++/test/th5s.cpp
+++ b/c++/test/th5s.cpp
@@ -188,7 +188,10 @@ static void test_h5s_basic()
* If this test fails and the H5S_MAX_RANK variable has changed, follow
* the instructions in space_overflow.c for regenating the th5s.h5 file.
*/
- const char *testfile = H5_get_srcdir_filename(TESTFILE.c_str());
+ char *tmp_str = new char[TESTFILE.length()+1];
+ strcpy(tmp_str, TESTFILE.c_str());
+ const char *testfile = H5_get_srcdir_filename(tmp_str);
+ delete []tmp_str;
// Create file
H5File fid1(testfile, H5F_ACC_RDONLY);
diff --git a/c++/test/trefer.cpp b/c++/test/trefer.cpp
index ce18e58..36c2ee4 100644
--- a/c++/test/trefer.cpp
+++ b/c++/test/trefer.cpp
@@ -27,13 +27,6 @@
#endif
#include <string>
-#ifndef H5_NO_NAMESPACE
-#ifndef H5_NO_STD
- using std::cerr;
- using std::endl;
-#endif // H5_NO_STD
-#endif
-
#include "H5Cpp.h" // C++ API header file
#ifndef H5_NO_NAMESPACE
@@ -44,27 +37,25 @@
const H5std_string FILE1("trefer1.h5");
const H5std_string FILE2("trefer2.h5");
-const H5std_string FILE3("trefer3.h5");
-const H5std_string DSET_DEFAULT_NAME("default");
// Dataset 1
const H5std_string DSET1_NAME("Dataset1");
-const int DSET1_LEN = 8;
+const H5std_string DSET2_NAME("Dataset2");
const H5std_string MEMBER1( "a_name" );
const H5std_string MEMBER2( "b_name" );
const H5std_string MEMBER3( "c_name" );
// 1-D dataset with fixed dimensions
-const H5std_string SPACE1_NAME("Space1");
const int SPACE1_RANK = 1;
const int SPACE1_DIM1 = 4;
-// 2-D dataset with fixed dimensions
-const H5std_string SPACE2_NAME("Space2");
+/* Larger 1-D dataset with fixed dimensions */
+const int SPACE3_RANK = 1;
+const int SPACE3_DIM1 = 100;
-// Larger 1-D dataset with fixed dimensions
-const H5std_string SPACE3_NAME("Space3");
+/* Element selection information */
+const int POINT1_NPOINTS = 10;
// Compound datatype
typedef struct s1_t {
@@ -75,8 +66,123 @@ typedef struct s1_t {
/****************************************************************
**
-** test_reference_obj(): Test basic object reference functionality.
-** Tests references to various kinds of objects
+** test_reference_params(): Test basic H5R (reference) parameters
+** for correct processing
+**
+****************************************************************/
+static void
+test_reference_params(void)
+{
+ const char *write_comment = "Foo!"; /* Comments for group */
+
+ // Output message about test being performed
+ SUBTEST("Object Reference Parameters");
+
+ H5File* file1 = NULL;
+ try {
+ hobj_ref_t *wbuf, // buffer to write to disk
+ *rbuf, // buffer read from disk
+ *tbuf; // temp. buffer read from disk
+
+ // Allocate write & read buffers
+ int temp_size = MAX(sizeof(unsigned),sizeof(hobj_ref_t));
+ wbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+ rbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+ tbuf=(hobj_ref_t*)HDmalloc(temp_size*SPACE1_DIM1);
+
+ // Create file FILE1
+ file1 = new H5File (FILE1, H5F_ACC_TRUNC);
+
+ // Create dataspace for datasets
+ hsize_t dims1[] = {SPACE1_DIM1};
+ DataSpace sid1(SPACE1_RANK, dims1);
+
+ // Create a group
+ Group group = file1->createGroup("Group1");
+
+ // Set group's comment
+ group.setComment(".", write_comment);
+
+ // Create a dataset (inside /Group1)
+ DataSet dataset = group.createDataSet(DSET1_NAME, PredType::NATIVE_UINT, sid1);
+
+ unsigned *tu32; // Temporary pointer to uint32 data
+ int i;
+ for (tu32=(unsigned *)wbuf, i=0; i<SPACE1_DIM1; i++)
+ *tu32++=i*3; // from C test
+
+ // Write selection to disk
+ dataset.write(wbuf, PredType::NATIVE_UINT);
+
+ // Close Dataset
+ dataset.close();
+
+ // Create another dataset (inside /Group1)
+ dataset = group.createDataSet("Dataset2", PredType::NATIVE_UCHAR, sid1);
+
+ // Close Dataset
+ dataset.close();
+
+ // Create a datatype to refer to
+ CompType dtype1(sizeof(s1_t));
+
+ // Insert fields
+ dtype1.insertMember(MEMBER1, HOFFSET(s1_t, a), PredType::NATIVE_INT);
+ dtype1.insertMember(MEMBER2, HOFFSET(s1_t, b), PredType::NATIVE_INT);
+ dtype1.insertMember(MEMBER3, HOFFSET(s1_t, c), PredType::NATIVE_FLOAT);
+
+ // Save datatype for later
+ dtype1.commit(group, "Datatype1");
+
+ // Close datatype and group
+ dtype1.close();
+ group.close();
+
+ // Create a dataset
+ dataset = file1->createDataSet("Dataset3", PredType::STD_REF_OBJ, sid1);
+
+ /* Test parameters to H5Location::reference */
+ try {
+ file1->reference(NULL, "/Group1/Dataset1");
+ } catch (ReferenceException E) {} // We expect this to fail
+ try {
+ file1->reference(&wbuf[0], NULL);
+ } catch (ReferenceException E) {} // We expect this to fail
+ try {
+ file1->reference(&wbuf[0], "");
+ } catch (ReferenceException E) {} // We expect this to fail
+ try {
+ file1->reference(&wbuf[0], "/Group1/Dataset1", H5R_MAXTYPE);
+ } catch (ReferenceException E) {} // We expect this to fail
+ try {
+ file1->reference(&wbuf[0], "/Group1/Dataset1", H5R_DATASET_REGION);
+ } catch (ReferenceException E) {} // We expect this to fail
+
+ // Close resources
+ dataset.close();
+ file1->close();
+ // Let sid1 go out of scope
+
+ // Free memory buffers
+ HDfree(wbuf);
+ HDfree(rbuf);
+ HDfree(tbuf);
+
+ PASSED();
+ } // end try
+ catch (Exception E) {
+ issue_fail_msg("test_reference_param()",__LINE__,__FILE__,
+ E.getCFuncName(), E.getCDetailMsg());
+ }
+
+ if(file1)
+ delete file1;
+} /* test_reference_param() */
+
+/****************************************************************
+**
+** test_reference_obj(): Test basic object reference functions
+** to various kinds of objects
**
****************************************************************/
static void test_reference_obj(void)
@@ -106,8 +212,11 @@ static void test_reference_obj(void)
hsize_t dims1[] = {SPACE1_DIM1};
DataSpace sid1(SPACE1_RANK, dims1);
+ // Create dataset access property list
+ PropList dapl(H5P_DATASET_ACCESS);
+
// Create a group
- Group group = file1->createGroup("Group1", (size_t)-1);
+ Group group = file1->createGroup("Group1");
// Set group's comment
group.setComment(".", write_comment);
@@ -116,7 +225,7 @@ static void test_reference_obj(void)
DataSet dataset = group.createDataSet(DSET1_NAME, PredType::NATIVE_UINT, sid1);
unsigned *tu32; // Temporary pointer to uint32 data
- for (tu32=(unsigned *)wbuf, i=0; i<SPACE1_DIM1; i++)
+ for (tu32 = (unsigned *)wbuf, i = 0; i < SPACE1_DIM1; i++)
*tu32++=i*3; // from C test
// Write selection to disk
@@ -152,22 +261,22 @@ static void test_reference_obj(void)
// Create reference to dataset and test getRefObjType
file1->reference(&wbuf[0], "/Group1/Dataset1");
H5O_type_t refobj_type = dataset.getRefObjType(&wbuf[0], H5R_OBJECT);
- verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType", __LINE__, __FILE__);
+ verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
// Create reference to dataset and test getRefObjType
file1->reference(&wbuf[1], "/Group1/Dataset2");
refobj_type = dataset.getRefObjType(&wbuf[1], H5R_OBJECT);
- verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType", __LINE__, __FILE__);
+ verify_val(refobj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
// Create reference to group
file1->reference(&wbuf[2], "/Group1");
refobj_type = dataset.getRefObjType(&wbuf[2], H5R_OBJECT);
- verify_val(refobj_type, H5O_TYPE_GROUP, "DataSet::getRefObjType", __LINE__, __FILE__);
+ verify_val(refobj_type, H5O_TYPE_GROUP, "DataSet::getRefObjType",__LINE__,__FILE__);
// Create reference to named datatype
file1->reference(&wbuf[3], "/Group1/Datatype1");
refobj_type = dataset.getRefObjType(&wbuf[3], H5R_OBJECT);
- verify_val(refobj_type, H5O_TYPE_NAMED_DATATYPE, "DataSet::getRefObjType", __LINE__, __FILE__);
+ verify_val(refobj_type, H5O_TYPE_NAMED_DATATYPE, "DataSet::getRefObjType",__LINE__,__FILE__);
// Write selection to disk
dataset.write(wbuf, PredType::STD_REF_OBJ);
@@ -188,18 +297,18 @@ static void test_reference_obj(void)
// Dereference dataset object by ctor, from the location where
// 'dataset' is located
- DataSet dset2(dataset, &rbuf[0]);
+ DataSet dset2(dataset, &rbuf[0], H5R_OBJECT, dapl);
// Check information in the referenced dataset
sid1 = dset2.getSpace();
hssize_t n_elements = sid1.getSimpleExtentNpoints();
- verify_val((long)n_elements, 4, "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+ verify_val((long)n_elements, 4, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
// Read from disk
dset2.read(tbuf, PredType::NATIVE_UINT);
- for(tu32=(unsigned *)tbuf,i=0; i<SPACE1_DIM1; i++,tu32++)
- verify_val(*tu32, (uint32_t)(i*3), "DataSpace::getSimpleExtentNpoints", __LINE__, __FILE__);
+ for(tu32 = (unsigned *)tbuf, i = 0; i < SPACE1_DIM1; i++, tu32++)
+ verify_val(*tu32, (uint32_t)(i*3), "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
// Close dereferenced dataset
dset2.close();
@@ -209,7 +318,7 @@ static void test_reference_obj(void)
// Get group's comment
H5std_string read_comment1 = group.getComment(".", 10);
- verify_val(read_comment1, write_comment, "Group::getComment", __LINE__, __FILE__);
+ verify_val(read_comment1.c_str(), write_comment, "Group::getComment",__LINE__,__FILE__);
// Test that getComment handles failures gracefully
try {
@@ -217,96 +326,29 @@ static void test_reference_obj(void)
}
catch (Exception E) {} // We expect this to fail
- // Test reading the name of an item in the group
-
- // Test getObjnameByIdx(idx)
- H5std_string name;
- name = group.getObjnameByIdx(0);
- verify_val(name, DSET1_NAME, "Group::getObjnameByIdx", __LINE__, __FILE__);
- // Test getObjnameByIdx(hsize_t idx, H5std_string& name, size_t size)
- name.clear();
- ssize_t name_size = group.getObjnameByIdx(0, name, 5);
- verify_val(name, "Data", "Group::getObjnameByIdx(index,(std::string)buf,buf_len)", __LINE__, __FILE__);
- verify_val(name_size, DSET1_LEN, "Group::getObjnameByIdx(index,(std::string)buf,buf_len)", __LINE__, __FILE__);
-
- name.clear();
- name_size = group.getObjnameByIdx(0, name, name_size+1);
- verify_val(name, DSET1_NAME, "Group::getObjnameByIdx(index,(std::string)buf,buf_len)", __LINE__, __FILE__);
- verify_val(name_size, DSET1_LEN, "Group::getObjnameByIdx(index,(std::string)buf,buf_len)", __LINE__, __FILE__);
-
- // Test getObjnameByIdx(hsize_t idx, char* name, size_t size)
- group.getObjnameByIdx(0, name, name_size+1);
- verify_val(name, DSET1_NAME, "Group::getObjnameByIdx(index,(char*)buf,buf_len)", __LINE__, __FILE__);
- verify_val(name_size, DSET1_LEN, "Group::getObjnameByIdx(index,(char*)buf,buf_len)", __LINE__, __FILE__);
-
-#ifndef H5_NO_DEPRECATED_SYMBOLS
- // Test getting the type of objects
-
- // Test getObjTypeByIdx(hsize_t idx)
- H5G_obj_t obj_type = group.getObjTypeByIdx(0);
- verify_val(obj_type, H5G_DATASET, "Group::getObjTypeByIdx(index)", __LINE__, __FILE__);
-
- // Test getObjTypeByIdx(hsize_t idx, char* type_name)
- obj_type = H5G_UNKNOWN;
- char type_name_C[256];
- obj_type = group.getObjTypeByIdx(0, type_name_C);
- verify_val(obj_type, H5G_DATASET, "Group::getObjTypeByIdx(index, (char*)name)", __LINE__, __FILE__);
- verify_val((const char*)type_name_C, (const char*)"dataset", "Group::getObjTypeByIdx(index, (char*)name)", __LINE__, __FILE__);
-
- // Test getObjTypeByIdx(hsize_t idx, H5std_string& type_name)
- obj_type = H5G_UNKNOWN;
- H5std_string type_name;
- obj_type = group.getObjTypeByIdx(0, type_name);
- verify_val(obj_type, H5G_DATASET, "Group::getObjTypeByIdx(index, (char*)name)", __LINE__, __FILE__);
- verify_val(type_name, "dataset", "Group::getObjTypeByIdx(index, (char*)name)", __LINE__, __FILE__);
-
-#endif // ifndef H5_NO_DEPRECATED_SYMBOLS
-
// Close group
group.close();
- // Dereference group object using file to specify location
- group.dereference(*file1, &rbuf[2]);
- H5std_string read_comment2 = group.getComment(".", 10);
- verify_val(read_comment2, write_comment, "Group::getComment", __LINE__, __FILE__);
- group.close();
-
- // Dereference group object by ctor and using dataset to specify
- // location
- Group new_group(dataset, &rbuf[2]);
- H5std_string read_comment3 = new_group.getComment(".", 10);
- verify_val(read_comment3, write_comment, "Group::getComment", __LINE__, __FILE__);
- new_group.close();
-
- // Dereference datatype object from the location where 'dataset'
- // is located
+ /*
+ * Verify correct referenced datatype
+ */
+ // Open datatype object
dtype1.dereference(dataset, &rbuf[3]);
// Verify correct datatype
- H5T_class_t tclass = dtype1.getClass();
- verify_val(tclass, H5T_COMPOUND, "DataType::getClass", __LINE__, __FILE__);
+ H5T_class_t tclass;
+ tclass = dtype1.getClass();
+ verify_val(tclass, H5T_COMPOUND, "DataType::getClass",__LINE__,__FILE__);
int n_members = dtype1.getNmembers();
- verify_val(n_members, 3, "DataType::getNmembers", __LINE__, __FILE__);
+ verify_val(n_members, 3, "CompType::getNmembers",__LINE__,__FILE__);
- // Close datatype
+ // Close all objects and file
dtype1.close();
-
- // Dereference datatype object by ctor, using file to specify location
- DataType dtype2(*file1, &rbuf[3]);
-
- // Verify correct datatype
- H5T_class_t tclass2 = dtype2.getClass();
- verify_val(tclass2, H5T_COMPOUND, "DataType::getClass", __LINE__, __FILE__);
-
- // Close datatype
- dtype2.close();
-
- // Close dataset and file
dataset.close();
file1->close();
- // Free memory buffers
+ // Free allocated buffers
HDfree(wbuf);
HDfree(rbuf);
HDfree(tbuf);
@@ -314,13 +356,431 @@ static void test_reference_obj(void)
PASSED();
} // end try
catch (Exception E) {
- issue_fail_msg("test_reference_obj()", __LINE__, __FILE__, E.getCDetailMsg());
+ issue_fail_msg("test_reference_obj()",__LINE__,__FILE__,
+ E.getCFuncName(), E.getCDetailMsg());
}
if(file1)
delete file1;
} // test_reference_obj()
+
+/****************************************************************
+**
+** test_reference_group(): Test object reference functionality
+** Tests for correct behavior of various routines on
+** dereferenced group
+**
+****************************************************************/
+#define GROUPNAME "/group"
+#define GROUPNAME2 "group2"
+#define GROUPNAME3 "group3"
+#define DSETNAME "/dset"
+#define DSETNAME2 "dset2"
+#define NAME_SIZE 16
+
+static void
+test_reference_group(void)
+{
+ hobj_ref_t wref; /* Reference to write */
+ hobj_ref_t rref; /* Reference to read */
+ const H5std_string write_comment="Foo!"; // Comments for group
+
+ // Output message about test being performed
+ SUBTEST("Object Reference to Group");
+
+ H5File* file1 = NULL;
+ try {
+ /*
+ * Create file with a group and a dataset containing an object
+ * reference to the group
+ */
+
+ // Create file FILE1
+ file1 = new H5File (FILE1, H5F_ACC_TRUNC);
+
+ // Create scalar dataspace
+ DataSpace sid1;
+
+ // Create a group
+ Group group = file1->createGroup(GROUPNAME);
+
+ /* Create nested groups */
+ Group group2 = group.createGroup(GROUPNAME2);
+ group2.close();
+ group2 = group.createGroup(GROUPNAME3);
+ group2.close();
+
+ // Create bottom dataset
+ DataSet dset1 = group.createDataSet(DSETNAME2, PredType::NATIVE_INT, sid1);
+ dset1.close();
+
+ // Close group 1
+ group.close();
+
+ // Create dataset
+ DataSet dset2 = file1->createDataSet(DSETNAME, PredType::STD_REF_OBJ, sid1);
+
+ file1->reference(&wref, GROUPNAME);
+
+ // Write selection to disk
+ dset2.write(&wref, PredType::STD_REF_OBJ);
+
+ // Close resources
+ dset2.close();
+ sid1.close();
+ file1->close();
+
+ /*
+ * Re-open the file and test deferencing group
+ */
+
+ // Re-open file
+ file1->openFile(FILE1, H5F_ACC_RDWR);
+
+ // Re-open dataset
+ dset1 = file1->openDataSet(DSETNAME);
+
+ // Read in the reference
+ dset1.read(&rref, PredType::STD_REF_OBJ);
+
+ // Dereference to get the group
+ Group refgroup(dset1, &rref);
+
+ // Dereference group object the other way
+ group.dereference(dset1, &rref);
+
+ /*
+ * Various queries on the group opened
+ */
+
+ // Check number of objects in the group dereferenced by constructor
+ hsize_t nobjs = refgroup.getNumObjs();
+ verify_val(nobjs, 3, "H5Group::getNumObjs",__LINE__,__FILE__);
+
+ // Check number of objects in the group dereferenced by ::reference
+ nobjs = group.getNumObjs();
+ verify_val(nobjs, 3, "H5Group::getNumObjs",__LINE__,__FILE__);
+
+ // Check getting file name given the group dereferenced via constructor
+ H5std_string fname = refgroup.getFileName();
+ verify_val(fname, FILE1, "H5Group::getFileName",__LINE__,__FILE__);
+
+ // Check getting file name given the group dereferenced by ::reference
+ fname = group.getFileName();
+ verify_val(fname, FILE1, "H5Group::getFileName",__LINE__,__FILE__);
+
+ // Unlink one of the objects in the dereferenced group, and re-check
+ refgroup.unlink(GROUPNAME2);
+ nobjs = refgroup.getNumObjs();
+ verify_val(nobjs, 2, "H5Group::getNumObjs",__LINE__,__FILE__);
+
+ // Close resources
+ group.close();
+ refgroup.close();
+ dset1.close();
+ file1->close();
+
+ PASSED();
+ } // end try
+ catch (Exception E) {
+ issue_fail_msg("test_reference_group()",__LINE__,__FILE__,
+ E.getCFuncName(), E.getCDetailMsg());
+ }
+
+ if(file1)
+ delete file1;
+} /* test_reference_group() */
+
+/****************************************************************
+**
+** test_reference_region_1D(): Test 1-D reference functionality
+** Tests 1-D references to various kinds of objects
+**
+****************************************************************/
+static void
+test_reference_region_1D(void)
+{
+ hsize_t start[SPACE3_RANK]; /* Starting location of hyperslab */
+ hsize_t stride[SPACE3_RANK]; /* Stride of hyperslab */
+ hsize_t count[SPACE3_RANK]; /* Element count of hyperslab */
+ hsize_t block[SPACE3_RANK]; /* Block size of hyperslab */
+ hsize_t coord1[POINT1_NPOINTS][SPACE3_RANK]; /* Coordinates for point selection */
+ hsize_t * coords; /* Coordinate buffer */
+ hsize_t low[SPACE3_RANK]; /* Selection bounds */
+ hsize_t high[SPACE3_RANK]; /* Selection bounds */
+ int i; /* counting variables */
+
+ // Output message about test being performed
+ SUBTEST("1-D Dataset Region Reference Functions");
+
+ try {
+ hdset_reg_ref_t *wbuf, // buffer to write to disk
+ *rbuf; // buffer read from disk
+ uint8_t *dwbuf, // Buffer for writing numeric data to disk
+ *drbuf; // Buffer for reading numeric data from disk
+
+ // Allocate write & read buffers
+ wbuf = (hdset_reg_ref_t *)HDcalloc(sizeof(hdset_reg_ref_t), (size_t)SPACE1_DIM1);
+ rbuf = (hdset_reg_ref_t *)HDmalloc(sizeof(hdset_reg_ref_t) * SPACE1_DIM1);
+ dwbuf = (uint8_t *)HDmalloc(sizeof(uint8_t) * SPACE3_DIM1);
+ drbuf = (uint8_t *)HDcalloc(sizeof(uint8_t), (size_t)SPACE3_DIM1);
+
+ // Create file FILE1
+ H5File file1(FILE2, H5F_ACC_TRUNC);
+
+ // Create dataspace for datasets
+ hsize_t dims3[] = {SPACE3_DIM1};
+ DataSpace sid3(SPACE3_RANK, dims3);
+
+ // Create dataset access property list
+ PropList dapl(H5P_DATASET_ACCESS);
+
+ // Create a dataset
+ DataSet dset3 = file1.createDataSet(DSET2_NAME, PredType::STD_U8LE, sid3);
+
+ uint8_t *tu8; // Temporary pointer to uint8 data
+ for (tu8 = dwbuf, i = 0; i < SPACE3_DIM1; i++)
+ *tu8++ = i * 3; // from C test
+
+ // Write selection to disk
+ dset3.write(dwbuf, PredType::STD_U8LE);
+
+ // Close Dataset
+ dset3.close();
+
+ // Create dataspace for datasets
+ hsize_t dims1[] = {SPACE1_DIM1};
+ DataSpace sid1(SPACE1_RANK, dims1);
+
+ // Create a dataset
+ DataSet dset1 = file1.createDataSet(DSET1_NAME, PredType::STD_REF_DSETREG, sid1);
+
+ /*
+ * Create references and prepare for testing
+ */
+
+ /* Select 15 2x1 hyperslabs for first reference */
+ start[0] = 2;
+ stride[0] = 5;
+ count[0] = 15;
+ block[0] = 2;
+
+ // Select a hyperslab region to add to the current selected region
+ sid3.selectHyperslab(H5S_SELECT_SET, count, start, stride, block);
+
+ // Get and verify the number of elements in a dataspace selection
+ hssize_t nelms = sid3.getSelectNpoints();
+ verify_val(nelms, 30, "DataSet::getRefObjType",__LINE__,__FILE__);
+
+ // Store first dataset region
+ file1.reference(&wbuf[0], "/Dataset2", sid3);
+
+ // Get and verify object type
+ H5O_type_t obj_type = dset1.getRefObjType(&wbuf[0], H5R_DATASET_REGION);
+ verify_val(obj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
+
+ /* Select sequence of ten points for second reference */
+ coord1[0][0] = 16;
+ coord1[1][0] = 22;
+ coord1[2][0] = 38;
+ coord1[3][0] = 41;
+ coord1[4][0] = 52;
+ coord1[5][0] = 63;
+ coord1[6][0] = 70;
+ coord1[7][0] = 89;
+ coord1[8][0] = 97;
+ coord1[9][0] = 3;
+
+ // Selects array elements to be included in the selection for sid3
+ sid3.selectElements(H5S_SELECT_SET, (size_t)POINT1_NPOINTS, (const hsize_t *)coord1);
+
+ // Get and verify the number of elements in a dataspace selection
+ nelms = sid3.getSelectNpoints();
+ verify_val(nelms, 10, "DataSet::getRefObjType",__LINE__,__FILE__);
+
+ // Store first dataset region
+ file1.reference(&wbuf[1], "/Dataset2", sid3);
+
+ // Write selection to disk
+ dset1.write(wbuf, PredType::STD_REF_DSETREG);
+
+ // Close disk dataspace, dataset, and file
+ sid1.close();
+ dset1.close();
+ sid3.close();
+ file1.close();
+
+ /*
+ * Testing various dereference functions
+ */
+
+ // Re-open the file
+ file1.openFile(FILE2, H5F_ACC_RDWR);
+
+ // Open the dataset
+ dset1 = file1.openDataSet("/Dataset1");
+
+ // Read selection from disk
+ dset1.read(rbuf, PredType::STD_REF_DSETREG);
+
+ { // Test DataSet::dereference
+ dset3.dereference(dset1, &rbuf[0], H5R_DATASET_REGION, dapl);
+
+ // Get and verify object type
+ obj_type = dset1.getRefObjType(&rbuf[0], H5R_DATASET_REGION);
+ verify_val(obj_type, H5O_TYPE_DATASET, "DataSet::getRefObjType",__LINE__,__FILE__);
+
+ // Get dataspace of dset3 the verify number of elements
+ sid1 = dset3.getSpace();
+ nelms = sid1.getSimpleExtentNpoints();
+ verify_val((long)nelms, 100, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+ } // End of test DataSet::dereference
+
+ { // Test DataSet constructor -by dereference
+ // Dereference dataset object by ctor, from the location where
+ // 'dset1' is located
+ DataSet newds(dset1, &rbuf[0], H5R_DATASET_REGION, dapl);
+
+ // Get dataspace of newds then verify number of elements
+ sid1 = newds.getSpace();
+ nelms = sid1.getSimpleExtentNpoints();
+ verify_val((long)nelms, 100, "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+
+ // Close objects for this mini test
+ newds.close();
+ sid1.close();
+ } // End of test DataSet constructor -by dereference
+
+ // Read from disk
+ dset3.read(drbuf, PredType::STD_U8LE);
+
+ for(tu8 = (uint8_t *)drbuf, i = 0; i < SPACE3_DIM1; i++, tu8++)
+ verify_val(*tu8, (uint8_t)(i * 3), "DataSpace::getSimpleExtentNpoints",__LINE__,__FILE__);
+
+ /*
+ * Test getting the referenced region
+ */
+
+ // Get region
+ DataSpace reg_sp = dset1.getRegion(&rbuf[0]);
+
+ // Get and verify number of elements in a dataspace selection
+ nelms = reg_sp.getSelectNpoints();
+ verify_val((long)nelms, 30, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
+
+ // Get and verify number of hyperslab blocks
+ nelms = reg_sp.getSelectHyperNblocks();
+ verify_val((long)nelms, 15, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
+
+ /* Allocate space for the hyperslab blocks */
+ coords = (hsize_t *)HDmalloc(nelms * SPACE3_RANK * sizeof(hsize_t) * 2);
+
+ // Get the list of hyperslab blocks currently selected
+ reg_sp.getSelectHyperBlocklist((hsize_t)0, (hsize_t)nelms, coords);
+
+ // Verify values in the list
+ verify_val(coords[0], 2, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[1], 3, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[2], 7, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[3], 8, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[4], 12, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[5], 13, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[6], 17, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[7], 18, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[8], 22, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[9], 23, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[10], 27, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[11], 28, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[12], 32, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[13], 33, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[14], 37, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[15], 38, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[16], 42, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[17], 43, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[18], 47, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[19], 48, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[20], 52, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[21], 53, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[22], 57, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[23], 58, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[24], 62, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[25], 63, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[26], 67, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[27], 68, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[28], 72, "Hyperslab Coordinates",__LINE__,__FILE__);
+ verify_val(coords[29], 73, "Hyperslab Coordinates",__LINE__,__FILE__);
+
+ HDfree(coords);
+
+ // Check boundaries
+ reg_sp.getSelectBounds(low, high);
+ verify_val(low[0], 2, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+ verify_val(high[0], 73, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+
+ /* Close region space */
+ reg_sp.close();
+
+ /*
+ * Another test on getting the referenced region
+ */
+
+ // Get region
+ DataSpace elm_sp = dset1.getRegion(&rbuf[1]);
+
+ // Get and verify number of element points in the current selection
+ hssize_t nelmspts = elm_sp.getSelectElemNpoints();
+ verify_val((long)nelmspts, 10, "DataSpace::getSelectNpoints",__LINE__,__FILE__);
+
+ /* Allocate space for the hyperslab blocks */
+ coords = (hsize_t *)HDmalloc(nelmspts * SPACE3_RANK * sizeof(hsize_t));
+
+ // Get the list of element points currently selected
+ elm_sp.getSelectElemPointlist((hsize_t)0, (hsize_t)nelmspts, coords);
+
+ // Verify points
+ verify_val(coords[0], coord1[0][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[1], coord1[1][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[2], coord1[2][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[3], coord1[3][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[4], coord1[4][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[5], coord1[5][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[6], coord1[6][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[7], coord1[7][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[8], coord1[8][0], "Element Coordinates",__LINE__,__FILE__);
+ verify_val(coords[9], coord1[9][0], "Element Coordinates",__LINE__,__FILE__);
+
+ HDfree(coords);
+
+ // Check boundaries
+ elm_sp.getSelectBounds(low, high);
+ verify_val(low[0], 3, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+ verify_val(high[0], 97, "DataSpace::getSelectBounds",__LINE__,__FILE__);
+
+ // Close element space
+ elm_sp.close();
+
+ // Close resources
+ sid1.close();
+ dset3.close();
+ dset1.close();
+ file1.close();
+
+ // Free memory buffers
+ HDfree(wbuf);
+ HDfree(rbuf);
+ HDfree(dwbuf);
+ HDfree(drbuf);
+
+ PASSED();
+ } // end try
+ catch (Exception E) {
+ issue_fail_msg("test_reference_region_1D()",__LINE__,__FILE__,
+ E.getCFuncName(), E.getCDetailMsg());
+ }
+} /* test_reference_region_1D() */
+
+
/****************************************************************
**
** test_reference_compat(): Test basic object reference functionality.
@@ -346,7 +806,10 @@ void test_reference(void)
// Output message about test being performed
MESSAGE(5, ("Testing References\n"));
+ test_reference_params(); // Test basic parameters of reference functionality
test_reference_obj(); // Test basic object reference functionality
+ test_reference_group(); // Test group reference functionality
+ test_reference_region_1D(); // Test 1-D reference functionality
test_reference_compat(); // Tests deprecated reference routines (not yet)
} // test_reference()
@@ -363,5 +826,6 @@ extern "C"
void cleanup_reference(void)
{
HDremove(FILE1.c_str());
+ HDremove(FILE2.c_str());
}