
add_definitions("-DRTABMAP_TEST_DATA_ROOT=\"${TEST_DATA_ROOT}\"")

#util2d.h
add_executable(test_util2d test_util2d.cpp)
target_link_libraries(test_util2d gtest_main rtabmap_core)
add_test(NAME test_util2d COMMAND test_util2d)

#util3d.h
add_executable(test_util3d test_util3d.cpp)
target_link_libraries(test_util3d gtest_main rtabmap_core)
add_test(NAME test_util3d COMMAND test_util3d)

#util3d_transforms.h
add_executable(test_util3d_transforms test_util3d_transforms.cpp)
target_link_libraries(test_util3d_transforms gtest_main rtabmap_core)
add_test(NAME test_util3d_transforms COMMAND test_util3d_transforms)

#util3d_filtering.h
add_executable(test_util3d_filtering test_util3d_filtering.cpp)
target_link_libraries(test_util3d_filtering gtest_main rtabmap_core)
add_test(NAME test_util3d_filtering COMMAND test_util3d_filtering)

#util3d_registration.h
add_executable(test_util3d_registration test_util3d_registration.cpp)
target_link_libraries(test_util3d_registration gtest_main rtabmap_core)
add_test(NAME test_util3d_registration COMMAND test_util3d_registration)

#util3d_features.h
add_executable(test_util3d_features test_util3d_features.cpp)
target_link_libraries(test_util3d_features gtest_main rtabmap_core)
add_test(NAME test_util3d_features COMMAND test_util3d_features)

#util3d_correspondences.h
add_executable(test_util3d_correspondences test_util3d_correspondences.cpp)
target_link_libraries(test_util3d_correspondences gtest_main rtabmap_core)
add_test(NAME test_util3d_correspondences COMMAND test_util3d_correspondences)

#util3d_mapping.h
add_executable(test_util3d_mapping test_util3d_mapping.cpp)
target_link_libraries(test_util3d_mapping gtest_main rtabmap_core)
add_test(NAME test_util3d_mapping COMMAND test_util3d_mapping)

#util3d_motion_estimation.h
add_executable(test_util3d_motion_estimation test_util3d_motion_estimation.cpp)
target_link_libraries(test_util3d_motion_estimation gtest_main rtabmap_core)
add_test(NAME test_util3d_motion_estimation COMMAND test_util3d_motion_estimation)

#util3d_surface.h
add_executable(test_util3d_surface test_util3d_surface.cpp)
target_link_libraries(test_util3d_surface gtest_main rtabmap_core)
add_test(NAME test_util3d_surface COMMAND test_util3d_surface)

#VisualWord.h
add_executable(test_visualword test_visualword.cpp)
target_link_libraries(test_visualword gtest_main rtabmap_core)
add_test(NAME test_visualword COMMAND test_visualword)

#VWDictionary.h
add_executable(test_vwdictionary test_vwdictionary.cpp)
target_link_libraries(test_vwdictionary gtest_main rtabmap_core)
add_test(NAME test_vwdictionary COMMAND test_vwdictionary)

#Transform.h
add_executable(test_transform test_transform.cpp)
target_link_libraries(test_transform gtest_main rtabmap_core)
add_test(NAME test_transform COMMAND test_transform)

#StereoDense.h (tests both BM and SGBM strategies)
add_executable(test_stereo_dense test_stereo_dense.cpp)
target_link_libraries(test_stereo_dense gtest_main rtabmap_core)
add_test(NAME test_stereo_dense COMMAND test_stereo_dense)

#Stereo.h (tests both BlockMatching and OpticalFlow strategies)
add_executable(test_stereo test_stereo.cpp)
target_link_libraries(test_stereo gtest_main rtabmap_core)
add_test(NAME test_stereo COMMAND test_stereo)

#CameraModel.h
add_executable(test_cameramodel test_cameramodel.cpp)
target_link_libraries(test_cameramodel gtest_main rtabmap_core)
add_test(NAME test_cameramodel COMMAND test_cameramodel)

#StereoCameraModel.h
add_executable(test_stereocameramodel test_stereocameramodel.cpp)
target_link_libraries(test_stereocameramodel gtest_main rtabmap_core)
add_test(NAME test_stereocameramodel COMMAND test_stereocameramodel)

#Statistics.h
add_executable(test_statistics test_statistics.cpp)
target_link_libraries(test_statistics gtest_main rtabmap_core)
add_test(NAME test_statistics COMMAND test_statistics)

#BayesFilter.h
add_executable(test_bayesfilter test_bayesfilter.cpp)
target_link_libraries(test_bayesfilter gtest_main rtabmap_core)
add_test(NAME test_bayesfilter COMMAND test_bayesfilter)

#Memory.h
add_executable(test_memory test_memory.cpp)
target_link_libraries(test_memory gtest_main rtabmap_core)
add_test(NAME test_memory COMMAND test_memory)

#Rtabmap.h
add_executable(test_rtabmap test_rtabmap.cpp)
target_link_libraries(test_rtabmap gtest_main rtabmap_core)
add_test(NAME test_rtabmap COMMAND test_rtabmap)

# Rtabmap end-to-end replay of sample DBs (test data fetched by
# scripts/fetch_test_data.sh into data/tests/*.db). Skips at runtime if the
# assets are absent, so the build stays green for contributors without them.
add_executable(test_rtabmap_integration test_rtabmap_integration.cpp)
target_link_libraries(test_rtabmap_integration gtest_main rtabmap_core)

# Labelled "long" so CI PR jobs can opt out via:
#  `ctest -LE long` 
# while nightlies run:
#  `ctest -L long`.
add_test(NAME test_rtabmap_integration COMMAND test_rtabmap_integration)
set_tests_properties(test_rtabmap_integration PROPERTIES
        TIMEOUT 1800
        LABELS  "long")

#Link.h
add_executable(test_link test_link.cpp)
target_link_libraries(test_link gtest_main rtabmap_core)
add_test(NAME test_link COMMAND test_link)

#Optimizer.h
add_executable(test_optimizer test_optimizer.cpp)
target_link_libraries(test_optimizer gtest_main rtabmap_core)
add_test(NAME test_optimizer COMMAND test_optimizer)

#GPS.h
add_executable(test_gps test_gps.cpp)
target_link_libraries(test_gps gtest_main rtabmap_core)
add_test(NAME test_gps COMMAND test_gps)

#IMU.h
add_executable(test_imu test_imu.cpp)
target_link_libraries(test_imu gtest_main rtabmap_core)
add_test(NAME test_imu COMMAND test_imu)

#IMUFilter.h
add_executable(test_imufilter test_imufilter.cpp)
target_link_libraries(test_imufilter gtest_main rtabmap_core)
add_test(NAME test_imufilter COMMAND test_imufilter)

#IMUThread.h
add_executable(test_imuthread test_imuthread.cpp)
target_link_libraries(test_imuthread gtest_main rtabmap_core)
add_test(NAME test_imuthread COMMAND test_imuthread)

#Landmark.h
add_executable(test_landmark test_landmark.cpp)
target_link_libraries(test_landmark gtest_main rtabmap_core)
add_test(NAME test_landmark COMMAND test_landmark)

#LocalGrid.h
add_executable(test_localgrid test_localgrid.cpp)
target_link_libraries(test_localgrid gtest_main rtabmap_core)
add_test(NAME test_localgrid COMMAND test_localgrid)

#Features2d.h
add_executable(test_features2d test_features2d.cpp)
target_link_libraries(test_features2d gtest_main rtabmap_core)
add_test(NAME test_features2d COMMAND test_features2d)

#GlobalMap.h
add_executable(test_globalmap test_globalmap.cpp)
target_link_libraries(test_globalmap gtest_main rtabmap_core)
add_test(NAME test_globalmap COMMAND test_globalmap)

#Registration.h
add_executable(test_registration test_registration.cpp)
target_link_libraries(test_registration gtest_main rtabmap_core)
add_test(NAME test_registration COMMAND test_registration)

#RegistrationVis.h
add_executable(test_registrationvis test_registrationvis.cpp)
target_link_libraries(test_registrationvis gtest_main rtabmap_core)
add_test(NAME test_registrationvis COMMAND test_registrationvis)

#RegistrationIcp.h
add_executable(test_registrationicp test_registrationicp.cpp)
target_link_libraries(test_registrationicp gtest_main rtabmap_core)
add_test(NAME test_registrationicp COMMAND test_registrationicp)

#LocalGridMaker.h
add_executable(test_localgridmaker test_localgridmaker.cpp)
target_link_libraries(test_localgridmaker gtest_main rtabmap_core)
add_test(NAME test_localgridmaker COMMAND test_localgridmaker)

#PythonInterface / PyDetector / PyDescriptor / PyMatcher (optional Python
# support; bridges to Python feature detectors (SuperPoint), global
# descriptors (NetVLAD), and matchers (SuperGlue). Tests use numpy-only stub
# scripts so no ML weights or extra packages are needed beyond what
# WITH_PYTHON already pulls in.
IF(WITH_PYTHON AND Python3_FOUND)
	# Direct tests for PythonInterface / getPythonTraceback. Links pybind11
	# and Python headers so the test can drive the Python C API directly.
	add_executable(test_python_interface test_python_interface.cpp)
	target_link_libraries(test_python_interface gtest_main rtabmap_core pybind11::embed)
	target_include_directories(test_python_interface PRIVATE ${Python3_INCLUDE_DIRS})
	add_test(NAME test_python_interface COMMAND test_python_interface)

	add_executable(test_pydetector test_pydetector.cpp)
	target_link_libraries(test_pydetector gtest_main rtabmap_core)
	add_test(NAME test_pydetector COMMAND test_pydetector)

	add_executable(test_pydescriptor test_pydescriptor.cpp)
	target_link_libraries(test_pydescriptor gtest_main rtabmap_core)
	add_test(NAME test_pydescriptor COMMAND test_pydescriptor)

	# PyMatcher's header is internal (not in the public include tree);
	# expose corelib/src so the test can `#include "python/PyMatcher.h"`.
	add_executable(test_pymatcher test_pymatcher.cpp)
	target_link_libraries(test_pymatcher gtest_main rtabmap_core)
	target_include_directories(test_pymatcher PRIVATE
			${CMAKE_SOURCE_DIR}/corelib/src)
	add_test(NAME test_pymatcher COMMAND test_pymatcher)
ENDIF(WITH_PYTHON AND Python3_FOUND)

#LASWriter.h (optional libLAS)
IF(libLAS_FOUND)
	add_executable(test_laswriter test_laswriter.cpp)
	target_link_libraries(test_laswriter gtest_main rtabmap_core ${libLAS_LIBRARIES})
	target_include_directories(test_laswriter PRIVATE ${libLAS_INCLUDE_DIRS})
	add_test(NAME test_laswriter COMMAND test_laswriter)
ENDIF(libLAS_FOUND)

#Graph.h
add_executable(test_graph test_graph.cpp)
target_link_libraries(test_graph gtest_main rtabmap_core)
add_test(NAME test_graph COMMAND test_graph)

#GeodeticCoords.h
add_executable(test_geodeticcoords test_geodeticcoords.cpp)
target_link_libraries(test_geodeticcoords gtest_main rtabmap_core)
add_test(NAME test_geodeticcoords COMMAND test_geodeticcoords)

#Compression.h
add_executable(test_compression test_compression.cpp)
target_link_libraries(test_compression gtest_main rtabmap_core)
add_test(NAME test_compression COMMAND test_compression)

#Odometry.h
add_executable(test_odometry test_odometry.cpp)
target_link_libraries(test_odometry gtest_main rtabmap_core)
add_test(NAME test_odometry COMMAND test_odometry)

#DBDriver.h
add_executable(test_dbdriver test_dbdriver.cpp)
target_link_libraries(test_dbdriver gtest_main rtabmap_core)
add_test(NAME test_dbdriver COMMAND test_dbdriver)

#DBDriverSqlite3.h
add_executable(test_dbdriversqlite3 test_dbdriversqlite3.cpp)
target_link_libraries(test_dbdriversqlite3 gtest_main rtabmap_core)
add_test(NAME test_dbdriversqlite3 COMMAND test_dbdriversqlite3)

#Signature.h
add_executable(test_signature test_signature.cpp)
target_link_libraries(test_signature gtest_main rtabmap_core)
add_test(NAME test_signature COMMAND test_signature)

#SensorEvent.h
add_executable(test_sensorevent test_sensorevent.cpp)
target_link_libraries(test_sensorevent gtest_main rtabmap_core)
add_test(NAME test_sensorevent COMMAND test_sensorevent)

#SensorData.h
add_executable(test_sensordata test_sensordata.cpp)
target_link_libraries(test_sensordata gtest_main rtabmap_core)
add_test(NAME test_sensordata COMMAND test_sensordata)

#SensorCapture.h
add_executable(test_sensorcapture test_sensorcapture.cpp)
target_link_libraries(test_sensorcapture gtest_main rtabmap_core)
add_test(NAME test_sensorcapture COMMAND test_sensorcapture)

#SensorCaptureThread.h
add_executable(test_sensorcapturethread test_sensorcapturethread.cpp)
target_link_libraries(test_sensorcapturethread gtest_main rtabmap_core)
add_test(NAME test_sensorcapturethread COMMAND test_sensorcapturethread)
