diff options
author | Scot Breitenfeld <brtnfld@hdfgroup.org> | 2008-09-30 16:42:10 (GMT) |
---|---|---|
committer | Scot Breitenfeld <brtnfld@hdfgroup.org> | 2008-09-30 16:42:10 (GMT) |
commit | fe1ca64d1672af7859c38c143b77533a14c518ec (patch) | |
tree | bbee085742020b59a4b6136f277c6dd4a0bc8de0 /fortran/test | |
parent | f361635ae5f344bc80aade6432e80bcf1647522b (diff) | |
download | hdf5-fe1ca64d1672af7859c38c143b77533a14c518ec.zip hdf5-fe1ca64d1672af7859c38c143b77533a14c518ec.tar.gz hdf5-fe1ca64d1672af7859c38c143b77533a14c518ec.tar.bz2 |
[svn-r15727]
Maintenance: Merged new Fortran Features and tests from trunk into hdf5_1_8 branch
(used svn merge -r 14941:14525 http://svn.hdfgroup.uiuc.edu/hdf5/trunk/fortran
command).
Diffstat (limited to 'fortran/test')
-rw-r--r-- | fortran/test/Makefile.am | 1 | ||||
-rw-r--r-- | fortran/test/fortranlib_test.f90 | 429 | ||||
-rw-r--r-- | fortran/test/fortranlib_test_1_8.f90 | 646 | ||||
-rw-r--r-- | fortran/test/tH5A_1_8.f90 | 797 | ||||
-rw-r--r-- | fortran/test/tH5G_1_8.f90 | 1045 | ||||
-rw-r--r-- | fortran/test/tH5O.f90 | 246 | ||||
-rw-r--r-- | fortran/test/tH5Sselect.f90 | 963 | ||||
-rw-r--r-- | fortran/test/tH5T.f90 | 87 | ||||
-rw-r--r-- | fortran/test/tf.f90 | 42 |
9 files changed, 1866 insertions, 2390 deletions
diff --git a/fortran/test/Makefile.am b/fortran/test/Makefile.am index 7d619d9..ca0a1b4 100644 --- a/fortran/test/Makefile.am +++ b/fortran/test/Makefile.am @@ -70,4 +70,5 @@ FORTRAN_API=yes # fflush2 depends on files created by fflush1 fflush2.chkexe_: fflush1.chkexe_ + include $(top_srcdir)/config/conclude.am diff --git a/fortran/test/fortranlib_test.f90 b/fortran/test/fortranlib_test.f90 index 0462740..be8d257 100644 --- a/fortran/test/fortranlib_test.f90 +++ b/fortran/test/fortranlib_test.f90 @@ -17,333 +17,226 @@ ! ! Testing Fortran functionality. ! - PROGRAM fortranlibtest - - USE HDF5 - - IMPLICIT NONE - INTEGER :: total_error = 0 - INTEGER :: error - INTEGER :: mounting_total_error = 0 - INTEGER :: reopen_total_error = 0 - INTEGER :: fclose_total_error = 0 - INTEGER :: fspace_total_error = 0 - INTEGER :: dataset_total_error = 0 - INTEGER :: extend_dataset_total_error = 0 - INTEGER :: refobj_total_error = 0 - INTEGER :: refreg_total_error = 0 - INTEGER :: dataspace_total_error = 0 - INTEGER :: hyperslab_total_error = 0 - INTEGER :: element_total_error = 0 - INTEGER :: basic_select_total_error = 0 - INTEGER :: total_error_compoundtest = 0 - INTEGER :: basic_datatype_total_error = 0 - INTEGER :: enum_total_error = 0 - INTEGER :: external_total_error = 0 - INTEGER :: multi_file_total_error = 0 - INTEGER :: attribute_total_error = 0 - INTEGER :: identifier_total_error = 0 - INTEGER :: group_total_error = 0 - INTEGER :: error_total_error = 0 - INTEGER :: vl_total_error = 0 - INTEGER :: z_total_error = 0 - INTEGER :: sz_total_error = 0 - INTEGER :: derived_flt_error = 0 - INTEGER :: majnum, minnum, relnum - CHARACTER(LEN=8) error_string - CHARACTER(LEN=8) :: success = ' PASSED ' - CHARACTER(LEN=8) :: failure = '*FAILED*' - CHARACTER(LEN=8) :: skip = '--SKIP--' - CHARACTER(LEN=4) :: e_format ='(8a)' - LOGICAL :: cleanup = .TRUE. -! LOGICAL :: cleanup = .FALSE. - LOGICAL :: szip_flag - - CALL h5open_f(error) - write(*,*) ' ========================== ' - write(*,*) ' FORTRAN tests ' - write(*,*) ' ========================== ' - CALL h5get_libversion_f(majnum, minnum, relnum, total_error) - if(total_error .eq. 0) then - - write(*, '(" FORTRANLIB_TEST is linked with HDF5 Library version ")', advance="NO") - write(*, '(I1)', advance="NO") majnum - write(*, '(".")', advance="NO") - write(*, '(I1)', advance="NO") minnum - write(*, '(" release ")', advance="NO") - write(*, '(I3)') relnum - else - total_error = total_error + 1 - endif - write(*,*) +PROGRAM fortranlibtest + + USE HDF5 + + IMPLICIT NONE + INTEGER :: total_error = 0 + INTEGER :: error + INTEGER :: majnum, minnum, relnum + LOGICAL :: cleanup = .TRUE. +! LOGICAL :: cleanup = .FALSE. + LOGICAL :: szip_flag + INTEGER :: ret_total_error + + CALL h5open_f(error) + WRITE(*,*) ' ========================== ' + WRITE(*,*) ' FORTRAN tests ' + WRITE(*,*) ' ========================== ' + CALL h5get_libversion_f(majnum, minnum, relnum, total_error) + IF(total_error .EQ. 0) THEN + + + WRITE(*, '(" FORTRANLIB_TEST is linked with HDF5 Library version ")', advance="NO") + WRITE(*, '(I1)', advance="NO") majnum + WRITE(*, '(".")', advance="NO") + WRITE(*, '(I1)', advance="NO") minnum + WRITE(*, '(" release ")', advance="NO") + WRITE(*, '(I3)') relnum + ELSE + total_error = total_error + 1 + ENDIF + WRITE(*,*) ! CALL h5check_version_f(1,4,4,total_error) ! write(*,*) '=========================================' ! write(*,*) 'Testing FILE Interface ' ! write(*,*) '=========================================' - error_string = failure - CALL mountingtest(cleanup, mounting_total_error) - IF (mounting_total_error == 0) error_string = success - write(*, fmt = '(14a)', advance = 'no') ' Mounting test' - write(*, fmt = '(56x,a)', advance = 'no') ' ' - - write(*, fmt = e_format) error_string - total_error = total_error + mounting_total_error - error_string = failure - CALL reopentest(cleanup, reopen_total_error) - IF (reopen_total_error == 0) error_string = success - write(*, fmt = '(12a)', advance = 'no') ' Reopen test' - write(*, fmt = '(58x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + reopen_total_error + + + ret_total_error = 0 + CALL mountingtest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Mounting test', total_error) + + ret_total_error = 0 + CALL reopentest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Reopen test', total_error) !DEC$ if defined(H5_VMS) - goto 100 + GOTO 8 !DEC$ else - error_string = failure - CALL file_close(cleanup, fclose_total_error) - IF (fclose_total_error == 0) error_string = success - write(*, fmt = '(21a)', advance = 'no') ' File open/close test' - write(*, fmt = '(49x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + fclose_total_error + ret_total_error = 0 + CALL file_close(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' File open/close test', total_error) !DEC$ endif -100 continue - error_string = failure - CALL file_space(cleanup, fspace_total_error) - IF (fspace_total_error == 0) error_string = success - write(*, fmt = '(21a)', advance = 'no') ' File free space test' - write(*, fmt = '(49x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + fspace_total_error +8 CONTINUE + + ret_total_error = 0 + CALL file_space(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' File free space test', total_error) ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing DATASET Interface ' ! write(*,*) '=========================================' - error_string = failure - CALL datasettest(cleanup, dataset_total_error) - IF (dataset_total_error == 0) error_string = success - write(*, fmt = '(13a)', advance = 'no') ' Dataset test' - write(*, fmt = '(57x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + dataset_total_error - error_string = failure - CALL extenddsettest(cleanup, extend_dataset_total_error) - IF (extend_dataset_total_error == 0) error_string = success - write(*, fmt = '(24a)', advance = 'no') ' Extendible dataset test' - write(*, fmt = '(46x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + extend_dataset_total_error + ret_total_error = 0 + CALL datasettest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Dataset test', total_error) + + ret_total_error = 0 + CALL extenddsettest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Extendible dataset test', total_error) + ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing DATASPACE Interface ' ! write(*,*) '=========================================' - error_string = failure - CALL dataspace_basic_test(cleanup, dataspace_total_error) - IF (dataspace_total_error == 0) error_string = success - write(*, fmt = '(21a)', advance = 'no') ' Basic dataspace test' - write(*, fmt = '(49x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + dataspace_total_error - + ret_total_error = 0 + CALL dataspace_basic_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Basic dataspace test', total_error) ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing REFERENCE Interface ' ! write(*,*) '=========================================' - error_string = failure - CALL refobjtest(cleanup, refobj_total_error) - IF (refobj_total_error == 0) error_string = success - write(*, fmt = '(25a)', advance = 'no') ' Reference to object test' - write(*, fmt = '(45x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + refobj_total_error - - error_string = failure - CALL refregtest(cleanup, refreg_total_error) - IF (refreg_total_error == 0) error_string = success - write(*, fmt = '(33a)', advance = 'no') ' Reference to dataset region test' - write(*, fmt = '(37x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + refreg_total_error + ret_total_error = 0 + CALL refobjtest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Reference to object test', total_error) + + ret_total_error = 0 + CALL refregtest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Reference to dataset region test', total_error) ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing selection functionalities ' ! write(*,*) '=========================================' - error_string = failure - CALL test_basic_select(cleanup, basic_select_total_error) - IF (basic_select_total_error == 0) error_string = success - write(*, fmt = '(21a)', advance = 'no') ' Basic selection test' - write(*, fmt = '(49x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + basic_select_total_error - - error_string = failure - CALL test_select_hyperslab( cleanup, hyperslab_total_error) - IF ( hyperslab_total_error == 0) error_string = success - write(*, fmt = '(25a)', advance = 'no') ' Hyperslab selection test' - write(*, fmt = '(45x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + hyperslab_total_error - - error_string = failure - CALL test_select_element(cleanup, element_total_error) - IF (element_total_error == 0) error_string = success - write(*, fmt = '(23a)', advance = 'no') ' Element selection test' - write(*, fmt = '(47x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + element_total_error + ret_total_error = 0 + CALL test_basic_select(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Basic selection test', total_error) + + ret_total_error = 0 + CALL test_select_hyperslab( cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Hyperslab selection test', total_error) + + ret_total_error = 0 + CALL test_select_element(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Element selection test', total_error) + ret_total_error = 0 + CALL test_select_point(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Element selection functions test ', total_error) + + ret_total_error = 0 + CALL test_select_combine(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Selection combinations test ', total_error) + + ret_total_error = 0 + CALL test_select_bounds(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Selection bounds test ', total_error) + ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing DATATYPE interface ' ! write(*,*) '=========================================' - error_string = failure - CALL basic_data_type_test(cleanup, basic_datatype_total_error) - IF (basic_datatype_total_error == 0) error_string = success - write(*, fmt = '(20a)', advance = 'no') ' Basic datatype test' - write(*, fmt = '(50x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + basic_datatype_total_error - - error_string = failure - CALL compoundtest(cleanup, total_error_compoundtest) - IF (total_error_compoundtest == 0) error_string = success - write(*, fmt = '(23a)', advance = 'no') ' Compound datatype test' - write(*, fmt = '(47x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + total_error_compoundtest - error_string = failure - CALL enumtest(cleanup, enum_total_error) - IF (enum_total_error == 0) error_string = success - write(*, fmt = '(19a)', advance = 'no') ' Enum datatype test' - write(*, fmt = '(51x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + enum_total_error - - error_string = failure - CALL test_derived_flt(cleanup, derived_flt_error) - IF (derived_flt_error == 0) error_string = success - write(*, fmt = '(28a)', advance = 'no') ' Derived float datatype test' - write(*, fmt = '(42x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + derived_flt_error + ret_total_error = 0 + CALL basic_data_type_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Basic datatype test', total_error) + + ret_total_error = 0 + CALL compoundtest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Compound datatype test', total_error) + ret_total_error = 0 + CALL enumtest(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Enum datatype test', total_error) + + ret_total_error = 0 + CALL test_derived_flt(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Derived float datatype test', total_error) + ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing PROPERTY interface ' ! write(*,*) '=========================================' - error_string = failure - CALL external_test(cleanup, external_total_error) - IF (external_total_error == 0) error_string = success - write(*, fmt = '(22a)', advance = 'no') ' External dataset test' - write(*, fmt = '(48x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + external_total_error - - error_string = failure -! error_string = skip - cleanup = .FALSE. - CALL multi_file_test(cleanup, multi_file_total_error) - IF (multi_file_total_error == 0) error_string = success - write(*, fmt = '(23a)', advance = 'no') ' Multi file driver test' - write(*, fmt = '(47x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + multi_file_total_error + ret_total_error = 0 + CALL external_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' External dataset test', total_error) + + ret_total_error = 0 + cleanup = .FALSE. + CALL multi_file_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Multi file driver test', total_error) + ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing ATTRIBUTE interface ' ! write(*,*) '=========================================' - error_string = failure - CALL attribute_test(cleanup, attribute_total_error) - write(*, fmt = '(15a)', advance = 'no') ' Attribute test' - write(*, fmt = '(55x,a)', advance = 'no') ' ' - IF (attribute_total_error == 0) error_string = success - write(*, fmt = e_format) error_string - total_error = total_error + attribute_total_error + ret_total_error = 0 + CALL attribute_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Attribute test', total_error) ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing IDENTIFIER interface ' ! write(*,*) '=========================================' - error_string = failure - CALL identifier_test(cleanup, identifier_total_error) - IF (identifier_total_error == 0) error_string = success - write(*, fmt = '(16a)', advance = 'no') ' Identifier test' - write(*, fmt = '(54x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + identifier_total_error - error_string = failure - CALL filters_test(cleanup, z_total_error) - IF (z_total_error == 0) error_string = success - write(*, fmt = '(13a)', advance = 'no') ' Filters test' - write(*, fmt = '(57x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + z_total_error - - CALL szip_test(szip_flag, cleanup, sz_total_error) - IF (sz_total_error == 0) error_string = success - ! Reset the flag is compression was not available - IF (.NOT. szip_flag) error_string = skip - IF (sz_total_error .gt. 0) error_string = failure - write(*, fmt = '(18a)', advance = 'no') ' SZIP filter test' - write(*, fmt = '(53x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - if(sz_total_error .gt. 0) total_error = total_error + sz_total_error + ret_total_error = 0 + CALL identifier_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Identifier test', total_error) + + ret_total_error = 0 + CALL filters_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Filters test', total_error) + + ret_total_error = 0 + CALL szip_test(szip_flag, cleanup, ret_total_error) + + IF (.NOT. szip_flag) THEN ! test not available + CALL write_test_status(-1, ' SZIP filter test', total_error) + ELSE + CALL write_test_status(ret_total_error, ' SZIP filter test', total_error) + ENDIF ! write(*,*) ! write(*,*) '=========================================' ! write(*,*) 'Testing GROUP interface ' ! write(*,*) '=========================================' - error_string = failure - CALL group_test(cleanup, group_total_error) - IF (group_total_error == 0) error_string = success - write(*, fmt = '(11a)', advance = 'no') ' Group test' - write(*, fmt = '(59x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + group_total_error - - error_string = failure - CALL error_report_test(cleanup, error_total_error) - IF (error_total_error == 0) error_string = success - write(*, fmt = '(11a)', advance = 'no') ' Error test' - write(*, fmt = '(59x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + error_total_error - - error_string = failure - CALL vl_test_integer(cleanup, vl_total_error) - CALL vl_test_real(cleanup, vl_total_error) - CALL vl_test_string(cleanup, vl_total_error) - IF (vl_total_error == 0) error_string = success - write(*, fmt = '(11a)', advance = 'no') ' VL test' - write(*, fmt = '(62x,a)', advance = 'no') ' ' - write(*, fmt = e_format) error_string - total_error = total_error + vl_total_error - - write(*,*) - - write(*,*) ' ============================================ ' - write(*, fmt = '(19x, 27a)', advance='NO') ' FORTRAN tests completed with ' - write(*, fmt = '(i4)', advance='NO') total_error - write(*, fmt = '(12a)' ) ' error(s) ! ' - write(*,*) ' ============================================ ' - - CALL h5close_f(error) - - ! if errors detected, exit with non-zero code. - IF (total_error .ne. 0) CALL h5_exit_f (1) - - END PROGRAM fortranlibtest + ret_total_error = 0 + CALL group_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Group test', total_error) + + ret_total_error = 0 + CALL error_report_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' Error test', total_error) + + ret_total_error = 0 + CALL vl_test_integer(cleanup, ret_total_error) + CALL vl_test_real(cleanup, ret_total_error) + CALL vl_test_string(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, ' VL test', total_error) + + WRITE(*,*) + + WRITE(*,*) ' ============================================ ' + WRITE(*, fmt = '(19x, 27a)', advance='NO') ' FORTRAN tests completed with ' + WRITE(*, fmt = '(i4)', advance='NO') total_error + WRITE(*, fmt = '(12a)' ) ' error(s) ! ' + WRITE(*,*) ' ============================================ ' + + CALL h5close_f(error) + + ! if errors detected, exit with non-zero code. + IF (total_error .NE. 0) CALL h5_exit_f (1) + +END PROGRAM fortranlibtest diff --git a/fortran/test/fortranlib_test_1_8.f90 b/fortran/test/fortranlib_test_1_8.f90 index acfd1af..4ff3e0f 100644 --- a/fortran/test/fortranlib_test_1_8.f90 +++ b/fortran/test/fortranlib_test_1_8.f90 @@ -23,33 +23,11 @@ PROGRAM fortranlibtest IMPLICIT NONE INTEGER :: total_error = 0 - INTEGER :: error - INTEGER :: mounting_total_error = 0 - INTEGER :: reopen_total_error = 0 - INTEGER :: fclose_total_error = 0 - INTEGER :: fspace_total_error = 0 - INTEGER :: dataset_total_error = 0 - INTEGER :: extend_dataset_total_error = 0 - INTEGER :: refobj_total_error = 0 - INTEGER :: refreg_total_error = 0 - INTEGER :: dataspace_total_error = 0 - INTEGER :: hyperslab_total_error = 0 - INTEGER :: element_total_error = 0 - INTEGER :: basic_select_total_error = 0 - INTEGER :: total_error_compoundtest = 0 - INTEGER :: basic_datatype_total_error = 0 - INTEGER :: enum_total_error = 0 - INTEGER :: external_total_error = 0 - INTEGER :: multi_file_total_error = 0 - INTEGER :: attribute_total_error = 0 - INTEGER :: group_total_error = 0 + INTEGER :: error + INTEGER :: ret_total_error INTEGER :: majnum, minnum, relnum - CHARACTER(LEN=8) error_string - CHARACTER(LEN=8) :: success = ' PASSED ' - CHARACTER(LEN=8) :: failure = '*FAILED*' - CHARACTER(LEN=4) :: e_format ='(8a)' LOGICAL :: cleanup = .TRUE. - ! LOGICAL :: cleanup = .FALSE. +! LOGICAL :: cleanup = .FALSE. CALL h5open_f(error) WRITE(*,*) ' ========================== ' @@ -68,65 +46,49 @@ PROGRAM fortranlibtest ENDIF WRITE(*,*) - error_string = failure - CALL file_space(cleanup, fspace_total_error) - IF (fspace_total_error == 0) error_string = success - WRITE(*, fmt = '(21a)', advance = 'no') ' Testing file free space' - WRITE(*, fmt = '(52x,a)', advance = 'no') ' ' - WRITE(*, fmt = e_format) error_string - total_error = total_error + fspace_total_error - - ! write(*,*) - ! write(*,*) '=========================================' - ! write(*,*) 'Testing ATTRIBUTE interface ' - ! write(*,*) '=========================================' - - error_string = failure - CALL attribute_test_1_8(cleanup, attribute_total_error) - WRITE(*, fmt = '(15a)', advance = 'no') ' Testing attributes' - WRITE(*, fmt = '(57x,a)', advance = 'no') ' ' - IF (attribute_total_error == 0) error_string = success - WRITE(*, fmt = e_format) error_string - total_error = total_error + attribute_total_error - - CALL group_test(cleanup, group_total_error) - WRITE(*, fmt = '(15a)', advance = 'no') ' Testing groups' - WRITE(*, fmt = '(61x,a)', advance = 'no') ' ' - IF (group_total_error == 0) error_string = success - WRITE(*, fmt = e_format) error_string - total_error = total_error + group_total_error - - CALL test_h5o(cleanup, group_total_error ) - WRITE(*, fmt = '(15a)', advance = 'no') ' Testing object interface' - WRITE(*, fmt = '(51x,a)', advance = 'no') ' ' - IF (group_total_error == 0) error_string = success - WRITE(*, fmt = e_format) error_string - total_error = total_error + group_total_error - - CALL dtransform(cleanup, group_total_error) - WRITE(*, fmt = '(15a)', advance = 'no') ' Testing data transform' - WRITE(*, fmt = '(53x,a)', advance = 'no') ' ' - IF (group_total_error == 0) error_string = success - WRITE(*, fmt = e_format) error_string - total_error = total_error + group_total_error - - CALL test_genprop_basic_class(cleanup, group_total_error) - WRITE(*, fmt = '(30a)', advance = 'no') ' Testing basic generic properties' - WRITE(*, fmt = '(43x,a)', advance = 'no') ' ' - IF (group_total_error == 0) error_string = success - WRITE(*, fmt = e_format) error_string - total_error = total_error + group_total_error - - CALL test_h5s_encode(cleanup, group_total_error) - WRITE(*, fmt = '(15a)', advance = 'no') ' Testing dataspace encoding and decoding' - WRITE(*, fmt = '(36x,a)', advance = 'no') ' ' - IF (group_total_error == 0) error_string = success - WRITE(*, fmt = e_format) error_string - total_error = total_error + group_total_error + ret_total_error = 0 + CALL file_space(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing file free space', & + total_error) -! CALL test_hard_query(group_total_error) + ret_total_error = 0 + CALL attribute_test_1_8(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing attributes', & + total_error) + + ret_total_error = 0 + CALL group_test(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing groups', & + total_error) - total_error = total_error + group_total_error + ret_total_error = 0 + CALL test_h5o(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing object interface', & + total_error) + + ret_total_error = 0 + CALL dtransform(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing data transform', & + total_error) + + ret_total_error = 0 + CALL test_genprop_basic_class(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing basic generic properties', & + total_error) + + ret_total_error = 0 + CALL test_h5s_encode(cleanup, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing dataspace encoding and decoding', & + total_error) + +! CALL test_hard_query(group_total_error) WRITE(*,*) @@ -150,8 +112,8 @@ SUBROUTINE dtransform(cleanup, total_error) LOGICAL, INTENT(IN) :: cleanup INTEGER, INTENT(INOUT) :: total_error - INTEGER(HID_T) :: dxpl_id_c_to_f, dxpl_id_c_to_f_copy - INTEGER(HID_T) :: dxpl_id_simple, dxpl_id_polynomial, dxpl_id_polynomial_copy, dxpl_id_utrans_inv, file_id + INTEGER(HID_T) :: dxpl_id_c_to_f + INTEGER(HID_T) :: file_id CHARACTER(LEN=15), PARAMETER :: c_to_f = "(9/5.0)*x + 123" INTEGER :: error @@ -217,7 +179,6 @@ SUBROUTINE test_genprop_basic_class(cleanup, total_error) INTEGER(HID_T) :: cid1 !/* Generic Property class ID */ INTEGER(HID_T) :: cid2 !/* Generic Property class ID */ - INTEGER(HID_T) :: cid3 !/* Generic Property class ID */ CHARACTER(LEN=7) :: CLASS1_NAME = "Class 1" CHARACTER(LEN=7) :: name ! /* Name of class */ @@ -305,10 +266,10 @@ SUBROUTINE test_h5s_encode(cleanup, total_error) LOGICAL, INTENT(IN) :: cleanup INTEGER, INTENT(INOUT) :: total_error - INTEGER(hid_t) :: sid1, sid2, sid3! /* Dataspace ID */ - INTEGER(hid_t) :: decoded_sid1, decoded_sid2, decoded_sid3 + INTEGER(hid_t) :: sid1, sid3! /* Dataspace ID */ + INTEGER(hid_t) :: decoded_sid1, decoded_sid3 INTEGER :: rank !/* LOGICAL rank of dataspace */ - INTEGER(size_t) :: sbuf_size=0, null_size=0, scalar_size=0 + INTEGER(size_t) :: sbuf_size=0, scalar_size=0 ! Make sure the size is large, need variable length in fortran 2003 CHARACTER(LEN=288) :: sbuf @@ -406,41 +367,6 @@ SUBROUTINE test_h5s_encode(cleanup, total_error) CALL h5sclose_f(decoded_sid1, error) CALL check("h5sclose_f", error, total_error) -!!$ -!!$ ret = H5Sclose(decoded_sid1); -!!$ CHECK(ret, FAIL, "H5Sclose"); -!!$ -!!$ /*------------------------------------------------------------------------- -!!$ * Test encoding and decoding of null dataspace. -!!$ *------------------------------------------------------------------------- -!!$ */ -!!$ sid2 = H5Screate(H5S_NULL); -!!$ CHECK(sid2, FAIL, "H5Screate"); -!!$ -!!$ /* Encode null data space in a buffer */ -!!$ ret = H5Sencode(sid2, NULL, &null_size); -!!$ CHECK(ret, FAIL, "H5Sencode"); -!!$ -!!$ if(null_size>0) -!!$ null_sbuf = (unsigned char*)HDcalloc((size_t)1, null_size); -!!$ -!!$ ret = H5Sencode(sid2, null_sbuf, &null_size); -!!$ CHECK(ret, FAIL, "H5Sencode"); -!!$ -!!$ /* Decode from the dataspace buffer and return an object handle */ -!!$ decoded_sid2=H5Sdecode(null_sbuf); -!!$ CHECK(decoded_sid2, FAIL, "H5Sdecode"); -!!$ -!!$ /* Verify decoded dataspace */ -!!$ space_type = H5Sget_simple_extent_type(decoded_sid2); -!!$ VERIFY(space_type, H5S_NULL, "H5Sget_simple_extent_type"); -!!$ -!!$ ret = H5Sclose(sid2); -!!$ CHECK(ret, FAIL, "H5Sclose"); -!!$ -!!$ ret = H5Sclose(decoded_sid2); -!!$ CHECK(ret, FAIL, "H5Sclose"); -!!$ ! /*------------------------------------------------------------------------- ! * Test encoding and decoding of scalar dataspace. ! *------------------------------------------------------------------------- @@ -491,477 +417,3 @@ SUBROUTINE test_h5s_encode(cleanup, total_error) END SUBROUTINE test_h5s_encode -!/*------------------------------------------------------------------------- -! * Function: test_hard_query -! * -! * Purpose: Tests H5Tcompiler_conv() for querying whether a conversion is -! * a hard one. -! * -! * Return: Success: 0 -! * -! * Failure: number of errors -! * -! * Programmer: Raymond Lu -! * Friday, Sept 2, 2005 -! * -! * Modifications: -! * -! *------------------------------------------------------------------------- -! */ - -!!$SUBROUTINE test_hard_query(total_error) -!!$ -!!$ USE HDF5 ! This module contains all necessary modules -!!$ -!!$ IMPLICIT NONE -!!$ INTEGER, INTENT(INOUT) :: total_error -!!$ -!!$ INTEGER :: error -!!$ LOGICAL :: flag -!!$ -!!$ WRITE(*,*) "query functions of compiler conversion" -!!$ -!!$ ! /* Verify the conversion from int to float is a hard conversion. */ -!!$ -!!$ CALL H5Tcompiler_conv_f(H5T_INTEGER_F, H5T_FLOAT_F, flag, error) -!!$ CALL check("H5Tcompiler_conv", error, total_error) -!!$ CALL VerifyLogical("H5Tcompiler_conv", flag, .TRUE.,total_error) - -!!$ if((ret = H5Tcompiler_conv(H5T_NATIVE_INT, H5T_NATIVE_FLOAT))!=TRUE) { -!!$ H5_FAILED(); -!!$ printf("Can't query conversion function\n"); -!!$ goto error; -!!$ } - -!!$ /* Unregister the hard conversion from int to float. Verify the conversion -!!$ * is a soft conversion. */ -!!$ H5Tunregister(H5T_PERS_HARD, NULL, H5T_NATIVE_INT, H5T_NATIVE_FLOAT, H5T_conv_int_float); -!!$ if((ret = H5Tcompiler_conv(H5T_NATIVE_INT, H5T_NATIVE_FLOAT))!=FALSE) { -!!$ H5_FAILED(); -!!$ printf("Can't query conversion function\n"); -!!$ goto error; -!!$ } -!!$ -!!$ /* Register the hard conversion from int to float. Verify the conversion -!!$ * is a hard conversion. */ -!!$ H5Tregister(H5T_PERS_HARD, "int_flt", H5T_NATIVE_INT, H5T_NATIVE_FLOAT, H5T_conv_int_float); -!!$ if((ret = H5Tcompiler_conv(H5T_NATIVE_INT, H5T_NATIVE_FLOAT))!=TRUE) { -!!$ H5_FAILED(); -!!$ printf("Can't query conversion function\n"); -!!$ goto error; -!!$ } -!!$ -!!$ PASSED(); -!!$ reset_hdf5(); -!!$ -!!$ return 0; -!!$ -!!$END SUBROUTINE test_hard_query - - -!/*------------------------------------------------------------------------- -! * Function: test_encode -! * -! * Purpose: Tests functions of encoding and decoding datatype. -! * -! * Return: Success: 0 -! * -! * Failure: number of errors -! * -! * Programmer: Raymond Lu -! * July 14, 2004 -! * -! * Modifications: -! * -! *------------------------------------------------------------------------- -! */ - -!!$SUBROUTINE test_encode(total_error) -!!$ -!!$ USE HDF5 ! This module contains all necessary modules -!!$ struct s1 { -!!$ int a; -!!$ float b; -!!$ long c; -!!$ double d; -!!$ }; -!!$ IMPLICIT NONE -!!$ INTEGER, INTENT(INOUT) :: total_error -!!$ INTEGER(SIZE_T), PARAMETER :: sizechar = 1024 -!!$ INTEGER :: error -!!$ INTEGER(hid_t) :: file=-1, tid1=-1, tid2=-1 -!!$ INTEGER(hid_t) :: decoded_tid1=-1, decoded_tid2=-1 -!!$ CHARACTER(LEN=1024) :: filename = 'encode.h5' -!!$ char compnd_type[]="Compound_type", enum_type[]="Enum_type"; -!!$ short enum_val; -!!$ size_t cmpd_buf_size = 0; -!!$ size_t enum_buf_size = 0; -!!$ unsigned char *cmpd_buf=NULL, *enum_buf=NULL; -!!$ herr_t ret; -!!$ INTEGER(HID_T) :: dt5_id ! Memory datatype identifier -!!$ -!!$ INTEGER(SIZE_T) :: type_sizec ! Size of the character datatype -!!$ -!!$ WRITE(*,*) "functions of encoding and decoding datatypes" -!!$ -!!$ !/* Create File */ -!!$ -!!$ CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file, error) -!!$ CALL check("H5Fcreate_f", error, total_error) -!!$ -!!$ !/*----------------------------------------------------------------------- -!!$ ! * Create compound and enumerate datatypes -!!$ ! *----------------------------------------------------------------------- -!!$ ! */ -!!$ -!!$ ! /* Create a compound datatype */ -!!$ CALL h5tcopy_f(H5T_NATIVE_CHARACTER, dt5_id, error) -!!$ CALL check("h5tcopy_f", error, total_error) -!!$ sizechar = 2 -!!$ CALL h5tset_size_f(dt5_id, sizechar, error) -!!$ CALL check("h5tset_size_f", error, total_error) -!!$ CALL h5tget_size_f(dt5_id, type_sizec, error) -!!$ CALL check("h5tget_size_f", error, total_error) -!!$ -!!$ CALL h5tget_size_f(H5T_NATIVE_INTEGER, type_sizec, error) -!!$ CALL check("h5tget_size_f", error, total_error) -!!$ CALL h5tcreate_f(H5T_COMPOUND_F, type_sizec, dtype_id, error) -!!$ -!!$ -!!$ if((tid1=H5Tcreate(H5T_COMPOUND, sizeof(struct s1))) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't create datatype!\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tinsert(tid1, "a", HOFFSET(struct s1, a), H5T_NATIVE_INT) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field 'a'\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tinsert(tid1, "b", HOFFSET(struct s1, b), H5T_NATIVE_FLOAT) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field 'b'\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tinsert(tid1, "c", HOFFSET(struct s1, c), H5T_NATIVE_LONG) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field 'c'\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tinsert(tid1, "d", HOFFSET(struct s1, d), H5T_NATIVE_DOUBLE) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field 'd'\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Create a enumerate datatype */ -!!$ if((tid2=H5Tcreate(H5T_ENUM, sizeof(short))) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't create enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tenum_insert(tid2, "RED", (enum_val=0,&enum_val)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field into enumeration type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tenum_insert(tid2, "GREEN", (enum_val=1,&enum_val)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field into enumeration type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tenum_insert(tid2, "BLUE", (enum_val=2,&enum_val)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field into enumeration type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tenum_insert(tid2, "ORANGE", (enum_val=3,&enum_val)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field into enumeration type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tenum_insert(tid2, "YELLOW", (enum_val=4,&enum_val)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't insert field into enumeration type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /*----------------------------------------------------------------------- -!!$ * Test encoding and decoding compound and enumerate datatypes -!!$ *----------------------------------------------------------------------- -!!$ */ -!!$ /* Encode compound type in a buffer */ -!!$ if(H5Tencode(tid1, NULL, &cmpd_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode compound type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ if(cmpd_buf_size>0) -!!$ cmpd_buf = (unsigned char*)calloc(1, cmpd_buf_size); -!!$ -!!$ /* Try decoding bogus buffer */ -!!$ H5E_BEGIN_TRY { -!!$ ret = H5Tdecode(cmpd_buf); -!!$ } H5E_END_TRY; -!!$ if(ret!=FAIL) { -!!$ H5_FAILED(); -!!$ printf("Decoded bogus buffer!\n"); -!!$ goto error; -!!$ } -!!$ -!!$ if(H5Tencode(tid1, cmpd_buf, &cmpd_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode compound type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Decode from the compound buffer and return an object handle */ -!!$ if((decoded_tid1 = H5Tdecode(cmpd_buf)) < 0) -!!$ FAIL_PUTS_ERROR("Can't decode compound type\n") -!!$ -!!$ /* Verify that the datatype was copied exactly */ -!!$ if(H5Tequal(decoded_tid1, tid1)<=0) { -!!$ H5_FAILED(); -!!$ printf("Datatype wasn't encoded & decoded identically\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Query member number and member index by name, for compound type. */ -!!$ if(H5Tget_nmembers(decoded_tid1)!=4) { -!!$ H5_FAILED(); -!!$ printf("Can't get member number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tget_member_index(decoded_tid1, "c")!=2) { -!!$ H5_FAILED(); -!!$ printf("Can't get correct index number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ -!!$ /* Encode enumerate type in a buffer */ -!!$ if(H5Tencode(tid2, NULL, &enum_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ if(enum_buf_size>0) -!!$ enum_buf = (unsigned char*)calloc(1, enum_buf_size); -!!$ -!!$ if(H5Tencode(tid2, enum_buf, &enum_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Decode from the enumerate buffer and return an object handle */ -!!$ if((decoded_tid2=H5Tdecode(enum_buf)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't decode enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Verify that the datatype was copied exactly */ -!!$ if(H5Tequal(decoded_tid2, tid2)<=0) { -!!$ H5_FAILED(); -!!$ printf("Datatype wasn't encoded & decoded identically\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Query member number and member index by name, for enumeration type. */ -!!$ if(H5Tget_nmembers(decoded_tid2)!=5) { -!!$ H5_FAILED(); -!!$ printf("Can't get member number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tget_member_index(decoded_tid2, "ORANGE") != 3) { -!!$ H5_FAILED(); -!!$ printf("Can't get correct index number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /*----------------------------------------------------------------------- -!!$ * Commit and reopen the compound and enumerate datatypes -!!$ *----------------------------------------------------------------------- -!!$ */ -!!$ /* Commit compound datatype and close it */ -!!$ if(H5Tcommit2(file, compnd_type, tid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't commit compound datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tclose(tid1) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tclose(decoded_tid1) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ free(cmpd_buf); -!!$ cmpd_buf_size = 0; -!!$ -!!$ /* Commit enumeration datatype and close it */ -!!$ if(H5Tcommit2(file, enum_type, tid2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't commit compound datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tclose(tid2) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tclose(decoded_tid2) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ free(enum_buf); -!!$ enum_buf_size = 0; -!!$ -!!$ /* Open the dataytpe for query */ -!!$ if((tid1 = H5Topen2(file, compnd_type, H5P_DEFAULT)) < 0) -!!$ FAIL_STACK_ERROR -!!$ if((tid2 = H5Topen2(file, enum_type, H5P_DEFAULT)) < 0) -!!$ FAIL_STACK_ERROR -!!$ -!!$ -!!$ /* Encode compound type in a buffer */ -!!$ if(H5Tencode(tid1, NULL, &cmpd_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode compound type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ if(cmpd_buf_size>0) -!!$ cmpd_buf = (unsigned char*)calloc(1, cmpd_buf_size); -!!$ -!!$ if(H5Tencode(tid1, cmpd_buf, &cmpd_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode compound type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Decode from the compound buffer and return an object handle */ -!!$ if((decoded_tid1 = H5Tdecode(cmpd_buf)) < 0) -!!$ FAIL_PUTS_ERROR("Can't decode compound type\n") -!!$ -!!$ /* Verify that the datatype was copied exactly */ -!!$ if(H5Tequal(decoded_tid1, tid1)<=0) { -!!$ H5_FAILED(); -!!$ printf("Datatype wasn't encoded & decoded identically\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Query member number and member index by name, for compound type. */ -!!$ if(H5Tget_nmembers(decoded_tid1)!=4) { -!!$ H5_FAILED(); -!!$ printf("Can't get member number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tget_member_index(decoded_tid1, "c")!=2) { -!!$ H5_FAILED(); -!!$ printf("Can't get correct index number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /*----------------------------------------------------------------------- -!!$ * Test encoding and decoding compound and enumerate datatypes -!!$ *----------------------------------------------------------------------- -!!$ */ -!!$ /* Encode enumerate type in a buffer */ -!!$ if(H5Tencode(tid2, NULL, &enum_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ if(enum_buf_size>0) -!!$ enum_buf = (unsigned char*)calloc(1, enum_buf_size); -!!$ -!!$ if(H5Tencode(tid2, enum_buf, &enum_buf_size) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't encode enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Decode from the enumerate buffer and return an object handle */ -!!$ if((decoded_tid2=H5Tdecode(enum_buf)) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't decode enumerate type\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Verify that the datatype was copied exactly */ -!!$ if(H5Tequal(decoded_tid2, tid2)<=0) { -!!$ H5_FAILED(); -!!$ printf("Datatype wasn't encoded & decoded identically\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Query member number and member index by name, for enumeration type. */ -!!$ if(H5Tget_nmembers(decoded_tid2)!=5) { -!!$ H5_FAILED(); -!!$ printf("Can't get member number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tget_member_index(decoded_tid2, "ORANGE")!=3) { -!!$ H5_FAILED(); -!!$ printf("Can't get correct index number\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /*----------------------------------------------------------------------- -!!$ * Close and release -!!$ *----------------------------------------------------------------------- -!!$ */ -!!$ /* Close datatype and file */ -!!$ if(H5Tclose(tid1) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tclose(tid2) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ if(H5Tclose(decoded_tid1) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ if(H5Tclose(decoded_tid2) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close datatype\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ if(H5Fclose(file) < 0) { -!!$ H5_FAILED(); -!!$ printf("Can't close file\n"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ free(cmpd_buf); -!!$ free(enum_buf); -!!$ -!!$ PASSED(); -!!$ return 0; -!!$ -!!$ error: -!!$ H5E_BEGIN_TRY { -!!$ H5Tclose (tid1); -!!$ H5Tclose (tid2); -!!$ H5Tclose (decoded_tid1); -!!$ H5Tclose (decoded_tid2); -!!$ H5Fclose (file); -!!$ } H5E_END_TRY; -!!$ return 1; -!!$} diff --git a/fortran/test/tH5A_1_8.f90 b/fortran/test/tH5A_1_8.f90 index 3a969d3..d45d9e3 100644 --- a/fortran/test/tH5A_1_8.f90 +++ b/fortran/test/tH5A_1_8.f90 @@ -22,7 +22,7 @@ SUBROUTINE attribute_test_1_8(cleanup, total_error) ! USE HDF5 ! This module contains all necessary modules - + IMPLICIT NONE LOGICAL, INTENT(IN) :: cleanup INTEGER, INTENT(INOUT) :: total_error @@ -56,12 +56,13 @@ SUBROUTINE attribute_test_1_8(cleanup, total_error) LOGICAL, DIMENSION(1:2) :: new_format = (/.TRUE.,.FALSE./) LOGICAL, DIMENSION(1:2) :: use_shared = (/.TRUE.,.FALSE./) + INTEGER :: ret_total_error ! ******************** ! test_attr equivelent ! ******************** - WRITE(*,*) "TESTING ATTRIBUTES" +! WRITE(*,*) "TESTING ATTRIBUTES" CALL H5Pcreate_f(H5P_FILE_ACCESS_F,fapl,error) CALL check("h5Pcreate_f",error,total_error) @@ -81,14 +82,20 @@ SUBROUTINE attribute_test_1_8(cleanup, total_error) CALL check(" H5Pset_shared_mesg_index_f",error, total_error) DO i = 1, 2 + IF (new_format(i)) THEN - WRITE(*,*) " - Testing with new file format" + WRITE(*,'(1X,A)') "Testing with new file format:" my_fapl = fapl2 ELSE - WRITE(*,*) " - Testing with old file format" + WRITE(*,'(1X,A)') "Testing with old file format:" my_fapl = fapl END IF - CALL test_attr_basic_write(my_fapl, total_error) + ret_total_error = 0 + CALL test_attr_basic_write(my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Tests INT attributes on both datasets and groups', & + total_error) + !!$ CALL test_attr_basic_read(my_fapl) !!$ CALL test_attr_flush(my_fapl) !!$ CALL test_attr_plist(my_fapl) ! this is next @@ -104,39 +111,88 @@ SUBROUTINE attribute_test_1_8(cleanup, total_error) IF(new_format(i)) THEN DO j = 1, 2 IF (use_shared(j)) THEN - WRITE(*,*) " - Testing with shared attributes" + WRITE(*,*) " - Testing with shared attributes:" my_fcpl = fcpl2 ELSE - WRITE(*,*) " - Testing without shared attributes" + WRITE(*,*) " - Testing without shared attributes:" my_fcpl = fcpl END IF !!$ CALL test_attr_dense_create(my_fcpl, my_fapl) - CALL test_attr_dense_open(my_fcpl, my_fapl, total_error) + ret_total_error = 0 + CALL test_attr_dense_open(my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing INT attributes on both datasets and groups', & + total_error) !!$ CALL test_attr_dense_delete(my_fcpl, my_fapl) !!$ CALL test_attr_dense_rename(my_fcpl, my_fapl) !!$ CALL test_attr_dense_unlink(my_fcpl, my_fapl) !!$ CALL test_attr_dense_limits(my_fcpl, my_fapl) !!$ CALL test_attr_big(my_fcpl, my_fapl) - CALL test_attr_null_space(my_fcpl, my_fapl, total_error) + ret_total_error = 0 + CALL test_attr_null_space(my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing storing attribute with "null" dataspace', & + total_error) !!$ CALL test_attr_deprec(fcpl, my_fapl) - CALL test_attr_many(new_format(i), my_fcpl, my_fapl, total_error) - CALL test_attr_corder_create_basic(my_fcpl, my_fapl, total_error) - CALL test_attr_corder_create_compact(my_fcpl, my_fapl, total_error) + ret_total_error = 0 + CALL test_attr_many(new_format(i), my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing storing lots of attributes', & + total_error) + + ret_total_error = 0 + CALL test_attr_corder_create_basic(my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing creating objects with attribute creation order', & + total_error) + + ret_total_error = 0 + CALL test_attr_corder_create_compact(my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing compact storage on objects with attribute creation order', & + total_error) !!$ CALL test_attr_corder_create_dense(my_fcpl, my_fapl) !!$ CALL test_attr_corder_create_reopen(my_fcpl, my_fapl) !!$ CALL test_attr_corder_transition(my_fcpl, my_fapl) !!$ CALL test_attr_corder_delete(my_fcpl, my_fapl) - CALL test_attr_info_by_idx(new_format(i), my_fcpl, my_fapl, total_error) - CALL test_attr_delete_by_idx(new_format(i), my_fcpl, my_fapl, total_error) -!!$ CALL test_attr_iterate2(new_format(i), my_fcpl, my_fapl) -!!$ CALL test_attr_open_by_idx(new_format(i), my_fcpl, my_fapl) -!!$ CALL test_attr_open_by_name(new_format(i), my_fcpl, my_fapl) - CALL test_attr_create_by_name(new_format(i), my_fcpl, my_fapl, total_error) + + ret_total_error = 0 + CALL test_attr_info_by_idx(new_format, my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing querying attribute info by index', & + total_error) + + ret_total_error = 0 + CALL test_attr_delete_by_idx(new_format, my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing deleting attribute by index', & + total_error) + +!!$ CALL test_attr_iterate2(new_format, my_fcpl, my_fapl) +!!$ CALL test_attr_open_by_idx(new_format, my_fcpl, my_fapl) +!!$ CALL test_attr_open_by_name(new_format, my_fcpl, my_fapl) + ret_total_error = 0 + CALL test_attr_create_by_name(new_format(i), my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' - Testing creating attributes by name', & + total_error) + ! /* More complex tests with both "new format" and "shared" attributes */ IF( use_shared(j) ) THEN !!$ CALL test_attr_shared_write(my_fcpl, my_fapl) - CALL test_attr_shared_rename(my_fcpl, my_fapl, total_error) - CALL test_attr_shared_delete(my_fcpl, my_fapl, total_error) + ret_total_error = 0 + CALL test_attr_shared_rename(my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error,& + ' - Testing renaming shared attributes in "compact" & "dense" storage', & + total_error) + + ret_total_error = 0 + CALL test_attr_shared_delete(my_fcpl, my_fapl, ret_total_error) + CALL write_test_status(ret_total_error,& + ' - Testing deleting shared attributes in "compact" & "dense" storage', & + total_error) + + !!$ CALL test_attr_shared_unlink(my_fcpl, my_fapl) END IF !!$ CALL test_attr_bug1(my_fcpl, my_fapl) @@ -155,7 +211,7 @@ SUBROUTINE attribute_test_1_8(cleanup, total_error) !!$ CALL test_attr_bug1(fcpl, my_fapl) END IF - END DO + ENDDO CALL H5Pclose_f(fcpl, error) CALL CHECK("H5Pclose", error,total_error) @@ -171,6 +227,13 @@ END SUBROUTINE attribute_test_1_8 SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) +!/**************************************************************** +!** +!** test_attr_corder_create_compact(): Test basic H5A (attribute) code. +!** Tests compact attribute storage on objects with attribute creation order info +!** +!****************************************************************/ + ! Needed for get_info_by_name USE HDF5 ! This module contains all necessary modules @@ -195,12 +258,7 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) INTEGER, PARAMETER :: NUM_DSETS = 3 INTEGER :: curr_dset -!!$ -!!$! - - - local declarations - - - -!!$ -!!$ INTEGER :: max_compact,min_dense,curr_dset,u -!!$ CHARACTER (LEN=NAME_BUF_SIZE) :: attrname -!!$ + INTEGER(HID_T) :: dset1, dset2, dset3 INTEGER(HID_T) :: my_dataset @@ -221,13 +279,7 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) data_dims = 0 -!!$ INTEGER :: sid -!!$ INTEGER :: attr -!!$ INTEGER :: dcpl -!!$ INTEGER ::is_empty -!!$ INTEGER ::is_dense -!!$ - WRITE(*,*) " - Testing Compact Storage of Attributes with Creation Order Info" +! WRITE(*,*) " - Testing Compact Storage of Attributes with Creation Order Info" ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) CALL check("h5fcreate_f",error,total_error) @@ -237,7 +289,6 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) CALL H5Pset_attr_creation_order_f(dcpl, IOR(H5P_CRT_ORDER_TRACKED_F, H5P_CRT_ORDER_INDEXED_F), error) CALL check("H5Pset_attr_creation_order",error,total_error) -! ret = H5Pset_attr_creation_order(dcpl, (H5P_CRT_ORDER_TRACKED | H5P_CRT_ORDER_INDEXED)); ! /* Query the attribute creation properties */ CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error) @@ -246,8 +297,6 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) CALL h5screate_f(H5S_SCALAR_F, sid, error) CALL check("h5screate_f",error,total_error) -! FIX: need to check optional parameters i.e. h5dcreate1/2_f - CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dset1, error, dcpl_id=dcpl ) CALL check("h5dcreate_f",error,total_error) @@ -257,10 +306,6 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) CALL h5dcreate_f(fid, DSET3_NAME, H5T_NATIVE_CHARACTER, sid, dset3, error, dcpl_id=dcpl ) CALL check("h5dcreate_f",error,total_error) -!!$ dset1 = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT) -!!$ dset2 = H5Dcreate2(fid, DSET2_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT) -!!$ dset3 = H5Dcreate2(fid, DSET3_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, dcpl, H5P_DEFAULT) - DO curr_dset = 0,NUM_DSETS-1 SELECT CASE (curr_dset) CASE (0) @@ -280,9 +325,7 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) ! /* Create attribute */ WRITE(chr2,'(I2.2)') u attrname = 'attr '//chr2 - - ! attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); - ! check with the optional information create2 specs. + CALL h5acreate_f(my_dataset, attrname, H5T_NATIVE_INTEGER, sid, attr, error) CALL check("h5acreate_f",error,total_error) @@ -326,9 +369,6 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl) CALL check("h5open_f",error,total_error) -!!$ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl) -!!$ CALL CHECK(fid, FAIL, "H5Fopen") - CALL h5dopen_f(fid, DSET1_NAME, dset1, error) CALL check("h5dopen_f",error,total_error) CALL h5dopen_f(fid, DSET2_NAME, dset2, error) @@ -399,7 +439,12 @@ SUBROUTINE test_attr_corder_create_compact(fcpl,fapl, total_error) END SUBROUTINE test_attr_corder_create_compact SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) -! -------------------------------------------------- +!/**************************************************************** +!** +!** test_attr_null_space(): Test basic H5A (attribute) code. +!** Tests storing attribute with "null" dataspace +!** +!****************************************************************/ USE HDF5 IMPLICIT NONE @@ -424,7 +469,7 @@ SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) INTEGER(HID_T) :: attr_sid INTEGER(HSIZE_T), DIMENSION(7) :: data_dims - INTEGER(HSIZE_T) :: storage_size ! attributes storage requirements .MSB. + INTEGER(HSIZE_T) :: storage_size ! attributes storage requirements LOGICAL :: f_corder_valid ! Indicates whether the the creation order data is valid for this attribute INTEGER :: corder ! Is a positive integer containing the creation order of the attribute @@ -435,22 +480,17 @@ SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) ! test: H5Sextent_equal_f - data_dims = 0 -! CHARACTER (LEN=NAME_BUF_SIZE) :: attrname - -! /* Output message about test being performed */ - WRITE(*,*) " - Testing Storing Attributes with 'null' dataspace" + ! /* Output message about test being performed */ +! WRITE(*,*) " - Testing Storing Attributes with 'null' dataspace" ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) CALL check("h5fcreate_f",error,total_error) -! /* Close file */ + ! /* Close file */ CALL h5fclose_f(fid, error) CALL check("h5fclose_f",error,total_error) -!!$ empty_filesize = h5_get_file_size(FILENAME) -!!$ IF (empty_filesize < 0) CALL TestErrPrintf("Line %d: file size wrong!\n"C, __LINE__) ! /* Re-open file */ CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error) CALL check("h5open_f",error,total_error) @@ -463,16 +503,12 @@ SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) ! /* Create a dataset */ CALL h5dcreate_f(fid, DSET1_NAME, H5T_NATIVE_CHARACTER, sid, dataset, error) CALL check("h5dcreate_f",error,total_error) -!!$ dataset = H5Dcreate2(fid, DSET1_NAME, H5T_NATIVE_UCHAR, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT) -!!$ CALL CHECK(dataset, FAIL, "H5Dcreate2") ! /* Add attribute with 'null' dataspace */ ! /* Create attribute */ CALL h5acreate_f(dataset, "null attr", H5T_NATIVE_INTEGER, null_sid, attr, error) CALL check("h5acreate_f",error,total_error) -!!$ CALL HDstrcpy(attrname, "null attr") -!!$ attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT) ! /* Try to read data from the attribute */ ! /* (shouldn't fail, but should leave buffer alone) */ value(1) = 103 @@ -496,7 +532,6 @@ SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) CALL check("H5Sextent_equal_f",error,total_error) CALL Verifylogical("H5Sextent_equal_f",equal,.TRUE.,total_error) - !!$ ret = H5Sclose(attr_sid) !!$ CALL CHECK(ret, FAIL, "H5Sclose") @@ -505,78 +540,24 @@ SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) CALL VERIFY("h5aget_storage_size_f",INT(storage_size),0,total_error) CALL h5aget_info_f(attr, f_corder_valid, corder, cset, data_size, error) - CALL VERIFY("h5aget_info_f",INT(data_size),INT(storage_size),total_error) + CALL check("h5aget_info_f", error, total_error) + ! /* Check the attribute's information */ + CALL VERIFY("h5aget_info_f.corder",corder,0,total_error) + CALL VERIFY("h5aget_info_f.cset", cset, H5T_CSET_ASCII_F, total_error) + CALL h5aget_storage_size_f(attr, storage_size, error) + CALL check("h5aget_storage_size_f",error,total_error) + CALL VERIFY("h5aget_info_f.data_size", INT(data_size), INT(storage_size), total_error) CALL h5aclose_f(attr,error) CALL check("h5aclose_f",error,total_error) - - -!!$ CALL HDstrcpy(attrname, "null attr #2") -!!$ attr = H5Acreate2(dataset, attrname, H5T_NATIVE_UINT, null_sid, H5P_DEFAULT, H5P_DEFAULT) -!!$ CALL CHECK(attr, FAIL, "H5Acreate2") -!!$ value = 23 -!!$ ret = H5Awrite(attr, H5T_NATIVE_UINT, value) -!!$ CALL CHECK(ret, FAIL, "H5Awrite") -!!$ CALL VERIFY(value, 23, "H5Awrite") -!!$ ret = H5Aclose(attr) -!!$ CALL CHECK(ret, FAIL, "H5Aclose") -!!$ ret = H5Dclose(dataset) -!!$ CALL CHECK(ret, FAIL, "H5Dclose") -!!$ ret = H5Fclose(fid) -!!$ CALL CHECK(ret, FAIL, "H5Fclose") -!!$ fid = H5Fopen(FILENAME, H5F_ACC_RDWR, fapl) -!!$ CALL CHECK(fid, FAIL, "H5Fopen") -!!$ dataset = H5Dopen2(fid, DSET1_NAME, H5P_DEFAULT) -!!$ CALL CHECK(dataset, FAIL, "H5Dopen2") -!!$ CALL HDstrcpy(attrname, "null attr #2") -!!$ attr = H5Aopen(dataset, attrname, H5P_DEFAULT) -!!$ CALL CHECK(attr, FAIL, "H5Aopen") -!!$ value = 23 -!!$ ret = H5Aread(attr, H5T_NATIVE_UINT, value) -!!$ CALL CHECK(ret, FAIL, "H5Aread") -!!$ CALL VERIFY(value, 23, "H5Aread") -!!$ attr_sid = H5Aget_space(attr) -!!$ CALL CHECK(attr_sid, FAIL, "H5Aget_space") -!!$ cmp = H5Sextent_equal(attr_sid, null_sid) -!!$ CALL CHECK(cmp, FAIL, "H5Sextent_equal") -!!$ CALL VERIFY(cmp, TRUE, "H5Sextent_equal") - CALL H5Sclose_f(attr_sid, error) CALL check("H5Sclose_f",error,total_error) - - -!!$ ret = H5Sclose(attr_sid) -!!$ CALL CHECK(ret, FAIL, "H5Sclose") -!!$ storage_size = H5Aget_storage_size(attr) -!!$ CALL VERIFY(storage_size, 0, "H5Aget_storage_size") -!!$ ret = H5Aget_info(attr, ainfo) -!!$ CALL CHECK(ret, FAIL, "H5Aget_info") -!!$ CALL VERIFY(ainfo%data_size, storage_size, "H5Aget_info") -!!$ ret = H5Aclose(attr) -!!$ CALL CHECK(ret, FAIL, "H5Aclose") -!!$ CALL HDstrcpy(attrname, "null attr") -!!$ attr = H5Aopen(dataset, attrname, H5P_DEFAULT) -!!$ CALL CHECK(attr, FAIL, "H5Aopen") -!!$ value = 23 -!!$ ret = H5Awrite(attr, H5T_NATIVE_UINT, value) -!!$ CALL CHECK(ret, FAIL, "H5Awrite") -!!$ CALL VERIFY(value, 23, "H5Awrite") - - -!!$ CALL H5Aclose_f(attr, error) -!!$ CALL check("H5Aclose_f", error,total_error) -!!$ CALL H5Ddelete_f(fid, DSET1_NAME, H5P_DEFAULT_F, error) -!!$ CALL check("H5Aclose_f", error,total_error) CALL H5Dclose_f(dataset, error) CALL check("H5Dclose_f", error,total_error) -!!$ ret = H5delete(fid, DSET1_NAME, H5P_DEFAULT) -!!$ CALL CHECK(ret, FAIL, "H5Ldelete") - -! TESTING1 CALL H5Fclose_f(fid, error) CALL check("H5Fclose_f", error,total_error) @@ -587,14 +568,18 @@ SUBROUTINE test_attr_null_space(fcpl, fapl, total_error) CALL H5Sclose_f(null_sid, error) CALL check("H5Sclose_f", error,total_error) -!!$ filesize = h5_get_file_size(FILENAME) -!!$ CALL VERIFY(filesize, empty_filesize, "h5_get_file_size") - END SUBROUTINE test_attr_null_space SUBROUTINE test_attr_create_by_name(new_format,fcpl,fapl, total_error) +!/**************************************************************** +!** +!** test_attr_create_by_name(): Test basic H5A (attribute) code. +!** Tests creating attributes by name +!** +!****************************************************************/ + USE HDF5 IMPLICIT NONE @@ -653,11 +638,11 @@ SUBROUTINE test_attr_create_by_name(new_format,fcpl,fapl, total_error) ! /* Loop over using index for creation order value */ DO i = 1, 2 ! /* Print appropriate test message */ - IF(use_index(i))THEN - WRITE(*,*) " - Testing Creating Attributes By Name w/Creation Order Index" - ELSE - WRITE(*,*) " - Testing Creating Attributes By Name w/o Creation Order Index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,*) " - Testing Creating Attributes By Name w/Creation Order Index" +!!$ ELSE +!!$ WRITE(*,*) " - Testing Creating Attributes By Name w/o Creation Order Index" +!!$ ENDIF ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) CALL check("h5fcreate_f",error,total_error) @@ -749,7 +734,6 @@ SUBROUTINE test_attr_create_by_name(new_format,fcpl,fapl, total_error) CALL attr_open_check(fid, dsetname, my_dataset, u, total_error) - ! CHECK(ret, FAIL, "attr_open_check"); ENDDO @@ -765,8 +749,6 @@ SUBROUTINE test_attr_create_by_name(new_format,fcpl,fapl, total_error) CASE (2) my_dataset = dset3 dsetname = DSET3_NAME -! CASE DEFAULT -! CALL HDassert(0.AND."Toomanydatasets!") END SELECT ! /* Create more attributes, to push into dense form */ @@ -850,6 +832,13 @@ END SUBROUTINE test_attr_create_by_name SUBROUTINE test_attr_info_by_idx(new_format, fcpl, fapl, total_error) +!/**************************************************************** +!** +!** test_attr_info_by_idx(): Test basic H5A (attribute) code. +!** Tests querying attribute info by index +!** +!****************************************************************/ + USE HDF5 IMPLICIT NONE @@ -903,17 +892,6 @@ SUBROUTINE test_attr_info_by_idx(new_format, fcpl, fapl, total_error) INTEGER(HSIZE_T) :: htmp data_dims = 0 -!!$ htri_t is_empty; /* Are there any attributes? */ -!!$ htri_t is_dense; /* Are attributes stored densely? */ -!!$ hsize_t nattrs; /* Number of attributes on object */ -!!$ hsize_t name_count; /* # of records in name index */ -!!$ hsize_t corder_count; /* # of records in creation order index */ -!!$ hbool_t use_index; /* Use index on creation order values */ -!!$ char attrname[NAME_BUF_SIZE]; /* Name of attribute */ -!!$ char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ -!!$ unsigned curr_dset; /* Current dataset to work on */ -!!$ unsigned u; /* Local index variable */ -!!$ herr_t ret; /* Generic return value */ ! /* Create dataspace for dataset & attributes */ @@ -936,11 +914,11 @@ SUBROUTINE test_attr_info_by_idx(new_format, fcpl, fapl, total_error) DO i = 1, 2 ! /* Output message about test being performed */ - IF(use_index(i))THEN - WRITE(*,'(A72)') " - Testing Querying Attribute Info By Index w/Creation Order Index" - ELSE - WRITE(*,'(A74)') " - Testing Querying Attribute Info By Index w/o Creation Order Index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(A72)') " - Testing Querying Attribute Info By Index w/Creation Order Index" +!!$ ELSE +!!$ WRITE(*,'(A74)') " - Testing Querying Attribute Info By Index w/o Creation Order Index" +!!$ ENDIF ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) @@ -1052,78 +1030,6 @@ SUBROUTINE test_attr_info_by_idx(new_format, fcpl, fapl, total_error) !CHECK(ret, FAIL, "attr_info_by_idx_check"); ENDDO - ! /* Verify state of object */ -!!$ ret = H5O_num_attrs_test(my_dataset, &nattrs); -!!$ CHECK(ret, FAIL, "H5O_num_attrs_test"); -!!$ VERIFY(nattrs, max_compact, "H5O_num_attrs_test"); -!!$ is_empty = H5O_is_attr_empty_test(my_dataset); -!!$ VERIFY(is_empty, FALSE, "H5O_is_attr_empty_test"); -!!$ is_dense = H5O_is_attr_dense_test(my_dataset); -!!$ VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); - - ! /* Check for out of bound offset queries */ -!!$ ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, &ainfo, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Aget_info_by_idx"); -!!$ ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Aget_info_by_idx"); -!!$ ret = H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Aget_name_by_idx"); -!!$ -!!$ /* Create more attributes, to push into dense form */ -!!$ for(; u < (max_compact * 2); u++) { -!!$ /* Create attribute */ -!!$ sprintf(attrname, "attr %02u", u); -!!$ attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); -!!$ CHECK(attr, FAIL, "H5Acreate2"); -!!$ -!!$ /* Write data into the attribute */ -!!$ ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); -!!$ CHECK(ret, FAIL, "H5Awrite"); -!!$ -!!$ /* Close attribute */ -!!$ ret = H5Aclose(attr); -!!$ CHECK(ret, FAIL, "H5Aclose"); -!!$ -!!$ /* Verify state of object */ -!!$ is_dense = H5O_is_attr_dense_test(my_dataset); -!!$ VERIFY(is_dense, (new_format ? TRUE : FALSE), "H5O_is_attr_dense_test"); -!!$ -!!$ /* Verify information for new attribute */ -!!$ ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); -!!$ CHECK(ret, FAIL, "attr_info_by_idx_check"); -!!$ } /* end for */ -!!$ -!!$ /* Verify state of object */ -!!$ ret = H5O_num_attrs_test(my_dataset, &nattrs); -!!$ CHECK(ret, FAIL, "H5O_num_attrs_test"); -!!$ VERIFY(nattrs, (max_compact * 2), "H5O_num_attrs_test"); -!!$ is_empty = H5O_is_attr_empty_test(my_dataset); -!!$ VERIFY(is_empty, FALSE, "H5O_is_attr_empty_test"); -!!$ is_dense = H5O_is_attr_dense_test(my_dataset); -!!$ VERIFY(is_dense, (new_format ? TRUE : FALSE), "H5O_is_attr_dense_test"); -!!$ -!!$ if(new_format) { -!!$ /* Retrieve & verify # of records in the name & creation order indices */ -!!$ ret = H5O_attr_dense_info_test(my_dataset, &name_count, &corder_count); -!!$ CHECK(ret, FAIL, "H5O_attr_dense_info_test"); -!!$ if(use_index) -!!$ VERIFY(name_count, corder_count, "H5O_attr_dense_info_test"); -!!$ VERIFY(name_count, (max_compact * 2), "H5O_attr_dense_info_test"); -!!$ } /* end if */ -!!$ -!!$ /* Check for out of bound offset queries */ -!!$ ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, &ainfo, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Aget_info_by_idx"); -!!$ ret = H5Aget_info_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)u, &ainfo, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Aget_info_by_idx"); -!!$ ret = H5Aget_name_by_idx(my_dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Aget_name_by_idx"); -!!$ } /* end for */ -!!$ - -!!$ } /* end for */ -!!$ - ENDDO @@ -1173,18 +1079,6 @@ SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error ) CHARACTER(LEN=7) :: tmpname INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T -!!$ -!!$ INTEGER :: const -!!$ INTEGER :: har -!!$ INTEGER :: attrname -!!$ INTEGER :: hsize_t -!!$ INTEGER :: hbool_t -!!$ INTEGER :: se_index -!!$ INTEGER :: old_nerrs -!!$ CHARACTER (LEN=NAME_BUF_SIZE) :: tmpname -!!$ ainfo -!!$ ret -!!$ old_nerrs = GetTestNumErrs() ! /* Verify the information for first attribute, in increasing creation order */ CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, hzero, & @@ -1219,15 +1113,12 @@ SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error ) ! * index. ! */ IF (use_index) THEN - ! CALL HDmemset(ainfo, 0, SIZEOF(ainfo) ! /* Verify the information for first attribute, in native creation order */ CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, hzero, & f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error) - ! CALL HDmemset(ainfo, 0, SIZEOF(ainfo) - ! /* Verify the information for new attribute, in native creation order */ CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, n, & f_corder_valid, corder, cset, data_size, error) @@ -1235,7 +1126,6 @@ SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error ) CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error) ! /* Verify the name for new link, in increasing native order */ - ! CALL HDmemset(tmpname, 0, (size_t)) CALL h5aget_name_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_NATIVE_F, & n, tmpname, error) ! check with no optional parameters CALL check("h5aget_name_by_idx_f",error,total_error) @@ -1253,7 +1143,6 @@ SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error ) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error) - ! CALL HDmemset(ainfo, 0, SIZEOF(ainfo) !EP CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_DEC_F, 0_HSIZE_T, & ! -- CHECK PASSING AN INTEGER CONSTANT IN DIFFERENT FORMS -- @@ -1279,37 +1168,27 @@ SUBROUTINE attr_info_by_idx_check(obj_id, attrname, n, use_index, total_error ) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error) -!!$ CALL HDmemset(tmpname, 0, (size_t)) -!!$ ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) -!!$ CALL CHECK(ret, FAIL, "H5Aget_name_by_idx") -!!$ IF (HDstrcmp(attrname, tmpname)) CALL TestErrPrintf("Line %d: attribute name size wrong!\n"C, __LINE__) -!!$ CALL HDmemset(ainfo, 0, SIZEOF(ainfo) !EP CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, 0_HSIZE_T, & CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, hzero, & f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error) -!!$ CALL HDmemset(ainfo, 0, SIZEOF(ainfo) CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, n, & f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error) -!!$ CALL HDmemset(tmpname, 0, (size_t)) !!$ ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) !!$ CALL CHECK(ret, FAIL, "H5Aget_name_by_idx") !!$ IF (HDstrcmp(attrname, tmpname)) CALL TestErrPrintf("Line %d: attribute name size wrong!\n"C, __LINE__) -!!$ CALL HDmemset(ainfo, 0, SIZEOF(ainfo) CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, n, & f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,0,total_error) -!!$ CALL HDmemset(ainfo, 0, SIZEOF(ainfo) !EP CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, 0_HSIZE_T, & CALL h5aget_info_by_idx_f(obj_id, ".", H5_INDEX_NAME_F, H5_ITER_DEC_F, hzero, & f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_by_idx_f",error,total_error) CALL VERIFY("h5aget_info_by_idx_f",corder,INT(n),total_error) -!!$ CALL HDmemset(tmpname, 0, (size_t)) !!$ ret = H5Aget_name_by_idx(obj_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) !!$ CALL CHECK(ret, FAIL, "H5Aget_name_by_idx") !!$ IF (HDstrcmp(attrname, tmpname)) CALL TestErrPrintf("Line %d: attribute name size wrong!\n"C, __LINE__) @@ -1384,9 +1263,8 @@ SUBROUTINE test_attr_shared_rename( fcpl, fapl, total_error) INTEGER :: arank = 1 ! Attribure rank ! /* Output message about test being performed */ - WRITE(*,*) " - Testing Renaming Shared & Unshared Attributes in Compact & Dense Storage" +! WRITE(*,*) " - Testing Renaming Shared & Unshared Attributes in Compact & Dense Storage" !!$ /* Initialize "big" attribute data */ -!!$ CALL HDmemset(big_value, 1, SIZEOF(big_value) ! /* Create dataspace for dataset */ CALL h5screate_f(H5S_SCALAR_F, sid, error) @@ -1414,26 +1292,18 @@ SUBROUTINE test_attr_shared_rename( fcpl, fapl, total_error) ! /* Make attributes > 500 bytes shared */ CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,1,error) CALL check("H5Pset_shared_mesg_nindexes_f",error, total_error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error) CALL check(" H5Pset_shared_mesg_index_f",error, total_error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); ELSE ! /* Set up copy of file creation property list */ CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,3,error) -!!$ -!!$ CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); -!!$ + ! /* Make attributes > 500 bytes shared */ - CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); -!!$ + CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error) ! /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ CALL H5Pset_shared_mesg_index_f(my_fcpl, 1, H5O_SHMESG_DTYPE_FLAG_F, 1,error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); CALL H5Pset_shared_mesg_index_f(my_fcpl, 2, H5O_SHMESG_SDSPACE_FLAG_F, 1,error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); ENDIF ! /* Create file */ @@ -1447,12 +1317,6 @@ SUBROUTINE test_attr_shared_rename( fcpl, fapl, total_error) CALL h5fclose_f(fid, error) CALL check("h5fclose_f",error,total_error) -!!$ -!!$ /* Get size of file */ -!!$ empty_filesize = h5_get_file_size(FILENAME); -!!$ if(empty_filesize < 0) -!!$ TestErrPrintf("Line %d: file size wrong!\n", __LINE__); - ! /* Re-open file */ CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error,fapl) CALL check("h5open_f",error,total_error) @@ -1531,7 +1395,7 @@ SUBROUTINE test_attr_shared_rename( fcpl, fapl, total_error) CALL h5acreate_f(dataset, attrname, attr_tid, big_sid, attr, error, H5P_DEFAULT_F, H5P_DEFAULT_F) CALL check("h5acreate_f",error,total_error) -!!$ + ! Check that attribute is shared */ !!$ is_shared = H5A_is_shared_test(attr); !!$ VERIFY(is_shared, TRUE, "H5A_is_shared_test"); @@ -1823,6 +1687,13 @@ END SUBROUTINE test_attr_shared_rename SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) +!/**************************************************************** +!** +!** test_attr_delete_by_idx(): Test basic H5A (attribute) code. +!** Tests deleting attribute by index +!** +!****************************************************************/ + USE HDF5 IMPLICIT NONE @@ -1832,9 +1703,9 @@ SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) INTEGER(HID_T), INTENT(IN) :: fapl INTEGER, INTENT(INOUT) :: total_error CHARACTER(LEN=8) :: FileName = "tattr.h5" - INTEGER(HID_T) :: fid - INTEGER(HID_T) :: dcpl - INTEGER(HID_T) :: sid + INTEGER(HID_T) :: fid ! /* HDF5 File ID */ + INTEGER(HID_T) :: dcpl ! /* Dataset creation property list ID */ + INTEGER(HID_T) :: sid ! /* Dataspace ID */ CHARACTER(LEN=8) :: DSET1_NAME = "Dataset1" CHARACTER(LEN=8) :: DSET2_NAME = "Dataset2" @@ -1873,39 +1744,13 @@ SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) INTEGER :: idx_type INTEGER :: order - INTEGER :: u + INTEGER :: u ! /* Local index variable */ INTEGER :: Input1 INTEGER(HSIZE_T) :: hzero = 0_HSIZE_T INTEGER :: minusone = -1 data_dims = 0 -!!$test_attr_delete_by_idx(hbool_t new_format, hid_t fcpl, hid_t fapl) -!!${ -!!$ hid_t fid; /* HDF5 File ID */ -!!$ hid_t dset1, dset2, dset3; /* Dataset IDs */ -!!$ hid_t my_dataset; /* Current dataset ID */ -!!$ hid_t sid; /* Dataspace ID */ -!!$ hid_t attr; /* Attribute ID */ -!!$ hid_t dcpl; /* Dataset creation property list ID */ -!!$ H5A_info_t ainfo; /* Attribute information */ -!!$ unsigned max_compact; /* Maximum # of links to store in group compactly */ -!!$ unsigned min_dense; /* Minimum # of links to store in group "densely" */ -!!$ htri_t is_empty; /* Are there any attributes? */ -!!$ htri_t is_dense; /* Are attributes stored densely? */ -!!$ hsize_t nattrs; /* Number of attributes on object */ -!!$ hsize_t name_count; /* # of records in name index */ -!!$ hsize_t corder_count; /* # of records in creation order index */ -!!$ H5_index_t idx_type; /* Type of index to operate on */ -!!$ H5_iter_order_t order; /* Order within in the index */ -!!$ hbool_t use_index; /* Use index on creation order values */ -!!$ char attrname[NAME_BUF_SIZE]; /* Name of attribute */ -!!$ char tmpname[NAME_BUF_SIZE]; /* Temporary attribute name */ -!!$ unsigned curr_dset; /* Current dataset to work on */ -!!$ unsigned u; /* Local index variable */ -!!$ herr_t ret; /* Generic return value */ -!!$ - ! /* Create dataspace for dataset & attributes */ CALL h5screate_f(H5S_SCALAR_F, sid, error) CALL check("h5screate_f",error,total_error) @@ -1929,39 +1774,39 @@ SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) DO i = 1, 2 ! /* Print appropriate test message */ - IF(idx_type .EQ. H5_INDEX_CRT_ORDER_F)THEN - IF(order .EQ. H5_ITER_INC_F) THEN - IF(use_index(i))THEN - WRITE(*,'(A102)') & - " - Testing Deleting Attribute By Creation Order Index in Increasing Order w/Creation Order Index" - ELSE - WRITE(*,'(A104)') & - " - Testing Deleting Attribute By Creation Order Index in Increasing Order w/o Creation Order Index" - ENDIF - ELSE - IF(use_index(i))THEN - WRITE(*,'(A102)') & - " - Testing Deleting Attribute By Creation Order Index in Decreasing Order w/Creation Order Index" - ELSE - WRITE(*,'(A104)') & - " - Testing Deleting Attribute By Creation Order Index in Decreasing Order w/o Creation Order Index" - ENDIF - ENDIF - ELSE - IF(order .EQ. H5_ITER_INC_F)THEN - IF(use_index(i))THEN - WRITE(*,'(7X,A86)')"- Testing Deleting Attribute By Name Index in Increasing Order w/Creation Order Index" - ELSE - WRITE(*,'(7X,A88)')"- Testing Deleting Attribute By Name Index in Increasing Order w/o Creation Order Index" - ENDIF - ELSE - IF(use_index(i))THEN - WRITE(*,'(7X,A86)') "- Testing Deleting Attribute By Name Index in Decreasing Order w/Creation Order Index" - ELSE - WRITE(*,'(7X,A88)') "- Testing Deleting Attribute By Name Index in Decreasing Order w/o Creation Order Index" - ENDIF - ENDIF - ENDIF +!!$ IF(idx_type .EQ. H5_INDEX_CRT_ORDER_F)THEN +!!$ IF(order .EQ. H5_ITER_INC_F) THEN +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(A102)') & +!!$ " - Testing Deleting Attribute By Creation Order Index in Increasing Order w/Creation Order Index" +!!$ ELSE +!!$ WRITE(*,'(A104)') & +!!$ " - Testing Deleting Attribute By Creation Order Index in Increasing Order w/o Creation Order Index" +!!$ ENDIF +!!$ ELSE +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(A102)') & +!!$ " - Testing Deleting Attribute By Creation Order Index in Decreasing Order w/Creation Order Index" +!!$ ELSE +!!$ WRITE(*,'(A104)') & +!!$ " - Testing Deleting Attribute By Creation Order Index in Decreasing Order w/o Creation Order Index" +!!$ ENDIF +!!$ ENDIF +!!$ ELSE +!!$ IF(order .EQ. H5_ITER_INC_F)THEN +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(7X,A86)')"- Testing Deleting Attribute By Name Index in Increasing Order w/Creation Order Index" +!!$ ELSE +!!$ WRITE(*,'(7X,A88)')"- Testing Deleting Attribute By Name Index in Increasing Order w/o Creation Order Index" +!!$ ENDIF +!!$ ELSE +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(7X,A86)') "- Testing Deleting Attribute By Name Index in Decreasing Order w/Creation Order Index" +!!$ ELSE +!!$ WRITE(*,'(7X,A88)') "- Testing Deleting Attribute By Name Index in Decreasing Order w/o Creation Order Index" +!!$ ENDIF +!!$ ENDIF +!!$ ENDIF ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) @@ -2220,16 +2065,10 @@ SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) CALL H5Adelete_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), error) CALL check("H5Adelete_by_idx_f",error,total_error) - - ! /* Verify the attribute information for first attribute in appropriate order */ -!!$ HDmemset(&ainfo, 0, sizeof(ainfo)); - CALL h5aget_info_by_idx_f(my_dataset, ".", idx_type, order, INT(0,HSIZE_T), & f_corder_valid, corder, cset, data_size, error) - - IF(new_format)THEN IF(order.EQ.H5_ITER_INC_F)THEN CALL VERIFY("H5Aget_info_by_idx_f",corder,u + 1,total_error) @@ -2238,7 +2077,6 @@ SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) CALL VERIFY("H5Aget_info_by_idx_f",corder, ((max_compact * 2) - (u + 2)), total_error) ENDIF - ! /* Verify the name for first attribute in appropriate order */ ! HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); @@ -2271,168 +2109,6 @@ SUBROUTINE test_attr_delete_by_idx(new_format, fcpl, fapl, total_error) CALL VERIFY("H5Adelete_by_idx_f",error,minusone,total_error) ENDDO - -!!$ -!!$ -!!$ /* Delete attributes in middle */ -!!$ -!!$ -!!$ /* Work on all the datasets */ -!!$ for(curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { -!!$ switch(curr_dset) { -!!$ case 0: -!!$ my_dataset = dset1; -!!$ break; -!!$ -!!$ case 1: -!!$ my_dataset = dset2; -!!$ break; -!!$ -!!$ case 2: -!!$ my_dataset = dset3; -!!$ break; -!!$ -!!$ default: -!!$ HDassert(0 && "Too many datasets!"); -!!$ } /* end switch */ -!!$ -!!$ /* Create attributes, to push into dense form */ -!!$ for(u = 0; u < (max_compact * 2); u++) { -!!$ /* Create attribute */ -!!$ sprintf(attrname, "attr %02u", u); -!!$ attr = H5Acreate2(my_dataset, attrname, H5T_NATIVE_UINT, sid, H5P_DEFAULT, H5P_DEFAULT); -!!$ CHECK(attr, FAIL, "H5Acreate2"); -!!$ -!!$ /* Write data into the attribute */ -!!$ ret = H5Awrite(attr, H5T_NATIVE_UINT, &u); -!!$ CHECK(ret, FAIL, "H5Awrite"); -!!$ -!!$ /* Close attribute */ -!!$ ret = H5Aclose(attr); -!!$ CHECK(ret, FAIL, "H5Aclose"); -!!$ -!!$ /* Verify state of object */ -!!$ if(u >= max_compact) { -!!$ is_dense = H5O_is_attr_dense_test(my_dataset); -!!$ VERIFY(is_dense, (new_format ? TRUE : FALSE), "H5O_is_attr_dense_test"); -!!$ } /* end if */ -!!$ -!!$ /* Verify information for new attribute */ -!!$ ret = attr_info_by_idx_check(my_dataset, attrname, (hsize_t)u, use_index); -!!$ CHECK(ret, FAIL, "attr_info_by_idx_check"); -!!$ } /* end for */ -!!$ } /* end for */ -!!$ -!!$ /* Work on all the datasets */ -!!$ for(curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { -!!$ switch(curr_dset) { -!!$ case 0: -!!$ my_dataset = dset1; -!!$ break; -!!$ -!!$ case 1: -!!$ my_dataset = dset2; -!!$ break; -!!$ -!!$ case 2: -!!$ my_dataset = dset3; -!!$ break; -!!$ -!!$ default: -!!$ HDassert(0 && "Too many datasets!"); -!!$ } /* end switch */ -!!$ -!!$ /* Delete every other attribute from dense storage, in appropriate order */ -!!$ for(u = 0; u < max_compact; u++) { -!!$ /* Delete attribute */ -!!$ ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); -!!$ CHECK(ret, FAIL, "H5Adelete_by_idx"); -!!$ -!!$ /* Verify the attribute information for first attribute in appropriate order */ -!!$ HDmemset(&ainfo, 0, sizeof(ainfo)); -!!$ ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, &ainfo, H5P_DEFAULT); -!!$ if(new_format) { -!!$ if(order == H5_ITER_INC) { -!!$ VERIFY(ainfo.corder, ((u * 2) + 1), "H5Aget_info_by_idx"); -!!$ } /* end if */ -!!$ else { -!!$ VERIFY(ainfo.corder, ((max_compact * 2) - ((u * 2) + 2)), "H5Aget_info_by_idx"); -!!$ } /* end else */ -!!$ } /* end if */ -!!$ -!!$ /* Verify the name for first attribute in appropriate order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ ret = H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); -!!$ if(order == H5_ITER_INC) -!!$ sprintf(attrname, "attr %02u", ((u * 2) + 1)); -!!$ else -!!$ sprintf(attrname, "attr %02u", ((max_compact * 2) - ((u * 2) + 2))); -!!$ ret = HDstrcmp(attrname, tmpname); -!!$ VERIFY(ret, 0, "H5Aget_name_by_idx"); -!!$ } /* end for */ -!!$ } /* end for */ -!!$ -!!$ /* Work on all the datasets */ -!!$ for(curr_dset = 0; curr_dset < NUM_DSETS; curr_dset++) { -!!$ switch(curr_dset) { -!!$ case 0: -!!$ my_dataset = dset1; -!!$ break; -!!$ -!!$ case 1: -!!$ my_dataset = dset2; -!!$ break; -!!$ -!!$ case 2: -!!$ my_dataset = dset3; -!!$ break; -!!$ -!!$ default: -!!$ HDassert(0 && "Too many datasets!"); -!!$ } /* end switch */ -!!$ -!!$ /* Delete remaining attributes from dense storage, in appropriate order */ -!!$ for(u = 0; u < (max_compact - 1); u++) { -!!$ /* Delete attribute */ -!!$ ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); -!!$ CHECK(ret, FAIL, "H5Adelete_by_idx"); -!!$ -!!$ /* Verify the attribute information for first attribute in appropriate order */ -!!$ HDmemset(&ainfo, 0, sizeof(ainfo)); -!!$ ret = H5Aget_info_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, &ainfo, H5P_DEFAULT); -!!$ if(new_format) { -!!$ if(order == H5_ITER_INC) { -!!$ VERIFY(ainfo.corder, ((u * 2) + 3), "H5Aget_info_by_idx"); -!!$ } /* end if */ -!!$ else { -!!$ VERIFY(ainfo.corder, ((max_compact * 2) - ((u * 2) + 4)), "H5Aget_info_by_idx"); -!!$ } /* end else */ -!!$ } /* end if */ -!!$ -!!$ /* Verify the name for first attribute in appropriate order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ ret = H5Aget_name_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT); -!!$ if(order == H5_ITER_INC) -!!$ sprintf(attrname, "attr %02u", ((u * 2) + 3)); -!!$ else -!!$ sprintf(attrname, "attr %02u", ((max_compact * 2) - ((u * 2) + 4))); -!!$ ret = HDstrcmp(attrname, tmpname); -!!$ VERIFY(ret, 0, "H5Aget_name_by_idx"); -!!$ } /* end for */ -!!$ -!!$ /* Delete last attribute */ -!!$ ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); -!!$ CHECK(ret, FAIL, "H5Adelete_by_idx"); -!!$ -!!$ /* Verify state of attribute storage (empty) */ -!!$ is_empty = H5O_is_attr_empty_test(my_dataset); -!!$ VERIFY(is_empty, TRUE, "H5O_is_attr_empty_test"); -!!$ -!!$ /* Check for deletion on empty attribute storage again */ -!!$ ret = H5Adelete_by_idx(my_dataset, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); -!!$ VERIFY(ret, FAIL, "H5Adelete_by_idx"); -!!$ } /* end for */ - ! /* Close Datasets */ CALL h5dclose_f(dset1, error) CALL check("h5dclose_f",error,total_error) @@ -2517,11 +2193,9 @@ SUBROUTINE test_attr_shared_delete(fcpl, fapl, total_error) INTEGER :: arank = 1 ! Attribure rank ! /* Output message about test being performed */ - WRITE(*,*) " - Testing Deleting Shared & Unshared Attributes in Compact & Dense Storage" +! WRITE(*,*) " - Testing Deleting Shared & Unshared Attributes in Compact & Dense Storage" ! /* Initialize "big" attribute DATA */ -!!$ HDmemset(big_value, 1, sizeof(big_value)); -!!$ ! /* Create dataspace for dataset */ CALL h5screate_f(H5S_SCALAR_F, sid, error) CALL check("h5screate_f",error,total_error) @@ -2558,16 +2232,10 @@ SUBROUTINE test_attr_shared_delete(fcpl, fapl, total_error) ELSE ! /* Set up copy of file creation property list */ CALL H5Pset_shared_mesg_nindexes_f(my_fcpl,3,error) -!!$ -!!$ CHECK_I(ret, "H5Pset_shared_mesg_nindexes"); -!!$ ! /* Make attributes > 500 bytes shared */ CALL H5Pset_shared_mesg_index_f(my_fcpl, 0, H5O_SHMESG_ATTR_FLAG_F, 500,error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); -!!$ ! /* Make datatypes & dataspaces > 1 byte shared (i.e. all of them :-) */ CALL H5Pset_shared_mesg_index_f(my_fcpl, 1, H5O_SHMESG_DTYPE_FLAG_F, 1,error) -!!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); CALL H5Pset_shared_mesg_index_f(my_fcpl, 2, H5O_SHMESG_SDSPACE_FLAG_F, 1,error) !!$ CHECK_I(ret, "H5Pset_shared_mesg_index"); ENDIF @@ -2582,11 +2250,6 @@ SUBROUTINE test_attr_shared_delete(fcpl, fapl, total_error) ! /* Close file */ CALL h5fclose_f(fid, error) CALL check("h5fclose_f",error,total_error) -!!$ -!!$ /* Get size of file */ -!!$ empty_filesize = h5_get_file_size(FILENAME); -!!$ if(empty_filesize < 0) -!!$ TestErrPrintf("Line %d: file size wrong!\n", __LINE__); ! /* Re-open file */ CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error,fapl) @@ -2924,7 +2587,7 @@ SUBROUTINE test_attr_dense_open( fcpl, fapl, total_error) data_dims = 0 ! /* Output message about test being performed */ - WRITE(*,*) " - Testing Opening Attributes in Dense Storage" +! WRITE(*,*) " - Testing Opening Attributes in Dense Storage" ! /* Create file */ @@ -2936,10 +2599,6 @@ SUBROUTINE test_attr_dense_open( fcpl, fapl, total_error) CALL check("h5fclose_f",error,total_error) - ! /* Get size of file */ -!!$ empty_filesize = h5_get_file_size(FILENAME); -!!$ if(empty_filesize < 0) -!!$ TestErrPrintf("Line %d: file size wrong!\n", __LINE__); ! /* Re-open file */ CALL h5fopen_f(FileName, H5F_ACC_RDWR_F, fid, error, fapl) @@ -3118,8 +2777,6 @@ SUBROUTINE test_attr_dense_verify(loc_id, max_attr, total_error) DO u=0, max_attr-1 -! size_t name_len; /* Length of attribute name */ -! char check_name[ATTR_NAME_LEN]; /* Buffer for checking attribute names */ ! /* Open attribute */ @@ -3182,7 +2839,7 @@ SUBROUTINE test_attr_corder_create_basic( fcpl, fapl, total_error ) INTEGER :: minusone = -1 ! /* Output message about test being performed */ - WRITE(*,*) " - Testing Basic Code for Attributes with Creation Order Info" +! WRITE(*,*) " - Testing Basic Code for Attributes with Creation Order Info" ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) @@ -3226,11 +2883,6 @@ SUBROUTINE test_attr_corder_create_basic( fcpl, fapl, total_error ) CALL h5sclose_f(sid, error) CALL check("h5sclose_f",error,total_error) - ! /* Check on dataset's attribute storage status */ -!!$ is_empty = H5O_is_attr_empty_test(dataset); -!!$ VERIFY(is_empty, TRUE, "H5O_is_attr_empty_test"); -!!$ is_dense = H5O_is_attr_dense_test(dataset); -!!$ VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); ! /* Close Dataset */ CALL h5dclose_f(dataset, error) @@ -3252,11 +2904,6 @@ SUBROUTINE test_attr_corder_create_basic( fcpl, fapl, total_error ) CALL h5dopen_f(fid, DSET1_NAME, dataset, error, H5P_DEFAULT_F ) CALL check("h5dopen_f",error,total_error) - ! /* Check on dataset's attribute storage status */ -!!$ is_empty = H5O_is_attr_empty_test(dataset); -!!$ VERIFY(is_empty, TRUE, "H5O_is_attr_empty_test"); -!!$ is_dense = H5O_is_attr_dense_test(dataset); -!!$ VERIFY(is_dense, FALSE, "H5O_is_attr_dense_test"); ! /* Retrieve dataset creation property list for group */ CALL H5Dget_create_plist_f(dataset, dcpl, error) @@ -3310,7 +2957,6 @@ SUBROUTINE test_attr_basic_write(fapl, total_error) INTEGER(HID_T) :: attr,attr2 !String Attribute identifier INTEGER(HID_T) :: group - INTEGER(HSIZE_T), DIMENSION(7) :: data_dims CHARACTER(LEN=25) :: check_name CHARACTER(LEN=18) :: chr_exact_size @@ -3344,7 +2990,7 @@ SUBROUTINE test_attr_basic_write(fapl, total_error) attr_data1a(3) = -99890 ! /* Output message about test being performed */ - WRITE(*,*) " - Testing Basic Scalar Attribute Writing Functions" +! WRITE(*,*) " - Testing Basic Scalar Attribute Writing Functions" ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid1, error, H5P_DEFAULT_F, fapl) @@ -3529,7 +3175,7 @@ SUBROUTINE test_attr_many(new_format, fcpl, fapl, total_error) data_dims = 0 ! /* Output message about test being performed */ - WRITE(*,*) " - Testing Storing Many Attributes" +! WRITE(*,*) " - Testing Storing Many Attributes" !/* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, fcpl, fapl) @@ -3596,54 +3242,7 @@ SUBROUTINE test_attr_many(new_format, fcpl, fapl, total_error) CALL h5fclose_f(fid, error) CALL check("h5fclose_f",error,total_error) -!!$ /* Re-open the file and check on the attributes */ -!!$ -!!$ /* Re-open file */ -!!$ fid = H5Fopen(FILENAME, H5F_ACC_RDONLY, fapl); -!!$ CHECK(fid, FAIL, "H5Fopen"); -!!$ -!!$ /* Re-open group */ -!!$ gid = H5Gopen2(fid, GROUP1_NAME, H5P_DEFAULT); -!!$ CHECK(gid, FAIL, "H5Gopen2"); -!!$ -!!$ /* Verify attributes */ -!!$ for(u = 0; u < nattr; u++) { -!!$ unsigned value; /* Attribute value */ -!!$ -!!$ sprintf(attrname, "a-%06u", u); -!!$ -!!$ exists = H5Aexists(gid, attrname); -!!$ VERIFY(exists, TRUE, "H5Aexists"); -!!$ -!!$ exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); -!!$ VERIFY(exists, TRUE, "H5Aexists_by_name"); -!!$ -!!$ aid = H5Aopen(gid, attrname, H5P_DEFAULT); -!!$ CHECK(aid, FAIL, "H5Aopen"); -!!$ -!!$ exists = H5Aexists(gid, attrname); -!!$ VERIFY(exists, TRUE, "H5Aexists"); -!!$ -!!$ exists = H5Aexists_by_name(fid, GROUP1_NAME, attrname, H5P_DEFAULT); -!!$ VERIFY(exists, TRUE, "H5Aexists_by_name"); -!!$ -!!$ ret = H5Aread(aid, H5T_NATIVE_UINT, &value); -!!$ CHECK(ret, FAIL, "H5Aread"); -!!$ VERIFY(value, u, "H5Aread"); -!!$ -!!$ ret = H5Aclose(aid); -!!$ CHECK(ret, FAIL, "H5Aclose"); -!!$ } /* end for */ -!!$ - ! /* Close group */ -!!$ CALL H5Gclose_f(gid, error) -!!$ CALL check("h5gclose_f",error,total_error) - - ! /* Close file */ -!!$ CALL h5fclose_f(fid, error) -!!$ CALL check("h5fclose_f",error,total_error) - -! /* Close dataspaces */ + ! /* Close dataspaces */ CALL h5sclose_f(sid, error) CALL check("h5sclose_f",error,total_error) @@ -3657,8 +3256,8 @@ END SUBROUTINE test_attr_many ! * Return: Success: 0 ! * Failure: -1 ! * -! * Programmer: Quincey Koziol -! * Wednesday, February 21, 2007 +! * Programmer: Fortran version (M.S. Breitenfeld) +! * March 21, 2008 ! * ! *------------------------------------------------------------------------- ! */ @@ -3683,6 +3282,7 @@ SUBROUTINE attr_open_check(fid, dsetname, obj_id, max_attrs, total_error ) INTEGER :: cset ! Indicates the character set used for the attribute’s name INTEGER(HSIZE_T) :: data_size ! indicates the size, in the number of characters + INTEGER(HSIZE_T) :: storage_size ! attributes storage requirements CHARACTER(LEN=2) :: chr2 INTEGER(HID_T) attr_id ! /* Open each attribute on object by index and check that it's the correct one */ @@ -3702,8 +3302,16 @@ SUBROUTINE attr_open_check(fid, dsetname, obj_id, max_attrs, total_error ) CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_f",error,total_error) - ! /* Check that the object is the correct one */ - CALL VERIFY("h5aget_info_f",corder,u,total_error) + + ! /* Check that the object's attributes are correct */ + CALL VERIFY("h5aget_info_f.corder",corder,u,total_error) + CALL Verifylogical("h5aget_info_f.corder_valid",f_corder_valid,.TRUE.,total_error) + CALL VERIFY("h5aget_info_f.cset", cset, H5T_CSET_ASCII_F, total_error) + CALL h5aget_storage_size_f(attr_id, storage_size, error) + CALL check("h5aget_storage_size_f",error,total_error) + + CALL VERIFY("h5aget_info_f.data_size", INT(data_size), INT(storage_size), total_error) + ! /* Close attribute */ CALL h5aclose_f(attr_id, error) @@ -3716,9 +3324,13 @@ SUBROUTINE attr_open_check(fid, dsetname, obj_id, max_attrs, total_error ) CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_f",error,total_error) - ! /* Get the attribute's information */ + ! /* Check the attribute's information */ CALL VERIFY("h5aget_info_f",corder,u,total_error) - + CALL Verifylogical("h5aget_info_f",f_corder_valid,.TRUE.,total_error) + CALL VERIFY("h5aget_info_f", cset, H5T_CSET_ASCII_F, total_error) + CALL h5aget_storage_size_f(attr_id, storage_size, error) + CALL check("h5aget_storage_size_f",error,total_error) + CALL VERIFY("h5aget_info_f", INT(data_size), INT(storage_size), total_error) ! /* Close attribute */ CALL h5aclose_f(attr_id, error) @@ -3734,8 +3346,13 @@ SUBROUTINE attr_open_check(fid, dsetname, obj_id, max_attrs, total_error ) CALL h5aget_info_f(attr_id, f_corder_valid, corder, cset, data_size, error) CALL check("h5aget_info_f",error,total_error) - ! /* Check that the object is the correct one */ + ! /* Check the attribute's information */ CALL VERIFY("h5aget_info_f",corder,u,total_error) + CALL Verifylogical("h5aget_info_f",f_corder_valid,.TRUE.,total_error) + CALL VERIFY("h5aget_info_f", cset, H5T_CSET_ASCII_F, total_error) + CALL h5aget_storage_size_f(attr_id, storage_size, error) + CALL check("h5aget_storage_size_f",error,total_error) + CALL VERIFY("h5aget_info_f", INT(data_size), INT(storage_size), total_error) ! /* Close attribute */ CALL h5aclose_f(attr_id, error) diff --git a/fortran/test/tH5G_1_8.f90 b/fortran/test/tH5G_1_8.f90 index 2fe39aa..0caec01 100644 --- a/fortran/test/tH5G_1_8.f90 +++ b/fortran/test/tH5G_1_8.f90 @@ -22,9 +22,9 @@ SUBROUTINE group_test(cleanup, total_error) INTEGER(HID_T) :: fapl, fapl2, my_fapl ! /* File access property lists */ - INTEGER :: error + INTEGER :: error, ret_total_error - WRITE(*,*) "TESTING GROUPS" +! WRITE(*,*) "TESTING GROUPS" CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error) CALL check("H5Pcreate_f",error, total_error) @@ -40,19 +40,60 @@ SUBROUTINE group_test(cleanup, total_error) my_fapl = fapl2 - CALL mklinks(fapl2, total_error) - CALL cklinks(fapl2, total_error) + ret_total_error = 0 + CALL mklinks(fapl2, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing building a file with assorted links', & + total_error) + + ret_total_error = 0 + CALL cklinks(fapl2, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing links are correct and building assorted links', & + total_error) + + ret_total_error = 0 + CALL group_info(cleanup, fapl2, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing create group with creation order indices, test querying group info', & + total_error) - CALL group_info(cleanup, fapl2,total_error) ! CALL ud_hard_links(fapl2,total_error) - CALL timestamps(cleanup, fapl2, total_error) - CALL test_move_preserves(fapl2, total_error) - CALL delete_by_idx(cleanup,fapl2, total_error) - CALL test_lcpl(cleanup, fapl, total_error) - - CALL objcopy(fapl, total_error) - - CALL lifecycle(cleanup, fapl2, total_error) + ret_total_error = 0 + CALL timestamps(cleanup, fapl2, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing disabling tracking timestamps for an object', & + total_error) + + ret_total_error = 0 + CALL test_move_preserves(fapl2, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing moving and renaming links preserves their properties', & + total_error) + + ret_total_error = 0 + CALL delete_by_idx(cleanup,fapl2,ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing deleting links by index', & + total_error) + + ret_total_error = 0 + CALL test_lcpl(cleanup, fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing link creation property lists', & + total_error) + + ret_total_error = 0 + CALL objcopy(fapl, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing object copy', & + total_error) + + ret_total_error = 0 + CALL lifecycle(cleanup, fapl2, ret_total_error) + CALL write_test_status(ret_total_error, & + ' Testing adding links to a group follow proper "lifecycle"', & + total_error) IF(cleanup) CALL h5_cleanup_f("TestLinks", H5P_DEFAULT_F, error) CALL check("h5_cleanup_f", error, total_error) @@ -116,7 +157,7 @@ SUBROUTINE group_info(cleanup, fapl, total_error) CHARACTER(LEN=17), PARAMETER :: CORDER_SOFT_GROUP_NAME = "corder_soft_group" INTEGER(HID_T) :: file_id ! /* File ID */ INTEGER :: error ! /* Generic return value */ - + LOGICAL :: mounted LOGICAL :: cleanup ! /* Create group creation property list */ @@ -137,48 +178,48 @@ SUBROUTINE group_info(cleanup, fapl, total_error) IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN IF(iorder == H5_ITER_INC_F)THEN order = H5_ITER_INC_F - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index" +!!$ ENDIF ELSE IF (iorder == H5_ITER_DEC_F) THEN order = H5_ITER_DEC_F - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index" +!!$ ENDIF ELSE order = H5_ITER_NATIVE_F - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index" +!!$ ENDIF ENDIF ELSE IF(iorder == H5_ITER_INC_F)THEN order = H5_ITER_INC_F - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in increasing order w/o creation order index" +!!$ ENDIF ELSE IF (iorder == H5_ITER_DEC_F) THEN order = H5_ITER_DEC_F - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in decreasing order w/o creation order index" +!!$ ENDIF ELSE order = H5_ITER_NATIVE_F - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index" - ENDIF +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in native order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"query group info by creation order index in native order w/o creation order index" +!!$ ENDIF ENDIF END IF @@ -207,7 +248,7 @@ SUBROUTINE group_info(cleanup, fapl, total_error) ! /* Check for out of bound query by index on empty group, should fail */ CALL H5Gget_info_by_idx_f(group_id, ".", H5_INDEX_NAME_F, order, INT(0,HSIZE_T), & storage_type, nlinks, max_corder, error) - CALL VERIFY("H5Gget_info_by_idx", error, -1, total_error) + CALL VERIFY("H5Gget_info_by_idx_f", error, -1, total_error) ! /* Create several links, up to limit of compact form */ DO u = 0, max_compact-1 @@ -221,31 +262,33 @@ SUBROUTINE group_info(cleanup, fapl, total_error) CALL check("H5Gcreate_f", error, total_error) ! /* Retrieve group's information */ - CALL H5Gget_info_f(group_id2, storage_type, nlinks, max_corder, error) + CALL H5Gget_info_f(group_id2, storage_type, nlinks, max_corder, error, mounted) CALL check("H5Gget_info_f", error, total_error) ! /* Check (new/empty) group's information */ CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) CALL VERIFY("H5Gget_info_f", max_corder, 0, total_error) CALL VERIFY("H5Gget_info_f", nlinks, 0, total_error) + CALL verifyLogical("H5Gget_info_f.mounted", mounted,.FALSE.,total_error) ! /* Retrieve group's information */ - CALL H5Gget_info_by_name_f(group_id, objname, storage_type, nlinks, max_corder, error) - CALL check("H5Gget_info_by_name", error, total_error) + CALL H5Gget_info_by_name_f(group_id, objname, storage_type, nlinks, max_corder, error, mounted=mounted) + CALL check("H5Gget_info_by_name_f", error, total_error) ! /* Check (new/empty) group's information */ - CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) - CALL VERIFY("H5Gget_info_f", max_corder, 0, total_error) - CALL VERIFY("H5Gget_info_f", nlinks, 0, total_error) + CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) + CALL VERIFY("H5Gget_info_by_name_f", max_corder, 0, total_error) + CALL VERIFY("H5Gget_info_by_name_f", nlinks, 0, total_error) + CALL verifyLogical("H5Gget_info_by_name_f.mounted", mounted,.FALSE.,total_error) ! /* Retrieve group's information */ CALL H5Gget_info_by_name_f(group_id2, ".", storage_type, nlinks, max_corder, error) CALL check("H5Gget_info_by_name", error, total_error) ! /* Check (new/empty) group's information */ - CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) - CALL VERIFY("H5Gget_info_f", max_corder, 0, total_error) - CALL VERIFY("H5Gget_info_f", nlinks, 0, total_error) + CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) + CALL VERIFY("H5Gget_info_by_name_f", max_corder, 0, total_error) + CALL VERIFY("H5Gget_info_by_name_f", nlinks, 0, total_error) ! /* Create objects in new group created */ DO v = 0, u @@ -286,23 +329,25 @@ SUBROUTINE group_info(cleanup, fapl, total_error) ! /* Check (new) group's information */ CALL VERIFY("H5Gget_info_by_name_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) - CALL VERIFY("H5Gget_info_by_name_f2", max_corder, u+1, total_error) + CALL VERIFY("H5Gget_info_by_name_f", max_corder, u+1, total_error) CALL VERIFY("H5Gget_info_by_name_f", nlinks, u+1, total_error) ! /* Retrieve group's information */ IF(order.NE.H5_ITER_NATIVE_F)THEN IF(order.EQ.H5_ITER_INC_F) THEN CALL H5Gget_info_by_idx_f(group_id, ".", idx_type, order, INT(u,HSIZE_T), & - storage_type, nlinks, max_corder, error,lapl_id=H5P_DEFAULT_F) + storage_type, nlinks, max_corder, error,lapl_id=H5P_DEFAULT_F, mounted=mounted) CALL check("H5Gget_info_by_idx_f", error, total_error) + CALL verifyLogical("H5Gget_info_by_idx_f", mounted,.FALSE.,total_error) ELSE CALL H5Gget_info_by_idx_f(group_id, ".", idx_type, order, INT(0,HSIZE_T), & - storage_type, nlinks, max_corder, error) + storage_type, nlinks, max_corder, error, mounted=mounted) + CALL verifyLogical("H5Gget_info_by_idx_f", mounted,.FALSE.,total_error) CALL check("H5Gget_info_by_idx_f", error, total_error) ENDIF ! /* Check (new) group's information */ CALL VERIFY("H5Gget_info_by_idx_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) - CALL VERIFY("H5Gget_info_by_idx_f33", max_corder, u+1, total_error) + CALL VERIFY("H5Gget_info_by_idx_f", max_corder, u+1, total_error) CALL VERIFY("H5Gget_info_by_idx_f", nlinks, u+1, total_error) ENDIF ! /* Close group created */ @@ -315,7 +360,7 @@ SUBROUTINE group_info(cleanup, fapl, total_error) ! /* Check main group's information */ CALL VERIFY("H5Gget_info_f", storage_type, H5G_STORAGE_TYPE_COMPACT_F, total_error) - CALL VERIFY("H5Gget_info_f2", max_corder, u+1, total_error) + CALL VERIFY("H5Gget_info_f", max_corder, u+1, total_error) CALL VERIFY("H5Gget_info_f", nlinks, u+1, total_error) ! /* Retrieve main group's information, by name */ @@ -351,156 +396,6 @@ SUBROUTINE group_info(cleanup, fapl, total_error) CALL VERIFY("H5Gget_info_f", nlinks, u+1, total_error) ENDDO - ! /* Verify state of group (compact) */ - ! if(H5G_has_links_test(group_id, NULL) != TRUE) TEST_ERROR - - !/* Check for out of bound query by index */ - ! H5E_BEGIN_TRY { - ! ret = H5Gget_info_by_idx(group_id, ".", H5_INDEX_NAME, order, (hsize_t)u, &grp_info, H5P_DEFAULT); - ! } H5E_END_TRY; - ! if(ret >= 0) TEST_ERROR - - ! /* Create more links, to push group into dense form */ -!!$ for(; u < (max_compact * 2); u++) { -!!$ hid_t group_id2, group_id3; /* Group IDs */ -!!$ -!!$ /* Make name for link */ -!!$ sprintf(objname, "filler %02u", u); -!!$ -!!$ /* Create hard link, with group object */ -!!$ if((group_id2 = H5Gcreate2(group_id, objname, H5P_DEFAULT, gcpl_id, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ -!!$ /* Retrieve group's information */ -!!$ if(H5Gget_info(group_id2, &grp_info) < 0) TEST_ERROR -!!$ -!!$ /* Check (new/empty) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_COMPACT) TEST_ERROR -!!$ if(grp_info.max_corder != 0) TEST_ERROR -!!$ if(grp_info.nlinks != 0) TEST_ERROR -!!$ -!!$ /* Retrieve group's information, by name */ -!!$ if(H5Gget_info_by_name(group_id, objname, &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Check (new/empty) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_COMPACT) TEST_ERROR -!!$ if(grp_info.max_corder != 0) TEST_ERROR -!!$ if(grp_info.nlinks != 0) TEST_ERROR -!!$ -!!$ /* Retrieve group's information, by name */ -!!$ if(H5Gget_info_by_name(group_id2, ".", &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Check (new/empty) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_COMPACT) TEST_ERROR -!!$ if(grp_info.max_corder != 0) TEST_ERROR -!!$ if(grp_info.nlinks != 0) TEST_ERROR -!!$ -!!$ -!!$ /* Create objects in new group created */ -!!$ for(v = 0; v <= u; v++) { -!!$ /* Make name for link */ -!!$ sprintf(objname2, "filler %02u", v); -!!$ -!!$ /* Create hard link, with group object */ -!!$ if((group_id3 = H5Gcreate2(group_id2, objname2, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Close group created */ -!!$ if(H5Gclose(group_id3) < 0) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ -!!$ /* Retrieve group's information */ -!!$ if(H5Gget_info(group_id2, &grp_info) < 0) TEST_ERROR -!!$ -!!$ /* Check (new) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ -!!$ /* Retrieve group's information, by name */ -!!$ if(H5Gget_info_by_name(group_id, objname, &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Check (new) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ -!!$ /* Retrieve group's information, by name */ -!!$ if(H5Gget_info_by_name(group_id2, ".", &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Check (new) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ -!!$ -!!$ /* Retrieve group's information */ -!!$ if(order != H5_ITER_NATIVE) { -!!$ if(order == H5_ITER_INC) { -!!$ if(H5Gget_info_by_idx(group_id, ".", idx_type, order, (hsize_t)u, &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ } /* end if */ -!!$ else { -!!$ if(H5Gget_info_by_idx(group_id, ".", idx_type, order, (hsize_t)0, &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ } /* end else */ -!!$ -!!$ /* Check (new) group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Close group created */ -!!$ if(H5Gclose(group_id2) < 0) TEST_ERROR -!!$ -!!$ -!!$ /* Retrieve main group's information */ -!!$ if(H5Gget_info(group_id, &grp_info) < 0) TEST_ERROR -!!$ -!!$ /* Check main group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ -!!$ /* Retrieve main group's information, by name */ -!!$ if(H5Gget_info_by_name(file_id, CORDER_GROUP_NAME, &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Check main group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ -!!$ /* Retrieve main group's information, by name */ -!!$ if(H5Gget_info_by_name(group_id, ".", &grp_info, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Check main group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ -!!$ -!!$ /* Create soft link in another group, to objects in main group */ -!!$ sprintf(valname, "/%s/%s", CORDER_GROUP_NAME, objname); -!!$ if(H5Lcreate_soft(valname, soft_group_id, objname, H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Retrieve soft link group's information, by name */ -!!$ if(H5Gget_info(soft_group_id, &grp_info) < 0) TEST_ERROR -!!$ -!!$ /* Check soft link group's information */ -!!$ if(grp_info.storage_type != H5G_STORAGE_TYPE_DENSE) TEST_ERROR -!!$ if(grp_info.max_corder != (int64_t)(u + 1)) TEST_ERROR -!!$ if(grp_info.nlinks != (hsize_t)(u + 1)) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Verify state of group (dense) */ -!!$ if(H5G_is_new_dense_test(group_id) != TRUE) TEST_ERROR -!!$ -!!$ /* Check for out of bound query by index */ -!!$ H5E_BEGIN_TRY { -!!$ ret = H5Gget_info_by_idx(group_id, ".", H5_INDEX_NAME, order, (hsize_t)u, &grp_info, H5P_DEFAULT); -!!$ } H5E_END_TRY; -!!$ if(ret >= 0) TEST_ERROR - - ! /* Close the groups */ CALL H5Gclose_f(group_id, error) @@ -563,7 +458,7 @@ SUBROUTINE group_info(cleanup, fapl, total_error) INTEGER :: error ! /* Print test message */ - WRITE(*,*) "timestamps on objects" +! WRITE(*,*) "timestamps on objects" ! /* Create group creation property list */ CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl_id, error ) @@ -749,7 +644,7 @@ SUBROUTINE group_info(cleanup, fapl, total_error) INTEGER :: arank = 1 ! Attribure rank INTEGER :: error - WRITE(*,*) "link creation (w/new group format)" +! WRITE(*,*) "link creation (w/new group format)" ! /* Create a file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, file, error, H5P_DEFAULT_F, fapl) @@ -818,7 +713,6 @@ SUBROUTINE group_info(cleanup, fapl, total_error) INTEGER(HID_T):: group_id INTEGER(HID_T):: fcpl_id ! /* Group creation property list ID */ INTEGER(HID_T):: lcpl_id - INTEGER(HID_T):: lcpl2_id !H5O_info_t oinfo; !H5L_info_t linfo; INTEGER :: old_cset @@ -846,7 +740,7 @@ SUBROUTINE group_info(cleanup, fapl, total_error) INTEGER :: error - WRITE(*,*) "moving and copying links preserves their properties (w/new group format)" +! WRITE(*,*) "moving and copying links preserves their properties (w/new group format)" !/* Create a file creation property list with creation order stored for links ! * in the root group @@ -997,165 +891,6 @@ SUBROUTINE group_info(cleanup, fapl, total_error) END SUBROUTINE test_move_preserves -!!$!/*------------------------------------------------------------------------- -!!$! * Function: ud_hard_links -!!$! * -!!$! * Purpose: Check that the functionality of hard links can be duplicated -!!$! * with user-defined links. -!!$! * -!!$! * -!!$! * Programmer: M.S. Breitenfeld -!!$! * February, 2008 -!!$! * -!!$! *------------------------------------------------------------------------- -!!$! */ -!!$! -!!$!/* Callback functions for UD hard links. */ -!!$!/* UD_hard_create increments the object's reference count */ -!!$ -!!$ SUBROUTINE ud_hard_links(fapl, total_error) -!!$ -!!$ USE HDF5 ! This module contains all necessary modules -!!$ -!!$ IMPLICIT NONE -!!$ INTEGER, INTENT(OUT) :: total_error -!!$ INTEGER(HID_T), INTENT(IN) :: fapl -!!$ -!!$ INTEGER(HID_T) :: fid ! /* File ID */ -!!$ INTEGER(HID_T) :: gid ! /* Group IDs */ -!!$ -!!$ CHARACTER(LEN=10) :: objname = 'objname.h5' ! /* Object name */ -!!$ CHARACTER(LEN=10), PARAMETER :: filename = 'filname.h5' -!!$ -!!$ INTEGER(HSIZE_T) :: name_len ! /* Size of an empty file */ -!!$ -!!$ INTEGER, PARAMETER :: UD_HARD_TYPE=201 -!!$ LOGICAL :: registered -!!$ -!!$!/* Link information */ -!!$ -!!$! ssize_t name_len; /* Length of object name */ -!!$! h5_stat_size_t empty_size; /* Size of an empty file */ -!!$ -!!$ -!!$ WRITE(*,*) "user-defined hard link (w/new group format)" -!!$ -!!$ ! /* Set up filename and create file*/ -!!$ -!!$ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, H5P_DEFAULT_F, fapl) -!!$ CALL check("h5fcreate_f",error,total_error) -!!$ -!!$ ! /* Close file */ -!!$ CALL h5fclose_f(fid, error) -!!$ CALL check("h5fclose_f",error,total_error) -!!$ -!!$ ! if((empty_size = h5_get_file_size(filename))<0) TEST_ERROR -!!$ -!!$ ! /* Create file */ -!!$ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, H5P_DEFAULT_F, fapl) -!!$ CALL check("h5fcreate_f",error,total_error) -!!$ -!!$ ! /* Check that external links are registered and UD hard links are not */ -!!$ -!!$ CALL H5Lis_registered(H5L_TYPE_EXTERNAL, registered, error) -!!$ CALL VerifyLogical("H5Lis_registered", registered, .TRUE., total_error) -!!$ -!!$ CALL H5Lis_registered(UD_HARD_TYPE, registered, error) -!!$ CALL VerifyLogical("H5Lis_registered", registered, .FALSE., total_error) -!!$ -!!$ !/* Register "user-defined hard links" with the library */ -!!$! if(H5Lregister(UD_hard_class) < 0) TEST_ERROR -!!$ -!!$ /* Check that UD hard links are now registered */ -!!$ if(H5Lis_registered(H5L_TYPE_EXTERNAL) != TRUE) TEST_ERROR -!!$ if(H5Lis_registered(UD_HARD_TYPE) != TRUE) TEST_ERROR -!!$ -!!$ /* Create a group for the UD hard link to point to */ -!!$ if((gid = H5Gcreate2(fid, "group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Get address for the group to give to the hard link */ -!!$ if(H5Lget_info(fid, "group", &li, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ if(H5Gclose(gid) < 0) TEST_ERROR -!!$ -!!$ -!!$ /* Create a user-defined "hard link" to the group using the address we got -!!$ * from H5Lget_info */ -!!$ if(H5Lcreate_ud(fid, "ud_link", UD_HARD_TYPE, &(li.u.address), sizeof(haddr_t), H5P_DEFAULT, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Close and re-open file to ensure that data is written to disk */ -!!$ if(H5Fclose(fid) < 0) TEST_ERROR -!!$ if((fid = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Open group through UD link */ -!!$ if((gid = H5Gopen2(fid, "ud_link", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Check name */ -!!$ if((name_len = H5Iget_name( gid, objname, (size_t)NAME_BUF_SIZE )) < 0) TEST_ERROR -!!$ if(HDstrcmp(objname, "/group")) TEST_ERROR -!!$ -!!$ /* Create object in group */ -!!$ if((gid2 = H5Gcreate2(gid, "new_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Close groups*/ -!!$ if(H5Gclose(gid2) < 0) TEST_ERROR -!!$ if(H5Gclose(gid) < 0) TEST_ERROR -!!$ -!!$ /* Re-open group without using ud link to check that it was created properly */ -!!$ if((gid = H5Gopen2(fid, "group/new_group", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Check name */ -!!$ if((name_len = H5Iget_name( gid, objname, (size_t)NAME_BUF_SIZE )) < 0) TEST_ERROR -!!$ if(HDstrcmp(objname, "/group/new_group")) TEST_ERROR -!!$ -!!$ /* Close opened object */ -!!$ if(H5Gclose(gid) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Check that H5Lget_objinfo works on the hard link */ -!!$ if(H5Lget_info(fid, "ud_link", &li, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ /* UD hard links have no query function, thus return a "link length" of 0 */ -!!$ if(li.u.val_size != 0) TEST_ERROR -!!$ if(UD_HARD_TYPE != li.type) { -!!$ H5_FAILED(); -!!$ puts(" Unexpected link class - should have been a UD hard link"); -!!$ goto error; -!!$ } /* end if */ -!!$ -!!$ /* Unlink the group pointed to by the UD link. It shouldn't be -!!$ * deleted because of the UD link. */ -!!$ if(H5Ldelete(fid, "/group", H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Ensure we can open the group through the UD link */ -!!$ if((gid = H5Gopen2(fid, "ud_link", H5P_DEFAULT)) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Unlink the group contained within it. */ -!!$ if(H5Ldelete(gid, "new_group", H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ if(H5Gclose(gid) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Now delete the UD link. This should cause the group to be -!!$ * deleted, too. */ -!!$ if(H5Ldelete(fid, "ud_link", H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Close file */ -!!$ if(H5Fclose(fid) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* The file should be empty again. */ -!!$ if(empty_size != h5_get_file_size(filename)) TEST_ERROR -!!$ -!!$ if(H5Lunregister(UD_HARD_TYPE) < 0) FAIL_STACK_ERROR -!!$ -!!$ PASSED(); -!!$ return 0; -!!$ -!!$ error: -!!$ H5E_BEGIN_TRY { -!!$ H5Gclose(gid2); -!!$ H5Gclose(gid); -!!$ H5Fclose(fid); -!!$ } H5E_END_TRY; -!!$ return -1; -!!$} /* end ud_hard_links() */ - !/*------------------------------------------------------------------------- ! * Function: lifecycle ! * @@ -1186,18 +921,13 @@ SUBROUTINE lifecycle(cleanup, fapl2, total_error) INTEGER(HID_T) :: fid !/* File ID */ INTEGER(HID_T) :: gid !/* Group ID */ - INTEGER(HID_T) :: gid2 !/* Datatype ID */ INTEGER(HID_T) :: gcpl !/* Group creation property list ID */ INTEGER(size_t) :: lheap_size_hint !/* Local heap size hint */ INTEGER :: max_compact !/* Maximum # of links to store in group compactly */ INTEGER :: min_dense !/* Minimum # of links to store in group "densely" */ INTEGER :: est_num_entries !/* Estimated # of entries in group */ INTEGER :: est_name_len !/* Estimated length of entry name */ - INTEGER :: nmsgs !/* Number of messages in group's header */ - CHARACTER(LEN=NAME_BUF_SIZE) :: objname ! /* Object name */ CHARACTER(LEN=NAME_BUF_SIZE) :: filename = 'fixx.h5' - INTEGER :: empty_size ! /* Size of an empty file */ - INTEGER :: u ! /* Local index variable */ INTEGER(SIZE_T) :: LIFECYCLE_LOCAL_HEAP_SIZE_HINT = 256 INTEGER :: LIFECYCLE_MAX_COMPACT = 4 INTEGER :: LIFECYCLE_MIN_DENSE = 3 @@ -1211,7 +941,7 @@ SUBROUTINE lifecycle(cleanup, fapl2, total_error) INTEGER :: H5G_CRT_GINFO_EST_NAME_LEN = 8 logical :: cleanup - WRITE(*,*) 'group lifecycle' +! WRITE(*,*) 'group lifecycle' ! /* Create file */ CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl2) @@ -1283,105 +1013,6 @@ SUBROUTINE lifecycle(cleanup, fapl2, total_error) CALL verify("H5Pget_est_link_info_f", est_name_len, LIFECYCLE_EST_NAME_LEN,total_error) - ! /* Use internal testing routine to check that the group has no links or symbol table */ - ! if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR - -!!$ /* Create first "bottom" group */ -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, (unsigned)0); -!!$ IF((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Check on bottom group's status */ -!!$ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR -!!$ -!!$ /* Close bottom group */ -!!$ if(H5Gclose(gid2) < 0) TEST_ERROR -!!$ -!!$ /* Check on top group's status */ -!!$ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR -!!$ if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR -!!$ if(nmsgs != 1) TEST_ERROR -!!$ -!!$ /* Create several more bottom groups, to push the top group almost to a symbol table */ -!!$ /* (Start counting at '1', since we've already created one bottom group */ -!!$ for(u = 1; u < LIFECYCLE_MAX_COMPACT; u++) { -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u); -!!$ if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Check on bottom group's status */ -!!$ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR -!!$ -!!$ /* Close bottom group */ -!!$ if(H5Gclose(gid2) < 0) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Check on top group's status */ -!!$ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR -!!$ if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR -!!$ if(nmsgs != LIFECYCLE_MAX_COMPACT) TEST_ERROR -!!$ if(H5G_is_new_dense_test(gid) != FALSE) TEST_ERROR -!!$ -!!$ /* Check that the object header is only one chunk and the space has been allocated correctly */ -!!$ if(H5Oget_info(gid, &oinfo) < 0) TEST_ERROR -!!$ if(oinfo.hdr.space.total != 151) TEST_ERROR -!!$ if(oinfo.hdr.space.free != 0) TEST_ERROR -!!$ if(oinfo.hdr.nmesgs != 6) TEST_ERROR -!!$ if(oinfo.hdr.nchunks != 1) TEST_ERROR -!!$ -!!$ /* Create one more "bottom" group, which should push top group into using a symbol table */ -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u); -!!$ if((gid2 = H5Gcreate2(gid, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ -!!$ /* Check on bottom group's status */ -!!$ if(H5G_is_empty_test(gid2) != TRUE) TEST_ERROR -!!$ -!!$ /* Close bottom group */ -!!$ if(H5Gclose(gid2) < 0) TEST_ERROR -!!$ -!!$ /* Check on top group's status */ -!!$ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR -!!$ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR -!!$ if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR -!!$ -!!$ /* Check that the object header is still one chunk and the space has been allocated correctly */ -!!$ if(H5Oget_info(gid, &oinfo) < 0) TEST_ERROR -!!$ if(oinfo.hdr.space.total != 151) TEST_ERROR -!!$ if(oinfo.hdr.space.free != 92) TEST_ERROR -!!$ if(oinfo.hdr.nmesgs != 3) TEST_ERROR -!!$ if(oinfo.hdr.nchunks != 1) TEST_ERROR -!!$ -!!$ /* Unlink objects from top group */ -!!$ while(u >= LIFECYCLE_MIN_DENSE) { -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u); -!!$ -!!$ if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ -!!$ u--; -!!$ } /* end while */ -!!$ -!!$ /* Check on top group's status */ -!!$ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR -!!$ if(H5G_has_links_test(gid, NULL) == TRUE) TEST_ERROR -!!$ if(H5G_is_new_dense_test(gid) != TRUE) TEST_ERROR -!!$ -!!$ /* Unlink one more object from the group, which should transform back to using links */ -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u); -!!$ if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ u--; -!!$ -!!$ /* Check on top group's status */ -!!$ if(H5G_is_empty_test(gid) == TRUE) TEST_ERROR -!!$ if(H5G_has_links_test(gid, &nmsgs) != TRUE) TEST_ERROR -!!$ if(nmsgs != (LIFECYCLE_MIN_DENSE - 1)) TEST_ERROR -!!$ -!!$ /* Unlink last two objects from top group */ -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u); -!!$ if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ u--; -!!$ sprintf(objname, LIFECYCLE_BOTTOM_GROUP, u); -!!$ if(H5Ldelete(gid, objname, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ -!!$ /* Check on top group's status */ -!!$ if(H5G_is_empty_test(gid) != TRUE) TEST_ERROR !/* Close top group */ CALL H5Gclose_f(gid, error) @@ -1400,12 +1031,6 @@ SUBROUTINE lifecycle(cleanup, fapl2, total_error) CALL H5Fclose_f(fid,error) CALL check("H5Fclose_f",error,total_error) -!!$ /* Get size of file as empty */ -!!$ if((file_size = h5_get_file_size(filename)) < 0) TEST_ERROR -!!$ -!!$ /* Verify that file is correct size */ -!!$ if(file_size != empty_size) TEST_ERROR - IF(cleanup) CALL h5_cleanup_f("fixx", H5P_DEFAULT_F, error) CALL check("h5_cleanup_f", error, total_error) @@ -1444,18 +1069,11 @@ SUBROUTINE lifecycle(cleanup, fapl2, total_error) ! H5L_info_t linfo2; CHARACTER(LEN=12), PARAMETER :: filename ='TestLinks.h5' - CHARACTER(LEN=12) :: linkval ! TYPE(C_PTR) :: linkval LOGICAL :: Lexists - -!!$ if(new_format) -!!$ TESTING("link queries (w/new group format)") -!!$ else -!!$ TESTING("link queries") - ! /* Open the file */ CALL H5Fopen_f(filename, H5F_ACC_RDONLY_F, file, error,access_prp=fapl) CALL check("H5Fopen_f",error,total_error) @@ -1483,93 +1101,11 @@ SUBROUTINE lifecycle(cleanup, fapl2, total_error) CALL H5Lexists_f(file,"grp1/hard",Lexists, error) CALL verifylogical("test_lcpl.H5Lexists", Lexists,.TRUE.,total_error) - -!!$ /* Symbolic link */ -!!$ if(H5Oget_info_by_name(file, "grp1/soft", &oinfo2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ if(H5O_TYPE_DATASET != oinfo2.type) { -!!$ H5_FAILED(); -!!$ printf(" %d: Unexpected object type should have been a dataset\n", __LINE__); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5F_addr_ne(oinfo1.addr, oinfo2.addr)) { -!!$ H5_FAILED(); -!!$ puts(" Soft link test failed. Link seems not to point to the "); -!!$ puts(" expected file location."); -!!$ TEST_ERROR -!!$ } /* end if */ - -! CALL H5Lget_val(file, "grp1/soft", INT(LEN(linkval), SIZE_T), linkval, error) - - -!!$ if(H5Lget_val(file, "grp1/soft", linkval, sizeof linkval, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ if(HDstrcmp(linkval, "/d1")) { -!!$ H5_FAILED(); -!!$ puts(" Soft link test failed. Wrong link value"); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5Lexists(file, "grp1/soft", H5P_DEFAULT) != TRUE) FAIL_STACK_ERROR -!!$ -!!$ /* Dangling link */ -!!$ H5E_BEGIN_TRY { -!!$ status = H5Oget_info_by_name(file, "grp1/dangle", &oinfo2, H5P_DEFAULT); -!!$ } H5E_END_TRY; -!!$ if(status >= 0) { -!!$ H5_FAILED(); -!!$ puts(" H5Oget_info_by_name() should have failed for a dangling link."); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5Lget_info(file, "grp1/dangle", &linfo2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ if(H5L_TYPE_SOFT != linfo2.type) { -!!$ H5_FAILED(); -!!$ printf(" %d: Unexpected object type should have been a symbolic link\n", __LINE__); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5Lget_val(file, "grp1/dangle", linkval, sizeof linkval, H5P_DEFAULT) < 0) { -!!$ H5_FAILED(); -!!$ printf(" %d: Can't retrieve link value\n", __LINE__); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(HDstrcmp(linkval, "foobar")) { -!!$ H5_FAILED(); -!!$ puts(" Dangling link test failed. Wrong link value"); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5Lexists(file, "grp1/dangle", H5P_DEFAULT) != TRUE) FAIL_STACK_ERROR -!!$ -!!$ /* Recursive link */ -!!$ H5E_BEGIN_TRY { -!!$ status = H5Oget_info_by_name(file, "grp1/recursive", &oinfo2, H5P_DEFAULT); -!!$ } H5E_END_TRY; -!!$ if(status >= 0) { -!!$ H5_FAILED(); -!!$ puts(" H5Oget_info_by_name() should have failed for a recursive link."); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5Lget_info(file, "grp1/recursive", &linfo2, H5P_DEFAULT) < 0) FAIL_STACK_ERROR -!!$ if(H5L_TYPE_SOFT != linfo2.type) { -!!$ H5_FAILED(); -!!$ printf(" %d: Unexpected object type should have been a symbolic link\n", __LINE__); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(H5Lget_val(file, "grp1/recursive", linkval, sizeof linkval, H5P_DEFAULT) < 0) { -!!$ H5_FAILED(); -!!$ printf(" %d: Can't retrieve link value\n", __LINE__); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ if(HDstrcmp(linkval, "/grp1/recursive")) { -!!$ H5_FAILED(); -!!$ puts(" Recursive link test failed. Wrong link value"); -!!$ TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Non-existant link */ -!!$ if(H5Lexists(file, "foobar", H5P_DEFAULT) == TRUE) FAIL_STACK_ERROR - ! /* Cleanup */ - CALL H5Fclose_f(file,error) - CALL check("H5Fclose_f",error,total_error) + CALL H5Fclose_f(file,error) + CALL check("H5Fclose_f",error,total_error) - END SUBROUTINE cklinks +END SUBROUTINE cklinks !/*------------------------------------------------------------------------- @@ -1608,7 +1144,6 @@ SUBROUTINE delete_by_idx(cleanup, fapl, total_error) CHARACTER(LEN=7) :: objname ! /* Object name */ CHARACTER(LEN=8) :: filename = 'file0.h5' ! /* File name */ - CHARACTER(LEN=7) :: tmpname ! /* Temporary link name */ CHARACTER(LEN=12), PARAMETER :: CORDER_GROUP_NAME = "corder_group" LOGICAL :: f_corder_valid ! Indicates whether the creation order data is valid for this attribute @@ -1626,11 +1161,8 @@ SUBROUTINE delete_by_idx(cleanup, fapl, total_error) ! ! ! - CHARACTER(LEN=6) :: filename1 - CHARACTER(LEN=6) :: filename2 CHARACTER(LEN=80) :: fix_filename1 CHARACTER(LEN=80) :: fix_filename2 - INTEGER(SIZE_T) :: size_tmp INTEGER(HSIZE_T) :: htmp LOGICAL :: cleanup @@ -1647,37 +1179,35 @@ SUBROUTINE delete_by_idx(cleanup, fapl, total_error) ! /* Loop over using index for creation order value */ DO i = 1, 2 ! /* Print appropriate test message */ - IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN - IF(iorder == H5_ITER_INC_F)THEN - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/o creation order index" - ENDIF - ELSE - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/o creation order index" - ENDIF - ENDIF - ELSE - IF(iorder == H5_ITER_INC_F)THEN - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/o creation order index" - ENDIF - ELSE - IF(use_index(i))THEN - WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/creation order index" - ELSE - WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/o creation order index" - ENDIF - ENDIF - ENDIF -! CALL h5_fixname_f(filename1, fix_filename1, H5P_DEFAULT_F, error) -! IF(error .NE. 0) STOP +!!$ IF(idx_type == H5_INDEX_CRT_ORDER_F)THEN +!!$ IF(iorder == H5_ITER_INC_F)THEN +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"deleting links by creation order index in increasing order w/o creation order index" +!!$ ENDIF +!!$ ELSE +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"deleting links by creation order index in decreasing order w/o creation order index" +!!$ ENDIF +!!$ ENDIF +!!$ ELSE +!!$ IF(iorder == H5_ITER_INC_F)THEN +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"deleting links by name index in increasing order w/o creation order index" +!!$ ENDIF +!!$ ELSE +!!$ IF(use_index(i))THEN +!!$ WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/creation order index" +!!$ ELSE +!!$ WRITE(*,'(5x,A)')"deleting links by name index in decreasing order w/o creation order index" +!!$ ENDIF +!!$ ENDIF +!!$ ENDIF ! /* Create file */ CALL H5Fcreate_f(filename, H5F_ACC_TRUNC_F, file_id, error, access_prp=fapl) @@ -1771,158 +1301,7 @@ SUBROUTINE delete_by_idx(cleanup, fapl, total_error) !!$ PRINT*,objname, tmpname !!$ CALL verifyString("delete_by_idx.H5Lget_name_by_idx_f", objname, tmpname, total_error) ENDDO -!!$ -!!$ /* Delete last link */ -!!$ if(H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Verify state of group (empty) */ -!!$ if(H5G_has_links_test(group_id, NULL) == TRUE) TEST_ERROR -!!$ -!!$ /* Create more links, to push group into dense form */ -!!$ for(u = 0; u < (max_compact * 2); u++) { -!!$ hid_t group_id2; /* Group ID */ -!!$ -!!$ /* Make name for link */ -!!$ sprintf(objname, "filler %02u", u); -!!$ -!!$ /* Create hard link, with group object */ -!!$ if((group_id2 = H5Gcreate2(group_id, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ if(H5Gclose(group_id2) < 0) TEST_ERROR -!!$ -!!$ /* Verify state of group (dense) */ -!!$ if(u >= max_compact) -!!$ if(H5G_is_new_dense_test(group_id) != TRUE) TEST_ERROR -!!$ -!!$ /* Verify link information for new link */ -!!$ if(link_info_by_idx_check(group_id, objname, (hsize_t)u, TRUE, use_index) < 0) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Check for out of bound deletion again */ -!!$ H5E_BEGIN_TRY { -!!$ ret = H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT); -!!$ } H5E_END_TRY; -!!$ if(ret >= 0) TEST_ERROR -!!$ -!!$ /* Delete links from dense group, in appropriate order */ -!!$ for(u = 0; u < ((max_compact * 2) - 1); u++) { -!!$ /* Delete first link in appropriate order */ -!!$ if(H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for first link in appropriate order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", idx_type, order, (hsize_t)0, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(order == H5_ITER_INC) { -!!$ if(linfo.corder != (u + 1)) TEST_ERROR -!!$ } /* end if */ -!!$ else { -!!$ if(linfo.corder != ((max_compact * 2) - (u + 2))) TEST_ERROR -!!$ } /* end else */ -!!$ -!!$ /* Verify the name for first link in appropriate order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(order == H5_ITER_INC) -!!$ sprintf(objname, "filler %02u", (u + 1)); -!!$ else -!!$ sprintf(objname, "filler %02u", ((max_compact * 2) - (u + 2))); -!!$ if(HDstrcmp(objname, tmpname)) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Delete last link */ -!!$ if(H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Verify state of group (empty) */ -!!$ if(H5G_has_links_test(group_id, NULL) == TRUE) TEST_ERROR -!!$ if(H5G_is_new_dense_test(group_id) == TRUE) TEST_ERROR -!!$ -!!$ /* Check for deletion on empty group again */ -!!$ H5E_BEGIN_TRY { -!!$ ret = H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT); -!!$ } H5E_END_TRY; -!!$ if(ret >= 0) TEST_ERROR -!!$ -!!$ -!!$ /* Delete links in middle */ -!!$ -!!$ -!!$ /* Create more links, to push group into dense form */ -!!$ for(u = 0; u < (max_compact * 2); u++) { -!!$ hid_t group_id2; /* Group ID */ -!!$ -!!$ /* Make name for link */ -!!$ sprintf(objname, "filler %02u", u); -!!$ -!!$ /* Create hard link, with group object */ -!!$ if((group_id2 = H5Gcreate2(group_id, objname, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT)) < 0) TEST_ERROR -!!$ if(H5Gclose(group_id2) < 0) TEST_ERROR -!!$ -!!$ /* Verify state of group (dense) */ -!!$ if(u >= max_compact) -!!$ if(H5G_is_new_dense_test(group_id) != TRUE) TEST_ERROR -!!$ -!!$ /* Verify link information for new link */ -!!$ if(link_info_by_idx_check(group_id, objname, (hsize_t)u, TRUE, use_index) < 0) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Delete every other link from dense group, in appropriate order */ -!!$ for(u = 0; u < max_compact; u++) { -!!$ /* Delete link */ -!!$ if(H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)u, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for current link in appropriate order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", idx_type, order, (hsize_t)u, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(order == H5_ITER_INC) { -!!$ if(linfo.corder != ((u * 2) + 1)) TEST_ERROR -!!$ } /* end if */ -!!$ else { -!!$ if(linfo.corder != ((max_compact * 2) - ((u * 2) + 2))) TEST_ERROR -!!$ } /* end else */ -!!$ -!!$ /* Verify the name for current link in appropriate order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", idx_type, order, (hsize_t)u, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(order == H5_ITER_INC) -!!$ sprintf(objname, "filler %02u", ((u * 2) + 1)); -!!$ else -!!$ sprintf(objname, "filler %02u", ((max_compact * 2) - ((u * 2) + 2))); -!!$ if(HDstrcmp(objname, tmpname)) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Delete remaining links from dense group, in appropriate order */ -!!$ for(u = 0; u < (max_compact - 1); u++) { -!!$ /* Delete link */ -!!$ if(H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for first link in appropriate order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", idx_type, order, (hsize_t)0, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(order == H5_ITER_INC) { -!!$ if(linfo.corder != ((u * 2) + 3)) TEST_ERROR -!!$ } /* end if */ -!!$ else { -!!$ if(linfo.corder != ((max_compact * 2) - ((u * 2) + 4))) TEST_ERROR -!!$ } /* end else */ -!!$ -!!$ /* Verify the name for first link in appropriate order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", idx_type, order, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(order == H5_ITER_INC) -!!$ sprintf(objname, "filler %02u", ((u * 2) + 3)); -!!$ else -!!$ sprintf(objname, "filler %02u", ((max_compact * 2) - ((u * 2) + 4))); -!!$ if(HDstrcmp(objname, tmpname)) TEST_ERROR -!!$ } /* end for */ -!!$ -!!$ /* Delete last link */ -!!$ if(H5Ldelete_by_idx(group_id, ".", idx_type, order, (hsize_t)0, H5P_DEFAULT) < 0) TEST_ERROR -!!$ -!!$ /* Verify state of group (empty) */ -!!$ if(H5G_has_links_test(group_id, NULL) == TRUE) TEST_ERROR -!!$ if(H5G_is_new_dense_test(group_id) == TRUE) TEST_ERROR -!!$ -!!$ -!!$ + ! /* Close the group */ CALL H5Gclose_f(group_id, error) CALL check("delete_by_idx.H5Gclose_f", error, total_error) @@ -1941,17 +1320,7 @@ SUBROUTINE delete_by_idx(cleanup, fapl, total_error) ENDDO ENDDO ENDDO -!!$ -!!$ return 0; -!!$ -!!$error: -!!$ H5E_BEGIN_TRY { -!!$ H5Pclose(gcpl_id); -!!$ H5Gclose(group_id); -!!$ H5Fclose(file_id); -!!$ } H5E_END_TRY; -!!$ return -1; -!!$} /* end delete_by_idx() */ + END SUBROUTINE delete_by_idx @@ -1997,7 +1366,6 @@ SUBROUTINE link_info_by_idx_check(group_id, linkname, n, & CHARACTER(LEN=10) :: tmpname_big !/* to big temporary link name */ CHARACTER(LEN=7) :: valname !/* Link value name */ - CHARACTER(LEN=7) :: tmpval !/* Temporary link value */ CHARACTER(LEN=2) :: chr2 INTEGER(SIZE_T) :: size_tmp INTEGER :: error @@ -2056,122 +1424,6 @@ SUBROUTINE link_info_by_idx_check(group_id, linkname, n, & ! Try with a buffer set to small -!!$ size_tmp = INT(4,SIZE_T) -!!$ CALL H5Lget_name_by_idx_f(group_id, ".", H5_INDEX_CRT_ORDER_F, H5_ITER_INC_F, INT(n,HSIZE_T), size_tmp, tmpname, error) -!!$ CALL check("H5Lget_name_by_idx_f", error, total_error) -!!$ CALL verifyString("H5Lget_name_by_idx_f", linkname, tmpname, total_error) - - -!!$ -!!$ if(H5Lget_name_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(linkname, tmpname)) TEST_ERROR - -!!$ /* Don't test "native" order if there is no creation order index, since -!!$ * there's not a good way to easily predict the link's order in the name -!!$ * index. -!!$ */ -!!$ if(use_index) { -!!$ /* Verify the link information for first link, in native creation order (which is increasing) */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, (hsize_t)0, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for new link, in native creation order (which is increasing) */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != (int64_t)n) TEST_ERROR -!!$ -!!$ /* Verify value for new soft link, in native creation order (which is increasing) */ -!!$ if(!hard_link) { -!!$ HDmemset(tmpval, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_val_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, tmpval, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(valname, tmpval)) TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Verify the name for new link, in native creation order (which is increasing) */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_NATIVE, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(linkname, tmpname)) TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Verify the link information for first link, in decreasing creation order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, n, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for new link, in decreasing creation order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != (int64_t)n) TEST_ERROR -!!$ -!!$ /* Verify value for new soft link, in decreasing creation order */ -!!$ if(!hard_link) { -!!$ HDmemset(tmpval, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_val_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpval, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(valname, tmpval)) TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Verify the name for new link, in decreasing creation order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", H5_INDEX_CRT_ORDER, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(linkname, tmpname)) TEST_ERROR -!!$ -!!$ -!!$ /* Verify the link information for first link, in increasing link name order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, (hsize_t)0, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for new link, in increasing link name order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != (int64_t)n) TEST_ERROR -!!$ -!!$ /* Verify value for new soft link, in increasing link name order */ -!!$ if(!hard_link) { -!!$ HDmemset(tmpval, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_val_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpval, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(valname, tmpval)) TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Verify the name for new link, in increasing link name order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_INC, n, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(linkname, tmpname)) TEST_ERROR -!!$ -!!$ /* Don't test "native" order queries on link name order, since there's not -!!$ * a good way to easily predict the order of the links in the name index. -!!$ */ -!!$ -!!$ /* Verify the link information for first link, in decreasing link name order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_DEC, n, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != 0) TEST_ERROR -!!$ -!!$ /* Verify the link information for new link, in decreasing link name order */ -!!$ HDmemset(&linfo, 0, sizeof(linfo)); -!!$ if(H5Lget_info_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, &linfo, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(linfo.corder != (int64_t)n) TEST_ERROR -!!$ -!!$ /* Verify value for new soft link, in decreasing link name order */ -!!$ if(!hard_link) { -!!$ HDmemset(tmpval, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_val_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpval, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(valname, tmpval)) TEST_ERROR -!!$ } /* end if */ -!!$ -!!$ /* Verify the name for new link, in decreasing link name order */ -!!$ HDmemset(tmpname, 0, (size_t)NAME_BUF_SIZE); -!!$ if(H5Lget_name_by_idx(group_id, ".", H5_INDEX_NAME, H5_ITER_DEC, (hsize_t)0, tmpname, (size_t)NAME_BUF_SIZE, H5P_DEFAULT) < 0) TEST_ERROR -!!$ if(HDstrcmp(linkname, tmpname)) TEST_ERROR -!!$ -!!$ /* Success */ -!!$ return(0); -!!$ -!!$error: -!!$ /* Failure */ -!!$ return(-1); -!!$} /* end link_info_by_idx_check() */ END SUBROUTINE link_info_by_idx_check @@ -2220,7 +1472,6 @@ SUBROUTINE link_info_by_idx_check(group_id, linkname, n, & ! H5L_LINK_ERROR _F - Error INTEGER :: address ! If the link is a hard link, address specifies the file address that the link points to INTEGER(HSIZE_T) :: val_size ! If the link is a symbolic link, val_size will be the length of the link value - INTEGER(HSIZE_T) :: data_size ! Indicates the size, in the number of characters, of the attribute CHARACTER(LEN=1024) :: filename = 'tempfile.h5' INTEGER, PARAMETER :: TEST6_DIM1 = 8, TEST6_DIM2 = 7 @@ -2235,7 +1486,7 @@ SUBROUTINE link_info_by_idx_check(group_id, linkname, n, & INTEGER :: i INTEGER :: tmp1, tmp2 - WRITE(*,*) "link creation property lists (w/new group format)" +! WRITE(*,*) "link creation property lists (w/new group format)" !/* Actually, intermediate group creation is tested elsewhere (tmisc). @@ -2576,23 +1827,17 @@ SUBROUTINE lapl_nlinks( fapl, total_error) INTEGER(HID_T) :: fid = (-1) !/* File ID */ INTEGER(HID_T) :: gid = (-1), gid2 = (-1) !/* Group IDs */ INTEGER(HID_T) :: plist = (-1) ! /* lapl ID */ - INTEGER(HID_T) :: tid = (-1), sid = (-1), did = (-1) ! /* Other IDs */ + INTEGER(HID_T) :: tid = (-1) ! /* Other IDs */ INTEGER(HID_T) :: gapl = (-1), dapl = (-1), tapl = (-1) ! /* Other property lists */ CHARACTER(LEN=7) :: objname ! /* Object name */ INTEGER(size_t) :: name_len ! /* Length of object name */ CHARACTER(LEN=12) :: filename = 'TestLinks.h5' INTEGER(size_t) :: nlinks ! /* nlinks for H5Pset_nlinks */ - INTEGER(hsize_t), DIMENSION(2) :: dims INTEGER(size_t) :: buf_size = 7 - WRITE(*,*) "adjusting nlinks with LAPL (w/new group format)" +! WRITE(*,*) "adjusting nlinks with LAPL (w/new group format)" -!!$ /* Make certain test is valid */ -!!$ /* XXX: should probably make a "generic" test that creates the proper -!!$ * # of links based on this value - QAK -!!$ */ -!!$ HDassert(H5L_NUM_LINKS == 16); ! /* Create file */ CALL h5fcreate_f(FileName, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl) diff --git a/fortran/test/tH5O.f90 b/fortran/test/tH5O.f90 index 53046f1..0aa4abd 100644 --- a/fortran/test/tH5O.f90 +++ b/fortran/test/tH5O.f90 @@ -19,6 +19,7 @@ SUBROUTINE test_h5o(cleanup, total_error) IMPLICIT NONE LOGICAL, INTENT(IN) :: cleanup INTEGER, INTENT(OUT) :: total_error + INTEGER :: error ! /* Output message about test being performed */ ! WRITE(*,*) "Testing Objects" @@ -27,9 +28,14 @@ SUBROUTINE test_h5o(cleanup, total_error) !!$ test_h5o_open_by_addr(); /* Test opening objects by address */ !!$ test_h5o_close(); /* Test generic CLOSE FUNCTION */ !!$ test_h5o_refcount(); /* Test incrementing and decrementing reference count */ -!!$ test_h5o_plist(); /* Test object creation properties */ + CALL test_h5o_plist(total_error) ! /* Test object creation properties */ CALL test_h5o_link(total_error) ! /* Test object link routine */ + IF(cleanup) CALL h5_cleanup_f("TestFile", H5P_DEFAULT_F, error) + CALL check("h5_cleanup_f", error, total_error) + IF(cleanup) CALL h5_cleanup_f("test", H5P_DEFAULT_F, error) + CALL check("h5_cleanup_f", error, total_error) + END SUBROUTINE test_h5o !/**************************************************************** @@ -53,7 +59,7 @@ SUBROUTINE test_h5o_link(total_error) INTEGER(HID_T) :: fapl_id INTEGER(HID_T) :: lcpl_id INTEGER(HID_T) :: mem_space_id, file_space_id, xfer_prp - CHARACTER(LEN=8), PARAMETER :: TEST_FILENAME = 'TestFile' + CHARACTER(LEN=11), PARAMETER :: TEST_FILENAME = 'TestFile.h5' INTEGER, PARAMETER :: TEST6_DIM1 = 2, TEST6_DIM2 = 5 !EP INTEGER(HSIZE_T), DIMENSION(1:2), PARAMETER :: dims = (/TEST6_DIM1,TEST6_DIM2/) INTEGER(HSIZE_T), DIMENSION(1:2) :: dims = (/TEST6_DIM1,TEST6_DIM2/) @@ -109,10 +115,10 @@ SUBROUTINE test_h5o_link(total_error) ! /* Create and commit a datatype with no name */ CALL H5Tcopy_f( H5T_NATIVE_INTEGER, type_id, error) - CALL check("H5Tcopy",error,total_error) + CALL check("H5Tcopy_F",error,total_error) CALL H5Tcommit_anon_f(file_id, type_id, error) ! using no optional parameters - CALL check("H5Tcommit_anon",error,total_error) + CALL check("H5Tcommit_anon_F",error,total_error) CALL H5Tcommitted_f(type_id, committed, error) CALL check("H5Tcommitted_f",error,total_error) @@ -212,3 +218,235 @@ SUBROUTINE test_h5o_link(total_error) CALL check("h5pclose_f", error, total_error) END SUBROUTINE test_h5o_link + +!/**************************************************************** +!** +!** test_h5o_plist(): Test object creation properties +!** +!****************************************************************/ + +SUBROUTINE test_h5o_plist(total_error) + + USE HDF5 ! This module contains all necessary modules + + IMPLICIT NONE + INTEGER, INTENT(OUT) :: total_error + + INTEGER(hid_t) :: fid !/* HDF5 File ID */ + INTEGER(hid_t) :: grp, dset, dtype, dspace !/* Object identifiers */ + INTEGER(hid_t) :: fapl !/* File access property list */ + INTEGER(hid_t) :: gcpl, dcpl, tcpl !/* Object creation properties */ + INTEGER :: def_max_compact, def_min_dense !/* Default phase change parameters */ + INTEGER :: max_compact, min_dense !/* Actual phase change parameters */ + INTEGER :: error !/* Value returned from API calls */ + CHARACTER(LEN=7), PARAMETER :: TEST_FILENAME = 'test.h5' + + +! PRINT*,'Testing object creation properties' + + !/* Make a FAPL that uses the "use the latest version of the format" flag */ + CALL H5Pcreate_f(H5P_FILE_ACCESS_F, fapl, error) + CALL check("H5Pcreate_f", error, total_error) + + ! /* Set the "use the latest version of the format" bounds for creating objects in the file */ + CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error) + CALL check("H5Pcreate_f", error, total_error) + + ! /* Create a new HDF5 file */ + CALL H5Fcreate_f(TEST_FILENAME, H5F_ACC_TRUNC_F, fid, error, access_prp=fapl) + CALL check("H5Fcreate_f", error, total_error) + + ! /* Create group, dataset & named datatype creation property lists */ + CALL H5Pcreate_f(H5P_GROUP_CREATE_F, gcpl, error) + CALL check("H5Pcreate_f", error, total_error) + CALL H5Pcreate_f(H5P_DATASET_CREATE_F, dcpl, error) + CALL check("H5Pcreate_f", error, total_error) + CALL H5Pcreate_f(H5P_DATATYPE_CREATE_F, tcpl, error) + CALL check("H5Pcreate_f", error, total_error) + + ! /* Retrieve default attribute phase change values */ + CALL H5Pget_attr_phase_change_f(gcpl, def_max_compact, def_min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + + ! /* Set non-default attribute phase change values on each creation property list */ + CALL H5Pset_attr_phase_change_f(gcpl, def_max_compact+1, def_min_dense-1, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL H5Pset_attr_phase_change_f(dcpl, def_max_compact+1, def_min_dense-1, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL H5Pset_attr_phase_change_f(tcpl, def_max_compact+1, def_min_dense-1, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + + ! /* Retrieve attribute phase change values on each creation property list and verify */ + CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + + !/* Create a group, dataset, and committed datatype within the file, + ! * using the respective type of creation property lists. + ! */ + + !/* Create the group anonymously and link it in */ + CALL H5Gcreate_anon_f(fid, grp, error, gcpl_id=gcpl) + CALL check("H5Gcreate_anon_f", error, total_error) + + CALL H5Olink_f(grp, fid, "group", error) + CALL check("H5Olink_f", error, total_error) + + ! /* Commit the type inside the group anonymously and link it in */ + CALL h5tcopy_f(H5T_NATIVE_INTEGER, dtype, error) + CALL check("h5tcopy_f", error, total_error) + + CALL H5Tcommit_anon_f(fid, dtype, error, tcpl_id=tcpl) + CALL check("H5Tcommit_anon_f",error,total_error) + + CALL H5Olink_f(dtype, fid, "datatype", error) + CALL check("H5Olink_f", error, total_error) + + ! /* Create the dataspace for the dataset. */ + CALL h5screate_f(H5S_SCALAR_F, dspace, error) + CALL check("h5screate_f",error,total_error) + + ! /* Create the dataset anonymously and link it in */ + CALL H5Dcreate_anon_f(fid, H5T_NATIVE_INTEGER, dspace, dset, error, dcpl ) + CALL check("H5Dcreate_anon_f",error,total_error) + + CALL H5Olink_f(dset, fid, "dataset", error) + CALL check("H5Olink_f", error, total_error) + + CALL h5sclose_f(dspace, error) + CALL check("h5sclose_f",error,total_error) + + + ! /* Close current creation property lists */ + CALL h5pclose_f(gcpl,error) + CALL check("h5pclose_f", error, total_error) + CALL h5pclose_f(dcpl,error) + CALL check("h5pclose_f", error, total_error) + CALL h5pclose_f(tcpl,error) + CALL check("h5pclose_f", error, total_error) + + ! /* Retrieve each object's creation property list */ + + CALL H5Gget_create_plist_f(grp, gcpl, error) + CALL check("H5Gget_create_plist", error, total_error) + + CALL H5Tget_create_plist_f(dtype, tcpl, error) + CALL check("H5Tget_create_plist_f", error, total_error) + + CALL H5Dget_create_plist_f(dset, dcpl, error) + CALL check("H5Dget_create_plist_f", error, total_error) + + + ! /* Retrieve attribute phase change values on each creation property list and verify */ + CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + + !/* Close current objects */ + + CALL h5pclose_f(gcpl,error) + CALL check("h5pclose_f", error, total_error) + CALL h5pclose_f(dcpl,error) + CALL check("h5pclose_f", error, total_error) + CALL h5pclose_f(tcpl,error) + CALL check("h5pclose_f", error, total_error) + + CALL h5gclose_f(grp, error) + CALL check("h5gclose_f",error,total_error) + + CALL h5tclose_f(dtype, error) + CALL check("h5tclose_f",error,total_error) + CALL h5dclose_f(dset, error) + CALL check("h5dclose_f",error,total_error) + CALL h5fclose_f(fid, error) + CALL check("h5fclose_f",error,total_error) + ! /* Re-open the file and check that the object creation properties persist */ + CALL h5fopen_f(TEST_FILENAME, H5F_ACC_RDONLY_F, fid, error, access_prp=fapl) + CALL check("H5fopen_f",error,total_error) + + ! /* Re-open objects */ + CALL H5Gopen_f(fid, "group", grp, error) + CALL check("h5gopen_f", error, total_error) + + CALL H5Topen_f(fid, "datatype", dtype,error) + CALL check("h5topen_f", error, total_error) + + CALL H5Dopen_f(fid, "dataset", dset, error) + CALL check("h5dopen_f", error, total_error) + + ! /* Retrieve each object's creation property list */ + CALL H5Gget_create_plist_f(grp, gcpl, error) + CALL check("H5Gget_create_plist", error, total_error) + + CALL H5Tget_create_plist_f(dtype, tcpl, error) + CALL check("H5Tget_create_plist_f", error, total_error) + + CALL H5Dget_create_plist_f(dset, dcpl, error) + CALL check("H5Dget_create_plist_f", error, total_error) + + + ! /* Retrieve attribute phase change values on each creation property list and verify */ + CALL H5Pget_attr_phase_change_f(gcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + CALL H5Pget_attr_phase_change_f(dcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + CALL H5Pget_attr_phase_change_f(tcpl, max_compact, min_dense, error) + CALL check("H5Pget_attr_phase_change_f", error, total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", max_compact, (def_max_compact + 1), total_error) + CALL VERIFY("H5Pget_attr_phase_change_f", min_dense, (def_min_dense - 1), total_error) + + + ! /* Close current objects */ + + CALL h5pclose_f(gcpl,error) + CALL check("h5pclose_f", error, total_error) + CALL h5pclose_f(dcpl,error) + CALL check("h5pclose_f", error, total_error) + CALL h5pclose_f(tcpl,error) + CALL check("h5pclose_f", error, total_error) + + CALL h5gclose_f(grp, error) + CALL check("h5gclose_f",error,total_error) + + CALL h5tclose_f(dtype, error) + CALL check("h5tclose_f",error,total_error) + CALL h5dclose_f(dset, error) + CALL check("h5dclose_f",error,total_error) + CALL h5fclose_f(fid, error) + CALL check("h5fclose_f",error,total_error) + + ! /* Close the FAPL */ + CALL H5Pclose_f(fapl, error) + CALL check("H5Pclose_f", error, total_error) + +END SUBROUTINE test_h5o_plist diff --git a/fortran/test/tH5Sselect.f90 b/fortran/test/tH5Sselect.f90 index 2a3bfd4..19364df 100644 --- a/fortran/test/tH5Sselect.f90 +++ b/fortran/test/tH5Sselect.f90 @@ -794,6 +794,8 @@ INTEGER :: error INTEGER(HSIZE_T), DIMENSION(3) :: data_dims + INTEGER :: i + ! !initialize the coord array to give the selected points' position ! @@ -916,7 +918,7 @@ CALL h5sget_select_hyper_blocklist_f(dataspace, startblock, & num_blocks, blocklist, error) CALL check("h5sget_select_hyper_blocklist_f", error, total_error) - !write(*,*) (blocklist(i), i =1, num_blocks*RANK*2) +! write(*,*) (blocklist(i), i =1, num_blocks*RANK*2) !result of blocklist selected is: !1, 1, 2, 2, 4, 1, 5, 2, 1, 4, 2, 5, 4, 4, 5, 5 ! @@ -1009,4 +1011,963 @@ RETURN END SUBROUTINE test_basic_select +!/**************************************************************** +!** +!** test_select_point(): Test basic H5S (dataspace) selection code. +!** Tests element selections between dataspaces of various sizes +!** and dimensionalities. +!** +!****************************************************************/ + +SUBROUTINE test_select_point(cleanup, total_error) + USE HDF5 ! This module contains all necessary modules + + IMPLICIT NONE + LOGICAL, INTENT(IN) :: cleanup + INTEGER, INTENT(OUT) :: total_error + INTEGER(HID_T) :: xfer_plist + + INTEGER, PARAMETER :: SPACE1_DIM1=3 + INTEGER, PARAMETER :: SPACE1_DIM2=15 + INTEGER, PARAMETER :: SPACE1_DIM3=13 + INTEGER, PARAMETER :: SPACE2_DIM1=30 + INTEGER, PARAMETER :: SPACE2_DIM2=26 + INTEGER, PARAMETER :: SPACE3_DIM1=15 + INTEGER, PARAMETER :: SPACE3_DIM2=26 + + INTEGER, PARAMETER :: SPACE1_RANK=3 + INTEGER, PARAMETER :: SPACE2_RANK=2 + INTEGER, PARAMETER :: SPACE3_RANK=2 + + ! /* Element selection information */ + INTEGER, PARAMETER :: POINT1_NPOINTS=10 + INTEGER(hid_t) ::fid1 ! /* HDF5 File IDs */ + INTEGER(hid_t) ::dataset ! /* Dataset ID */ + INTEGER(hid_t) ::sid1,sid2 ! /* Dataspace ID */ + INTEGER(hsize_t), DIMENSION(1:3) :: dims1 = (/SPACE1_DIM1, SPACE1_DIM2, SPACE1_DIM3/) + INTEGER(hsize_t), DIMENSION(1:2) :: dims2 = (/SPACE2_DIM1, SPACE2_DIM2/) + INTEGER(hsize_t), DIMENSION(1:2) :: dims3 = (/SPACE3_DIM1, SPACE3_DIM2/) + + INTEGER(hsize_t), DIMENSION(1:SPACE1_RANK,1:POINT1_NPOINTS) :: coord1 !/* Coordinates for point selection */ + INTEGER(hsize_t), DIMENSION(1:SPACE1_RANK,1:POINT1_NPOINTS) :: temp_coord1 !/* Coordinates for point selection */ + INTEGER(hsize_t), DIMENSION(1:SPACE2_RANK,1:POINT1_NPOINTS) :: coord2 !/* Coordinates for point selection */ + INTEGER(hsize_t), DIMENSION(1:SPACE2_RANK,1:POINT1_NPOINTS) :: temp_coord2 !/* Coordinates for point selection */ + INTEGER(hsize_t), DIMENSION(1:SPACE3_RANK,1:POINT1_NPOINTS) :: coord3 !/* Coordinates for point selection */ + INTEGER(hsize_t), DIMENSION(1:SPACE3_RANK,1:POINT1_NPOINTS) :: temp_coord3 !/* Coordinates for point selection */ + INTEGER(hssize_t) :: npoints + +!!$ uint8_t *wbuf, /* buffer to write to disk */ +!!$ *rbuf, /* buffer read from disk */ +!!$ *tbuf; /* temporary buffer pointer */ + INTEGER :: i,j; !/* Counters */ +! struct pnt_iter pi; /* Custom Pointer iterator struct */ + INTEGER :: error !/* Generic return value */ + CHARACTER(LEN=12) :: filename = 'h5s_hyper.h5' + CHARACTER(LEN=1), DIMENSION(1:SPACE2_DIM1,1:SPACE2_DIM2) :: wbuf, rbuf + + xfer_plist = H5P_DEFAULT_F +! MESSAGE(5, ("Testing Element Selection Functions\n")); + + !/* Allocate write & read buffers */ +!!$ wbuf = HDmalloc(sizeof(uint8_t) * SPACE2_DIM1 * SPACE2_DIM2); +!!$ rbuf = HDcalloc(sizeof(uint8_t), (size_t)(SPACE3_DIM1 * SPACE3_DIM2)); +!!$ + !/* Initialize WRITE buffer */ + + DO i = 1, SPACE2_DIM1 + DO j = 1, SPACE2_DIM2 + wbuf(i,j) = 'a' + ENDDO + ENDDO + +!!$ for(i=0, tbuf=wbuf; i<SPACE2_DIM1; i++) +!!$ for(j=0; j<SPACE2_DIM2; j++) +!!$ *tbuf++=(uint8_t)((i*SPACE2_DIM2)+j); + + !/* Create file */ + CALL h5fcreate_f(filename, H5F_ACC_TRUNC_F, fid1, error) + CALL check("h5fcreate_f", error, total_error) + + !/* Create dataspace for dataset */ + CALL h5screate_simple_f(SPACE1_RANK, dims1, sid1, error) + CALL check("h5screate_simple_f", error, total_error) + + !/* Create dataspace for write buffer */ + CALL h5screate_simple_f(SPACE2_RANK, dims2, sid2, error) + CALL check("h5screate_simple_f", error, total_error) + + !/* Select sequence of ten points for disk dataset */ + coord1(1,1)=1; coord1(2,1)=11; coord1(3,1)= 6; + coord1(1,2)=2; coord1(2,2)= 3; coord1(3,2)= 8; + coord1(1,3)=3; coord1(2,3)= 5; coord1(3,3)=10; + coord1(1,4)=1; coord1(2,4)= 7; coord1(3,4)=12; + coord1(1,5)=2; coord1(2,5)= 9; coord1(3,5)=14; + coord1(1,6)=3; coord1(2,6)=13; coord1(3,6)= 1; + coord1(1,7)=1; coord1(2,7)=15; coord1(3,7)= 3; + coord1(1,8)=2; coord1(2,8)= 1; coord1(3,8)= 5; + coord1(1,9)=3; coord1(2,9)= 2; coord1(3,9)= 7; + coord1(1,10)=1; coord1(2,10)= 4; coord1(3,10)= 9 + + + CALL h5sselect_elements_f(sid1, H5S_SELECT_SET_F, SPACE1_RANK, INT(POINT1_NPOINTS,size_t), coord1, error) + CALL check("h5sselect_elements_f", error, total_error) + + !/* Verify correct elements selected */ + + CALL h5sget_select_elem_pointlist_f(sid1, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord1,error) + CALL check("h5sget_select_elem_pointlist_f", error, total_error) + + DO i= 1, POINT1_NPOINTS + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(1,i)), INT(coord1(1,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(2,i)), INT(coord1(2,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(3,i)), INT(coord1(3,i)), total_error) + ENDDO + + CALL H5Sget_select_npoints_f(sid1, npoints, error) + CALL check("h5sget_select_npoints_f", error, total_error) + CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error) + + !/* Append another sequence of ten points to disk dataset */ + + coord1(1,1)=1; coord1(2,1)=3; coord1(3,1)= 1; + coord1(1,2)=2; coord1(2,2)=11; coord1(3,2)= 9; + coord1(1,3)=3; coord1(2,3)= 9; coord1(3,3)=11; + coord1(1,4)=1; coord1(2,4)= 8; coord1(3,4)=13; + coord1(1,5)=2; coord1(2,5)= 4; coord1(3,5)=12; + coord1(1,6)=3; coord1(2,6)= 2; coord1(3,6)= 2; + coord1(1,7)=1; coord1(2,7)=14; coord1(3,7)= 8; + coord1(1,8)=2; coord1(2,8)=15; coord1(3,8)= 7; + coord1(1,9)=3; coord1(2,9)= 3; coord1(3,9)= 6; + coord1(1,10)=1; coord1(2,10)= 7; coord1(3,10)= 14 + + + CALL h5sselect_elements_f(sid1, H5S_SELECT_APPEND_F, SPACE1_RANK, INT(POINT1_NPOINTS,size_t), coord1, error) + CALL check("h5sselect_elements_f", error, total_error) + ! /* Verify correct elements selected */ + + CALL h5sget_select_elem_pointlist_f(sid1, INT(POINT1_NPOINTS,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord1,error) + CALL check("h5sget_select_elem_pointlist_f", error, total_error) + + DO i= 1, POINT1_NPOINTS + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(1,i)), INT(coord1(1,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(2,i)), INT(coord1(2,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord1(3,i)), INT(coord1(3,i)), total_error) + ENDDO + + CALL H5Sget_select_npoints_f(sid1, npoints, error) + CALL check("h5sget_select_npoints_f", error, total_error) + CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error) + + ! /* Select sequence of ten points for memory dataset */ + coord2(1,1)=13; coord2(2,1)= 4; + coord2(1,2)=16; coord2(2,2)=14; + coord2(1,3)= 8; coord2(2,3)=26; + coord2(1,4)= 1; coord2(2,4)= 7; + coord2(1,5)=14; coord2(2,5)= 1; + coord2(1,6)=25; coord2(2,6)=12; + coord2(1,7)=13; coord2(2,7)=22; + coord2(1,8)=30; coord2(2,8)= 5; + coord2(1,9)= 9; coord2(2,9)= 9; + coord2(1,10)=20; coord2(2,10)=18 + + CALL h5sselect_elements_f(sid2, H5S_SELECT_SET_F, SPACE2_RANK, INT(POINT1_NPOINTS,size_t), coord2, error) + CALL check("h5sselect_elements_f", error, total_error) + + + !/* Verify correct elements selected */ + + CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord2,error) + CALL check("h5sget_select_elem_pointlist_f", error, total_error) + + DO i= 1, POINT1_NPOINTS + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(1,i)), INT(coord2(1,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(2,i)), INT(coord2(2,i)), total_error) + ENDDO + +!!$ +!!$ /* Save points for later iteration */ +!!$ /* (these are in the second half of the buffer, because we are prepending */ +!!$ /* the next list of points to the beginning of the point selection list) */ +!!$ HDmemcpy(((char *)pi.coord)+sizeof(coord2),coord2,sizeof(coord2)); +!!$ + + CALL H5Sget_select_npoints_f(sid2, npoints, error) + CALL check("h5sget_select_npoints_f", error, total_error) + CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error) + + !/* Append another sequence of ten points to memory dataset */ + coord2(1,1)=25; coord2(2,1)= 1; + coord2(1,2)= 3; coord2(2,2)=26; + coord2(1,3)=14; coord2(2,3)=18; + coord2(1,4)= 9; coord2(2,4)= 4; + coord2(1,5)=30; coord2(2,5)= 5; + coord2(1,6)=12; coord2(2,6)=15; + coord2(1,7)= 6; coord2(2,7)=23; + coord2(1,8)=13; coord2(2,8)= 3; + coord2(1,9)=22; coord2(2,9)=13; + coord2(1,10)= 10; coord2(2,10)=19 + + CALL h5sselect_elements_f(sid2, H5S_SELECT_PREPEND_F, SPACE2_RANK, INT(POINT1_NPOINTS,size_t), coord2, error) + CALL check("h5sselect_elements_f", error, total_error) + + + !/* Verify correct elements selected */ + CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord2,error) + CALL check("h5sget_select_elem_pointlist_f", error, total_error) + + DO i= 1, POINT1_NPOINTS + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(1,i)), INT(coord2(1,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord2(2,i)), INT(coord2(2,i)), total_error) + ENDDO + + CALL H5Sget_select_npoints_f(sid2, npoints, error) + CALL check("h5sget_select_npoints_f", error, total_error) + CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error) + +!!$ /* Save points for later iteration */ +!!$ HDmemcpy(pi.coord,coord2,sizeof(coord2)); + + ! /* Create a dataset */ + CALL h5dcreate_f(fid1, "Dataset1", H5T_NATIVE_CHARACTER, sid1, dataset, error) + CALL check("h5dcreate_f", error, total_error) + + ! /* Write selection to disk */ + CALL h5dwrite_f(dataset, H5T_NATIVE_CHARACTER, wbuf, dims2, error, sid2, sid1, xfer_plist) + CALL check("h5dwrite_f", error, total_error) + + ! /* Close memory dataspace */ + CALL h5sclose_f(sid2, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Create dataspace for reading buffer */ + CALL h5screate_simple_f(SPACE3_RANK, dims3, sid2, error) + CALL check("h5screate_simple_f", error, total_error) + + ! /* Select sequence of points for read dataset */ + coord3(1,1)= 1; coord3(2,1)= 3; + coord3(1,2)= 5; coord3(2,2)= 9; + coord3(1,3)=14; coord3(2,3)=14; + coord3(1,4)=15; coord3(2,4)=21; + coord3(1,5)= 8; coord3(2,5)=10; + coord3(1,6)= 3; coord3(2,6)= 1; + coord3(1,7)= 10; coord3(2,7)=20; + coord3(1,8)= 2; coord3(2,8)=23; + coord3(1,9)=13; coord3(2,9)=22; + coord3(1,10)=12; coord3(2,10)=7; + + CALL h5sselect_elements_f(sid2, H5S_SELECT_SET_F, SPACE3_RANK, INT(POINT1_NPOINTS,size_t), coord3, error) + CALL check("h5sselect_elements_f", error, total_error) + + ! /* Verify correct elements selected */ + CALL h5sget_select_elem_pointlist_f(sid2, INT(0,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord3,error) + CALL check("h5sget_select_elem_pointlist_f", error, total_error) + DO i= 1, POINT1_NPOINTS + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(1,i)), INT(coord3(1,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(2,i)), INT(coord3(2,i)), total_error) + ENDDO + + CALL H5Sget_select_npoints_f(sid2, npoints, error) + CALL check("h5sget_select_npoints_f", error, total_error) + CALL verify("h5sget_select_npoints_f", INT(npoints), 10, total_error) + + !/* Append another sequence of ten points to disk dataset */ + coord3(1,1)=15; coord3(2,1)=26; + coord3(1,2)= 1; coord3(2,2)= 1; + coord3(1,3)=12; coord3(2,3)=12; + coord3(1,4)= 6; coord3(2,4)=15; + coord3(1,5)= 4; coord3(2,5)= 6; + coord3(1,6)= 3; coord3(2,6)= 3; + coord3(1,7)= 8; coord3(2,7)=14; + coord3(1,8)=10; coord3(2,8)=17; + coord3(1,9)=13; coord3(2,9)=23; + coord3(1,10)=14; coord3(2,10)=10 + + CALL h5sselect_elements_f(sid2, H5S_SELECT_APPEND_F, SPACE3_RANK, INT(POINT1_NPOINTS,size_t), coord3, error) + CALL check("h5sselect_elements_f", error, total_error) + ! /* Verify correct elements selected */ + CALL h5sget_select_elem_pointlist_f(sid2, INT(POINT1_NPOINTS,hsize_t), INT(POINT1_NPOINTS,hsize_t),temp_coord3,error) + CALL check("h5sget_select_elem_pointlist_f", error, total_error) + DO i= 1, POINT1_NPOINTS + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(1,i)), INT(coord3(1,i)), total_error) + CALL VERIFY("h5sget_select_elem_pointlist_f", INT(temp_coord3(2,i)), INT(coord3(2,i)), total_error) + ENDDO + + CALL H5Sget_select_npoints_f(sid2, npoints, error) + CALL check("h5sget_select_npoints_f", error, total_error) + CALL verify("h5sget_select_npoints_f", INT(npoints), 20, total_error) + +! F2003 feature +!!$ /* Read selection from disk */ +!!$ ret=H5Dread(dataset,H5T_NATIVE_UCHAR,sid2,sid1,xfer_plist,rbuf); +!!$ CHECK(ret, FAIL, "H5Dread"); +!!$ +!!$ /* Check that the values match with a dataset iterator */ +!!$ pi.buf=wbuf; +!!$ pi.offset=0; +!!$ ret = H5Diterate(rbuf,H5T_NATIVE_UCHAR,sid2,test_select_point_iter1,&pi); +!!$ CHECK(ret, FAIL, "H5Diterate"); +!!$ +! F2003 feature + + !/* Close memory dataspace */ + CALL h5sclose_f(sid2, error) + CALL check("h5sclose_f", error, total_error) + + !/* Close disk dataspace */ + CALL h5sclose_f(sid1, error) + CALL check("h5sclose_f", error, total_error) + + !/* Close Dataset */ + CALL h5dclose_f(dataset, error) + CALL check("h5dclose_f", error, total_error) + + !/* Close file */ + CALL h5fclose_f(fid1, error) + CALL check("h5fclose_f", error, total_error) + +END SUBROUTINE test_select_point + + +!/**************************************************************** +!** +!** test_select_combine(): Test basic H5S (dataspace) selection code. +!** Tests combining "all" and "none" selections with hyperslab +!** operations. +!** +!****************************************************************/ + +SUBROUTINE test_select_combine(cleanup, total_error) + USE HDF5 ! This module contains all necessary modules + + IMPLICIT NONE + LOGICAL, INTENT(IN) :: cleanup + INTEGER, INTENT(OUT) :: total_error + + INTEGER, PARAMETER :: SPACE7_RANK = 2 + INTEGER, PARAMETER :: SPACE7_DIM1 = 10 + INTEGER, PARAMETER :: SPACE7_DIM2 = 10 + + INTEGER(hid_t) :: base_id ! /* Base dataspace for test */ + INTEGER(hid_t) :: all_id ! /* Dataspace for "all" selection */ + INTEGER(hid_t) :: none_id ! /* Dataspace for "none" selection */ + INTEGER(hid_t) :: space1 ! /* Temporary dataspace #1 */ + INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: start ! /* Hyperslab start */ + INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: stride ! /* Hyperslab stride */ + INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: icount ! /* Hyperslab count */ + INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: iblock ! /* Hyperslab BLOCK */ + INTEGER(hsize_t), DIMENSION(1:SPACE7_RANK) :: dims = (/SPACE7_DIM1,SPACE7_DIM2/) !/* Dimensions of dataspace */ + INTEGER :: sel_type ! /* Selection type */ + INTEGER(hssize_t) :: nblocks !/* Number of hyperslab blocks */ + INTEGER(hsize_t), DIMENSION(1:128,1:2,1:SPACE7_RANK) :: blocks ! /* List of blocks */ + INTEGER :: error, area + + !/* Create dataspace for dataset on disk */ + CALL h5screate_simple_f(SPACE7_RANK, dims, base_id, error) + CALL check("h5screate_simple_f", error, total_error) + + ! /* Copy base dataspace and set selection to "all" */ + CALL h5scopy_f(base_id, all_id, error) + CALL check("h5scopy_f", error, total_error) + + CALL H5Sselect_all_f(all_id, error) + CALL check("H5Sselect_all_f", error, total_error) + + CALL H5Sget_select_type_f(all_id, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_ALL_F), total_error) + + !/* Copy base dataspace and set selection to "none" */ + CALL h5scopy_f(base_id, none_id, error) + CALL check("h5scopy_f", error, total_error) + + CALL H5Sselect_none_f(none_id, error) + CALL check("H5Sselect_none_f", error, total_error) + + CALL H5Sget_select_type_f(none_id, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_NONE_F), total_error) + + !/* Copy "all" selection & space */ + CALL H5Scopy_f(all_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + !/* 'OR' "all" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_OR_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + !/* Verify that it's still "all" selection */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT(H5S_SEL_ALL_F), total_error) + + !/* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + !/* Copy "all" selection & space */ + CALL H5Scopy_f(all_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'AND' "all" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_AND_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + !/* Verify that the new selection is the same at the original block */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error) + + !/* Verify that there is only one block */ + CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error) + CALL check("h5sget_select_hyper_nblocks_f", error, total_error) + CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error) + + !/* Retrieve the block defined */ + CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error) + CALL check("h5sget_select_hyper_blocklist_f", error, total_error) + + !/* Verify that the correct block is defined */ + + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error) + + !/* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + !/* Copy "all" selection & space */ + CALL H5Scopy_f(all_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'XOR' "all" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_XOR_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is an inversion of the original block */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error) + + ! /* Verify that there are two blocks */ + CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error) + CALL check("h5sget_select_hyper_nblocks_f", error, total_error) + CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 2, total_error) + + ! /* Retrieve the block defined */ + + blocks = -1 ! /* Reset block list */ + CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error) + CALL check("h5sget_select_hyper_blocklist_f", error, total_error) + + ! /* Verify that the correct block is defined */ + + ! No guarantee is implied as the order in which blocks are listed. + ! So this will ONLY work for square domains iblock(1:2) = (/5,5/) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 5, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 10, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(5,1,1)), 6, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(6,1,1)), 1, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(7,1,1)), 10, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(8,1,1)), 10, total_error) + + ! Otherwise make sure the "area" of the block is correct + area = (ABS(INT(blocks(1,1,1)-blocks(3,1,1)))+1)*(ABS(INT(blocks(2,1,1)-blocks(4,1,1)))+1) + area = area + (ABS(INT(blocks(5,1,1)-blocks(7,1,1)))+1)*(ABS(INT(blocks(6,1,1)-blocks(8,1,1)))+1) + CALL VERIFY("h5sget_select_hyper_blocklist_f", area, 80, total_error) + + !/* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Copy "all" selection & space */ + CALL H5Scopy_f(all_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'NOTB' "all" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTB_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is an inversion of the original block */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error) + + ! /* Verify that there are two blocks */ + CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error) + CALL check("h5sget_select_hyper_nblocks_f", error, total_error) + CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 2, total_error) + + ! /* Retrieve the block defined */ + blocks = -1 ! /* Reset block list */ + CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error) + CALL check("h5sget_select_hyper_blocklist_f", error, total_error) + + ! /* Verify that the correct block is defined */ + + ! No guarantee is implied as the order in which blocks are listed. + ! So this will ONLY work for square domains iblock(1:2) = (/5,5/) + +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 5, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)),10, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(5,1,1)), 6, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(6,1,1)), 1, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(7,1,1)),10, total_error) +!!$ CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(8,1,1)),10, total_error) + + ! Otherwise make sure the "area" of the block is correct + area = (ABS(INT(blocks(1,1,1)-blocks(3,1,1)))+1)*(ABS(INT(blocks(2,1,1)-blocks(4,1,1)))+1) + area = area + (ABS(INT(blocks(5,1,1)-blocks(7,1,1)))+1)*(ABS(INT(blocks(6,1,1)-blocks(8,1,1)))+1) + CALL VERIFY("h5sget_select_hyper_blocklist_f", area, 80, total_error) + + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + ! /* Copy "all" selection & space */ + CALL H5Scopy_f(all_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'NOTA' "all" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTA_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + !/* Verify that the new selection is the "none" selection */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error) + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Copy "none" selection & space */ + CALL H5Scopy_f(none_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'OR' "none" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_OR_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is the same as the original hyperslab */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error) + + + ! /* Verify that there is only one block */ + CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error) + CALL check("h5sget_select_hyper_nblocks_f", error, total_error) + CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error) + + ! /* Retrieve the block defined */ + blocks = -1 ! /* Reset block list */ + CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error) + CALL check("h5sget_select_hyper_blocklist_f", error, total_error) + + ! /* Verify that the correct block is defined */ + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error) + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Copy "none" selection & space */ + CALL H5Scopy_f(none_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'AND' "none" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_AND_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is the "none" selection */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error) + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Copy "none" selection & space */ + CALL H5Scopy_f(none_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'XOR' "none" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_XOR_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is the same as the original hyperslab */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error) + + + ! /* Verify that there is only one block */ + CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error) + CALL check("h5sget_select_hyper_nblocks_f", error, total_error) + CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error) + + ! /* Retrieve the block defined */ + blocks = -1 ! /* Reset block list */ + CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error) + CALL check("h5sget_select_hyper_blocklist_f", error, total_error) + ! /* Verify that the correct block is defined */ + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error) + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Copy "none" selection & space */ + CALL H5Scopy_f(none_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'NOTB' "none" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTB_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is the "none" selection */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_NONE_F), total_error) + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Copy "none" selection & space */ + CALL H5Scopy_f(none_id, space1, error) + CALL check("h5scopy_f", error, total_error) + + ! /* 'NOTA' "none" selection with another hyperslab */ + start(1:2) = 0 + stride(1:2) = 1 + icount(1:2) = 1 + iblock(1:2) = (/5,4/) !5 + CALL h5sselect_hyperslab_f(space1, H5S_SELECT_NOTA_F, start, & + icount, error, stride, iblock) + CALL check("h5sselect_hyperslab_f", error, total_error) + + ! /* Verify that the new selection is the same as the original hyperslab */ + CALL H5Sget_select_type_f(space1, sel_type, error) + CALL check("H5Sget_select_type_f", error, total_error) + CALL VERIFY("H5Sget_select_type_f", INT(sel_type), INT( H5S_SEL_HYPERSLABS_F), total_error) + + ! /* Verify that there is ONLY one BLOCK */ + CALL h5sget_select_hyper_nblocks_f(space1, nblocks, error) + CALL check("h5sget_select_hyper_nblocks_f", error, total_error) + CALL VERIFY("h5sget_select_hyper_nblocks_f", INT(nblocks), 1, total_error) + + ! /* Retrieve the block defined */ + + blocks = -1 ! /* Reset block list */ + CALL h5sget_select_hyper_blocklist_f(space1, INT(0, hsize_t), INT(nblocks,hsize_t), blocks, error) + CALL check("h5sget_select_hyper_blocklist_f", error, total_error) + + + ! /* Verify that the correct block is defined */ + + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(1,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(2,1,1)), 1, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(3,1,1)), 5, total_error) + CALL VERIFY("h5sget_select_hyper_blocklist_f", INT(blocks(4,1,1)), 4, total_error) + + ! /* Close temporary dataspace */ + CALL h5sclose_f(space1, error) + CALL check("h5sclose_f", error, total_error) + + ! /* Close dataspaces */ + + CALL h5sclose_f(base_id, error) + CALL check("h5sclose_f", error, total_error) + CALL h5sclose_f(all_id, error) + CALL check("h5sclose_f", error, total_error) + CALL h5sclose_f(none_id, error) + CALL check("h5sclose_f", error, total_error) + +END SUBROUTINE test_select_combine + +!/**************************************************************** +!** +!** test_select_bounds(): Tests selection bounds on dataspaces, +!** both with and without offsets. +!** +!****************************************************************/ + +SUBROUTINE test_select_bounds(cleanup, total_error) + USE HDF5 ! This module contains all necessary modules + + IMPLICIT NONE + LOGICAL, INTENT(IN) :: cleanup + INTEGER, INTENT(OUT) :: total_error + + INTEGER, PARAMETER :: SPACE11_RANK=2 + INTEGER, PARAMETER :: SPACE11_DIM1=100 + INTEGER, PARAMETER :: SPACE11_DIM2=50 + INTEGER, PARAMETER :: SPACE11_NPOINTS=4 + + INTEGER(hid_t) :: sid ! /* Dataspace ID */ + INTEGER(hsize_t), DIMENSION(1:SPACE11_RANK) :: dims = (/SPACE11_DIM1, SPACE11_DIM2/) !Dataspace dimensions + INTEGER(hsize_t), DIMENSION(SPACE11_RANK, SPACE11_NPOINTS) :: coord !/* Coordinates for point selection + INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: start ! /* The start of the hyperslab */ + INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: stride !/* The stride between block starts for the hyperslab */ + INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: count !/* The number of blocks for the hyperslab */ + INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: BLOCK !/* The size of each block for the hyperslab */ + INTEGER(hssize_t), DIMENSION(SPACE11_RANK) :: offset !/* Offset amount for selection */ + INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: low_bounds !/* The low bounds for the selection */ + INTEGER(hsize_t), DIMENSION(SPACE11_RANK) :: high_bounds !/* The high bounds for the selection */ + + INTEGER :: error + + !/* Create dataspace */ + CALL h5screate_simple_f(SPACE11_RANK, dims, sid, error) + CALL check("h5screate_simple_f", error, total_error) + + ! /* Get bounds for 'all' selection */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 1, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), SPACE11_DIM1, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), SPACE11_DIM2, total_error) + + !/* Set offset for selection */ + offset(1:2) = 1 + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + !/* Get bounds for 'all' selection with offset (which should be ignored) */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL verify("h5sget_select_bounds_f", INT(low_bounds(1)), 1, total_error) + CALL verify("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error) + CALL verify("h5sget_select_bounds_f", INT(high_bounds(1)), SPACE11_DIM1, total_error) + CALL verify("h5sget_select_bounds_f", INT(high_bounds(2)), SPACE11_DIM2, total_error) + + !/* Reset offset for selection */ + offset(1:2) = 0 + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + !/* Set 'none' selection */ + CALL H5Sselect_none_f(sid, error) + CALL check("H5Sselect_none_f", error, total_error) + + !/* Get bounds for 'none' selection, should fail */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error) + + !/* Set point selection */ + + coord(1,1)= 3; coord(2,1)= 3; + coord(1,2)= 3; coord(2,2)= 46; + coord(1,3)= 96; coord(2,3)= 3; + coord(1,4)= 96; coord(2,4)= 46; + + CALL h5sselect_elements_f(sid, H5S_SELECT_SET_F, SPACE11_RANK, INT(SPACE11_NPOINTS,size_t), coord, error) + CALL check("h5sselect_elements_f", error, total_error) + + !/* Get bounds for point selection */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 3, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 3, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), SPACE11_DIM1-4, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), SPACE11_DIM2-4, total_error) + + ! /* Set bad offset for selection */ + + offset(1:2) = (/5,-5/) + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + ! /* Get bounds for hyperslab selection with negative offset */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error) + + ! /* Set valid offset for selection */ + offset(1:2) = (/2,-2/) + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + ! /* Get bounds for point selection with offset */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 5, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), SPACE11_DIM1-2, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), SPACE11_DIM2-6, total_error) + + ! /* Reset offset for selection */ + offset(1:2) = 0 + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + ! /* Set "regular" hyperslab selection */ + start(1:2) = 2 + stride(1:2) = 10 + count(1:2) = 4 + block(1:2) = 5 + + CALL h5sselect_hyperslab_f(sid, H5S_SELECT_SET_F, start, & + count, error, stride, block) + CALL check("h5sselect_hyperslab_f", error, total_error) + + !/* Get bounds for hyperslab selection */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 3, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 3, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 37, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 37, total_error) + + !/* Set bad offset for selection */ + offset(1:2) = (/5,-5/) + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + ! /* Get bounds for hyperslab selection with negative offset */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error) + + ! /* Set valid offset for selection */ + offset(1:2) = (/5,-2/) + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + !/* Get bounds for hyperslab selection with offset */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 8, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 42, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 35, total_error) + + !/* Reset offset for selection */ + offset(1:2) = 0 + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + ! /* Make "irregular" hyperslab selection */ + start(1:2) = 20 + stride(1:2) = 20 + count(1:2) = 2 + block(1:2) = 10 + + CALL h5sselect_hyperslab_f(sid, H5S_SELECT_OR_F, start, & + count, error, stride, block) + CALL check("h5sselect_hyperslab_f", error, total_error) + + !/* Get bounds for hyperslab selection */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 3, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 3, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 50, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 50, total_error) + + ! /* Set bad offset for selection */ + offset(1:2) = (/5,-5/) + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + ! /* Get bounds for hyperslab selection with negative offset */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL VERIFY("h5sget_select_bounds_f", error, -1, total_error) + + !/* Set valid offset for selection */ + offset(1:2) = (/5,-2/) + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + !/* Get bounds for hyperslab selection with offset */ + CALL h5sget_select_bounds_f(sid, low_bounds, high_bounds, error) + CALL check("h5sget_select_bounds_f", error, total_error) + + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(1)), 8, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(low_bounds(2)), 1, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(1)), 55, total_error) + CALL VERIFY("h5sget_select_bounds_f", INT(high_bounds(2)), 48, total_error) + + !/* Reset offset for selection */ + offset(1:2) = 0 + CALL H5Soffset_simple_f(sid, offset, error) + CALL check("H5Soffset_simple_f", error, total_error) + + !/* Close the dataspace */ + CALL h5sclose_f(sid, error) + CALL check("h5sclose_f", error, total_error) + +END SUBROUTINE test_select_bounds diff --git a/fortran/test/tH5T.f90 b/fortran/test/tH5T.f90 index 0648cac..0c86b6c 100644 --- a/fortran/test/tH5T.f90 +++ b/fortran/test/tH5T.f90 @@ -814,13 +814,16 @@ INTEGER(HID_T) :: file_id INTEGER(HID_T) :: dset_id INTEGER(HID_T) :: dspace_id - INTEGER(HID_T) :: dtype_id + INTEGER(HID_T) :: dtype_id, dtype, native_type INTEGER :: error INTEGER :: value INTEGER(HSIZE_T), DIMENSION(1) :: dsize INTEGER(SIZE_T) :: buf_size INTEGER, DIMENSION(2) :: data INTEGER(HSIZE_T), DIMENSION(7) :: dims + INTEGER :: order1, order2 + INTEGER(SIZE_T) :: type_size1, type_size2 + INTEGER :: class dims(1) = 2 dsize(1) = 2 @@ -829,55 +832,82 @@ ! ! Create a new file using default properties. ! - CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error) - if (error .ne. 0) then - write(*,*) "Cannot modify filename" - stop - endif + CALL h5_fixname_f(filename, fix_filename, H5P_DEFAULT_F, error) + IF (error .NE. 0) THEN + WRITE(*,*) "Cannot modify filename" + STOP + ENDIF CALL h5fcreate_f(fix_filename,H5F_ACC_TRUNC_F,file_id,error) - CALL check("h5fcreate_f", error, total_error) + CALL check("h5fcreate_f", error, total_error) ! ! Create enumeration datatype with tow values ! CALL h5tenum_create_f(H5T_NATIVE_INTEGER,dtype_id,error) - CALL check("h5tenum_create_f", error, total_error) - CALL h5tenum_insert_f(dtype_id,true,data(1),error) - CALL check("h5tenum_insert_f", error, total_error) - CALL h5tenum_insert_f(dtype_id,false,data(2),error) - CALL check("h5tenum_insert_f", error, total_error) + CALL check("h5tenum_create_f", error, total_error) + CALL h5tenum_insert_f(dtype_id,true,DATA(1),error) + CALL check("h5tenum_insert_f", error, total_error) + CALL h5tenum_insert_f(dtype_id,false,DATA(2),error) + CALL check("h5tenum_insert_f", error, total_error) ! ! Create write and close a dataset with enum datatype ! CALL h5screate_simple_f(1,dsize,dspace_id,error) - CALL check("h5screate_simple_f", error, total_error) + CALL check("h5screate_simple_f", error, total_error) CALL h5dcreate_f(file_id,dsetname,dtype_id,dspace_id,dset_id,error) - CALL check("h5dcreate_f", error, total_error) - CALL h5dwrite_f(dset_id,dtype_id,data,dims,error) - CALL check("h5dwrite_f", error, total_error) + CALL check("h5dcreate_f", error, total_error) + CALL h5dwrite_f(dset_id,dtype_id,DATA,dims,error) + CALL check("h5dwrite_f", error, total_error) + + CALL H5Dget_type_f(dset_id, dtype, error) + CALL check("H5Dget_type_f", error, total_error) + + CALL H5Tget_native_type_f(dtype, H5T_DIR_ASCEND_F, native_type, error) + CALL check("H5Tget_native_type_f",error, total_error) + + !/* Verify the datatype retrieved and converted */ + CALL H5Tget_order_f(native_type, order1, error) + CALL check("H5Tget_order_f",error, total_error) + CALL H5Tget_order_f(H5T_NATIVE_INTEGER, order2, error) + CALL check("H5Tget_order_f",error, total_error) + CALL VERIFY("H5Tget_native_type_f",order1, order2, total_error) + + ! this test depends on whether -i8 was specified needs to account for that FIX -scot- + +!!$ CALL H5Tget_size_f(native_type, type_size1, error) +!!$ CALL check("H5Tget_size_f",error, total_error) +!!$ CALL H5Tget_size_f(H5T_STD_I32BE, type_size2, error) +!!$ CALL check("H5Tget_size_f",error, total_error) +!!$ CALL VERIFY("H5Tget_native_type_f", INT(type_size1), INT(type_size2), total_error) + + CALL H5Tget_class_f(native_type, class, error) + CALL check("H5Tget_class_f",error, total_error) + CALL VERIFY("H5Tget_native_type_f", INT(class), INT(H5T_ENUM_F), total_error) + CALL h5dclose_f(dset_id,error) - CALL check("h5dclose_f", error, total_error) + CALL check("h5dclose_f", error, total_error) CALL h5sclose_f(dspace_id,error) - CALL check("h5sclose_f", error, total_error) + CALL check("h5sclose_f", error, total_error) ! ! Get value of "TRUE" ! CALL h5tenum_valueof_f(dtype_id, "TRUE", value, error) - CALL check("h5tenum_valueof_f", error, total_error) - if (value .ne. 1) then - write(*,*) " Value of TRUE is not 1, error" - total_error = total_error + 1 - endif + CALL check("h5tenum_valueof_f", error, total_error) + IF (value .NE. 1) THEN + WRITE(*,*) " Value of TRUE is not 1, error" + total_error = total_error + 1 + ENDIF ! ! Get name of 0 ! value = 0 buf_size = 5 CALL h5tenum_nameof_f(dtype_id, value, buf_size, mem_name, error) - CALL check("h5tenum_nameof_f", error, total_error) - if (mem_name .ne. "FALSE") then - write(*,*) " Wrong name for 0 value" - total_error = total_error + 1 - endif + CALL check("h5tenum_nameof_f", error, total_error) + IF (mem_name .NE. "FALSE") THEN + WRITE(*,*) " Wrong name for 0 value" + total_error = total_error + 1 + ENDIF + CALL h5tclose_f(dtype_id,error) CALL check("h5tclose_f", error, total_error) CALL h5fclose_f(file_id,error) @@ -1085,4 +1115,3 @@ SUBROUTINE test_derived_flt(cleanup, total_error) CALL check("h5fclose_f", error, total_error) END SUBROUTINE test_derived_flt - diff --git a/fortran/test/tf.f90 b/fortran/test/tf.f90 index 1cbac24..d48ede1 100644 --- a/fortran/test/tf.f90 +++ b/fortran/test/tf.f90 @@ -18,11 +18,51 @@ ! This file contains subroutines which are used in ! all the hdf5 fortran tests ! + + !This definition is needed for Windows DLLs !DEC$if defined(BUILD_HDF5_DLL) -!DEC$attributes dllexport :: check +!DEC$attributes dllexport :: write_test_status !DEC$endif + SUBROUTINE write_test_status( test_result, test_title, total_error) + +! Writes the results of the tests + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: test_result ! negative, --skip -- + ! 0 , passed + ! positive, failed + + CHARACTER(LEN=*), INTENT(IN) :: test_title ! Short description of test + INTEGER, INTENT(INOUT) :: total_error ! Accumulated error + +! Controls the output style for reporting test results + + CHARACTER(LEN=8) :: error_string + CHARACTER(LEN=8), PARAMETER :: success = ' PASSED ' + CHARACTER(LEN=8), PARAMETER :: failure = '*FAILED*' + CHARACTER(LEN=8), PARAMETER :: skip = '--SKIP--' + + error_string = failure + IF (test_result == 0) THEN + error_string = success + ELSE IF (test_result == -1) THEN + error_string = skip + ENDIF + + WRITE(*, fmt = '(A, T72, A)') test_title, error_string + + IF(test_result.GT.0) total_error = total_error + test_result + + END SUBROUTINE write_test_status + + +!This definition is needed for Windows DLLs +!DEC$if defined(BUILD_HDF5_DLL) +!DEC$attributes dllexport :: check +!DEC$endif SUBROUTINE check(string,error,total_error) CHARACTER(LEN=*) :: string INTEGER :: error, total_error |