cmake_minimum_required(VERSION 3.10)
project(H100PowerMangerTests)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 需要 GoogleTest（由 CI Dockerfile 或本地安装，提供 GTestConfig/库）
find_package(GTest REQUIRED)

################################################SQLiteTest（保留原有）#######
# 添加 SQLite 测试可执行文件（不使用第三方测试库）
add_executable(SQLiteTest
    until/testSqlitdb.cpp
    ${CMAKE_SOURCE_DIR}/src/pPowerManger/sqlit3/SQLite.cpp
    ${CMAKE_SOURCE_DIR}/src/pPowerManger/sqlit3/sqlite3.c
    ${CMAKE_SOURCE_DIR}/src/pPowerManger/logc/loguru.cpp
)

# 包含目录
target_include_directories(SQLiteTest PRIVATE
    ${CMAKE_SOURCE_DIR}/src/pPowerManger
    ${CMAKE_SOURCE_DIR}/src/pPowerManger/sqlit3
)

# 链接库文件
target_link_libraries(SQLiteTest
    pthread
    dl
)

################################################PowerMangerTests（gtest）####
# 综合单元测试：Driver / SystemData / FaultMap / Upmsg / UdpComm /
# PmSysvariable / SQLite 读回。仅链接现有 src 源码，不改动生产代码。
set(PM_SRC_DIR ${CMAKE_SOURCE_DIR}/src/pPowerManger)

set(PM_TEST_SOURCES
    until/DriverTest.cpp
    until/SystemDataTest.cpp
    until/FaultMapTest.cpp
    until/UpmsgTest.cpp
    until/UdpCommTest.cpp
    until/PmSysvariableTest.cpp
    until/SqliteTest.cpp
)

add_executable(PowerMangerTests ${PM_TEST_SOURCES}
    ${PM_SRC_DIR}/driver.cpp
    ${PM_SRC_DIR}/udpcomm/udpComm.cpp
    ${PM_SRC_DIR}/upmsg/upmsg_definitions.cpp
    ${PM_SRC_DIR}/sqlit3/SQLite.cpp
    ${PM_SRC_DIR}/sqlit3/sqlite3.c
    ${PM_SRC_DIR}/logc/loguru.cpp
)

target_include_directories(PowerMangerTests PRIVATE
    ${PM_SRC_DIR}
    ${PM_SRC_DIR}/sqlit3
    ${PM_SRC_DIR}/upmsg
    ${PM_SRC_DIR}/udpcomm
    ${PM_SRC_DIR}/logc
)

# gtest 需要 C++14+
set_target_properties(PowerMangerTests PROPERTIES
    CXX_STANDARD 14
    CXX_STANDARD_REQUIRED ON
)

# 兼容两种 gtest 安装方式：镜像安装(提供 GTest::gtest_main) 或 apt(仅 GTest_LIBRARIES)
if(TARGET GTest::gtest_main)
    set(GTEST_LIBS GTest::gtest_main GTest::gtest)
else()
    set(GTEST_LIBS ${GTest_LIBRARIES})
    target_include_directories(PowerMangerTests PRIVATE ${GTest_INCLUDE_DIRS})
endif()

target_link_libraries(PowerMangerTests
    ${GTEST_LIBS}
    ${MOOS_LIBRARIES}
    mbutil
    jsoncpp
    m
    pthread
    dl
)

################################################udpFeeder（集成测试用）#######
# 集成测试辅助：向 pPowerManger 发送真实 CCU 状态反馈 UDP 消息（字节级一致）
add_executable(udpFeeder
    integration/udp_feeder.cpp
    ${PM_SRC_DIR}/udpcomm/udpComm.cpp
    ${PM_SRC_DIR}/logc/loguru.cpp
)
target_include_directories(udpFeeder PRIVATE
    ${PM_SRC_DIR}
    ${PM_SRC_DIR}/udpcomm
    ${PM_SRC_DIR}/logc
)
set_target_properties(udpFeeder PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
)
target_link_libraries(udpFeeder
    ${MOOS_LIBRARIES}
    mbutil
    m
    pthread
    dl
)

################################################fullFeeder（集成测试用）#######
# 全类型 UDP 仿真器：CCU 状态 + 4 路配电反馈（自包含，仅依赖协议结构体头文件）
add_executable(fullFeeder
    integration/full_feeder.cpp
)
target_include_directories(fullFeeder PRIVATE
    ${PM_SRC_DIR}
    ${PM_SRC_DIR}/udpcomm
)
set_target_properties(fullFeeder PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
)
target_link_libraries(fullFeeder
    pthread
)

################################################pccuTest（pCCU 单元测试）#####
# pCCU 协议编解码 / 校验和 / 链路分发 / 数据库 单元测试
set(CCU_DIR ${CMAKE_SOURCE_DIR}/src/pCCU)

add_executable(pccuTest
    pccu/pccuTest.cpp
    ${CCU_DIR}/protocol/Frame.cpp
    ${CCU_DIR}/protocol/Message.cpp
    ${CCU_DIR}/protocol/MessageRegistry.cpp
    ${CCU_DIR}/protocol/FcProtocol.cpp
    ${CCU_DIR}/protocol/PmProtocol.cpp
    ${CCU_DIR}/protocol/DisProtocol.cpp
    ${CCU_DIR}/protocol/CanBms.cpp
    ${CCU_DIR}/comm/UdpEndpoint.cpp
    ${CCU_DIR}/comm/LinkManager.cpp
    ${CCU_DIR}/store/DbStore.cpp
    ${PM_SRC_DIR}/sqlit3/sqlite3.c
    ${PM_SRC_DIR}/logc/loguru.cpp
)
target_include_directories(pccuTest PRIVATE
    ${CCU_DIR}
    ${PM_SRC_DIR}
    ${PM_SRC_DIR}/sqlit3
    ${PM_SRC_DIR}/logc
)
set_target_properties(pccuTest PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
)
target_link_libraries(pccuTest
    ${MOOS_LIBRARIES}
    m
    pthread
    dl
)
