#include #include "vde/core/exact_predicates.h" #include #include using namespace vde::core; TEST(ExactPredicatesTest, Orient2D_CounterClockwise) { double r = exact_orient2d(0, 0, 1, 0, 0, 1); EXPECT_GT(r, 0.0); // CCW } TEST(ExactPredicatesTest, Orient2D_Clockwise) { double r = exact_orient2d(0, 0, 0, 1, 1, 0); EXPECT_LT(r, 0.0); } TEST(ExactPredicatesTest, Orient2D_Collinear) { double r = exact_orient2d(0, 0, 1, 1, 2, 2); EXPECT_NEAR(r, 0.0, 1e-9); } TEST(ExactPredicatesTest, Orient3D_Above) { // Tetrahedron: base on z=0, apex at z=1 → positive volume double r = exact_orient3d(0,0,0, 1,0,0, 0,1,0, 0,0,1); EXPECT_GT(r, 0.0); } TEST(ExactPredicatesTest, Orient3D_Coplanar) { double r = exact_orient3d(0,0,0, 1,0,0, 0,1,0, 0.5,0.5,0); EXPECT_NEAR(r, 0.0, 1e-9); } TEST(ExactPredicatesTest, InSphere_Inside) { // Regular tetrahedron, point at centroid → inside circumsphere double r = exact_in_sphere(0,0,0, 2,0,0, 0,2,0, 0,0,2, 0.2,0.2,0.2); EXPECT_GT(r, 0.0); } TEST(ExactPredicatesTest, InSphere_OnSurface) { double r = exact_in_sphere(0,0,0, 3,0,0, 0,3,0, 0,0,3, 0,0,3); EXPECT_NEAR(r, 0.0, 1e-8); } TEST(ExactPredicatesTest, PointInPolygon_Inside) { std::vector poly = {{0,0,0},{2,0,0},{2,2,0},{0,2,0}}; EXPECT_TRUE(exact_point_in_polygon({1,1,0}, poly)); } TEST(ExactPredicatesTest, PointInPolygon_Outside) { std::vector poly = {{0,0,0},{2,0,0},{2,2,0},{0,2,0}}; EXPECT_FALSE(exact_point_in_polygon({3,3,0}, poly)); } TEST(ExactPredicatesTest, PointInPolygon_OnEdge) { std::vector poly = {{0,0,0},{2,0,0},{2,2,0},{0,2,0}}; EXPECT_TRUE(exact_point_in_polygon({1,0,0}, poly)); } TEST(ExactPredicatesTest, PrecisionMode) { set_precision_mode(PrecisionMode::Fast); EXPECT_EQ(precision_mode(), PrecisionMode::Fast); set_precision_mode(PrecisionMode::Adaptive); EXPECT_EQ(precision_mode(), PrecisionMode::Adaptive); set_precision_mode(PrecisionMode::Adaptive); // restore default } TEST(ExactPredicatesTest, IsUncertain) { EXPECT_TRUE(is_uncertain(1e-12)); EXPECT_FALSE(is_uncertain(1.0)); }