cmake_minimum_required(VERSION 3.20)
project(map_gesture_regression LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 17)
set(REPO "${CMAKE_CURRENT_LIST_DIR}/../..")
set(LVGL_DIR "" CACHE PATH "Pinned LVGL 9.4 source directory")
set(LV_BUILD_CONF_PATH "${REPO}/tests/map_poi_view/lv_conf.h" CACHE PATH "" FORCE)
set(CONFIG_LV_BUILD_DEMOS OFF CACHE BOOL "" FORCE)
set(CONFIG_LV_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(CONFIG_LV_USE_THORVG_INTERNAL OFF CACHE BOOL "" FORCE)
add_subdirectory(${LVGL_DIR} lvgl)

# Compile the real map gesture callbacks, not a rewritten state machine. The
# surrounding tile/SD/POI runtime is intentionally excluded from this input test.
set(VIEWPORT "${REPO}/modules/ui_shared/src/ui/widgets/map/map_viewport.cpp")
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${VIEWPORT}")
file(READ "${VIEWPORT}" SOURCE)
string(FIND "${SOURCE}" "bool is_runtime_alive(" FIRST)
string(FIND "${SOURCE}" "void update_gesture_surface_visibility(" LAST)
math(EXPR LENGTH "${LAST} - ${FIRST}")
string(SUBSTRING "${SOURCE}" ${FIRST} ${LENGTH} HELPERS)
string(FIND "${SOURCE}" "lv_indev_t* resolve_event_indev(" FIRST)
string(FIND "${SOURCE}" "void prime_visible_tiles(" LAST)
math(EXPR LENGTH "${LAST} - ${FIRST}")
string(SUBSTRING "${SOURCE}" ${FIRST} ${LENGTH} CALLBACKS)
string(REGEX MATCH "constexpr int kGestureDragStartPx = [0-9]+;" THRESHOLD "${SOURCE}")
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/map_gesture_actual.inc" "${THRESHOLD}\n${HELPERS}\n${CALLBACKS}")

add_executable(map_gesture_regression test_gesture.cpp)
target_include_directories(map_gesture_regression PRIVATE
    "${CMAKE_CURRENT_BINARY_DIR}" "${REPO}/modules/ui_shared/include"
    "${REPO}/modules/ui_presentation/include")
target_link_libraries(map_gesture_regression PRIVATE lvgl)
if(MSVC)
    target_compile_options(map_gesture_regression PRIVATE /UNDEBUG)
else()
    target_compile_options(map_gesture_regression PRIVATE -UNDEBUG -Wall -Wextra)
endif()
enable_testing()
add_test(NAME map_gesture_regression COMMAND map_gesture_regression)
set_tests_properties(map_gesture_regression PROPERTIES TIMEOUT 30)
add_subdirectory("${REPO}/tests/settings_navigation" settings_navigation)
