summaryrefslogtreecommitdiffstats
path: root/tools/h5diff/testh5diff_basic.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/h5diff/testh5diff_basic.c')
-rw-r--r--tools/h5diff/testh5diff_basic.c498
1 files changed, 498 insertions, 0 deletions
diff --git a/tools/h5diff/testh5diff_basic.c b/tools/h5diff/testh5diff_basic.c
new file mode 100644
index 0000000..fe0282d
--- /dev/null
+++ b/tools/h5diff/testh5diff_basic.c
@@ -0,0 +1,498 @@
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Copyright by the Board of Trustees of the University of Illinois. *
+ * All rights reserved. *
+ * *
+ * This file is part of HDF5. The full HDF5 copyright notice, including *
+ * terms governing use, modification, and redistribution, is contained in *
+ * the files COPYING and Copyright.html. COPYING can be found at the root *
+ * of the source code distribution tree; Copyright.html can be found at the *
+ * root level of an installed copy of the electronic HDF5 document set and *
+ * is linked from the top-level documents page. It can also be found at *
+ * http://hdf.ncsa.uiuc.edu/HDF5/doc/Copyright.html. If you do not have *
+ * access to either file, you may request a copy from hdfhelp@ncsa.uiuc.edu. *
+ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+#include "testh5diff.h"
+
+
+/*UINT_MAX Maximum value for a variable of type unsigned int. 4294967295 */
+#define UIMAX 4294967295u
+
+
+
+/*
+
+# ##############################################################################
+# # Common usage
+# ##############################################################################
+
+
+# 1.0
+ -h
+
+# 1.1
+ file1.h5 file2.h5 g1/dset1 g1/dset2
+
+# 1.2
+ file1.h5 file2.h5 -n 2 g1/dset1 g1/dset2
+
+# 1.3
+ file1.h5 file2.h5 -d 5 g1/dset3 g1/dset4
+
+# 1.4
+ file1.h5 file2.h5 -p 0.05 g1/dset3 g1/dset4
+
+# 1.5
+ file1.h5 file2.h5 -r g1/dset1 g1/dset2
+
+# 1.6
+ file1.h5 file2.h5
+
+# ##############################################################################
+# # basic types
+# ##############################################################################
+
+# 2.0
+ file3.h5 file3.h5 dset group
+
+# 2.1
+ file3.h5 file3.h5 dset link
+
+# 2.2
+ file3.h5 file3.h5 dset type
+
+# 2.3
+ file3.h5 file3.h5 group group
+
+# 2.4
+ file3.h5 file3.h5 type type
+
+# 2.5
+ file3.h5 file3.h5 link link
+
+
+# ##############################################################################
+# # Dimensions
+# ##############################################################################
+
+# 4.0
+ file5.h5 file5.h5 dset1 dset2
+
+# 4.1
+ file5.h5 file5.h5 dset3 dset4
+
+# 4.2
+ file5.h5 file5.h5 dset5 dset6
+
+
+# ##############################################################################
+# # Dataset types
+# ##############################################################################
+
+# 5.0
+ file6.h5 file6.h5 dset0a dset0b
+
+# 5.1
+ file6.h5 file6.h5 dset1a dset1b
+
+# 5.2
+ file6.h5 file6.h5 dset2a dset2b
+
+# 5.3
+ file6.h5 file6.h5 dset3a dset4b
+
+# 5.4
+ file6.h5 file6.h5 dset4a dset4b
+
+# 5.5
+ file6.h5 file6.h5 dset5a dset5b
+
+# 5.6
+ file6.h5 file6.h5 dset6a dset6b
+
+# 5.7
+ file6.h5 file6.h5 dset7a dset7b
+
+# 5.8
+ file6.h5 file6.h5 dset8a dset8b
+
+# ##############################################################################
+# # Error messages
+# ##############################################################################
+
+
+# 6.0: Check if the command line number of arguments is less than 3
+ h5diff_test1.h5
+
+# 6.1: Check for invalid options
+ h5diff_test1.h5 h5diff_test2.h5 -x
+
+# ##############################################################################
+# # -d
+# ##############################################################################
+
+# 6.2: no value
+ file1.h5 file2.h5 -d g1/dset3 g1/dset4
+
+# 6.3: negative value
+ file1.h5 file2.h5 -d -4 g1/dset3 g1/dset4
+
+# 6.4: zero
+ file1.h5 file2.h5 -d 0 g1/dset3 g1/dset4
+
+# 6.5: non number
+ file1.h5 file2.h5 -d u g1/dset3 g1/dset4
+
+# 6.6: hexadecimal
+ file1.h5 file2.h5 -d 0x1 g1/dset3 g1/dset4
+
+# 6.7: string
+ file1.h5 file2.h5 -d "1" g1/dset3 g1/dset4
+
+# 6.8: repeated option
+ file1.h5 file2.h5 -d 1 -d 2 g1/dset3 g1/dset4
+
+# 6.9: number larger than biggest difference
+ file1.h5 file2.h5 -d 200 g1/dset3 g1/dset4
+
+# 6.10: number smaller than smallest difference
+ file1.h5 file2.h5 -d 1 g1/dset3 g1/dset4
+
+
+# ##############################################################################
+# # -p
+# ##############################################################################
+
+
+# 6.11: no value
+ file1.h5 file2.h5 -p g1/dset3 g1/dset4
+
+# 6.12: negative value
+ file1.h5 file2.h5 -p -4 g1/dset3 g1/dset4
+
+# 6.13: zero
+ file1.h5 file2.h5 -p 0 g1/dset3 g1/dset4
+
+# 6.14: non number
+ file1.h5 file2.h5 -p u g1/dset3 g1/dset4
+
+# 6.15: hexadecimal
+ file1.h5 file2.h5 -p 0x1 g1/dset3 g1/dset4
+
+# 6.16: string
+ file1.h5 file2.h5 -p "0.21" g1/dset3 g1/dset4
+
+# 6.17: repeated option
+ file1.h5 file2.h5 -p 0.21 -p 0.22 g1/dset3 g1/dset4
+
+# 6.18: number larger than biggest difference
+ file1.h5 file2.h5 -p 2 g1/dset3 g1/dset4
+
+# 6.19: number smaller than smallest difference
+ file1.h5 file2.h5 -p 0.005 g1/dset3 g1/dset4
+
+
+
+# ##############################################################################
+# # -n
+# ##############################################################################
+
+
+# 6.20: no value
+ file1.h5 file2.h5 -n g1/dset3 g1/dset4
+
+# 6.21: negative value
+ file1.h5 file2.h5 -n -4 g1/dset3 g1/dset4
+
+# 6.22: zero
+ file1.h5 file2.h5 -n 0 g1/dset3 g1/dset4
+
+# 6.23: non number
+ file1.h5 file2.h5 -n u g1/dset3 g1/dset4
+
+# 6.24: hexadecimal
+ file1.h5 file2.h5 -n 0x1 g1/dset3 g1/dset4
+
+# 6.25: string
+ file1.h5 file2.h5 -n "2" g1/dset3 g1/dset4
+
+# 6.26: repeated option
+ file1.h5 file2.h5 -n 2 -n 3 g1/dset3 g1/dset4
+
+# 6.27: number larger than biggest difference
+ file1.h5 file2.h5 -n 200 g1/dset3 g1/dset4
+
+# 6.28: number smaller than smallest difference
+ file1.h5 file2.h5 -n 1 g1/dset3 g1/dset4
+
+# ##############################################################################
+# # non valid files
+# ##############################################################################
+
+ file1.h6 file2.h6
+
+*/
+
+
+/*-------------------------------------------------------------------------
+ * Basic review tests
+ *-------------------------------------------------------------------------
+ */
+
+int test_basic(const char *file1, const char *file2)
+{
+
+ hid_t file1_id, file2_id;
+ hid_t group1_id, group2_id, group3_id;
+ herr_t status;
+ hsize_t dims[2] = { 3,2 };
+
+ /* Test */
+ double data1[3][2] = {{1,1},{1,1},{1,1}};
+ double data2[3][2] = {{1,1.1},{1.01,1.001},{1.0001,1}};
+ double data3[3][2] = {{100,110},{100,100},{100,100}};
+ double data4[3][2] = {{110,100},{90,80},{140,200}};
+
+/*-------------------------------------------------------------------------
+ * Create two files
+ *-------------------------------------------------------------------------
+ */
+
+ file1_id = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+ file2_id = H5Fcreate (file2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+ /* Create groups */
+ group1_id = H5Gcreate(file1_id, "g1", 0);
+ group2_id = H5Gcreate(file2_id, "g1", 0);
+ group3_id = H5Gcreate(file2_id, "g2", 0);
+
+ write_dset(group1_id,2,dims,"dset1",H5T_NATIVE_DOUBLE,data1);
+ write_dset(group2_id,2,dims,"dset2",H5T_NATIVE_DOUBLE,data2);
+ write_dset(group1_id,2,dims,"dset3",H5T_NATIVE_DOUBLE,data3);
+ write_dset(group2_id,2,dims,"dset4",H5T_NATIVE_DOUBLE,data4);
+ write_dset(group2_id,2,dims,"dset1",H5T_NATIVE_DOUBLE,data2);
+
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Gclose(group1_id);
+ status = H5Gclose(group2_id);
+ status = H5Gclose(group3_id);
+ status = H5Fclose(file1_id);
+ status = H5Fclose(file2_id);
+ return status;
+}
+
+/*-------------------------------------------------------------------------
+ * Compare different types: H5G_DATASET, H5G_TYPE, H5G_GROUP, H5G_LINK
+ *-------------------------------------------------------------------------
+ */
+
+int test_types(const char *file1, const char UNUSED *file2)
+{
+
+ hid_t file1_id;
+ hid_t group_id;
+ hid_t type_id;
+ herr_t status;
+ hsize_t dims[1]={1};
+ /* Compound datatype */
+ typedef struct s_t
+ {
+ int a;
+ float b;
+ } s_t;
+
+
+/*-------------------------------------------------------------------------
+ * Create one file
+ *-------------------------------------------------------------------------
+ */
+ file1_id = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+/*-------------------------------------------------------------------------
+ * H5G_DATASET
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,1,dims,"dset",H5T_NATIVE_INT,0);
+
+/*-------------------------------------------------------------------------
+ * H5G_GROUP
+ *-------------------------------------------------------------------------
+ */
+ group_id = H5Gcreate(file1_id, "group", 0);
+ status = H5Gclose(group_id);
+
+/*-------------------------------------------------------------------------
+ * H5G_TYPE
+ *-------------------------------------------------------------------------
+ */
+
+ /* Create a memory compound datatype */
+ type_id = H5Tcreate (H5T_COMPOUND, sizeof(s_t));
+ H5Tinsert(type_id, "a", HOFFSET(s_t, a), H5T_NATIVE_INT);
+ H5Tinsert(type_id, "b", HOFFSET(s_t, b), H5T_NATIVE_FLOAT);
+ /* Commit compound datatype and close it */
+ H5Tcommit(file1_id, "type", type_id);
+ H5Tclose(type_id);
+
+/*-------------------------------------------------------------------------
+ * H5G_LINK
+ *-------------------------------------------------------------------------
+ */
+
+ status = H5Glink(file1_id, H5G_LINK_SOFT, "dset", "link");
+
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Fclose(file1_id);
+ return status;
+}
+
+
+
+
+
+/*-------------------------------------------------------------------------
+ * Datasets datatypes
+ *-------------------------------------------------------------------------
+ */
+
+int test_native(const char *file1, const char UNUSED *file2)
+{
+
+ hid_t file1_id;
+ hsize_t dims[2]={3,2};
+ herr_t status;
+ char buf1a[3][2] = {{1,1},{1,1},{1,1}};
+ char buf1b[3][2] = {{1,1},{3,4},{5,6}};
+ short buf2a[3][2] = {{1,1},{1,1},{1,1}};
+ short buf2b[3][2] = {{1,1},{3,4},{5,6}};
+ int buf3a[3][2] = {{1,1},{1,1},{1,1}};
+ int buf3b[3][2] = {{1,1},{3,4},{5,6}};
+ long buf4a[3][2] = {{1,1},{1,1},{1,1}};
+ long buf4b[3][2] = {{1,1},{3,4},{5,6}};
+ float buf5a[3][2] = {{1,1},{1,1},{1,1}};
+ float buf5b[3][2] = {{1,1},{3,4},{5,6}};
+ double buf6a[3][2] = {{1,1},{1,1},{1,1}};
+ double buf6b[3][2] = {{1,1},{3,4},{5,6}};
+
+ /*unsigned/signed test
+ signed char -128 to 127
+ unsigned char 0 to 255
+ */
+ char buf7a[3][2] = {{-1,-128},{-1,-1},{-1,-1}};
+ unsigned char buf7b[3][2] = {{1,128},{1,1},{1,1}};
+
+ /* long_long test */
+ long_long buf8a[3][2] = {{1,1},{1,1},{1,1}};
+ long_long buf8b[3][2] = {{1,1},{3,4},{5,6}};
+ unsigned long_long buf9a[3][2] = {{1,1},{1,1},{1,1}};
+ unsigned long_long buf9b[3][2] = {{1,1},{3,4},{5,6}};
+
+ unsigned int buf10a[3][2] = {{UIMAX,1},{1,1},{1,1}};
+ unsigned int buf10b[3][2] = {{UIMAX-1,1},{3,4},{5,6}};
+
+
+/*-------------------------------------------------------------------------
+ * Create a file
+ *-------------------------------------------------------------------------
+ */
+ file1_id = H5Fcreate (file1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);
+
+/*-------------------------------------------------------------------------
+ * Check for different storage order. Give a warning if they are different
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset0a",H5T_STD_I16LE,buf2a);
+ write_dset(file1_id,2,dims,"dset0b",H5T_STD_I32LE,buf3b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_CHAR
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset1a",H5T_NATIVE_CHAR,buf1a);
+ write_dset(file1_id,2,dims,"dset1b",H5T_NATIVE_CHAR,buf1b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_SHORT
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset2a",H5T_NATIVE_SHORT,buf2a);
+ write_dset(file1_id,2,dims,"dset2b",H5T_NATIVE_SHORT,buf2b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_INT
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset3a",H5T_NATIVE_INT,buf3a);
+ write_dset(file1_id,2,dims,"dset3b",H5T_NATIVE_INT,buf3b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_LONG
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset4a",H5T_NATIVE_LONG,buf4a);
+ write_dset(file1_id,2,dims,"dset4b",H5T_NATIVE_LONG,buf4b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_FLOAT
+ *-------------------------------------------------------------------------
+ */
+ write_dset(file1_id,2,dims,"dset5a",H5T_NATIVE_FLOAT,buf5a);
+ write_dset(file1_id,2,dims,"dset5b",H5T_NATIVE_FLOAT,buf5b);
+
+/*-------------------------------------------------------------------------
+ * Check H5T_NATIVE_DOUBLE
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset6a",H5T_NATIVE_DOUBLE,buf6a);
+ write_dset(file1_id,2,dims,"dset6b",H5T_NATIVE_DOUBLE,buf6b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_CHAR and H5T_NATIVE_UCHAR
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset7a",H5T_NATIVE_CHAR,buf7a);
+ write_dset(file1_id,2,dims,"dset7b",H5T_NATIVE_UCHAR,buf7b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_LLONG
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset8a",H5T_NATIVE_LLONG,buf8a);
+ write_dset(file1_id,2,dims,"dset8b",H5T_NATIVE_LLONG,buf8b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_ULLONG
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset9a",H5T_NATIVE_ULLONG,buf9a);
+ write_dset(file1_id,2,dims,"dset9b",H5T_NATIVE_ULLONG,buf9b);
+
+/*-------------------------------------------------------------------------
+ * H5T_NATIVE_INT
+ *-------------------------------------------------------------------------
+ */
+
+ write_dset(file1_id,2,dims,"dset10a",H5T_NATIVE_UINT,buf10a);
+ write_dset(file1_id,2,dims,"dset10b",H5T_NATIVE_UINT,buf10b);
+
+
+/*-------------------------------------------------------------------------
+ * Close
+ *-------------------------------------------------------------------------
+ */
+ status = H5Fclose(file1_id);
+ return status;
+}
+
+