# tests/cgal/CMakeLists.txt
#
# CGAL-dependent test target.  Only built when -DWITH_CGAL=ON.
# Requires Boost (find_package(Boost REQUIRED) is called in the root CMakeLists).
#
# Run with:
#   cmake -S code -B build -DWITH_CGAL=ON
#   cmake --build build --target conformallab_cgal_tests
#   ctest --test-dir build -R cgal

add_executable(conformallab_cgal_tests
    # ── Phase 3a: mesh infrastructure ──────────────────────────────────────
    test_conformal_mesh.cpp

    # ── Phase 3b: HyperIdealFunctional ─────────────────────────────────────
    test_hyper_ideal_functional.cpp

    # ── Phase 3c + 3e: SphericalFunctional + gauge-fix ────────────────────
    test_spherical_functional.cpp

    # ── Phase 3d: EuclideanCyclicFunctional ───────────────────────────────
    test_euclidean_functional.cpp

    # ── Phase 3f: Hessians (cotangent Laplacian, spherical + Euclidean) ───
    test_euclidean_hessian.cpp
    test_spherical_hessian.cpp

    # ── Phase 9b: Hyper-ideal Hessian — block-FD vs full-FD validation ───
    #    Verifies the O(F·36) block-local Hessian agrees with the
    #    O(F·n) full-FD baseline.  Java upstream has no Hessian at all
    #    (HyperIdealFunctional.hasHessian() returns false) — both
    #    variants are conformallab++ extensions beyond the port.
    test_hyper_ideal_hessian.cpp

    # ── Phase 4a: Newton solver ────────────────────────────────────────────
    test_newton_solver.cpp

    # ── Phase 4b: Mesh I/O (CGAL::IO) ─────────────────────────────────────
    test_mesh_io.cpp

    # ── Phase 4c: End-to-end pipeline + user examples ─────────────────────
    test_pipeline.cpp

    # ── Phase 5: Layout / embedding + serialization ────────────────────────
    test_layout.cpp

    # ── Phase 6: Gauss–Bonnet, cut graph, exact trilateration, normalisation
    test_phase6.cpp

    # ── Phase 7: Java-parity layout — MobiusMap, priority BFS, halfedge_uv,
    #             period matrix, fundamental domain, tiling
    test_phase7.cpp

    # ── Java parity: geometry utility tests ──────────────────────────────────
    #    Ported from CuttinUtilityTest, UnwrapUtilityTest,
    #    ConvergenceUtilityTests, HomologyTest (tests 1–6).
    #    Test 7 (genus-2 homology) as GTEST_SKIP stub until Phase 8.
    test_geometry_utils.cpp

    # ── Scalability smoke tests ────────────────────────────────────────────────
    #    Newton convergence on large real-world meshes (cathead, brezel, brezel2).
    #    Assert correctness only (< 30 iterations, ||G|| < 1e-8).
    #    Wall-clock time is printed for documentation but NOT asserted,
    #    so the tests remain stable on slow CI hardware (Raspberry Pi ARM64).
    test_scalability_smoke.cpp

    # ── Phase 8 MVP: new CGAL-style public API ────────────────────────────────
    #    First client of Conformal_map_traits.h + Discrete_conformal_map.h.
    #    Acceptance probe before Phase 9a (Inversive-Distance) lands.
    test_cgal_traits_mvp.cpp
)

target_include_directories(conformallab_cgal_tests SYSTEM PRIVATE
    ${CMAKE_SOURCE_DIR}/deps/eigen-3.4.0
    ${CMAKE_SOURCE_DIR}/deps/CGAL-6.1.1/include
    ${CMAKE_SOURCE_DIR}/deps/single_includes
    ${Boost_INCLUDE_DIRS}
)

target_include_directories(conformallab_cgal_tests PRIVATE
    ${CMAKE_SOURCE_DIR}/include
)

target_compile_definitions(conformallab_cgal_tests PRIVATE
    CGAL_DISABLE_GMP
    CGAL_DISABLE_MPFR
    # Data directory — absolute path to code/data/ at build time.
    # Used by tests that load real mesh files (cathead.obj, brezel2.obj, …).
    CONFORMALLAB_DATA_DIR="${CMAKE_SOURCE_DIR}/data"
)

# Suppress warnings from CGAL/Boost headers
target_compile_options(conformallab_cgal_tests PRIVATE
    $<$<CXX_COMPILER_ID:GNU,Clang,AppleClang>:-Wno-unused-parameter>
)

target_link_libraries(conformallab_cgal_tests PRIVATE GTest::gtest_main)

include(GoogleTest)
gtest_discover_tests(conformallab_cgal_tests
    TEST_PREFIX "cgal."
    DISCOVERY_TIMEOUT 60
)
