74 lines
2.1 KiB
C++
74 lines
2.1 KiB
C++
|
|
#include <gtest/gtest.h>
|
||
|
|
#include "vde/core/exact_predicates.h"
|
||
|
|
#include <vector>
|
||
|
|
#include <cmath>
|
||
|
|
|
||
|
|
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<Point3D> 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<Point3D> 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<Point3D> 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));
|
||
|
|
}
|