cmake_minimum_required(VERSION 3.2.2)
PROJECT (H4H5_LIB_TEST C CXX)

#-----------------------------------------------------------------------------
# Setup include Directories
#-----------------------------------------------------------------------------
INCLUDE_DIRECTORIES (${H4H5_LIB_BINARY_DIR} ${H4H5_SRC_DIR})
LINK_DIRECTORIES (
    ${H4H5_LIB_BINARY_DIR}
    ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
)

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

MACRO (BUILD_H4H5_TEST file)
  add_executable (${file} ${H4H5_LIB_TEST_SOURCE_DIR}/${file}.c)
  TARGET_NAMING (${file} STATIC)
  TARGET_C_PROPERTIES (${file} STATIC " " " ")
  target_link_libraries (${file} ${H4H5_SRC_LIB_TARGET} ${LINK_LIBS})
  if (BUILD_SHARED_LIBS)
    add_executable (${file}-shared ${H4H5_LIB_TEST_SOURCE_DIR}/${file}.c)
    TARGET_NAMING (${file}-shared SHARED)
    TARGET_C_PROPERTIES (${file}-shared SHARED " " " ")
    target_link_libraries (${file}-shared ${H4H5_SRC_LIB_TARGET} ${LINK_LIBS})
  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
)

file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/Expected")
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})
  set (desth5 "${PROJECT_BINARY_DIR}/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}
  )
  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}/${testfile}.hdf
  )
  if (NOT "${last_test}" STREQUAL "")
    set_tests_properties (TESTH4TOH5_COPY-${testname} PROPERTIES DEPENDS ${last_test})
  endif ()

  add_test (NAME TESTH4TOH5-${testname} COMMAND $<TARGET_FILE:${testname}> ${testfile}.hdf ${testfile}.h5)
  set_tests_properties (TESTH4TOH5-${testname} PROPERTIES DEPENDS TESTH4TOH5_COPY-${testname})

  add_test (
      NAME TESTH4TOH5-${testname}-DIFF
      COMMAND ${HDF5_DIFF_EXECUTABLE} -v ${PROJECT_BINARY_DIR}/${testfile}.h5 ${PROJECT_BINARY_DIR}/Expected/${testfile}.h5
  )
  set_tests_properties (TESTH4TOH5-${testname}-DIFF PROPERTIES DEPENDS TESTH4TOH5-${testname})
  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 $<TARGET_FILE:${testname}-shared> ${testfile}.hdf ${testfile}.h5)
  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}/${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")

#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})

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 ()
