Files
ConformalLabpp/doc/api/tests.md
Tarik Moussa f25174ed69 feat: output_uv_map for InversiveDistance, error for CP-Euclidean, reviewer trio
Three reviewer-meeting deliverables in one commit.

(1) output_uv_map for the two remaining DCE entries
    ─────────────────────────────────────────────────
    * Discrete_inversive_distance.h: full implementation.  After Newton,
      reconstruct effective Euclidean edge lengths from the converged
      log-radii via the Bowers-Stephenson identity
      `ℓᵢⱼ² = rᵢ² + rⱼ² + 2·Iᵢⱼ·rᵢ·rⱼ`, populate a temporary
      EuclideanMaps with `lambda0 = log(ℓᵢⱼ²)`, and reuse the existing
      `euclidean_layout(mesh, 0, eucl)` priority-BFS.  Per-vertex
      Point_2 coordinates written into the user-supplied pmap.
      Optional `normalise_layout(true)` applies the canonical PCA
      centroid + major-axis rotation, same as the other 3 entries.

    * Discrete_circle_packing.h: throws std::runtime_error with a
      clear pointer to Phase 9c rather than silently producing
      nonsense.  CP-Euclidean is face-based; the faithful output is a
      per-face circle packing in ℝ², not a per-vertex Point_2 map.
      A true layout requires BPS-2010 §6 (~150 lines, on the porting
      roadmap as Phase 9c).  Failing loudly is the honest default.

    Tests: 2 new cases in test_cgal_phase8b_lite.cpp
    (OutputUvMap_InversiveDistance_PopulatesPmap;
    OutputUvMap_CPEuclidean_ThrowsClearly).  Both green.
    Suite total now 259 (was 257, +2).  CGAL subtotal: 234 → 236.

(2) Reviewer meeting documents
    ──────────────────────────
    New directory doc/reviewer/ with three files:

    * briefing.md  — one-page orientation for the reviewer.
      What the project is, where to look first
      (https://tmoussa.codeberg.page/ConformalLabpp/), the headline
      evidence (tests/coverage/sanitizers/license), what we want from
      them, what's deferred and why, and the 5 questions in a separate
      file.

    * questions.md — the 5 concrete decisions we want their second
      opinion on:
        Q1 Phase 9c (port-literal vs re-derive)
        Q2 Phase 9b-analytic (worth ~2 weeks for ~6× speedup?)
        Q3 CP-Euclidean output_uv_map (build now or defer?)
        Q4 CGAL submission strategy (one package or five?)
        Q5 geometry-central cross-validation co-authorship
      Plus an explicit "what would you say no to?" question at the
      bottom — negative feedback is the highest-value information.

    * agenda.md   — my own internal playbook (NOT to be sent).
      60-min flow: 5-min thank-you, 10-min architecture tour,
      30-min for Q1-Q5 in the order Q4-Q1-Q2-Q5-Q3, 5-min "no"
      question, 5-min wrap-up.  Includes post-meeting memo template
      to fill out in the 30 min after.

    * README.md    — index for the directory; says which file goes
      to whom and when to send.

(3) locked-vs-flexible.md known-limitations update
    ─────────────────────────────────────────────
    "output_uv_map covers 3 of 5 entries" → "covers 4 of 5".
    CP-Euclidean's throws-clearly behaviour documented as a Phase 9c
    deliverable rather than a passive gap.

Bonus: extended .codespellrc ignore list (acknowledgement, the
British-English spelling I used in agenda.md).

Verifications on this commit:
  259/259 tests pass (0 skipped)
  scripts/check-test-counts.sh:                OK (23 + 236 = 259)
  scripts/quality/license-headers.sh:          OK (66/66 SPDX)
  python3 scripts/quality/cgal-conventions.py: OK (0/6 violations)
  scripts/quality/codespell.sh:                OK (0 typos)
  scripts/quality/shellcheck.sh:               OK (0 findings)
  python3 scripts/check-markdown-links.py:     OK (143/143)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-26 11:15:09 +02:00

5.9 KiB
Raw Blame History

Test Suites

conformallab_tests — always built (no CGAL)

Pure-math tests, only Eigen required. Covers Java utilities ported in Phase 12.

File What it tests
test_clausen.cpp Clausen Cl₂, Lobachevsky Л, ImLi₂ — values at known points
test_hyper_ideal_utility.cpp Tetrahedron volumes (Meyerhoff / KolpakovMednykh)
test_matrix_utility.cpp Matrix helpers
test_surface_curve_utility.cpp Surface curve utilities
test_discrete_elliptic_utility.cpp Discrete elliptic functions
test_p2_utility.cpp P2 projective utilities
test_hyper_ideal_visualization_utility.cpp Poincaré disk projection, circumcircle

Total: 23 tests, 0 skipped.


conformallab_cgal_tests — built with -DWITH_CGAL_TESTS=ON or -DWITH_CGAL=ON

All tests have CTest prefix cgal. (set via TEST_PREFIX "cgal." in CMakeLists).

Suite File Tests What is verified
ConformalMeshTopology test_conformal_mesh.cpp 4 Euler characteristic, vertex/edge/face counts
ConformalMeshTraversal test_conformal_mesh.cpp 4 Halfedge iteration, valence, opposite
ConformalMeshProperties test_conformal_mesh.cpp 5 Property maps (λ, θ, idx, α, geometry type)
ConformalMeshValidity test_conformal_mesh.cpp 1 CGAL validity for all factory meshes
HyperIdealFunctional test_hyper_ideal_functional.cpp 7 FD gradient checks + Hessian symmetry
SphericalFunctional test_spherical_functional.cpp 12 Angle formula + gradient + gauge-fix + cross-module Hessian check
EuclideanFunctional test_euclidean_functional.cpp 12 Angle formula + gradient + cross-module Hessian check
EuclideanHessian test_euclidean_hessian.cpp 9 Cotangent Laplacian structure, FD agreement, PSD, null space
SphericalHessian test_spherical_hessian.cpp 8 Derivative correctness, NSD at equilibrium
NewtonSolver test_newton_solver.cpp 11 Convergence: Euclidean ×3, Spherical ×4, HyperIdeal ×4
SparseQRFallback test_newton_solver.cpp 3 Full-rank LDLT · singular matrix → QR · closed mesh gauge mode
MeshIO test_mesh_io.cpp 6 OFF/OBJ round-trips, error handling
Pipeline test_pipeline.cpp 5 End-to-end: build → setup → solve → export → reload
Layout test_layout.cpp 6 Edge-length preservation (Eucl./Spher.), Poincaré disk layout
Serialization test_layout.cpp 2 JSON and XML round-trips (DOF vector + layout UVs)
GaussBonnet test_phase6.cpp 12 χ, genus, sum/RHS, deficit, check, enforce
CutGraph test_phase6.cpp 6 Tree-cotree, open/closed meshes, flagindex consistency
HyperbolicTrilateration test_phase6.cpp 4 Möbius + law of cosines: exact distances, disk interior, off-origin
Normalisation test_phase6.cpp 4 Euclidean centroid, length ratios, Möbius centring
MobiusMap test_phase7.cpp 8 Identity, inverse, compose, from_three, apply(Vector2d)
BestRootFace test_phase7.cpp 2 Valid root face selection, interior bonus
HalfedgeUV test_phase7.cpp 4 Size = number of half-edges, seam consistency, boundary half-edges = 0
PriorityBFS test_phase7.cpp 3 Success, no seam on open meshes, all vertices placed
NormaliseEuclidean test_phase7.cpp 2 UV centroid = 0, halfedge_uv centroid = 0
PeriodMatrix test_phase7.cpp 7 τ ∈ , SL(2,) reduction, exception outside
FundamentalDomain test_phase7.cpp 7 Genus-1 parallelogram CCW, generators, g > 1 empty
TilingCopy/Neighbourhood test_phase7.cpp 4 Translation correct, tile count
CuttingUtility test_geometry_utils.cpp 3 point_in_triangle_2d: false, true, unit triangle (Java CuttingUtilityTest)
UnwrapUtility test_geometry_utils.cpp 2 Corner angle: collinear → π, equilateral → π/3 (Java UnwrapUtilityTest)
ConvergenceUtility test_geometry_utils.cpp 6 Circumradius + scale-invariant R_f/√A (Java ConvergenceUtilityTests)
EuclideanLayout test_geometry_utils.cpp 2 Euclidean layout round-trip edge lengths
SphericalLayout test_geometry_utils.cpp 1 Spherical layout on unit sphere
HomologyGenerators test_geometry_utils.cpp 1 Genus-2 cut graph: χ = 2, 4 cut edges (brezel2.obj)
SmokeEuclidean test_scalability_smoke.cpp 3 Smoke tests on real meshes: CatHead (open), Brezel genus-1, Brezel2 genus-2
CGALConformalTraits test_cgal_traits_mvp.cpp 2 Phase 8a MVP traits + Default model
CGALDiscreteConformalMap test_cgal_traits_mvp.cpp 6 Phase 8a MVP wrapper smoke tests
CPEuclideanFunctional test_cp_euclidean_functional.cpp 10 Phase 9a.1 — BPS-2010 face-based packing (Java parity)
InversiveDistanceFunctional test_inversive_distance_functional.cpp 11 Phase 9a.2 — Luo-2004 vertex-based packing (from literature)
HyperIdealHessian test_hyper_ideal_hessian.cpp 7 Phase 9b — block-FD vs full-FD cross-validation + PSD + speed-up
NewtonPhase9a test_newton_phase9a.cpp 7 Phase 9a-Newton — convergence for the two new circle-packing solvers
CGALPhase8bLite test_cgal_phase8b_lite.cpp 17 Phase 8b-Lite — CGAL entries for all 5 DCE models + output_uv_map (Euclidean, Spherical, HyperIdeal, Inversive-Distance) + CP-Euclidean throws-clearly + pipe-operator chaining

Total: 236 tests, 0 skipped.


Running tests

# All CGAL tests
ctest --test-dir build -R "^cgal\." --output-on-failure

# One suite
./build/conformallab_cgal_tests --gtest_filter="PeriodMatrix*"

# One specific test
./build/conformallab_cgal_tests --gtest_filter="PeriodMatrix.TauInUpperHalfPlane"

# Verbose output with timing
./build/conformallab_cgal_tests --gtest_filter="NewtonSolver*" --gtest_print_time=1