#
# This file is distributed under the MIT License. See LICENSE.md for details.
#

cmake_policy(SET CMP0060 NEW)

set(SRC "${CMAKE_SOURCE_DIR}/tests/unit")

add_subdirectory(llvm_lit_tests)
add_subdirectory(mlir_lit_tests)

find_package(Boost REQUIRED COMPONENTS unit_test_framework)

#
# test_lazysmallbitvector
#

revng_add_test_executable(test_lazysmallbitvector
                          "${SRC}/LazySmallBitVector.cpp")
target_compile_definitions(test_lazysmallbitvector
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_lazysmallbitvector
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_lazysmallbitvector revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_lazysmallbitvector COMMAND test_lazysmallbitvector)
set_tests_properties(test_lazysmallbitvector PROPERTIES LABELS "unit")

#
# test_classsentinel
#

revng_add_test_executable(test_classsentinel "${SRC}/ClassSentinel.cpp")
target_compile_definitions(test_classsentinel PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_classsentinel PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_classsentinel revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_classsentinel COMMAND test_classsentinel)
set_tests_properties(test_classsentinel PROPERTIES LABELS "unit")

#
# test_irhelpers
#

revng_add_test_executable(test_irhelpers "${SRC}/IRHelpers.cpp")
target_compile_definitions(test_irhelpers PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_irhelpers PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_irhelpers revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_irhelpers COMMAND test_irhelpers)
set_tests_properties(test_irhelpers PROPERTIES LABELS "unit")

#
# test_advancedvalueinfo
#

revng_add_test_executable(test_advancedvalueinfo "${SRC}/AdvancedValueInfo.cpp")
target_compile_definitions(test_advancedvalueinfo
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_advancedvalueinfo PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_advancedvalueinfo revngSupport revngBasicAnalyses revngValueMaterializer
  Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_advancedvalueinfo COMMAND test_advancedvalueinfo)
set_tests_properties(test_advancedvalueinfo PROPERTIES LABELS "unit")

#
# test_zipmapiterator
#

revng_add_test_executable(test_zipmapiterator "${SRC}/ZipMapIterator.cpp")
target_compile_definitions(test_zipmapiterator PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_zipmapiterator PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_zipmapiterator revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_zipmapiterator COMMAND test_zipmapiterator)
set_tests_properties(test_zipmapiterator PROPERTIES LABELS "unit")

#
# test_constantrangeset
#

revng_add_test_executable(test_constantrangeset "${SRC}/ConstantRangeSet.cpp")
target_compile_definitions(test_constantrangeset
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_constantrangeset PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_constantrangeset revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_constantrangeset COMMAND test_constantrangeset)
set_tests_properties(test_constantrangeset PROPERTIES LABELS "unit")

#
# test_shrinkinstructionoperands
#

revng_add_test_executable(test_shrinkinstructionoperands
                          "${SRC}/ShrinkInstructionOperandsPass.cpp")
target_compile_definitions(test_shrinkinstructionoperands
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_shrinkinstructionoperands
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_shrinkinstructionoperands revngUnitTestHelpers revngBasicAnalyses
  Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_shrinkinstructionoperands COMMAND
               test_shrinkinstructionoperands)
set_tests_properties(test_shrinkinstructionoperands PROPERTIES LABELS "unit")

#
# test_metaaddress
#

revng_add_test_executable(test_metaaddress "${SRC}/MetaAddress.cpp")
target_include_directories(test_metaaddress PRIVATE "${CMAKE_SOURCE_DIR}"
                                                    "${Boost_INCLUDE_DIRS}")
target_compile_definitions(test_metaaddress PRIVATE "BOOST_TEST_DYN_LINK=1")
target_link_libraries(test_metaaddress revngSupport revngUnitTestHelpers
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY} ${LLVM_LIBRARIES})
revng_add_test(NAME test_metaaddress COMMAND test_metaaddress)
set_tests_properties(test_metaaddress PROPERTIES LABELS "unit")

#
# test_filtered_graph_traits
#

revng_add_test_executable(test_filtered_graph_traits
                          "${SRC}/FilteredGraphTraits.cpp")
target_compile_definitions(test_filtered_graph_traits
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_filtered_graph_traits
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_filtered_graph_traits revngSupport revngUnitTestHelpers
  Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_filtered_graph_traits COMMAND
               test_filtered_graph_traits -- "${SRC}/test_graphs/")
set_tests_properties(test_filtered_graph_traits PROPERTIES LABELS "unit")

#
# test_smallmap
#

revng_add_test_executable(test_smallmap "${SRC}/SmallMap.cpp")
target_compile_definitions(test_smallmap PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_smallmap PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_smallmap revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_smallmap COMMAND test_smallmap)
set_tests_properties(test_smallmap PROPERTIES LABELS "unit")

#
# test_genericgraph
#

revng_add_test_executable(test_genericgraph "${SRC}/GenericGraph.cpp")
target_compile_definitions(test_genericgraph PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_genericgraph PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_genericgraph revngSupport Boost::unit_test_framework
                      ${LLVM_LIBRARIES})
revng_add_test(NAME test_genericgraph COMMAND test_genericgraph)
set_tests_properties(test_genericgraph PROPERTIES LABELS "unit")

#
# test_graphalgorithms
#

revng_add_test_executable(test_graphalgorithms "${SRC}/GraphAlgorithms.cpp")
target_compile_definitions(test_graphalgorithms PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_graphalgorithms PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_graphalgorithms revngSupport
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
add_test(NAME test_graphalgorithms COMMAND test_graphalgorithms)
set_tests_properties(test_graphalgorithms PROPERTIES LABELS "unit")

#
# test_keyedobjectscontainers
#

revng_add_test_executable(test_keyedobjectscontainers
                          "${SRC}/KeyedObjectsContainers.cpp")
target_compile_definitions(test_keyedobjectscontainers
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_keyedobjectscontainers
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_keyedobjectscontainers revngSupport revngUnitTestHelpers revngModel
  Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_keyedobjectscontainers COMMAND
               test_keyedobjectscontainers)
set_tests_properties(test_keyedobjectscontainers PROPERTIES LABELS "unit")

#
# test_model
#

revng_add_test_executable(test_model "${SRC}/Model.cpp")
target_compile_definitions(test_model PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_model PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_model
  revngSupport
  revngUnitTestHelpers
  revngModel
  revngModelPasses
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
revng_add_test(NAME test_model COMMAND test_model)
set_tests_properties(test_model PROPERTIES LABELS "unit")

#
# test_instantiatepasses
#

revng_add_test_executable(test_instantiatepasses "${SRC}/InstantiatePasses.cpp")
target_compile_definitions(test_instantiatepasses
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_instantiatepasses PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_instantiatepasses revngSupport revngUnitTestHelpers
                      revngModel Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_instantiatepasses COMMAND test_instantiatepasses)
set_tests_properties(test_instantiatepasses PROPERTIES LABELS "unit")

#
# test_upcastablepointer
#

revng_add_test_executable(test_upcastablepointer "${SRC}/UpcastablePointer.cpp")
target_compile_definitions(test_upcastablepointer
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_upcastablepointer PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_upcastablepointer revngSupport revngUnitTestHelpers
                      revngModel Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_upcastablepointer COMMAND test_upcastablepointer)
set_tests_properties(test_upcastablepointer PROPERTIES LABELS "unit")

#
# test_recursive_coroutines
#

macro(add_recursive_coroutine_test NAME)
  revng_add_test_executable("${NAME}" "${SRC}/RecursiveCoroutine.cpp")
  target_compile_definitions("${NAME}" PRIVATE "BOOST_TEST_DYN_LINK=1")
  target_include_directories("${NAME}" PRIVATE "${CMAKE_SOURCE_DIR}")
  target_link_libraries("${NAME}" revngSupport ${LLVM_LIBRARIES})
  revng_add_test(NAME "${NAME}" COMMAND "${NAME}")
  set_tests_properties("${NAME}" PROPERTIES LABELS "unit")
endmacro()

add_recursive_coroutine_test(test_recursive_coroutines)

add_recursive_coroutine_test(test_recursive_coroutines_fallback)
target_compile_definitions(test_recursive_coroutines_fallback
                           PRIVATE DISABLE_RECURSIVE_COROUTINES)

add_recursive_coroutine_test(test_recursive_coroutines_iterative)
target_compile_definitions(test_recursive_coroutines_iterative
                           PRIVATE ITERATIVE)

#
# test_model_type
#

revng_add_test_executable(test_model_type "${SRC}/ModelType.cpp")
target_compile_definitions(test_model_type PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_model_type PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_model_type revngSupport revngUnitTestHelpers
                      revngModel Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_model_type COMMAND test_model_type)
set_tests_properties(test_model_type PROPERTIES LABELS "unit")

#
# test_tuple_tree_generator
#

set(HEADERS "${SRC}/TupleTreeGenerator/TestClass.h"
            "${SRC}/TupleTreeGenerator/TestEnum.h")
set(INCLUDE_DIR "${CMAKE_SOURCE_DIR}/tests/unit/TupleTreeGenerator")
set(OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/tests/unit/TupleTreeGenerator")
set(HEADERS_DIR "${OUTPUT_DIR}/include")
set(CPP_DIR "${OUTPUT_DIR}/lib")

revng_add_test_executable(test_tuple_tree_generator
                          "${SRC}/TupleTreeGenerator/Test.cpp")
target_include_directories(test_tuple_tree_generator PUBLIC "${HEADERS_DIR}"
                                                            "${INCLUDE_DIR}")
target_tuple_tree_generator(
  test_tuple_tree_generator
  HEADERS
  "${HEADERS}"
  NAMESPACE
  ttgtest
  ROOT_TYPE
  TestClass
  SCHEMA_PATH
  "${OUTPUT_DIR}/schema.yml"
  HEADERS_PATH
  "${HEADERS_DIR}/Generated"
  INCLUDE_PATH_PREFIX
  ".")
target_compile_definitions(test_tuple_tree_generator
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_link_libraries(test_tuple_tree_generator revngUnitTestHelpers revngModel
                      Boost::unit_test_framework)

revng_add_test(NAME test_tuple_tree_generator COMMAND test_tuple_tree_generator)
set_tests_properties(test_tuple_tree_generator PROPERTIES LABELS "unit")

#
# test_pipeline
#

revng_add_test_executable(test_pipeline "${SRC}/Pipeline.cpp")
target_compile_definitions(test_pipeline PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_pipeline PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_pipeline revngUnitTestHelpers revngPipeline
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_pipeline COMMAND test_pipeline)
set_tests_properties(test_pipeline PROPERTIES LABELS "unit")

#
# test_pipeline_c
#

revng_add_test_executable(test_pipeline_c "${SRC}/PipelineC.cpp")
target_compile_definitions(test_pipeline_c PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_pipeline_c PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_pipeline_c
  revngSupport
  revngUnitTestHelpers
  revngPipelineC
  revngStringContainerLibrary
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
revng_add_test(NAME test_pipeline_c COMMAND test_pipeline_c)
set_tests_properties(test_pipeline_c PROPERTIES LABELS "unit")

#
# test_register_state_deductions
#

revng_add_test_executable(test_register_state_deductions
                          "${SRC}/RegisterStateDeductions.cpp")
target_compile_definitions(test_register_state_deductions
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_register_state_deductions
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_register_state_deductions
  revngABI
  revngModel
  revngSupport
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
revng_add_test(NAME test_register_state_deductions COMMAND
               test_register_state_deductions)
set_tests_properties(test_register_state_deductions PROPERTIES LABELS
                                                               "unit;abi")

#
# test_location_infrastructure
#

revng_add_test_executable(test_location_infrastructure "${SRC}/Location.cpp")
target_compile_definitions(test_location_infrastructure
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_location_infrastructure
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_location_infrastructure
  revngModel
  revngPipeline
  revngSupport
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
revng_add_test(NAME test_location_infrastructure COMMAND
               test_location_infrastructure)
set_tests_properties(test_location_infrastructure
                     PROPERTIES LABELS "unit;pipeline;location")

#
# test_alignment
#

revng_add_test_executable(test_alignment "${SRC}/Alignment.cpp")
target_compile_definitions(test_alignment PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_alignment PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_alignment
  revngABI
  revngModel
  revngSupport
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
revng_add_test(NAME test_alignment COMMAND test_alignment)
set_tests_properties(test_alignment PROPERTIES LABELS "unit;abi;alignment")

#
# test_pipeline_c_tracing
#

configure_file("${CMAKE_SOURCE_DIR}/tests/pipeline/CopyPipeTestPipeline.yml"
               "${CMAKE_BINARY_DIR}/tests/pipeline/Tracing.yml" COPYONLY)

revng_add_test_executable(test_pipeline_c_tracing "PipelineCTracing.cpp")
target_compile_definitions(test_pipeline_c_tracing
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_pipeline_c_tracing
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_pipeline_c_tracing revngPipelineC revngSupport
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_pipeline_c_tracing COMMAND test_pipeline_c_tracing)
set_tests_properties(test_pipeline_c_tracing PROPERTIES LABELS "unit")

#
# test_gzip_tar_file
#

revng_add_test_executable(test_gzip_tar_file "${SRC}/GzipTarFile.cpp")
target_compile_definitions(test_gzip_tar_file PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_gzip_tar_file PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_gzip_tar_file revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_gzip_tar_file COMMAND test_gzip_tar_file)
set_tests_properties(test_gzip_tar_file PROPERTIES LABELS "unit")

revng_add_test_executable(test_gzip_tar_fileGenerator
                          "${SRC}/GzipTarFileGenerator.cpp")
target_link_libraries(test_gzip_tar_fileGenerator revngSupport
                      ${LLVM_LIBRARIES})
revng_add_test(
  NAME test_gzip_tar_fileGenerator COMMAND
  "${CMAKE_CURRENT_SOURCE_DIR}/GzipTarFileGeneratorTest.sh"
  "${CMAKE_BINARY_DIR}")
set_tests_properties(test_gzip_tar_fileGenerator PROPERTIES LABELS "unit")

#
# test_type_bucket
#

revng_add_test_executable(test_type_bucket "${SRC}/TypeBucket.cpp")
target_compile_definitions(test_type_bucket PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_type_bucket PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_type_bucket revngModel revngSupport revngUnitTestHelpers
  Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_type_bucket COMMAND test_type_bucket)
set_tests_properties(test_type_bucket PROPERTIES LABELS
                                                 "unit;model;type_bucket")

#
# test_register_usage_analysis
#

revng_add_test_executable(test_register_usage_analysis
                          "${SRC}/RegisterUsageAnalyses.cpp")
target_compile_definitions(test_register_usage_analysis
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_register_usage_analysis
                           PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(
  test_register_usage_analysis revngSupport revngUnitTestHelpers
  Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_register_usage_analysis COMMAND
               test_register_usage_analysis)
set_tests_properties(test_register_usage_analysis
                     PROPERTIES LABELS "unit;model;type_bucket")

#
# test_adt
#

revng_add_test_executable(test_adt "${SRC}/ADT.cpp")
target_compile_definitions(test_adt PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_adt PRIVATE "${CMAKE_SOURCE_DIR}")
target_link_libraries(test_adt revngSupport revngUnitTestHelpers
                      Boost::unit_test_framework ${LLVM_LIBRARIES})
revng_add_test(NAME test_adt COMMAND test_adt)
set_tests_properties(test_adt PROPERTIES LABELS "unit")

#
# test_type_shrinking
#
revng_add_test(
  NAME
  test_type_shrinking
  COMMAND
  bash
  -c
  "${CMAKE_BINARY_DIR}/bin/revng opt -S -early-type-shrinking -type-shrinking -instcombine ${SRC}/TypeShrinking.ll | FileCheck ${SRC}/TypeShrinking.ll"
)

#
# test_combingpass
#

revng_add_test_executable(test_combingpass "${SRC}/CombingPass.cpp")
target_compile_definitions(test_combingpass PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_combingpass PRIVATE "${CMAKE_SOURCE_DIR}"
                                                    "${Boost_INCLUDE_DIRS}")
target_link_libraries(
  test_combingpass
  revngRestructureCFG
  revngModel
  revngSupport
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
add_test(NAME test_combingpass COMMAND test_combingpass -- "${SRC}/TestGraphs/")

#
# test_dla_step_manager
#

revng_add_test_executable(test_dla_step_manager "${SRC}/DLAStepManager.cpp")
target_compile_definitions(test_dla_step_manager
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(
  test_dla_step_manager PRIVATE "${CMAKE_SOURCE_DIR}" "${Boost_INCLUDE_DIRS}")
target_link_libraries(
  test_dla_step_manager
  revngDataLayoutAnalysis
  revngModel
  revngSupport
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
add_test(NAME test_dla_step_manager COMMAND test_dla_step_manager)

#
# test_dla_steps
#

revng_add_test_executable(test_dla_steps "${SRC}/DLASteps.cpp")
target_compile_definitions(test_dla_steps PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_dla_steps PRIVATE "${CMAKE_SOURCE_DIR}"
                                                  "${Boost_INCLUDE_DIRS}")
target_link_libraries(
  test_dla_steps
  revngDataLayoutAnalysis
  revngModel
  revngSupport
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
add_test(NAME test_dla_steps COMMAND test_dla_steps)

#
# test_clift
#

revng_add_test_executable(test_clift "${SRC}/Clift.cpp")
target_compile_definitions(test_clift PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_clift PRIVATE "${CMAKE_SOURCE_DIR}"
                                              "${Boost_INCLUDE_DIRS}")
target_link_libraries(test_clift MLIRCliftDialect Boost::unit_test_framework
                      revngUnitTestHelpers ${LLVM_LIBRARIES})
add_test(NAME test_clift COMMAND test_clift)

#
# test_clift_type
#

revng_add_test_executable(test_clift_type "${SRC}/CliftType.cpp")
target_compile_definitions(test_clift_type PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(test_clift_type PRIVATE "${CMAKE_SOURCE_DIR}"
                                                   "${Boost_INCLUDE_DIRS}")
target_link_libraries(
  test_clift_type
  MLIRCliftDialect
  MLIRCliftUtils
  Boost::unit_test_framework
  revngModel
  revngUnitTestHelpers
  ${LLVM_LIBRARIES})
add_test(NAME test_clift_type COMMAND test_clift_type)

#
# test_pointer_array_emission
#

revng_add_test_executable(test_pointer_array_emission
                          "${SRC}/PointerArrayEmission.cpp")
target_compile_definitions(test_pointer_array_emission
                           PRIVATE "BOOST_TEST_DYN_LINK=1")
target_include_directories(
  test_pointer_array_emission PRIVATE "${CMAKE_SOURCE_DIR}"
                                      "${Boost_INCLUDE_DIRS}")
target_link_libraries(
  test_pointer_array_emission
  revngSupport
  revngTypeNames
  revngModel
  revngUnitTestHelpers
  Boost::unit_test_framework
  ${LLVM_LIBRARIES})
add_test(NAME test_pointer_array_emission COMMAND test_pointer_array_emission)

#
# compile a pass
#

# We use the plain `add_library` and not the revng version
# (revng_add_library_internal) in order to not get this installed into `lib`
add_library(test_scopegraph SHARED "${SRC}/ScopeGraphLoggerPass.cpp")
target_link_libraries(test_scopegraph revngScopeGraphUtils revngSupport
                      ${LLVM_LIBRARIES})
