find_program( GRIB_COMPARE grib_compare )

if( NOT GRIB_COMPARE AND TARGET grib_compare )
  get_target_property( GRIB_COMPARE grib_compare LOCATION )
endif()

if( NOT grib_api_BASE_DIR AND GRIB_COMPARE )
  get_filename_component( _grib_compare_dir "${GRIB_COMPARE}" PATH )
  get_filename_component( grib_api_BASE_DIR "${_grib_compare_dir}" ABSOLUTE )
  set( grib_api_BASE_DIR "${grib_api_BASE_DIR}/../" )
endif()

if( NOT GRIB_COMPARE )
    message( WARNING "Could not find grib_compare executable -- turning off some tests!\nTo enable them place 'grib_compare' on the PATH and re-run cmake" )
else()
    message( STATUS "Testing with grib_api: ${grib_api_BASE_DIR}" )
    message( STATUS "Testing with grib_compare: ${GRIB_COMPARE}" )
endif()

# define the grib environment
if( grib_api_BASE_DIR )
  set( _grib_environment
    GRIB_DEFINITION_PATH=${grib_api_BASE_DIR}/share/grib_api/definitions/
    GRIB_SAMPLES_PATH=${grib_api_BASE_DIR}/share/grib_api/samples/ )
endif()

# configure Fortran-based targets for double precision (compilation & linking)
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${emos_double_precision_flags}")

configure_file( include.sh.in include.sh @ONLY )

##################### INTERPOLATION #######################

ecbuild_add_test(
  TARGET  interpolation_example_grib_api
  SOURCES interpolation_example_grib_api.F
  LIBS    emos ${GRIB_API_LIBRARIES}
  ARGS    -i ${PROJECT_SOURCE_DIR}/data/latlon.grib -o interpolation_example_grib_api.grib
  LINKER_LANGUAGE Fortran
  ENVIRONMENT
    "${_grib_environment}"
    MARS_LSM_PATH=${CMAKE_BINARY_DIR}/${INSTALL_DATA_DIR}/tables/interpol/
    ECMWF_LOCAL_TABLE_PATH=${PROJECT_SOURCE_DIR}/gribtables/
    LOCAL_DEFINITION_TEMPLATES=${PROJECT_SOURCE_DIR}/gribtemplates/ )

ecbuild_add_test(
  TARGET  interpolation_example_wind
  SOURCES interpolation_example_wind.F
  LIBS    emos ${GRIB_API_LIBRARIES}
  ARGS    -i ${PROJECT_SOURCE_DIR}/data/latlon.grib -o interpolation_example_wind.grib
  LINKER_LANGUAGE Fortran
  ENVIRONMENT
    "${_grib_environment}"
    MARS_LSM_PATH=${CMAKE_BINARY_DIR}/${INSTALL_DATA_DIR}/tables/interpol/
    ECMWF_LOCAL_TABLE_PATH=${PROJECT_SOURCE_DIR}/gribtables/
    LOCAL_DEFINITION_TEMPLATES=${PROJECT_SOURCE_DIR}/gribtemplates/ )

ecbuild_add_executable(
  TARGET  interpolation NOINSTALL
  SOURCES interpolation.F
  LIBS    emos ${GRIB_API_LIBRARIES} )

ecbuild_add_test(
  TARGET      interpolation
  TYPE        SCRIPT
  CONDITION   GRIB_COMPARE
  COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/interpolation.sh
  RESOURCES   data_ref/spectral-ll.grib data_ref/spectral-rg.grib
  ENVIRONMENT "${_grib_environment}"
)

##################### G R I B E X #########################

if( HAVE_GRIBEX_ABORT )

  ecbuild_add_test(
    TARGET  gribex_abort
    SOURCES gribex_abort.F
    LIBS    emos ${GRIB_API_LIBRARIES}
    LINKER_LANGUAGE Fortran )
  set_tests_properties( gribex_abort PROPERTIES WILL_FAIL TRUE )

else()

  ecbuild_add_test(
    TARGET  interpolation_example_gribex
    SOURCES interpolation_example_gribex.F
    LIBS    emos ${GRIB_API_LIBRARIES}
    ARGS    -i ${PROJECT_SOURCE_DIR}/data/latlon.grib -o interpolation_example_gribex.grib
    LINKER_LANGUAGE Fortran
    ENVIRONMENT
      "${_grib_environment}"
      MARS_LSM_PATH=${CMAKE_BINARY_DIR}/${INSTALL_DATA_DIR}/tables/interpol/
      ECMWF_LOCAL_TABLE_PATH=${PROJECT_SOURCE_DIR}/gribtables/
      LOCAL_DEFINITION_TEMPLATES=${PROJECT_SOURCE_DIR}/gribtemplates/ )

endif()

##################### B U F R #############################

# set bufr tables path (for testing):
# (check if bufrtables/ is bundled, otherwise set to best guess)
if( NOT TEST_BUFR_TABLES_PATH AND EXISTS "${PROJECT_SOURCE_DIR}/bufrtables/B0000000000000000000.TXT" )
  set( TEST_BUFR_TABLES_PATH "${PROJECT_SOURCE_DIR}/bufrtables" )
elseif ( NOT TEST_BUFR_TABLES_PATH )
  set( TEST_BUFR_TABLES_PATH "${BUFR_TABLES_PATH}" )
endif()
message( STATUS "TEST_BUFR_TABLES_PATH: ${TEST_BUFR_TABLES_PATH}" )
if( EXISTS "${TEST_BUFR_TABLES_PATH}" )
  set( TEST_BUFR_TABLES_PATH_EXISTS TRUE )
else()
  set( TEST_BUFR_TABLES_PATH_EXISTS FALSE )
  message( WARNING "Could not find bufr tables path for testing -- turning off some tests!\nTo enable them set a valid TEST_BUFR_TABLES_PATH (alternatively, BUFR_TABLES_PATH) and re-run cmake" )
endif()

# download bufr test files
file(READ "bufr_data_files.txt" bufr_files)
string(REGEX REPLACE "\n" ";" bufr_files "${bufr_files}")
ecbuild_get_test_multidata( TARGET download_bufrs NOCHECK NAMES ${bufr_files} )

# add F90 tests
if( ENABLE_FORTRAN90 )

  ecbuild_add_test(
    TARGET       bufr_demo
    SOURCES      bufr_demo.f90
    LIBS         emos ${GRIB_API_LIBRARIES}
    LINKER_LANGUAGE Fortran
    CONDITION    TEST_BUFR_TABLES_PATH_EXISTS
    ARGS         ${PROJECT_SOURCE_DIR}/data/temp_101.bufr
    ENVIRONMENT  BUFR_TABLES=${TEST_BUFR_TABLES_PATH} )

  ecbuild_add_test(
    TARGET       bufr_demo_NotFoundTestFile
    COMMAND      bufr_demo
    CONDITION    TEST_BUFR_TABLES_PATH_EXISTS
    ARGS         NotFoundTestFile.bufr
    ENVIRONMENT  BUFR_TABLES=${TEST_BUFR_TABLES_PATH} )
  set_tests_properties( bufr_demo_NotFoundTestFile PROPERTIES WILL_FAIL TRUE )

  ecbuild_add_test(
    TARGET       bufr_demo_NotFoundTablesPath
    COMMAND      bufr_demo
    ARGS         ${PROJECT_SOURCE_DIR}/data/temp_101.bufr
    ENVIRONMENT  BUFR_TABLES="NotFoundTablesPath/" )
  set_tests_properties( bufr_demo_NotFoundTablesPath PROPERTIES WILL_FAIL TRUE )

endif( ENABLE_FORTRAN90 )

# add F77 tests
ecbuild_add_test(
  TARGET       bufr_decode_all_NotFoundTestFile
  COMMAND      ${CMAKE_BINARY_DIR}/bin/bufr_decode_all
  CONDITION    TEST_BUFR_TABLES_PATH_EXISTS
  ARGS         -i NotFoundTestFile.bufr
  ENVIRONMENT  BUFR_TABLES=${TEST_BUFR_TABLES_PATH} )
set_tests_properties( bufr_decode_all_NotFoundTestFile PROPERTIES WILL_FAIL TRUE )

ecbuild_add_test(
  TARGET      bufr_decode_all_NotFoundTablesPath
  COMMAND     ${CMAKE_BINARY_DIR}/bin/bufr_decode_all
  ARGS        -i ${PROJECT_SOURCE_DIR}/data/temp_101.bufr
  ENVIRONMENT BUFR_TABLES="NotFoundTablesPath/" )
set_tests_properties( bufr_decode_all_NotFoundTablesPath PROPERTIES WILL_FAIL TRUE )

foreach( bufr_file ${bufr_files} )
  ecbuild_add_test(
    TARGET       bufr_decode_all_${bufr_file}
    COMMAND      ${CMAKE_BINARY_DIR}/bin/bufr_decode_all
    CONDITION    TEST_BUFR_TABLES_PATH_EXISTS
    ARGS         -i ${bufr_file}
    TEST_DEPENDS download_bufrs
    ENVIRONMENT  BUFR_TABLES=${TEST_BUFR_TABLES_PATH} )
endforeach()


#if( ENABLE_INSTALL_TOOLS )
#  ecbuild_add_test(
#    TARGET  tc_tracks
#    TYPE    SCRIPT
#    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tc_tracks.sh
#    ENVIRONMENT BUFR_TABLES=${TEST_BUFR_TABLES_PATH} )
#endif( ENABLE_INSTALL_TOOLS )

##################### F F T ###############################

ecbuild_add_test(
  TARGET       fft
  SOURCES      fft.F
  LIBS         emos ${GRIB_API_LIBRARIES}
  LINKER_LANGUAGE Fortran )

