# SimpleRemoter 测试构建配置
cmake_minimum_required(VERSION 3.14)
project(SimpleRemoterTests)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# MSVC 编码设置
if(MSVC)
    add_compile_options(/utf-8)
endif()

# 选项：是否构建测试
option(BUILD_TESTING "Build tests" ON)

if(NOT BUILD_TESTING)
    return()
endif()

# 使用 FetchContent 获取 Google Test
include(FetchContent)
FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG        v1.14.0
)

# Windows 下避免覆盖 /MT /MD 设置
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)

FetchContent_MakeAvailable(googletest)

enable_testing()

# 包含项目头文件目录
include_directories(${CMAKE_SOURCE_DIR}/..)
include_directories(${CMAKE_SOURCE_DIR}/../client)
include_directories(${CMAKE_SOURCE_DIR}/../server/2015Remote)
include_directories(${CMAKE_SOURCE_DIR}/../common)

# ============================================
# 客户端 Buffer 测试
# ============================================
add_executable(client_buffer_test
    unit/client/BufferTest.cpp
)

# 测试文件内联包含了 Buffer 实现的测试版本
# 无需链接原始源文件，支持跨平台测试

target_link_libraries(client_buffer_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(client_buffer_test PRIVATE _WIN32)
endif()

# ============================================
# 服务端 Buffer 测试
# ============================================
add_executable(server_buffer_test
    unit/server/BufferTest.cpp
)

# 测试文件内联包含了 Buffer 实现的测试版本
# 支持跨平台测试

target_link_libraries(server_buffer_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(server_buffer_test PRIVATE _WIN32)
endif()

# Linux 需要 pthread
if(UNIX)
    find_package(Threads REQUIRED)
    target_link_libraries(client_buffer_test Threads::Threads)
    target_link_libraries(server_buffer_test Threads::Threads)
endif()

# ============================================
# 协议测试 (Phase 1)
# ============================================
add_executable(protocol_test
    unit/protocol/PacketTest.cpp
    unit/protocol/PathUtilsTest.cpp
)

target_link_libraries(protocol_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(protocol_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(protocol_test Threads::Threads)
endif()

# ============================================
# 文件传输测试 (Phase 2)
# ============================================
add_executable(file_transfer_test
    unit/file/FileTransferV2Test.cpp
)

target_link_libraries(file_transfer_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(file_transfer_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(file_transfer_test Threads::Threads)
endif()

# ============================================
# 分块管理测试 (Phase 2)
# ============================================
add_executable(chunk_manager_test
    unit/file/ChunkManagerTest.cpp
)

target_link_libraries(chunk_manager_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(chunk_manager_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(chunk_manager_test Threads::Threads)
endif()

# ============================================
# SHA-256 校验测试 (Phase 2)
# ============================================
add_executable(sha256_verify_test
    unit/file/SHA256VerifyTest.cpp
)

target_link_libraries(sha256_verify_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(sha256_verify_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(sha256_verify_test Threads::Threads)
endif()

# ============================================
# 断点续传状态测试 (Phase 2)
# ============================================
add_executable(resume_state_test
    unit/file/ResumeStateTest.cpp
)

target_link_libraries(resume_state_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(resume_state_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(resume_state_test Threads::Threads)
endif()

# ============================================
# 协议头验证测试 (Phase 3)
# ============================================
add_executable(header_test
    unit/network/HeaderTest.cpp
)

target_link_libraries(header_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(header_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(header_test Threads::Threads)
endif()

# ============================================
# 粘包/分包测试 (Phase 3)
# ============================================
add_executable(packet_fragment_test
    unit/network/PacketFragmentTest.cpp
)

target_link_libraries(packet_fragment_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(packet_fragment_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(packet_fragment_test Threads::Threads)
endif()

# ============================================
# HTTP 伪装测试 (Phase 3)
# ============================================
add_executable(http_mask_test
    unit/network/HttpMaskTest.cpp
)

target_link_libraries(http_mask_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(http_mask_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(http_mask_test Threads::Threads)
endif()

# ============================================
# 差分算法测试 (Phase 4)
# ============================================
add_executable(diff_algorithm_test
    unit/screen/DiffAlgorithmTest.cpp
)

target_link_libraries(diff_algorithm_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(diff_algorithm_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(diff_algorithm_test Threads::Threads)
endif()

# ============================================
# RGB565 压缩测试 (Phase 4)
# ============================================
add_executable(rgb565_test
    unit/screen/RGB565Test.cpp
)

target_link_libraries(rgb565_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(rgb565_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(rgb565_test Threads::Threads)
endif()

# ============================================
# 滚动检测测试 (Phase 4)
# ============================================
add_executable(scroll_detector_test
    unit/screen/ScrollDetectorTest.cpp
)

target_link_libraries(scroll_detector_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(scroll_detector_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(scroll_detector_test Threads::Threads)
endif()

# ============================================
# 质量自适应测试 (Phase 4)
# ============================================
add_executable(quality_adaptive_test
    unit/screen/QualityAdaptiveTest.cpp
)

target_link_libraries(quality_adaptive_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(quality_adaptive_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(quality_adaptive_test Threads::Threads)
endif()

# ============================================
# 时间验证测试 (授权模块)
# ============================================
add_executable(date_verify_test
    unit/auth/DateVerifyTest.cpp
)

target_link_libraries(date_verify_test
    GTest::gtest_main
)

if(WIN32)
    target_compile_definitions(date_verify_test PRIVATE _WIN32)
endif()

if(UNIX)
    target_link_libraries(date_verify_test Threads::Threads)
endif()

# ============================================
# IP地理位置测试 (网络API)
# ============================================
if(WIN32)
    add_executable(geolocation_test
        unit/network/GeoLocationTest.cpp
    )

    target_link_libraries(geolocation_test
        GTest::gtest_main
        wininet
        ws2_32
    )

    target_compile_definitions(geolocation_test PRIVATE _WIN32)
endif()

# ============================================
# 注册表配置测试 (iniFile/binFile)
# ============================================
if(WIN32)
    add_executable(registry_config_test
        unit/config/RegistryConfigTest.cpp
    )

    target_link_libraries(registry_config_test
        GTest::gtest_main
        advapi32
    )

    target_compile_definitions(registry_config_test PRIVATE _WIN32)
endif()

# 注册测试
include(GoogleTest)
if(WIN32)
    gtest_discover_tests(geolocation_test)
    gtest_discover_tests(registry_config_test)
endif()
gtest_discover_tests(client_buffer_test)
gtest_discover_tests(server_buffer_test)
gtest_discover_tests(protocol_test)
gtest_discover_tests(file_transfer_test)
gtest_discover_tests(chunk_manager_test)
gtest_discover_tests(sha256_verify_test)
gtest_discover_tests(resume_state_test)
gtest_discover_tests(header_test)
gtest_discover_tests(packet_fragment_test)
gtest_discover_tests(http_mask_test)
gtest_discover_tests(diff_algorithm_test)
gtest_discover_tests(rgb565_test)
gtest_discover_tests(scroll_detector_test)
gtest_discover_tests(quality_adaptive_test)
gtest_discover_tests(date_verify_test)

# 自定义目标：运行所有测试
add_custom_target(run_tests
    COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
    DEPENDS client_buffer_test server_buffer_test protocol_test
            file_transfer_test chunk_manager_test sha256_verify_test resume_state_test
            header_test packet_fragment_test http_mask_test
            diff_algorithm_test rgb565_test scroll_detector_test quality_adaptive_test
            date_verify_test
)
