
# ------------------------------------------------------------------------
# MACRO metview_etc_files
# Ensures the files listed in ETC_FILES are copied to the build directory
# and that they will be installed at install time
# ------------------------------------------------------------------------


set (POST_INSTALL_TEST_SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/metview_post_install_tests.sh)
set (MVRUN "${CMAKE_INSTALL_PREFIX}/bin/${METVIEW_SCRIPT}")


macro(metview_macro_test)
    set(options)
    set(single_value_args MACRO)
    set(multi_value_args RESOURCES MACRO_ARGS)
    cmake_parse_arguments( _PAR "${options}" "${single_value_args}" "${multi_value_args}" ${_FIRST_ARG} ${ARGN} )


    ecbuild_add_test(TARGET      ${_PAR_MACRO}_dummy_target
                     COMMAND     ${FULL_STARTUP_SCRIPT_PATH}
                     TYPE        SCRIPT
                     ARGS        -b ${_PAR_MACRO} ${_PAR_MACRO_ARGS}
                     RESOURCES   ${_PAR_MACRO} ${_PAR_RESOURCES})


    # add to the post-install tests too
    string (REPLACE ";" " " MACRO_ARGS "${_PAR_MACRO_ARGS}")  # ';' -> ' '
    file(APPEND ${POST_INSTALL_TEST_SCRIPT} "${MVRUN} -b ${_PAR_MACRO} ${MACRO_ARGS}\n")

    set(all_tests "${all_tests}${_PAR_MACRO} ") # note the spacing
endmacro()



# write the start of the post-install test script
file(WRITE  ${POST_INSTALL_TEST_SCRIPT} "#!/bin/sh\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "# Run the tests on the installed version of Metview\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "# -------------------------------------------------\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "set -eax\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "\n")



set(all_tests) # empty to start with



if(ENABLE_PLOTTING)
    metview_macro_test(MACRO     HelloWorld.mv
                       RESOURCES set_output.mv ../data/z500.grb)

    metview_macro_test(MACRO     layoutx3.mv
                       RESOURCES set_output.mv ../data/z500.grb)

    metview_macro_test(MACRO     plot_from_read_grib.mv
                       RESOURCES set_output.mv ../data/fc_data.grib)

    metview_macro_test(MACRO     plot_bufr.mv
                       RESOURCES set_output.mv ../data/temp_10.bufr)
endif()


metview_macro_test(MACRO     grib_dates.mv
                   RESOURCES  ../data/fc_data.grib
                              ../data/hindcast.grib
                              ../data/fc_long_step.grib
                              ../data/monthly_avg.grib)

metview_macro_test(MACRO     grib_keys.mv
                   RESOURCES  ../data/fc_data.grib)

metview_macro_test(MACRO     grib_nearest_gridpoint.mv
                   RESOURCES  ../data/t1000_LL_1x1.grb
                              ../data/t1000_LL_1x1_subarea.grb
                              ../data/t1000_LL_2x2.grb
                              ../data/t1000_LL_2x2_with_missing.grb
                              ../data/t1000_reg_gg_N48.grib
                              ../data/t1000_red_gg_N48.grib)

metview_macro_test(MACRO     interpolation_sh_to_ll.mv
                   RESOURCES  ../data/t1000_SH.grb)

metview_macro_test(MACRO     interpolation_sh_to_rgg.mv
                   RESOURCES  ../data/t1000_SH.grb)

metview_macro_test(MACRO     interpolation_rgg_to_ll.mv
                   RESOURCES  ../data/t1000_SH_to_RGG_reference.grb)

metview_macro_test(MACRO     grib_to_gpt.mv
                   RESOURCES  ../data/t1000_LL_2x2.grb)

metview_macro_test(MACRO     gpt_to_grib_core.mv
                   RESOURCES  ../data/gpt_to_grib_input_1.gpt
                              ../data/gpt_to_grib_reciprocal_reference.grb
                              ../data/gpt_to_grib_exp_mean_reference.grb
                              ../data/gpt_to_grib_exp_sum_reference.grb)

metview_macro_test(MACRO     gpt_to_grib_with_template.mv
                   RESOURCES  ../data/t1000_LL_2x2.grb ../data/10U_GG.grb)

metview_macro_test(MACRO     gpt_to_grib_nearest.mv
                   RESOURCES  ../data/t1000_LL_7x7.grb
                              ../data/example_XYLDTZ.geo
                              ../data/gpt_to_grib_nearest_sum_reference.grb
                              ../data/gpt_to_grib_nearest_mean_reference.grb
                              ../data/gpt_to_grib_nearest_count_reference.grb
                              ../data/nearest_gridpoint_gpt_ref_1.gpt)

metview_macro_test(MACRO     geopoint_types.mv
                   RESOURCES  ../data/bufr_obs_filter_basic_reference.gpt
                              ../data/example_POLAR_VECTOR.geo
                              ../data/example_XYZ.geo
                              ../data/example_XY_VECTOR.geo)

metview_macro_test(MACRO     gpt_set.mv
                   RESOURCES  ../data/gpt_to_grib_input_1.gpt
                              ../data/bufr_picker_reference.gpt
                              ../data/bufr_obs_filter_area_reference.gpt
                              ../data/bufr_obs_filter_custom_reference.gpt
                              ../data/nearest_gridpoint_gpt_ref_1.gpt
                              ../data/t1000_LL_1x1.grb
                              ../data/hindcast.grib)

#metview_macro_test(MACRO     interpolation_gg_to_subarea.mv
#                   RESOURCES  ../data/10U_GG.grb)

metview_macro_test(MACRO     bufr_obs_filter.mv
                   RESOURCES  ../data/bufr-3.bufr
				           ../data/compress_3.bufr
				           ../data/bufr_obs_filter_basic_reference.gpt
							  ../data/temp_10.bufr
							  ../data/bufr_obs_filter_level_reference.gpt
							  ../data/synop_multi_subset_uncompressed.bufr
							  ../data/bufr_obs_filter_area_reference.gpt
							  ../data/amsua_13.bufr
							  ../data/bufr_obs_filter_time_reference.gpt
							  ../data/bufr_obs_filter_custom_reference.gpt
							  ../data/bufr_obs_filter_blockstation_reference.gpt
							  ../data/aircraft_10.bufr
							  ../data/bufr_obs_filter_subtype_reference.gpt)

metview_macro_test(MACRO     bufr_picker.mv
                   RESOURCES  ../data/bufr-2.bufr ../data/bufr_picker_reference.gpt
                              ../data/cape-ens.bufr ../data/bufr_picker_two_coordinate_descriptors_compressed_reference.gpt
                              ../data/2t-ens.bufr ../data/bufr_picker_two_coordinate_descriptors_uncompressed_reference.gpt)

if(ENABLE_UI)
metview_macro_test(MACRO     bufr_filter.mv
                   RESOURCES  ../data/temp_small.bufr ../data/aircraft_small.bufr
                            ../data/ens_multi_subset_uncompressed.bufr
                            ../data/ens_multi_subset_compressed.bufr
                            ../data/synop_multi_subset_uncompressed.bufr
                            ../data/tropical_cyclone.bufr)
endif()

metview_macro_test(MACRO     inline_c.mv
                   RESOURCES ../data/z500.grb)

if(HAVE_FORTRAN)
metview_macro_test(MACRO     inline_fortran.mv
                   RESOURCES ../data/z500.grb)
endif()

metview_macro_test(MACRO     station.mv)

metview_macro_test(MACRO     vectors.mv
                   RESOURCES ../data/gpt_to_grib_nearest_sum_reference.grb
                             ../data/bufr_picker_reference.gpt)

metview_macro_test(MACRO     tables.mv
                   RESOURCES ../data/table1.csv
                             ../data/example_XYLDTZ.geo)

metview_macro_test(MACRO     lists.mv)

metview_macro_test(MACRO     strings.mv)

metview_macro_test(MACRO     dates.mv)

metview_macro_test(MACRO     fieldsets.mv
                   RESOURCES ../data/hindcast.grib
                             ../data/tuv_pl.grib)

metview_macro_test(MACRO     llmatrix.mv
                   RESOURCES ../data/myllmat.llmat)


metview_macro_test(MACRO     geopoints.mv
                   RESOURCES ../data/geopoints_with_metadata.gpt
                             ../data/bufr_picker_reference.gpt)

metview_macro_test(MACRO     netcdf_computations.mv
                   RESOURCES ../data/xs_with_missing_vals.nc
                             ../data/xs_without_missing_vals.nc
                             ../data/nc_from_grib.nc
                             ../data/xs_date_mv5.nc)

#metview_macro_test(MACRO     "../../bin/mv_flextra_prep.mv 1 mv_flextra_prepare_test01.txt"
#                   RESOURCES  ../data/mv_flextra_prepare_test01.txt
#                              ../data/hindcast.grib)

metview_macro_test(MACRO     divrot.mv
                   RESOURCES ../data/vorticity_divergence_500_sh.grb)

metview_macro_test(MACRO     input_visualiser_missing_value.mv)

#metview_macro_test(MACRO      mv_flextra_prep.mv
#                   MACRO_ARGS 1 mv_flextra_prepare_test01.txt
#                   RESOURCES  ../../scripts/mv_flextra_prep.mv
#                              ../data/mv_flextra_prepare_test01.txt)

if(ENABLE_MARS)
    metview_macro_test(MACRO      MarsAccess.mv
                       RESOURCES  ../data/10U_GG.grb )
endif()


if(METVIEW_ODB)
    metview_macro_test(MACRO      odb_read.mv
                       RESOURCES  ../data/odb_test_set.odb )

    metview_macro_test(MACRO      odb_filter.mv
                       RESOURCES  ../data/odb_test_set.odb )

    if(ENABLE_PLOTTING)
        metview_macro_test(MACRO      odb_visualiser.mv
                           RESOURCES  ../data/odb_test_set.odb )
    endif()
endif()


# finish the post-install test script
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "# if we got this far, then all tests must have succeeded\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "echo \"ALL TESTS PASSED\"\n")
file(APPEND ${POST_INSTALL_TEST_SCRIPT} "echo \"\"\n")



# generate a script which can be used to run the tests on the installed version
set(METVIEW_COMMAND "${CMAKE_INSTALL_PREFIX}/bin/${METVIEW_SCRIPT}")
set(TESTS_DIR       "${CMAKE_CURRENT_BINARY_DIR}")

install( FILES ${CMAKE_CURRENT_BINARY_DIR}/metview_post_install_tests.sh 
         DESTINATION ${MV_BIN_DIR}
         PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE)

