cmake_minimum_required (VERSION 3.10)
project (H4H5_LIB_TEST C)

#
# Copyright by The HDF Group.
# All rights reserved.
#
# This file is part of H4H5TOOLS. The full H4H5TOOLS copyright notice,
# including terms governing use, modification, and redistribution, is
# contained in the COPYING file, which can be found at the root of the
# source code distribution tree. The copyright notice can also be found
# at https://www.hdfgroup.org/licenses.  If you do not have access to
# either file, you may request a copy from help@hdfgroup.org.
#

#-----------------------------------------------------------------------------
# Setup Sources
#-----------------------------------------------------------------------------
set (H4H5_TESTS
    h4toh5test
    h4h5apitestdefault
    h4h5apitestname
    h4h5apitestadvgroup
    h4h5apitestsds
    h4h5apitestimage
    h4h5apitestvdata
    h4h5apitestbasvgroup
    h4h5apitestimageattr
    h4h5apitestsdsattr
    h4h5apitestlonesds
    h4h5apitestloneimage
    h4h5apitestlonevdata
    h4toh5eostest
)

macro (BUILD_H4H5_TEST file)
  if (NOT ONLY_SHARED_LIBS)
    add_executable (${file} ${H4H5_LIB_TEST_SOURCE_DIR}/${file}.c)
    target_include_directories(${file} PRIVATE "${HDF4_INCLUDE_DIRS};${HDF5_INCLUDE_DIRS};${H4H5_SRC_DIR};${H4H5_LIB_BINARY_DIR}")
    TARGET_C_PROPERTIES (${file} STATIC)
    target_link_libraries (${file} PRIVATE ${H4H5_SRC_LIB_TARGET})
  endif ()
  if (BUILD_SHARED_LIBS)
    add_executable (${file}-shared ${H4H5_LIB_TEST_SOURCE_DIR}/${file}.c)
    target_include_directories(${file}-shared PRIVATE "${HDF4_INCLUDE_DIRS};${HDF5_INCLUDE_DIRS};${H4H5_SRC_DIR};${H4H5_LIB_BINARY_DIR}")
    TARGET_C_PROPERTIES (${file}-shared SHARED)
    target_link_libraries (${file}-shared PRIVATE ${H4H5_SRC_LIBSH_TARGET})
  endif ()
endmacro ()

foreach (test ${H4H5_TESTS})
    BUILD_H4H5_TEST(${test})
endforeach ()

#-- Copy all the dat files from the test directory into the source directory
set (H4H5_REFERENCE_TEST_FILES
    image_lib_lonetest
    image_lib_test
    sds_lib_lonetest
    sds_lib_test
    testallvgroup
    vdata_lib_lonetest
    vdata_lib_test
    vg_all_test
    vg_all_testname
    vg_bas_test
)

if (NOT ONLY_SHARED_LIBS)
  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/static")
  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/static/Expected")
endif ()
if (BUILD_SHARED_LIBS)
  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/shared")
  file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/shared/Expected")
endif ()
foreach (h4h5_file ${H4H5_REFERENCE_TEST_FILES})
  if (NOT ONLY_SHARED_LIBS)
    set (desth5 "${PROJECT_BINARY_DIR}/static/Expected/${h4h5_file}.h5")
    #MESSAGE(STATUS " Copying ${h4h5_file} to ${dest} and ${desth5}")
    add_custom_command (
        TARGET     h4toh5test
        POST_BUILD
        COMMAND    ${CMAKE_COMMAND}
        ARGS       -E copy_if_different ${H4H5_SOURCE_DIR}/lib/testfiles/Expected/${h4h5_file}.h5 ${desth5}
    )
  endif ()
  if (BUILD_SHARED_LIBS)
    set (desth5 "${PROJECT_BINARY_DIR}/shared/Expected/${h4h5_file}.h5")
    #MESSAGE(STATUS " Copying ${h4h5_file} to ${dest} and ${desth5}")
    add_custom_command (
        TARGET     h4toh5test
        POST_BUILD
        COMMAND    ${CMAKE_COMMAND}
        ARGS       -E copy_if_different ${H4H5_SOURCE_DIR}/lib/testfiles/Expected/${h4h5_file}.h5 ${desth5}
    )
  endif ()
endforeach ()

if (H5_USE_HDFEOS2)
  add_definitions (-DHAVE_LIBHDFEOS)
endif ()

macro (ADD_H4H5_TEST testname testfile)
  add_test (
      NAME TESTH4TOH5_COPY-${testname}
      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${H4H5_SOURCE_DIR}/lib/testfiles/${testfile}.hdf ${PROJECT_BINARY_DIR}/static/${testfile}.hdf
  )
  if (NOT "${last_test}" STREQUAL "")
    set_tests_properties (TESTH4TOH5_COPY-${testname} PROPERTIES DEPENDS ${last_test})
  endif ()

  add_test (
      NAME TESTH4TOH5-${testname}
      COMMAND "${CMAKE_COMMAND}"
          -D "TEST_PROGRAM=$<TARGET_FILE:${testname}>"
          -D "TEST_ARGS:STRING=${testfile}.hdf;${testfile}.h5"
          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/static"
          -D "TEST_EXPECT=0"
          -D "TEST_OUTPUT=${testname}.out"
          -D "TEST_REFERENCE=${testname}.tst"
          -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}"
          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
  )
  set_tests_properties (TESTH4TOH5-${testname} PROPERTIES DEPENDS TESTH4TOH5_COPY-${testname})

  add_test (
      NAME TESTH4TOH5-${testname}-DIFF
      COMMAND ${HDF5_DIFF_EXECUTABLE} -v ${PROJECT_BINARY_DIR}/static/${testfile}.h5 ${PROJECT_BINARY_DIR}/static/Expected/${testfile}.h5
  )
  set_tests_properties (TESTH4TOH5-${testname}-DIFF PROPERTIES
      DEPENDS TESTH4TOH5-${testname}
      WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/static"
  )
  set (last_test "TESTH4TOH5-${testname}-DIFF")
endmacro ()

macro (ADD_H4H5_SHARED_TEST testname testfile)
  add_test (
      NAME TESTH4TOH5_COPY-${testname}-shared
      COMMAND ${CMAKE_COMMAND} -E copy_if_different ${H4H5_SOURCE_DIR}/lib/testfiles/${testfile}.hdf ${PROJECT_BINARY_DIR}/shared/${testfile}.hdf
  )
  if (NOT "${last_test}" STREQUAL "")
    set_tests_properties (TESTH4TOH5_COPY-${testname}-shared PROPERTIES DEPENDS ${last_test})
  endif ()

  add_test (
      NAME TESTH4TOH5-${testname}-shared
      COMMAND "${CMAKE_COMMAND}"
          -D "TEST_PROGRAM=$<TARGET_FILE:${testname}-shared>"
          -D "TEST_ARGS:STRING=${testfile}.hdf;${testfile}.h5"
          -D "TEST_FOLDER=${PROJECT_BINARY_DIR}/shared"
          -D "TEST_EXPECT=0"
          -D "TEST_OUTPUT=${testname}-shared.out"
          -D "TEST_REFERENCE=${testname}-shared.tst"
          -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}"
          -P "${HDF_RESOURCES_EXT_DIR}/runTest.cmake"
  )
  set_tests_properties (TESTH4TOH5-${testname}-shared PROPERTIES
        DEPENDS TESTH4TOH5_COPY-${testname}-shared
        WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/shared")

  add_test (
      NAME TESTH4TOH5-${testname}-shared-DIFF
      COMMAND ${HDF5_DIFF_EXECUTABLE} -v ${PROJECT_BINARY_DIR}/shared/${testfile}.h5 ${PROJECT_BINARY_DIR}/shared/Expected/${testfile}.h5
  )
  set_tests_properties (TESTH4TOH5-${testname}-shared-DIFF PROPERTIES
        DEPENDS TESTH4TOH5-${testname}-shared
        WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/shared"
  )
  set (last_test "TESTH4TOH5-${testname}-shared-DIFF")
endmacro ()

# Remove any output file left over from previous test run
add_test (
    NAME h4toh5test-clearall-objects
    COMMAND ${CMAKE_COMMAND} -E remove
        image_lib_lonetest.h5
        image_lib_test.h5
        sds_lib_lonetest.h5
        sds_lib_test.h5
        testallvgroup.h5
        vdata_lib_lonetest.h5
        vdata_lib_test.h5
        vg_all_test.h5
        vg_all_testname.h5
        vg_bas_test.h5
)
if (NOT "${last_test}" STREQUAL "")
  set_tests_properties (h4toh5test-clearall-objects PROPERTIES DEPENDS ${last_test})
endif ()
set (last_test "h4toh5test-clearall-objects")

if (NOT ONLY_SHARED_LIBS)
  #ADD_H4H5_TEST (h4toh5test ${h4h5_file})
  ADD_H4H5_TEST (h4h5apitestdefault vg_all_test)
  ADD_H4H5_TEST (h4h5apitestname vg_all_testname)
  ADD_H4H5_TEST (h4h5apitestsds sds_lib_test)
  ADD_H4H5_TEST (h4h5apitestimage image_lib_test)
  ADD_H4H5_TEST (h4h5apitestvdata vdata_lib_test)
  ADD_H4H5_TEST (h4h5apitestimageattr image_lib_test)
  ADD_H4H5_TEST (h4h5apitestsdsattr sds_lib_test)
  ADD_H4H5_TEST (h4h5apitestbasvgroup vg_bas_test)
  ADD_H4H5_TEST (h4h5apitestadvgroup testallvgroup)
  ADD_H4H5_TEST (h4h5apitestloneimage image_lib_lonetest)
  ADD_H4H5_TEST (h4h5apitestlonesds sds_lib_lonetest)
  ADD_H4H5_TEST (h4h5apitestlonevdata vdata_lib_lonetest)
  #ADD_H4H5_TEST (h4toh5eostest ${h4h5_file})
endif ()

if (BUILD_SHARED_LIBS)
  #ADD_H4H5_SHARED_TEST (h4toh5test ${h4h5_file})
  ADD_H4H5_SHARED_TEST (h4h5apitestdefault vg_all_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestname vg_all_testname)
  ADD_H4H5_SHARED_TEST (h4h5apitestsds sds_lib_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestimage image_lib_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestvdata vdata_lib_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestimageattr image_lib_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestsdsattr sds_lib_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestbasvgroup vg_bas_test)
  ADD_H4H5_SHARED_TEST (h4h5apitestadvgroup testallvgroup)
  ADD_H4H5_SHARED_TEST (h4h5apitestloneimage image_lib_lonetest)
  ADD_H4H5_SHARED_TEST (h4h5apitestlonesds sds_lib_lonetest)
  ADD_H4H5_SHARED_TEST (h4h5apitestlonevdata vdata_lib_lonetest)
  #ADD_H4H5_SHARED_TEST (h4toh5eostest ${h4h5_file})
endif ()
