set(EXECUTABLE_OUTPUT_PATH ${PUGS_BINARY_DIR})

include_directories(${PUGS_SOURCE_DIR}/src)
include_directories(${PUGS_BINARY_DIR}/src)
include_directories(${PUGS_SOURCE_DIR}/tests)

install(
  DIRECTORY "${PUGS_SOURCE_DIR}/packages/Catch2/src/catch2"
  DESTINATION "include"
  FILES_MATCHING
  PATTERN "*.hpp"
)

install(
  DIRECTORY "${PUGS_BINARY_DIR}/generated-includes/catch2"
  DESTINATION "include"
  FILES_MATCHING
  PATTERN "*.hpp"
)

set(checkpointing_sequential_TESTS
  # this one should enventually integrate parallel tests
  test_checkpointing_Checkpoint_sequential.cpp
  test_checkpointing_Resume_sequential.cpp
)

add_executable (unit_tests
  test_main.cpp
  test_AffectationProcessor.cpp
  test_AffectationToStringProcessor.cpp
  test_AffectationToTupleProcessor.cpp
  test_Array.cpp
  test_ArraySubscriptProcessor.cpp
  test_ASTBuilder.cpp
  test_ASTCheckpoint.cpp
  test_ASTCheckpointsInfo.cpp
  test_ASTDotPrinter.cpp
  test_ASTExecutionStack.cpp
  test_ASTModulesImporter.cpp
  test_ASTNode.cpp
  test_ASTNodeAffectationExpressionBuilder.cpp
  test_ASTNodeArraySubscriptExpressionBuilder.cpp
  test_ASTNodeBinaryOperatorExpressionBuilder.cpp
  test_ASTNodeBuiltinFunctionExpressionBuilder.cpp
  test_ASTNodeDataType.cpp
  test_ASTNodeDataTypeBuilder.cpp
  test_ASTNodeDataTypeChecker.cpp
  test_ASTNodeDataTypeFlattener.cpp
  test_ASTNodeDeclarationToAffectationConverter.cpp
  test_ASTNodeEmptyBlockCleaner.cpp
  test_ASTNodeExpressionBuilder.cpp
  test_ASTNodeFunctionEvaluationExpressionBuilder.cpp
  test_ASTNodeFunctionExpressionBuilder.cpp
  test_ASTNodeIncDecExpressionBuilder.cpp
  test_ASTNodeJumpPlacementChecker.cpp
  test_ASTNodeListAffectationExpressionBuilder.cpp
  test_ASTNodeListProcessor.cpp
  test_ASTNodeNaturalConversionChecker.cpp
  test_ASTNodeTypeCleaner.cpp
  test_ASTNodeUnaryOperatorExpressionBuilder.cpp
  test_ASTPrinter.cpp
  test_ASTSymbolTableBuilder.cpp
  test_ASTSymbolInitializationChecker.cpp
  test_BreakProcessor.cpp
  test_BinaryExpressionProcessor_arithmetic.cpp
  test_BinaryExpressionProcessor_comparison.cpp
  test_BinaryExpressionProcessor_equality.cpp
  test_BinaryExpressionProcessor_logic.cpp
  test_BinaryExpressionProcessor_raw.cpp
  test_BinaryExpressionProcessor_shift.cpp
  test_BinaryOperatorMangler.cpp
  test_BiCGStab.cpp
  test_BuildInfo.cpp
  test_BuiltinFunctionEmbedder.cpp
  test_BuiltinFunctionEmbedderUtils.cpp
  test_BuiltinFunctionEmbedderTable.cpp
  test_BuiltinFunctionProcessor.cpp
  test_CastArray.cpp
  test_CellIntegrator.cpp
  test_CellType.cpp
  test_CommunicatorManager.cpp
  test_ConsoleManager.cpp
  test_CG.cpp
  test_ConcatExpressionProcessor.cpp
  test_ConsoleManager.cpp
  test_ContinueProcessor.cpp
  test_CRSGraph.cpp
  test_CRSMatrix.cpp
  test_CRSMatrixDescriptor.cpp
  test_CubeGaussQuadrature.cpp
  test_CubeTransformation.cpp
  test_DataVariant.cpp
  test_Demangle.cpp
  test_DiamondDualConnectivityBuilder.cpp
  test_DiamondDualMeshBuilder.cpp
  test_DiscreteFunctionDescriptorP0.cpp
  test_DiscreteFunctionDescriptorP0Vector.cpp
  test_DiscreteFunctionType.cpp
  test_DiscreteFunctionUtils.cpp
  test_DoWhileProcessor.cpp
  test_Dual1DConnectivityBuilder.cpp
  test_Dual1DMeshBuilder.cpp
  test_DualConnectivityManager.cpp
  test_DualMeshManager.cpp
  test_DualMeshType.cpp
  test_EdgeIntegrator.cpp
  test_Eigen3Utils.cpp
  test_EigenvalueSolver.cpp
  test_EmbeddedData.cpp
  test_EmbeddedDiscreteFunctionUtils.cpp
  test_EscapedString.cpp
  test_Exceptions.cpp
  test_ExecutionPolicy.cpp
  test_Exit.cpp
  test_FaceIntegrator.cpp
  test_FakeProcessor.cpp
  test_ForProcessor.cpp
  test_FunctionArgumentConverter.cpp
  test_FunctionProcessor.cpp
  test_FunctionSymbolId.cpp
  test_FunctionTable.cpp
  test_GaussLegendreQuadratureDescriptor.cpp
  test_GaussLobattoQuadratureDescriptor.cpp
  test_GaussQuadratureDescriptor.cpp
  test_Givens.cpp
  test_IfProcessor.cpp
  test_IncDecExpressionProcessor.cpp
  test_IntegrateCellArray.cpp
  test_IntegrateCellValue.cpp
  test_IntegrateOnCells.cpp
  test_INodeProcessor.cpp
  test_ItemId.cpp
  test_ItemType.cpp
  test_LinearSolver.cpp
  test_LinearSolverOptions.cpp
  test_LineTransformation.cpp
  test_ListAffectationProcessor.cpp
  test_LoadBalancer_serial.cpp
  test_MathModule.cpp
  test_MedianDualConnectivityBuilder.cpp
  test_MedianDualMeshBuilder.cpp
  test_NameProcessor.cpp
  test_NaNHelper.cpp
  test_OStream.cpp
  test_ParallelChecker_write.cpp
  test_ParseError.cpp
  test_PartitionerOptions.cpp
  test_PETScUtils.cpp
  test_PrimalToDiamondDualConnectivityDataMapper.cpp
  test_PrimalToDual1DConnectivityDataMapper.cpp
  test_PrimalToMedianDualConnectivityDataMapper.cpp
  test_PrismGaussQuadrature.cpp
  test_PrismTransformation.cpp
  test_PugsAssert.cpp
  test_PugsFunctionAdapter.cpp
  test_PugsUtils.cpp
  test_PyramidGaussQuadrature.cpp
  test_PyramidTransformation.cpp
  test_QuadraticPolynomialReconstruction.cpp
  test_QuadratureType.cpp
  test_RefId.cpp
  test_RefItemList.cpp
  test_ReproducibleSumManager.cpp
  test_RevisionInfo.cpp
  test_SmallArray.cpp
  test_SmallMatrix.cpp
  test_SmallVector.cpp
  test_Socket.cpp
  test_SocketModule.cpp
  test_SourceLocation.cpp
  test_SquareGaussQuadrature.cpp
  test_SquareTransformation.cpp
  test_Stop.cpp
  test_SymbolTable.cpp
  test_Table.cpp
  test_TetrahedronGaussQuadrature.cpp
  test_TetrahedronTransformation.cpp
  test_TensorialGaussLegendreQuadrature.cpp
  test_TensorialGaussLobattoQuadrature.cpp
  test_Timer.cpp
  test_TinyMatrix.cpp
  test_TinyVector.cpp
  test_TriangleGaussQuadrature.cpp
  test_TriangleTransformation.cpp
  test_TupleToVectorProcessor.cpp
  test_UnaryExpressionProcessor.cpp
  test_UnaryOperatorMangler.cpp
  test_Vector.cpp
  test_WhileProcessor.cpp
  ${checkpointing_sequential_TESTS}
  )

  set(checkpointing_TESTS
    test_checkpointing_Checkpoint.cpp
    test_checkpointing_PrintCheckpointInfo.cpp
    test_checkpointing_PrintScriptFrom.cpp
    test_checkpointing_Resume.cpp
    test_checkpointing_ResumingManager.cpp
    test_checkpointing_ResumingUtils.cpp
    test_checkpointing_SetResumeFrom.cpp
  )

if(PUGS_HAS_HDF5)
  list(APPEND checkpointing_TESTS
    test_checkpointing_Array.cpp
    test_checkpointing_Connectivity.cpp
    test_checkpointing_DiscreteFunctionVariant.cpp
    test_checkpointing_HFTypes.cpp
    test_checkpointing_IBoundaryDescriptor.cpp
    test_checkpointing_IBoundaryConditionDescriptor.cpp
    test_checkpointing_IQuadratureDescriptor.cpp
    test_checkpointing_IDiscreteFunctionDescriptor.cpp
    test_checkpointing_IInterfaceDescriptor.cpp
    test_checkpointing_INamedDiscreteData.cpp
    test_checkpointing_ItemArray.cpp
    test_checkpointing_ItemArrayVariant.cpp
    test_checkpointing_ItemType.cpp
    test_checkpointing_ItemValue.cpp
    test_checkpointing_ItemValueVariant.cpp
    test_checkpointing_IWriter.cpp
    test_checkpointing_IZoneDescriptor.cpp
    test_checkpointing_Mesh.cpp
    test_checkpointing_OStream.cpp
    test_checkpointing_SubItemArrayPerItemVariant.cpp
    test_checkpointing_SubItemValuePerItemVariant.cpp
    test_checkpointing_Table.cpp
    test_checkpointing_VariableBCDescriptor.cpp
  )
endif(PUGS_HAS_HDF5)

add_executable (mpi_unit_tests
  mpi_test_main.cpp
  test_Connectivity.cpp
  test_ConnectivityDispatcher.cpp
  test_DiscreteFunctionDPk.cpp
  test_DiscreteFunctionDPkVector.cpp
  test_DiscreteFunctionIntegrator.cpp
  test_DiscreteFunctionIntegratorByZone.cpp
  test_DiscreteFunctionInterpoler.cpp
  test_DiscreteFunctionInterpolerByZone.cpp
  test_DiscreteFunctionP0.cpp
  test_DiscreteFunctionP0Vector.cpp
  test_DiscreteFunctionVectorIntegrator.cpp
  test_DiscreteFunctionVectorIntegratorByZone.cpp
  test_DiscreteFunctionVectorInterpoler.cpp
  test_DiscreteFunctionVectorInterpolerByZone.cpp
  test_EmbeddedDiscreteFunctionMathFunctions1D.cpp
  test_EmbeddedDiscreteFunctionMathFunctions2D.cpp
  test_EmbeddedDiscreteFunctionMathFunctions3D.cpp
  test_EmbeddedDiscreteFunctionOperators1D.cpp
  test_EmbeddedDiscreteFunctionOperators2D.cpp
  test_EmbeddedDiscreteFunctionOperators3D.cpp
  test_ExecutionStatManager.cpp
  test_InterpolateItemArray.cpp
  test_InterpolateItemValue.cpp
  test_ItemArray.cpp
  test_ItemArrayUtils.cpp
  test_ItemArrayVariant.cpp
  test_ItemArrayVariantFunctionInterpoler.cpp
  test_ItemValue.cpp
  test_ItemValueUtils.cpp
  test_ItemValueVariant.cpp
  test_ItemValueVariantFunctionInterpoler.cpp
  test_LoadBalancer_parallel.cpp
  test_MeshEdgeBoundary.cpp
  test_MeshEdgeInterface.cpp
  test_MeshFaceBoundary.cpp
  test_MeshFaceInterface.cpp
  test_MeshFlatEdgeBoundary.cpp
  test_MeshFlatFaceBoundary.cpp
  test_MeshFlatNodeBoundary.cpp
  test_MeshLineEdgeBoundary.cpp
  test_MeshLineFaceBoundary.cpp
  test_MeshLineNodeBoundary.cpp
  test_MeshNodeBoundary.cpp
  test_MeshNodeInterface.cpp
  test_MeshVariant.cpp
  test_Messenger.cpp
  test_OFStream.cpp
  test_ParallelChecker_read.cpp
  test_Partitioner.cpp
  test_PolynomialReconstruction_degree_1.cpp
  test_PolynomialReconstruction_degree_2.cpp
  test_PolynomialReconstructionDescriptor.cpp
  test_RandomEngine.cpp
  test_StencilBuilder_cell2cell.cpp
  test_StencilBuilder_node2cell.cpp
  test_SubItemArrayPerItemVariant.cpp
  test_SubItemValuePerItem.cpp
  test_SubItemValuePerItemVariant.cpp
  test_SubItemValuePerItemUtils.cpp
  test_SubItemArrayPerItem.cpp
  test_SubItemArrayPerItemUtils.cpp
  test_Synchronizer.cpp
  ${checkpointing_TESTS}
  )

add_library(test_Pugs_MeshDataBase
  MeshDataBaseForTests.cpp)

add_library(test_Pugs_ParallelCheckerTester
  ParallelCheckerTester.cpp)

target_link_libraries (test_Pugs_ParallelCheckerTester
  ${HIGHFIVE_TARGET})

target_link_libraries (unit_tests
  test_Pugs_MeshDataBase
  test_Pugs_ParallelCheckerTester
  PugsLanguageAST
  PugsLanguageModules
  PugsLanguageAlgorithms
  PugsLanguageUtils
  PugsLanguage
  PugsMesh
  PugsAlgebra
  PugsAnalysis
  PugsScheme
  PugsOutput
  PugsUtils
  PugsCheckpointing
  PugsDev
  Kokkos::kokkos
  ${PARMETIS_LIBRARIES}
  ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
  ${PETSC_LIBRARIES}
  Catch2
  ${PUGS_STD_LINK_FLAGS}
  ${HIGHFIVE_TARGET}
  ${SLURM_LIBRARY}
  stdc++fs
  )

target_link_libraries (mpi_unit_tests
  test_Pugs_MeshDataBase
  test_Pugs_ParallelCheckerTester
  PugsAlgebra
  PugsAnalysis
  PugsUtils
  PugsLanguage
  PugsLanguageAST
  PugsLanguageModules
  PugsLanguageAlgorithms
  PugsMesh
  PugsAlgebra
  PugsUtils
  PugsLanguageUtils
  PugsScheme
  PugsOutput
  PugsUtils
  PugsCheckpointing
  PugsDev
  PugsAlgebra
  PugsMesh
  Kokkos::kokkos
  ${PARMETIS_LIBRARIES}
  ${MPI_CXX_LINK_FLAGS} ${MPI_CXX_LIBRARIES}
  ${PETSC_LIBRARIES}
  Catch2
  ${PUGS_STD_LINK_FLAGS}
  ${HIGHFIVE_TARGET}
  ${SLURM_LIBRARY}
  stdc++fs
  )