summaryrefslogtreecommitdiffstats
path: root/hl/c++/test/ptableTest.cpp
diff options
context:
space:
mode:
authorJames Laird <jlaird@hdfgroup.org>2005-03-28 16:32:20 (GMT)
committerJames Laird <jlaird@hdfgroup.org>2005-03-28 16:32:20 (GMT)
commit9452992c091df0bc7451a8d3ee0eea771cf5b97b (patch)
treeb07dec93daa39a432f47cb0b35a59e939adbff06 /hl/c++/test/ptableTest.cpp
parentaf6d77bfc4effe7e206745d2ef8da06fd0a7e58a (diff)
downloadhdf5-9452992c091df0bc7451a8d3ee0eea771cf5b97b.zip
hdf5-9452992c091df0bc7451a8d3ee0eea771cf5b97b.tar.gz
hdf5-9452992c091df0bc7451a8d3ee0eea771cf5b97b.tar.bz2
[svn-r10459]
Purpose: Added C++ wrapper for Packet Table API. Description: Added macro for high-level C++ library (LIBH5CPP_HL), which changes every Makefile.in. Added directories for high-level C++ library (though currently only Packet Table API is supported). Added both C++ source and tests. Platforms tested: sleipnir, mir, modi4 Misc. update:
Diffstat (limited to 'hl/c++/test/ptableTest.cpp')
-rw-r--r--hl/c++/test/ptableTest.cpp398
1 files changed, 398 insertions, 0 deletions
diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp
new file mode 100644
index 0000000..e82d581
--- /dev/null
+++ b/hl/c++/test/ptableTest.cpp
@@ -0,0 +1,398 @@
+#include "ptableTest.h"
+
+/* Main test function */
+int main(void)
+{
+ herr_t err;
+
+ /* Create new HDF5 file */
+ fileID = H5Fcreate("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ if(fileID <0)
+ fprintf(stderr, "Couldn't open file.\n");
+ else {
+
+ BasicTest();
+
+ TestCompoundDatatype();
+
+ TestGetPacket();
+
+ TestGetNext();
+
+ TestErrors();
+
+ SystemTest();
+
+ VariableLengthTest();
+
+ /* Terminate access to the file. */
+ err = H5Fclose(fileID);
+ if( err < 0 )
+ fprintf(stderr, "Failed to close file.\n");
+ }
+}
+
+
+void BasicTest()
+{
+ printf("Basic Test running...\n");
+
+ herr_t err;
+ int myRecord;
+ int count;
+ int error;
+
+ FL_PacketTable wrapper(fileID, "/basicTest", H5T_NATIVE_INT, 1);
+ assert(wrapper.IsValid());
+
+ /* Ensure initial count is zero */
+ count = wrapper.GetPacketCount(error);
+ assert(count == 0);
+ assert(error == 0);
+
+ myRecord = 1;
+
+ /* add some records test */
+ err = wrapper.AppendPacket(&myRecord);
+ if(err == -1)
+ printf("AppendHorizontalRecord failed.\n");
+ else{
+
+ myRecord = 2;
+
+ wrapper.AppendPacket(&myRecord);
+
+ /* get number of records test */
+ count = wrapper.GetPacketCount();
+
+ assert(count == 2);
+
+ /* get records test */
+ err = wrapper.GetPacket(0, &myRecord);
+ if(err == -1)
+ fprintf(stderr, "Error in GetPacket.\n");
+
+ assert(myRecord == 1);
+
+ err = wrapper.GetPacket(1, &myRecord);
+ if(err == -1)
+ fprintf(stderr, "Error in GetPacket.\n");
+
+ assert(myRecord == 2);
+}
+}
+
+void TestCompoundDatatype()
+{
+printf("TestCompoundDatatype running...\n");
+
+ hid_t dtypeID;
+ int error;
+
+ /* Create compound datatype */
+ typedef struct compoundType
+ {
+ short a, b, c;
+ int e;
+ } compoundType;
+
+ dtypeID = H5Tcreate( H5T_COMPOUND, sizeof(compoundType));
+
+ H5Tinsert(dtypeID, "abbey", HOFFSET( compoundType, a ), H5T_NATIVE_SHORT);
+ H5Tinsert(dtypeID, "bert", HOFFSET( compoundType, b ), H5T_NATIVE_SHORT);
+ H5Tinsert(dtypeID, "charlie", HOFFSET( compoundType, c ), H5T_NATIVE_SHORT);
+ H5Tinsert(dtypeID, "ebert", HOFFSET( compoundType, e ), H5T_NATIVE_INT);
+
+ /* Create packet table */
+ FL_PacketTable wrapper(fileID, "/compoundTest", dtypeID, 1);
+
+ assert(wrapper.IsValid());
+
+ compoundType first;
+ first.a = 1;
+ first.b = first.c = 3;
+ first.e = 5;
+
+ /* Write packet */
+ wrapper.AppendPacket(&first);
+
+ int count = wrapper.GetPacketCount(error);
+ assert(count == 1);
+
+ first.a = first.b = first.c = 0;
+ first.e = 0;
+
+ /* Read packet back */
+ wrapper.GetPacket(0, &first);
+
+ assert(first.a == 1);
+ assert(first.e == 5);
+}
+
+void TestGetNext()
+{
+printf("TestGetNext running...\n");
+
+ int error;
+
+ /* Create a dataset */
+ FL_PacketTable wrapper(fileID, "/TestGetNext", H5T_NATIVE_INT, 1);
+
+ assert(wrapper.IsValid());
+
+ int record;
+ int records[2];
+
+ /* Append 5 records to the dataset */
+ for(record = 1; record < 6; record++)
+ wrapper.AppendPacket(&record);
+
+ /* Ensure that we can interate through the records and get the right ones */
+ for(int i = 1; i < 6; i++)
+ {
+ wrapper.GetNextPacket(&record);
+ assert(record == i);
+ }
+
+ wrapper.ResetIndex();
+
+ /* Ensure that we can interate through the records and get the right ones */
+ for(int i = 1; i < 6; i++)
+ {
+ error = wrapper.GetNextPacket(&record);
+ assert(record == i);
+ assert(error == 0);
+ }
+
+ wrapper.SetIndex(1);
+
+ /* Ensure we can get multiple records with our index pointer */
+ wrapper.GetNextPackets(2, records);
+ assert(records[0] == 2);
+ assert(records[1] == 3);
+
+ /* Ensure our pointer was updated correctly */
+ wrapper.GetNextPacket(&record);
+ assert(record == 4);
+}
+
+void TestGetPacket()
+{
+ printf("TestGetPacket running...\n");
+
+ /* Create a dataset */
+ FL_PacketTable wrapper(fileID, "/TestGetPacket", H5T_NATIVE_INT, 1);
+
+ assert(wrapper.IsValid());
+
+ int record;
+
+ /* Append 5 records to the dataset */
+ for(record = 1; record < 6; record++)
+ wrapper.AppendPacket(&record);
+
+ /* Ensure that the records were written properly */
+ wrapper.GetPacket(1, &record);
+ assert(record == 2);
+
+ /* Ensure that we can retrieve multiple records */
+ int theRecs[3] = {0, 0, 0};
+ wrapper.GetPackets(1, 3, theRecs);
+ for(int i = 0; i < 3; i++)
+ assert(theRecs[i] == i+2);
+}
+
+void TestErrors()
+{
+ printf("TestErrors running...\n");
+
+ /* Create a dataset */
+ FL_PacketTable wrapper(fileID, "/TestErrors", H5T_NATIVE_INT, 1);
+
+ assert(wrapper.IsValid());
+
+ int record;
+ int records[3];
+ int error;
+
+ /* Append 4 records to the dataset */
+ for(record = 1; record < 5; record++)
+ wrapper.AppendPacket(&record);
+
+ /* Try to confuse functions with bad indexes */
+ error = wrapper.GetPacket(-1, &record);
+ assert(error == -1);
+ error = wrapper.GetPacket(4, &record);
+ assert(error == -1);
+ error = wrapper.GetPacket(-250, &record);
+ assert(error == -1);
+ error = wrapper.GetPacket(3000, &record);
+ assert(error == -1);
+ error = wrapper.GetPacket(1, &record);
+ assert(error == 0);
+
+ error = wrapper.GetPackets(-1, 1, records);
+ assert(error == -1);
+ error = wrapper.GetPackets(2, 4, records);
+ assert(error == -1);
+ error = wrapper.GetPackets(-60, -62, records);
+ assert(error == -1);
+ error = wrapper.GetPackets(10, 12, records);
+ assert(error == -1);
+ error = wrapper.GetPackets(0, 2, records);
+ assert(error == 0);
+ error = wrapper.GetPackets(2, 0, records);
+ assert(error == -1);
+ error = wrapper.GetPackets(1, 1, records);
+ assert(error == 0);
+ error = wrapper.GetPackets(1, 3, records);
+ assert(error == 0);
+
+ wrapper.ResetIndex();
+ error = wrapper.SetIndex(-1);
+ assert(error == -1);
+ error = wrapper.GetNextPacket(&record);
+ assert(error == 0);
+ assert(record == 1);
+ error = wrapper.SetIndex(20);
+ assert(error == -1);
+ error = wrapper.GetNextPacket(&record);
+ assert(error == 0);
+ assert(record == 2);
+ wrapper.SetIndex(3);
+ error = wrapper.GetNextPacket(&record);
+ assert(error == 0);
+ assert(record == 4);
+ error = wrapper.GetNextPacket(&record);
+ assert(error == -1);
+
+ wrapper.ResetIndex();
+ error = wrapper.GetNextPackets(10, records);
+ assert(error == -1);
+ error = wrapper.GetNextPackets(0, records);
+ assert(error == 0);
+}
+
+void SystemTest()
+{
+ printf("SystemTest running...\n");
+
+ hid_t dtypeID1, dtypeID2;
+
+ /* Creating two inter-related datatypes. Create two datasets and put
+ * one datatype in each. */
+ typedef struct compoundType
+ {
+ short a, b, c;
+ int e;
+ } compoundType;
+
+ dtypeID1 = H5Tcreate( H5T_COMPOUND, sizeof(compoundType));
+
+ H5Tinsert(dtypeID1, "abbey", HOFFSET( compoundType, a ), H5T_NATIVE_SHORT);
+ H5Tinsert(dtypeID1, "bert", HOFFSET( compoundType, b ), H5T_NATIVE_SHORT);
+ H5Tinsert(dtypeID1, "charlie", HOFFSET( compoundType, c ), H5T_NATIVE_SHORT);
+ H5Tinsert(dtypeID1, "ebert", HOFFSET( compoundType, e ), H5T_NATIVE_INT);
+
+ typedef struct cType2
+ {
+ char f;
+ compoundType g;
+ } cType2;
+
+ dtypeID2 = H5Tcreate ( H5T_COMPOUND, sizeof(cType2));
+
+ H5Tinsert(dtypeID2, "f", HOFFSET( cType2, f ), H5T_NATIVE_CHAR);
+ H5Tinsert(dtypeID2, "g", HOFFSET( cType2, g ), dtypeID1);
+
+ cType2 ct2[10];
+ ct2[0].f = 'h';
+ ct2[0].g.a = 9;
+ ct2[0].g.b = -13;
+ ct2[0].g.c = 0;
+ ct2[0].g.e = 3000;
+
+ /* Create the packet table datasets */
+ FL_PacketTable wrapper1(fileID, "/SystemTest1", dtypeID1, 1);
+ FL_PacketTable wrapper2(fileID, "/SystemTest2", dtypeID2, 1);
+
+ assert(wrapper1.IsValid());
+ assert(wrapper2.IsValid());
+
+ /* Write and read packets, ensure that nothing is unusual */
+ wrapper2.AppendPacket(ct2);
+
+ unsigned int count = wrapper1.GetPacketCount();
+ assert(count == 0);
+
+ compoundType ct1[10];
+ ct1[0].a = 31;
+ ct1[0].b = 4607;
+ ct1[0].c = -1002;
+ ct1[0].e = 3;
+
+ ct2[1].f = 'b';
+ ct2[1].g = ct1[0];
+
+ wrapper1.AppendPacket(ct1);
+ wrapper2.AppendPacket(&ct2[1]);
+
+ wrapper1.ResetIndex();
+ wrapper1.GetNextPacket(&ct1[1]);
+ wrapper2.GetPacket(1, &ct2[2]);
+
+ assert(ct1[1].b == ct2[2].g.b);
+}
+
+void VariableLengthTest(void)
+{
+ long test_long;
+ short test_short;
+ hvl_t read_buf;
+
+ printf("VariableLengthTest running...\n");
+
+ /* Create a variable length table */
+ VL_PacketTable* test_VLPT = new VL_PacketTable(fileID, "/VariableLengthTest", 1);
+
+ /* Verify that the creation succeeded */
+ assert(test_VLPT->IsValid());
+
+ /* Append some packets */
+ test_short = 9;
+ test_VLPT->AppendPacket(&test_short, sizeof(short));
+ test_long = 16;
+ test_VLPT->AppendPacket(&test_long, sizeof(long));
+
+ /* Read them back and make sure they are correct */
+ test_VLPT->GetNextPackets(1, &read_buf);
+
+ assert(read_buf.len == sizeof(short));
+ assert(*(short *)(read_buf.p) == test_short);
+
+ /* Free the memory used by the read */
+ test_VLPT->FreeReadbuff(1, &read_buf);
+
+ /* Read the second record */
+ test_VLPT->GetNextPackets(1, &read_buf);
+
+ assert(read_buf.len == sizeof(long));
+ assert(*(long *)(read_buf.p) == test_long);
+
+ /* Free the memory used by the read */
+ test_VLPT->FreeReadbuff(1, &read_buf);
+
+ /* Close the packet table */
+ delete test_VLPT;
+
+ /* Reopen the packet table and verify that it is variable length */
+ PacketTable * new_pt = new PacketTable(fileID, "/VariableLengthTest");
+
+ /* Verify that the open succeeded */
+ assert(new_pt->IsValid());
+
+ assert(new_pt->IsVariableLength() == 1);
+
+ /* Close the packet table */
+ delete new_pt;
+}