include_directories("${CMAKE_CURRENT_BINARY_DIR}"
  "${AvogadroLibs_BINARY_DIR}/avogadro/qtgui"
  "${AvogadroLibs_BINARY_DIR}/avogadro/molequeue"
  "${AvogadroLibs_SOURCE_DIR}/tests/core")

find_package(Qt${QT_VERSION} COMPONENTS Widgets Network Test REQUIRED)

# Find python interpreter for input generator
find_package(Python3 COMPONENTS Interpreter)

# Setup config file with data location
if(AVOGADRO_DATA_ROOT)
  set(AVOGADRO_DATA ${AVOGADRO_DATA_ROOT})
endif()
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/qtguitests.h.in"
  "${CMAKE_CURRENT_BINARY_DIR}/qtguitests.h" @ONLY)

# Specify the name of each test (the Test will be appended where needed).
set(tests
  CalcWorker
  ElementTranslator
  GenericHighlighter
  HydrogenTools
  MeshGenerator
  Molecule
  PackageManager
  RWMolecule
)

if (BUILD_MOLEQUEUE)
  # Pull in MoleQueue
  find_package(MoleQueue REQUIRED NO_MODULE)
  include_directories(${MoleQueue_INCLUDE_DIRS})
  list(APPEND tests
    MoleQueueQueueListModel
  )
  set(MoleQueueLink Avogadro::MoleQueue MoleQueueClient)
endif()

if(Python3_EXECUTABLE AND AVOGADRO_DATA)
  list(APPEND tests
    # these are still somewhat broken
    # but it's not crucial
    #FileBrowseWidget
    #InputGenerator
    #InputGeneratorWidget
  )
  list(APPEND MoleQueueLink Avogadro::MoleQueue)
endif()

# Build up the source file names.
set(testSrcs "")
foreach(TestName ${tests})
  message(STATUS "Adding ${TestName} test.")
  string(TOLOWER ${TestName} testname)
  list(APPEND testSrcs ${testname}test.cpp)
endforeach()

# Add a single executable for all of our tests.
add_executable(AvogadroQtGuiTests ${testSrcs})
target_link_libraries(AvogadroQtGuiTests Avogadro::QtGui ${MoleQueueLink}
 ${GTEST_BOTH_LIBRARIES} ${EXTRA_LINK_LIB}
 Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::Test)

# Now add all of the tests, using the gtest_filter argument so that only those
# cases are run in each test invocation.
foreach(TestName ${tests})
  add_test(NAME "QtGui-${TestName}"
    COMMAND AvogadroQtGuiTests "--gtest_filter=${TestName}Test.*")
endforeach()

if (DEFINED ENV{LIB_FUZZING_ENGINE})
  option(ENABLE_FUZZ "Enable fuzz testing." ON)
else()
  option(ENABLE_FUZZ "Enable fuzz testing." OFF)
endif()

if(ENABLE_FUZZ OR DEFINED ENV{LIB_FUZZING_ENGINE})
  set(qtgui_fuzz rwmolecule generichighlighter jsonwidget interfacescript-json)
  foreach(fuzzName ${qtgui_fuzz})
    add_executable(fuzz_qtgui_${fuzzName} fuzz-${fuzzName}.cpp)
    if(DEFINED ENV{LIB_FUZZING_ENGINE})
      target_link_libraries(fuzz_qtgui_${fuzzName}
        PRIVATE Avogadro::QtGui
        Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::Test
        $ENV{LIB_FUZZING_ENGINE})
    else()
      target_compile_options(fuzz_qtgui_${fuzzName} PRIVATE -g -fsanitize=fuzzer)
      target_link_options(fuzz_qtgui_${fuzzName} PRIVATE -fsanitize=fuzzer)
      target_link_libraries(fuzz_qtgui_${fuzzName}
        PRIVATE Avogadro::QtGui
        Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::Test)
    endif()
  endforeach()
endif()
