diff --git a/.idea/omath.iml b/.idea/omath.iml
new file mode 100644
index 00000000..4c942354
--- /dev/null
+++ b/.idea/omath.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/examples/example_glfw3.cpp b/examples/example_glfw3.cpp
index 0a3c5e35..da55ac07 100644
--- a/examples/example_glfw3.cpp
+++ b/examples/example_glfw3.cpp
@@ -127,8 +127,8 @@ int main()
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif
- const int SCR_WIDTH = 800;
- const int SCR_HEIGHT = 600;
+ constexpr int SCR_WIDTH = 800;
+ constexpr int SCR_HEIGHT = 600;
GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "omath cube + camera (GLEW)", nullptr, nullptr);
if (!window)
diff --git a/tests/general/unit_test_a_star.cpp b/tests/general/unit_test_a_star.cpp
index 83ec7f51..fc7011ad 100644
--- a/tests/general/unit_test_a_star.cpp
+++ b/tests/general/unit_test_a_star.cpp
@@ -1,8 +1,8 @@
// Extra unit tests for the project's A* implementation
+#include
#include
#include
#include
-#include
#include
using namespace omath;
@@ -11,12 +11,12 @@ using namespace omath::pathfinding;
TEST(AStarExtra, TrivialNeighbor)
{
NavigationMesh nav;
- Vector3 v1{0.f,0.f,0.f};
- Vector3 v2{1.f,0.f,0.f};
+ Vector3 v1{0.f, 0.f, 0.f};
+ Vector3 v2{1.f, 0.f, 0.f};
nav.m_vertex_map[v1] = {v2};
nav.m_vertex_map[v2] = {v1};
- auto path = Astar::find_path(v1, v2, nav);
+ const auto path = Astar::find_path(v1, v2, nav);
ASSERT_EQ(path.size(), 1u);
EXPECT_EQ(path.front(), v2);
}
@@ -24,10 +24,10 @@ TEST(AStarExtra, TrivialNeighbor)
TEST(AStarExtra, StartEqualsGoal)
{
NavigationMesh nav;
- Vector3 v{1.f,1.f,0.f};
+ constexpr Vector3 v{1.f, 1.f, 0.f};
nav.m_vertex_map[v] = {};
- auto path = Astar::find_path(v, v, nav);
+ const auto path = Astar::find_path(v, v, nav);
ASSERT_EQ(path.size(), 1u);
EXPECT_EQ(path.front(), v);
}
@@ -35,13 +35,13 @@ TEST(AStarExtra, StartEqualsGoal)
TEST(AStarExtra, BlockedNoPathBetweenTwoVertices)
{
NavigationMesh nav;
- Vector3 left{0.f,0.f,0.f};
- Vector3 right{2.f,0.f,0.f};
+ constexpr Vector3 left{0.f, 0.f, 0.f};
+ constexpr Vector3 right{2.f, 0.f, 0.f};
// both vertices present but no connections
nav.m_vertex_map[left] = {};
nav.m_vertex_map[right] = {};
- auto path = Astar::find_path(left, right, nav);
+ const auto path = Astar::find_path(left, right, nav);
// disconnected vertices -> empty result
EXPECT_TRUE(path.empty());
}
@@ -50,44 +50,47 @@ TEST(AStarExtra, LongerPathAvoidsBlock)
{
NavigationMesh nav;
// build 3x3 grid of vertices, block center (1,1)
- auto idx = [&](int x, int y){ return Vector3{static_cast(x), static_cast(y), 0.f}; };
+ auto idx = [&](const int x, const int y)
+ { return Vector3{static_cast(x), static_cast(y), 0.f}; };
for (int y = 0; y < 3; ++y)
{
for (int x = 0; x < 3; ++x)
{
- Vector3 v = idx(x,y);
- if (x==1 && y==1) continue; // center is omitted (blocked)
+ Vector3 v = idx(x, y);
+ if (x == 1 && y == 1)
+ continue; // center is omitted (blocked)
std::vector> neigh;
- const std::array,4> offs{{{1,0},{-1,0},{0,1},{0,-1}}};
- for (auto [dx,dy]: offs)
+ constexpr std::array, 4> offs{{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}};
+ for (auto [dx, dy] : offs)
{
- int nx = x + dx, ny = y + dy;
- if (nx < 0 || nx >= 3 || ny < 0 || ny >= 3) continue;
- if (nx==1 && ny==1) continue; // neighbor is the blocked center
- neigh.push_back(idx(nx,ny));
+ const int nx = x + dx, ny = y + dy;
+ if (nx < 0 || nx >= 3 || ny < 0 || ny >= 3)
+ continue;
+ if (nx == 1 && ny == 1)
+ continue; // neighbor is the blocked center
+ neigh.push_back(idx(nx, ny));
}
nav.m_vertex_map[v] = neigh;
}
}
- Vector3 start = idx(0,1);
- Vector3 goal = idx(2,1);
- auto path = Astar::find_path(start, goal, nav);
+ constexpr Vector3 start = idx(0, 1);
+ constexpr Vector3 goal = idx(2, 1);
+ const auto path = Astar::find_path(start, goal, nav);
ASSERT_FALSE(path.empty());
EXPECT_EQ(path.front(), goal); // Astar convention: single-element or endpoint present
}
-
TEST(AstarTests, TrivialDirectNeighborPath)
{
NavigationMesh nav;
// create two vertices directly connected
- Vector3 v1{0.f,0.f,0.f};
- Vector3 v2{1.f,0.f,0.f};
+ Vector3 v1{0.f, 0.f, 0.f};
+ Vector3 v2{1.f, 0.f, 0.f};
nav.m_vertex_map.emplace(v1, std::vector>{v2});
nav.m_vertex_map.emplace(v2, std::vector>{v1});
- auto path = Astar::find_path(v1, v2, nav);
+ const auto path = Astar::find_path(v1, v2, nav);
// Current A* implementation returns the end vertex as the reconstructed
// path (single-element) in the simple neighbor scenario. Assert that the
// endpoint is present and reachable.
@@ -98,12 +101,12 @@ TEST(AstarTests, TrivialDirectNeighborPath)
TEST(AstarTests, NoPathWhenDisconnected)
{
NavigationMesh nav;
- Vector3 v1{0.f,0.f,0.f};
- Vector3 v2{10.f,0.f,0.f};
+ Vector3 v1{0.f, 0.f, 0.f};
+ constexpr Vector3 v2{10.f, 0.f, 0.f};
// nav has only v1
nav.m_vertex_map.emplace(v1, std::vector>{});
- auto path = Astar::find_path(v1, v2, nav);
+ const auto path = Astar::find_path(v1, v2, nav);
// When the nav mesh contains only the start vertex, the closest
// vertex for both start and end will be the same vertex. In that
// case Astar returns a single-element path with the start vertex.
@@ -113,11 +116,11 @@ TEST(AstarTests, NoPathWhenDisconnected)
TEST(AstarTests, EmptyNavReturnsNoPath)
{
- NavigationMesh nav;
- Vector3 v1{0.f,0.f,0.f};
- Vector3 v2{1.f,0.f,0.f};
+ const NavigationMesh nav;
+ constexpr Vector3 v1{0.f, 0.f, 0.f};
+ constexpr Vector3 v2{1.f, 0.f, 0.f};
- auto path = Astar::find_path(v1, v2, nav);
+ const auto path = Astar::find_path(v1, v2, nav);
EXPECT_TRUE(path.empty());
}
diff --git a/tests/general/unit_test_angle.cpp b/tests/general/unit_test_angle.cpp
index 0e4c7ba0..d1fc410f 100644
--- a/tests/general/unit_test_angle.cpp
+++ b/tests/general/unit_test_angle.cpp
@@ -13,11 +13,11 @@ namespace
{
// Handy aliases (defaults: Type=float, [0,360], Normalized)
- using Deg = Angle;
- using Pitch = Angle;
- using Turn = Angle;
+ using Deg = Angle(0), static_cast(360), AngleFlags::Normalized>;
+ using Pitch = Angle(-90), static_cast(90), AngleFlags::Clamped>;
+ using Turn = Angle(-180), static_cast(180), AngleFlags::Normalized>;
- constexpr float kEps = 1e-5f;
+ constexpr float k_eps = 1e-5f;
} // namespace
@@ -25,7 +25,7 @@ namespace
TEST(UnitTestAngle, DefaultConstructor_IsZeroDegrees)
{
- Deg a; // default ctor
+ constexpr Deg a; // default ctor
EXPECT_FLOAT_EQ(*a, 0.0f);
EXPECT_FLOAT_EQ(a.as_degrees(), 0.0f);
}
@@ -44,8 +44,8 @@ TEST(UnitTestAngle, FromDegrees_Normalized_WrapsBelowMin)
TEST(UnitTestAngle, FromDegrees_Clamped_ClampsToRange)
{
- const Pitch hi = Pitch::from_degrees(100.0f);
- const Pitch lo = Pitch::from_degrees(-120.0f);
+ constexpr Pitch hi = Pitch::from_degrees(100.0f);
+ constexpr Pitch lo = Pitch::from_degrees(-120.0f);
EXPECT_FLOAT_EQ(hi.as_degrees(), 90.0f);
EXPECT_FLOAT_EQ(lo.as_degrees(), -90.0f);
@@ -80,8 +80,8 @@ TEST(UnitTestAngle, DereferenceReturnsDegrees)
TEST(UnitTestAngle, SinCosTanCot_BasicCases)
{
const Deg a0 = Deg::from_degrees(0.0f);
- EXPECT_NEAR(a0.sin(), 0.0f, kEps);
- EXPECT_NEAR(a0.cos(), 1.0f, kEps);
+ EXPECT_NEAR(a0.sin(), 0.0f, k_eps);
+ EXPECT_NEAR(a0.cos(), 1.0f, k_eps);
// cot(0) -> cos/sin -> div by 0: allow inf or nan
const float cot0 = a0.cot();
EXPECT_TRUE(std::isinf(cot0) || std::isnan(cot0));
@@ -99,7 +99,7 @@ TEST(UnitTestAngle, Atan_IsAtanOfRadians)
{
// atan(as_radians). For 0° -> atan(0)=0.
const Deg a0 = Deg::from_degrees(0.0f);
- EXPECT_NEAR(a0.atan(), 0.0f, kEps);
+ EXPECT_NEAR(a0.atan(), 0.0f, k_eps);
const Deg a45 = Deg::from_degrees(45.0f);
// atan(pi/4) ≈ 0.665773...
diff --git a/tests/general/unit_test_collision_extra.cpp b/tests/general/unit_test_collision_extra.cpp
index 6d42e85e..4884c630 100644
--- a/tests/general/unit_test_collision_extra.cpp
+++ b/tests/general/unit_test_collision_extra.cpp
@@ -66,18 +66,18 @@ TEST(CollisionExtra, EPAConvergesOnSimpleCase)
std::vector>{{ {0.f,0.f,0.f}, {}, {} }, { {1.f,0.f,0.f}, {}, {} } },
{}
};
- omath::source_engine::Mesh meshB = meshA;
- meshB.set_origin({0.5f, 0.f, 0.f}); // translate to overlap
+ omath::source_engine::Mesh mesh_b = meshA;
+ mesh_b.set_origin({0.5f, 0.f, 0.f}); // translate to overlap
- omath::source_engine::MeshCollider A(meshA);
- omath::source_engine::MeshCollider B(meshB);
+ omath::source_engine::MeshCollider a(meshA);
+ omath::source_engine::MeshCollider b(mesh_b);
// Create a simplex that approximately contains the origin in Minkowski space
Simplex> simplex;
simplex = { omath::Vector3{0.5f,0.f,0.f}, omath::Vector3{-0.5f,0.f,0.f}, omath::Vector3{0.f,0.5f,0.f}, omath::Vector3{0.f,-0.5f,0.f} };
auto pool = std::pmr::monotonic_buffer_resource(1024);
- auto res = Epa::solve(A, B, simplex, {}, pool);
+ auto res = Epa::solve(a, b, simplex, {}, pool);
// EPA may or may not converge depending on numerics; ensure it returns optionally
// but if it does, fields should be finite
if (res.has_value())
diff --git a/tests/general/unit_test_color_grouped.cpp b/tests/general/unit_test_color_grouped.cpp
index 0d74c330..a32eaf1a 100644
--- a/tests/general/unit_test_color_grouped.cpp
+++ b/tests/general/unit_test_color_grouped.cpp
@@ -113,50 +113,50 @@ TEST_F(UnitTestColorGrouped, BlendVector3)
TEST(UnitTestColorGrouped_Extra, SetHueSaturationValue)
{
Color c = Color::red();
- auto h1 = c.to_hsv();
+ const auto h1 = c.to_hsv();
EXPECT_FLOAT_EQ(h1.hue, 0.f);
c.set_hue(0.5f);
- auto h2 = c.to_hsv();
+ const auto h2 = c.to_hsv();
EXPECT_NEAR(h2.hue, 0.5f, 1e-3f);
c = Color::from_hsv(0.25f, 0.8f, 0.6f);
c.set_saturation(0.3f);
- auto h3 = c.to_hsv();
+ const auto h3 = c.to_hsv();
EXPECT_NEAR(h3.saturation, 0.3f, 1e-3f);
c.set_value(1.0f);
- auto h4 = c.to_hsv();
+ const auto h4 = c.to_hsv();
EXPECT_NEAR(h4.value, 1.0f, 1e-3f);
}
TEST(UnitTestColorGrouped_Extra, ToStringVariants)
{
- Color c = Color::from_rgba(10, 20, 30, 255);
+ constexpr Color c = Color::from_rgba(10, 20, 30, 255);
auto s = c.to_string();
EXPECT_NE(s.find("r:"), std::string::npos);
- auto ws = c.to_wstring();
+ const auto ws = c.to_wstring();
EXPECT_FALSE(ws.empty());
- auto u8 = c.to_u8string();
+ const auto u8 = c.to_u8string();
EXPECT_FALSE(u8.empty());
}
TEST(UnitTestColorGrouped_Extra, BlendEdgeCases)
{
- Color a = Color::red();
- Color b = Color::blue();
- auto r0 = a.blend(b, 0.f);
+ constexpr Color a = Color::red();
+ constexpr Color b = Color::blue();
+ constexpr auto r0 = a.blend(b, 0.f);
EXPECT_FLOAT_EQ(r0.x, a.x);
- auto r1 = a.blend(b, 1.f);
+ constexpr auto r1 = a.blend(b, 1.f);
EXPECT_FLOAT_EQ(r1.x, b.x);
}
// From unit_test_color_more.cpp
TEST(UnitTestColorGrouped_More, DefaultCtorIsZero)
{
- Color c;
+ constexpr Color c;
EXPECT_FLOAT_EQ(c.x, 0.0f);
EXPECT_FLOAT_EQ(c.y, 0.0f);
EXPECT_FLOAT_EQ(c.z, 0.0f);
@@ -165,7 +165,7 @@ TEST(UnitTestColorGrouped_More, DefaultCtorIsZero)
TEST(UnitTestColorGrouped_More, FloatCtorAndClampForRGB)
{
- Color c(1.2f, -0.5f, 0.5f, 2.0f);
+ constexpr Color c(1.2f, -0.5f, 0.5f, 2.0f);
EXPECT_FLOAT_EQ(c.x, 1.0f);
EXPECT_FLOAT_EQ(c.y, 0.0f);
EXPECT_FLOAT_EQ(c.z, 0.5f);
@@ -174,7 +174,7 @@ TEST(UnitTestColorGrouped_More, FloatCtorAndClampForRGB)
TEST(UnitTestColorGrouped_More, FromRgbaProducesScaledComponents)
{
- Color c = Color::from_rgba(25u, 128u, 230u, 64u);
+ constexpr Color c = Color::from_rgba(25u, 128u, 230u, 64u);
EXPECT_NEAR(c.x, 25.0f/255.0f, 1e-6f);
EXPECT_NEAR(c.y, 128.0f/255.0f, 1e-6f);
EXPECT_NEAR(c.z, 230.0f/255.0f, 1e-6f);
@@ -183,9 +183,9 @@ TEST(UnitTestColorGrouped_More, FromRgbaProducesScaledComponents)
TEST(UnitTestColorGrouped_More, BlendProducesIntermediate)
{
- Color c0(0.0f, 0.0f, 0.0f, 1.0f);
- Color c1(1.0f, 1.0f, 1.0f, 0.0f);
- Color mid = c0.blend(c1, 0.5f);
+ constexpr Color c0(0.0f, 0.0f, 0.0f, 1.0f);
+ constexpr Color c1(1.0f, 1.0f, 1.0f, 0.0f);
+ constexpr Color mid = c0.blend(c1, 0.5f);
EXPECT_FLOAT_EQ(mid.x, 0.5f);
EXPECT_FLOAT_EQ(mid.y, 0.5f);
EXPECT_FLOAT_EQ(mid.z, 0.5f);
@@ -194,9 +194,9 @@ TEST(UnitTestColorGrouped_More, BlendProducesIntermediate)
TEST(UnitTestColorGrouped_More, HsvRoundTrip)
{
- Color red = Color::red();
- auto hsv = red.to_hsv();
- Color back = Color::from_hsv(hsv);
+ constexpr Color red = Color::red();
+ const auto hsv = red.to_hsv();
+ const Color back = Color::from_hsv(hsv);
EXPECT_NEAR(back.x, 1.0f, 1e-6f);
EXPECT_NEAR(back.y, 0.0f, 1e-6f);
EXPECT_NEAR(back.z, 0.0f, 1e-6f);
@@ -204,7 +204,7 @@ TEST(UnitTestColorGrouped_More, HsvRoundTrip)
TEST(UnitTestColorGrouped_More, ToStringContainsComponents)
{
- Color c = Color::from_rgba(10, 20, 30, 40);
+ constexpr Color c = Color::from_rgba(10, 20, 30, 40);
std::string s = c.to_string();
EXPECT_NE(s.find("r:"), std::string::npos);
EXPECT_NE(s.find("g:"), std::string::npos);
@@ -215,7 +215,7 @@ TEST(UnitTestColorGrouped_More, ToStringContainsComponents)
// From unit_test_color_more2.cpp
TEST(UnitTestColorGrouped_More2, FromRgbaAndToString)
{
- auto c = Color::from_rgba(255, 128, 0, 64);
+ constexpr auto c = Color::from_rgba(255, 128, 0, 64);
const auto s = c.to_string();
EXPECT_NE(s.find("r:255"), std::string::npos);
EXPECT_NE(s.find("g:128"), std::string::npos);
@@ -225,7 +225,7 @@ TEST(UnitTestColorGrouped_More2, FromRgbaAndToString)
TEST(UnitTestColorGrouped_More2, FromHsvCases)
{
- const float eps = 1e-5f;
+ constexpr float eps = 1e-5f;
auto check_hue = [&](float h) {
SCOPED_TRACE(::testing::Message() << "h=" << h);
@@ -257,7 +257,7 @@ TEST(UnitTestColorGrouped_More2, FromHsvCases)
TEST(UnitTestColorGrouped_More2, ToHsvAndSetters)
{
Color c{0.2f, 0.4f, 0.6f, 1.f};
- auto hsv = c.to_hsv();
+ const auto hsv = c.to_hsv();
EXPECT_NEAR(hsv.value, 0.6f, 1e-6f);
c.set_hue(0.0f);
@@ -272,16 +272,16 @@ TEST(UnitTestColorGrouped_More2, ToHsvAndSetters)
TEST(UnitTestColorGrouped_More2, BlendAndStaticColors)
{
- Color a = Color::red();
- Color b = Color::blue();
- auto mid = a.blend(b, 0.5f);
+ constexpr Color a = Color::red();
+ constexpr Color b = Color::blue();
+ constexpr auto mid = a.blend(b, 0.5f);
EXPECT_GT(mid.x, 0.f);
EXPECT_GT(mid.z, 0.f);
- auto all_a = a.blend(b, -1.f);
+ constexpr auto all_a = a.blend(b, -1.f);
EXPECT_NEAR(all_a.x, a.x, 1e-6f);
- auto all_b = a.blend(b, 2.f);
+ constexpr auto all_b = a.blend(b, 2.f);
EXPECT_NEAR(all_b.z, b.z, 1e-6f);
}
diff --git a/tests/general/unit_test_epa.cpp b/tests/general/unit_test_epa.cpp
index 97838d3d..43e6b014 100644
--- a/tests/general/unit_test_epa.cpp
+++ b/tests/general/unit_test_epa.cpp
@@ -60,7 +60,7 @@ TEST(UnitTestEpa, TestCollisionTrue)
EXPECT_NEAR(epa->normal.z, 0.0f, 1e-3f);
// Try both signs with a tiny margin (avoid grazing contacts)
- const float margin = 1.0f + 1e-3f;
+ constexpr float margin = 1.0f + 1e-3f;
const auto pen = epa->penetration_vector;
Mesh b_plus = b;
diff --git a/tests/general/unit_test_epa_internal.cpp b/tests/general/unit_test_epa_internal.cpp
index 25982810..f31416c4 100644
--- a/tests/general/unit_test_epa_internal.cpp
+++ b/tests/general/unit_test_epa_internal.cpp
@@ -9,7 +9,8 @@ using Vector3f = omath::Vector3;
struct DummyCollider
{
using VectorType = Vector3f;
- VectorType find_abs_furthest_vertex_position(const VectorType& dir) const noexcept
+ [[nodiscard]]
+ static VectorType find_abs_furthest_vertex_position(const VectorType& dir) noexcept
{
// map direction to a small point so support_point is finite
return Vector3f{dir.x * 0.01f, dir.y * 0.01f, dir.z * 0.01f};
@@ -25,12 +26,13 @@ TEST(EpaInternal, SolveHandlesSmallPolytope)
Simplex s;
s = { Vector3f{0.01f, 0.f, 0.f}, Vector3f{0.f, 0.01f, 0.f}, Vector3f{0.f, 0.f, 0.01f}, Vector3f{-0.01f, -0.01f, -0.01f} };
- DummyCollider a, b;
+ constexpr DummyCollider a;
+ constexpr DummyCollider b;
EpaDummy::Params params;
params.max_iterations = 16;
params.tolerance = 1e-6f;
- auto result = EpaDummy::solve(a, b, s, params);
+ const auto result = EpaDummy::solve(a, b, s, params);
// Should either return a valid result or gracefully return nullopt
if (result)
diff --git a/tests/general/unit_test_epa_more.cpp b/tests/general/unit_test_epa_more.cpp
index 2c491b65..086987db 100644
--- a/tests/general/unit_test_epa_more.cpp
+++ b/tests/general/unit_test_epa_more.cpp
@@ -30,12 +30,13 @@ TEST(EpaExtra, DegenerateFaceHandled)
Simplex s;
s = { Vector3f{0.01f, 0.f, 0.f}, Vector3f{0.02f, 0.f, 0.f}, Vector3f{0.03f, 0.f, 0.f}, Vector3f{0.0f, 0.0f, 0.01f} };
- DegenerateCollider a, b;
+ constexpr DegenerateCollider a;
+ constexpr DegenerateCollider b;
Epa::Params params;
params.max_iterations = 4;
params.tolerance = 1e-6f;
- auto result = Epa::solve(a, b, s, params);
+ const auto result = Epa::solve(a, b, s, params);
// The algorithm should either return a valid result or gracefully exit (not crash)
if (result)
diff --git a/tests/general/unit_test_line_trace.cpp b/tests/general/unit_test_line_trace.cpp
index 8387c4cb..8f1ec124 100644
--- a/tests/general/unit_test_line_trace.cpp
+++ b/tests/general/unit_test_line_trace.cpp
@@ -19,9 +19,9 @@ namespace
// -----------------------------------------------------------------------------
// Constants & helpers
// -----------------------------------------------------------------------------
- constexpr float kTol = 1e-5f;
+ constexpr float k_tol = 1e-5f;
- bool VecEqual(const Vec3& a, const Vec3& b, float tol = kTol)
+ bool vec_equal(const Vec3& a, const Vec3& b, const float tol = k_tol)
{
return std::fabs(a.x - b.x) < tol &&
std::fabs(a.y - b.y) < tol &&
@@ -58,8 +58,8 @@ namespace
TEST_P(CanTraceLineParam, VariousRays)
{
- const auto& p = GetParam();
- EXPECT_EQ(LineTracer::can_trace_line(p.ray, triangle), p.expected_clear);
+ const auto& [ray, expected_clear] = GetParam();
+ EXPECT_EQ(LineTracer::can_trace_line(ray, triangle), expected_clear);
}
INSTANTIATE_TEST_SUITE_P(
@@ -85,8 +85,8 @@ namespace
constexpr Vec3 expected{0.3f, 0.3f, 0.f};
const Vec3 hit = LineTracer::get_ray_hit_point(ray, triangle);
- ASSERT_FALSE(VecEqual(hit, ray.end));
- EXPECT_TRUE(VecEqual(hit, expected));
+ ASSERT_FALSE(vec_equal(hit, ray.end));
+ EXPECT_TRUE(vec_equal(hit, expected));
}
// -----------------------------------------------------------------------------
diff --git a/tests/general/unit_test_line_tracer.cpp b/tests/general/unit_test_line_tracer.cpp
index 33787981..fccc1675 100644
--- a/tests/general/unit_test_line_tracer.cpp
+++ b/tests/general/unit_test_line_tracer.cpp
@@ -8,51 +8,51 @@ using omath::Vector3;
TEST(LineTracerTests, ParallelRayReturnsEnd)
{
// Triangle in XY plane
- omath::Triangle> tri{ {0.f,0.f,0.f}, {1.f,0.f,0.f}, {0.f,1.f,0.f} };
+ constexpr omath::Triangle> tri{ {0.f,0.f,0.f}, {1.f,0.f,0.f}, {0.f,1.f,0.f} };
omath::collision::Ray ray;
ray.start = Vector3{0.f,0.f,1.f};
ray.end = Vector3{1.f,1.f,2.f}; // direction parallel to plane normal (z) -> but choose parallel to plane? make direction parallel to triangle plane
ray.end = Vector3{1.f,1.f,1.f};
// For a ray parallel to the triangle plane the algorithm should return ray.end
- auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
EXPECT_TRUE(hit == ray.end);
EXPECT_TRUE(omath::collision::LineTracer::can_trace_line(ray, tri));
}
TEST(LineTracerTests, MissesTriangleReturnsEnd)
{
- omath::Triangle> tri{ {0.f,0.f,0.f}, {1.f,0.f,0.f}, {0.f,1.f,0.f} };
+ constexpr omath::Triangle> tri{ {0.f,0.f,0.f}, {1.f,0.f,0.f}, {0.f,1.f,0.f} };
omath::collision::Ray ray;
ray.start = Vector3{2.f,2.f,-1.f};
ray.end = Vector3{2.f,2.f,1.f}; // passes above the triangle area
- auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
EXPECT_TRUE(hit == ray.end);
}
TEST(LineTracerTests, HitTriangleReturnsPointInsideSegment)
{
- omath::Triangle> tri{ {0.f,0.f,0.f}, {2.f,0.f,0.f}, {0.f,2.f,0.f} };
+ constexpr omath::Triangle> tri{ {0.f,0.f,0.f}, {2.f,0.f,0.f}, {0.f,2.f,0.f} };
omath::collision::Ray ray;
ray.start = Vector3{0.25f,0.25f,-1.f};
ray.end = Vector3{0.25f,0.25f,1.f};
- auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
// Should return a point between start and end (z approximately 0)
EXPECT_NE(hit, ray.end);
EXPECT_NEAR(hit.z, 0.f, 1e-4f);
// t_hit should be between 0 and 1 along the ray direction
- auto dir = ray.direction_vector();
+ const auto dir = ray.direction_vector();
// find t such that start + dir * t == hit (only check z comp for stability)
- float t = (hit.z - ray.start.z) / dir.z;
+ const float t = (hit.z - ray.start.z) / dir.z;
EXPECT_GT(t, 0.f);
EXPECT_LT(t, 1.f);
}
TEST(LineTracerTests, InfiniteLengthEarlyOut)
{
- omath::Triangle> tri{ {0.f,0.f,0.f}, {1.f,0.f,0.f}, {0.f,1.f,0.f} };
+ constexpr omath::Triangle> tri{ {0.f,0.f,0.f}, {1.f,0.f,0.f}, {0.f,1.f,0.f} };
omath::collision::Ray ray;
ray.start = Vector3{0.25f,0.25f,0.f};
ray.end = Vector3{0.25f,0.25f,1.f};
@@ -60,6 +60,6 @@ TEST(LineTracerTests, InfiniteLengthEarlyOut)
// If t_hit <= epsilon the algorithm should return ray.end when infinite_length is true.
// Using start on the triangle plane should produce t_hit <= epsilon.
- auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = omath::collision::LineTracer::get_ray_hit_point(ray, tri);
EXPECT_TRUE(hit == ray.end);
}
diff --git a/tests/general/unit_test_line_tracer_extra.cpp b/tests/general/unit_test_line_tracer_extra.cpp
index 73766441..51214dd2 100644
--- a/tests/general/unit_test_line_tracer_extra.cpp
+++ b/tests/general/unit_test_line_tracer_extra.cpp
@@ -8,17 +8,17 @@ using namespace omath::collision;
TEST(LineTracerExtra, MissParallel)
{
- Triangle> tri({0,0,0},{1,0,0},{0,1,0});
- Ray ray{ {0.3f,0.3f,1.f}, {0.3f,0.3f,2.f}, false };// parallel above triangle
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ constexpr Triangle> tri({0,0,0},{1,0,0},{0,1,0});
+ constexpr Ray ray{ {0.3f,0.3f,1.f}, {0.3f,0.3f,2.f}, false }; // parallel above triangle
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerExtra, HitCenter)
{
- Triangle> tri({0,0,0},{1,0,0},{0,1,0});
- Ray ray{ {0.3f,0.3f,-1.f}, {0.3f,0.3f,1.f}, false };
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ constexpr Triangle> tri({0,0,0},{1,0,0},{0,1,0});
+ constexpr Ray ray{ {0.3f,0.3f,-1.f}, {0.3f,0.3f,1.f}, false };
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
ASSERT_FALSE(hit == ray.end);
EXPECT_NEAR(hit.x, 0.3f, 1e-6f);
EXPECT_NEAR(hit.y, 0.3f, 1e-6f);
@@ -27,9 +27,9 @@ TEST(LineTracerExtra, HitCenter)
TEST(LineTracerExtra, HitOnEdge)
{
- Triangle> tri({0,0,0},{1,0,0},{0,1,0});
- Ray ray{ {0.0f,0.0f,1.f}, {0.0f,0.0f,0.f}, false };
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ constexpr Triangle> tri({0,0,0},{1,0,0},{0,1,0});
+ constexpr Ray ray{ {0.0f,0.0f,1.f}, {0.0f,0.0f,0.f}, false };
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
// hitting exact vertex/edge may be considered miss; ensure function handles without crash
if (hit != ray.end)
{
@@ -40,9 +40,9 @@ TEST(LineTracerExtra, HitOnEdge)
TEST(LineTracerExtra, InfiniteRayIgnoredIfBehind)
{
- Triangle> tri({0,0,0},{1,0,0},{0,1,0});
+ constexpr Triangle> tri({0,0,0},{1,0,0},{0,1,0});
// Ray pointing away but infinite_length true should be ignored
- Ray ray{ {0.5f,0.5f,-1.f}, {0.5f,0.5f,-2.f}, true };
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ constexpr Ray ray{ {0.5f,0.5f,-1.f}, {0.5f,0.5f,-2.f}, true };
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
diff --git a/tests/general/unit_test_line_tracer_more.cpp b/tests/general/unit_test_line_tracer_more.cpp
index 66b1c941..81c711b7 100644
--- a/tests/general/unit_test_line_tracer_more.cpp
+++ b/tests/general/unit_test_line_tracer_more.cpp
@@ -11,53 +11,53 @@ using Triangle3 = omath::Triangle>;
TEST(LineTracerMore, ParallelRayReturnsEnd)
{
// Ray parallel to triangle plane: construct triangle in XY plane and ray along X axis
- Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
+ constexpr Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
Ray ray; ray.start = {0.f,0.f,1.f}; ray.end = {1.f,0.f,1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore, UOutOfRangeReturnsEnd)
{
// Construct a ray that misses due to u < 0
- Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
+ constexpr Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
Ray ray; ray.start = {-1.f,-1.f,-1.f}; ray.end = {-0.5f,-1.f,1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore, VOutOfRangeReturnsEnd)
{
// Construct ray that has v < 0
- Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
+ constexpr Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
Ray ray; ray.start = {2.f,2.f,-1.f}; ray.end = {2.f,2.f,1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore, THitTooSmallReturnsEnd)
{
- Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
+ constexpr Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
Ray ray; ray.start = {0.f,0.f,0.0000000001f}; ray.end = {0.f,0.f,1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore, THitGreaterThanOneReturnsEnd)
{
- Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
+ constexpr Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
// Choose a ray and compute t_hit locally to assert consistency
Ray ray; ray.start = {0.f,0.f,-1.f}; ray.end = {0.f,0.f,-0.5f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
- const float k_epsilon = std::numeric_limits::epsilon();
- const auto side_a = tri.side_a_vector();
- const auto side_b = tri.side_b_vector();
+ constexpr float k_epsilon = std::numeric_limits::epsilon();
+ constexpr auto side_a = tri.side_a_vector();
+ constexpr auto side_b = tri.side_b_vector();
const auto ray_dir = ray.direction_vector();
const auto p = ray_dir.cross(side_b);
const auto det = side_a.dot(p);
@@ -82,21 +82,21 @@ TEST(LineTracerMore, THitGreaterThanOneReturnsEnd)
TEST(LineTracerMore, InfiniteLengthWithSmallTHitReturnsEnd)
{
Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
- Triangle3 tri2(Vector3{0.f,0.f,-1e-8f}, Vector3{1.f,0.f,-1e-8f}, Vector3{0.f,1.f,-1e-8f});
+ constexpr Triangle3 tri2(Vector3{0.f,0.f,-1e-8f}, Vector3{1.f,0.f,-1e-8f}, Vector3{0.f,1.f,-1e-8f});
Ray ray; ray.start = {0.f,0.f,0.f}; ray.end = {0.f,0.f,1.f}; ray.infinite_length = true;
// Create triangle slightly behind so t_hit <= eps
tri = tri2;
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore, SuccessfulHitReturnsPoint)
{
- Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
+ constexpr Triangle3 tri(Vector3{0.f,0.f,0.f}, Vector3{1.f,0.f,0.f}, Vector3{0.f,1.f,0.f});
Ray ray; ray.start = {0.1f,0.1f,-1.f}; ray.end = {0.1f,0.1f,1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_NE(hit, ray.end);
// Hit should be on plane z=0 and near x=0.1,y=0.1
EXPECT_NEAR(hit.z, 0.f, 1e-6f);
diff --git a/tests/general/unit_test_line_tracer_more2.cpp b/tests/general/unit_test_line_tracer_more2.cpp
index d8ff62d1..716453f8 100644
--- a/tests/general/unit_test_line_tracer_more2.cpp
+++ b/tests/general/unit_test_line_tracer_more2.cpp
@@ -10,48 +10,48 @@ using Triangle3 = omath::Triangle>;
TEST(LineTracerMore2, UGreaterThanOneReturnsEnd)
{
- Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
+ constexpr Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
// choose ray so barycentric u > 1
Ray ray; ray.start = {2.f, -1.f, -1.f}; ray.end = {2.f, -1.f, 1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore2, VGreaterThanOneReturnsEnd)
{
- Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
+ constexpr Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
// choose ray so barycentric v > 1
Ray ray; ray.start = {-1.f, 2.f, -1.f}; ray.end = {-1.f, 2.f, 1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore2, UPlusVGreaterThanOneReturnsEnd)
{
- Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
+ constexpr Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
// Ray aimed so u+v > 1 (outside triangle region)
Ray ray; ray.start = {1.f, 1.f, -1.f}; ray.end = {1.f, 1.f, 1.f};
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
TEST(LineTracerMore2, DirectionVectorNormalizedProducesUnitLength)
{
Ray r; r.start = {0.f,0.f,0.f}; r.end = {0.f,3.f,4.f};
- auto dir = r.direction_vector_normalized();
- auto len = dir.length();
+ const auto dir = r.direction_vector_normalized();
+ const auto len = dir.length();
EXPECT_NEAR(len, 1.f, 1e-6f);
}
TEST(LineTracerMore2, ZeroLengthRayHandled)
{
- Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
+ constexpr Triangle3 tri({0.f,0.f,0.f},{1.f,0.f,0.f},{0.f,1.f,0.f});
Ray ray; ray.start = {0.f,0.f,0.f}; ray.end = {0.f,0.f,0.f};
// Zero-length ray: direction length == 0; algorithm should handle without crash
- auto hit = LineTracer::get_ray_hit_point(ray, tri);
+ const auto hit = LineTracer::get_ray_hit_point(ray, tri);
EXPECT_EQ(hit, ray.end);
}
diff --git a/tests/general/unit_test_linear_algebra_cover_more_ops.cpp b/tests/general/unit_test_linear_algebra_cover_more_ops.cpp
index bfedb00d..b49ea48e 100644
--- a/tests/general/unit_test_linear_algebra_cover_more_ops.cpp
+++ b/tests/general/unit_test_linear_algebra_cover_more_ops.cpp
@@ -31,16 +31,16 @@ TEST(Vector3ScalarOps, InPlaceScalarOperators)
TEST(Vector4BinaryOps, ElementWiseMulDiv)
{
- Vector4 a{2.f, 4.f, 6.f, 8.f};
- Vector4 b{1.f, 2.f, 3.f, 4.f};
+ constexpr Vector4 a{2.f, 4.f, 6.f, 8.f};
+ constexpr Vector4 b{1.f, 2.f, 3.f, 4.f};
- auto m = a * b;
+ constexpr auto m = a * b;
EXPECT_FLOAT_EQ(m.x, 2.f);
EXPECT_FLOAT_EQ(m.y, 8.f);
EXPECT_FLOAT_EQ(m.z, 18.f);
EXPECT_FLOAT_EQ(m.w, 32.f);
- auto d = a / b;
+ constexpr auto d = a / b;
EXPECT_FLOAT_EQ(d.x, 2.f);
EXPECT_FLOAT_EQ(d.y, 2.f);
EXPECT_FLOAT_EQ(d.z, 2.f);
diff --git a/tests/general/unit_test_linear_algebra_cover_remaining.cpp b/tests/general/unit_test_linear_algebra_cover_remaining.cpp
index 7027f330..be42f383 100644
--- a/tests/general/unit_test_linear_algebra_cover_remaining.cpp
+++ b/tests/general/unit_test_linear_algebra_cover_remaining.cpp
@@ -10,23 +10,21 @@ using namespace omath;
static void make_bad_mat_rows()
{
// wrong number of rows -> should throw inside initializer-list ctor
- Mat<2, 2, float> m{{1.f, 2.f}};
- (void)m;
+ [[maybe_unused]] const Mat<2, 2, float> m{{1.f, 2.f}};
}
static void make_bad_mat_cols()
{
// row with wrong number of columns -> should throw
- Mat<2, 2, float> m{{1.f, 2.f}, {1.f}};
- (void)m;
+ [[maybe_unused]] const Mat<2, 2, float> m{{1.f, 2.f}, {1.f}};
}
TEST(Vector4Operator, Subtraction)
{
- Vector4 a{5.f, 6.f, 7.f, 8.f};
- Vector4 b{1.f, 2.f, 3.f, 4.f};
+ constexpr Vector4 a{5.f, 6.f, 7.f, 8.f};
+ constexpr Vector4 b{1.f, 2.f, 3.f, 4.f};
- auto r = a - b;
+ constexpr auto r = a - b;
EXPECT_FLOAT_EQ(r.x, 4.f);
EXPECT_FLOAT_EQ(r.y, 4.f);
EXPECT_FLOAT_EQ(r.z, 4.f);
diff --git a/tests/general/unit_test_linear_algebra_extra.cpp b/tests/general/unit_test_linear_algebra_extra.cpp
index b081033a..c5926e84 100644
--- a/tests/general/unit_test_linear_algebra_extra.cpp
+++ b/tests/general/unit_test_linear_algebra_extra.cpp
@@ -11,12 +11,12 @@ using namespace omath;
TEST(LinearAlgebraExtra, FormatterAndHashVector2)
{
Vector2 v{1.0f, 2.0f};
- std::string s = std::format("{}", v);
+ const std::string s = std::format("{}", v);
EXPECT_EQ(s, "[1, 2]");
- std::size_t h1 = std::hash>{}(v);
- std::size_t h2 = std::hash>{}(Vector2{1.0f, 2.0f});
- std::size_t h3 = std::hash>{}(Vector2{2.0f, 3.0f});
+ const std::size_t h1 = std::hash>{}(v);
+ const std::size_t h2 = std::hash>{}(Vector2{1.0f, 2.0f});
+ const std::size_t h3 = std::hash>{}(Vector2{2.0f, 3.0f});
EXPECT_EQ(h1, h2);
EXPECT_NE(h1, h3);
@@ -25,11 +25,11 @@ TEST(LinearAlgebraExtra, FormatterAndHashVector2)
TEST(LinearAlgebraExtra, FormatterAndHashVector3)
{
Vector3 v{1.0f, 2.0f, 3.0f};
- std::string s = std::format("{}", v);
+ const std::string s = std::format("{}", v);
EXPECT_EQ(s, "[1, 2, 3]");
- std::size_t h1 = std::hash>{}(v);
- std::size_t h2 = std::hash>{}(Vector3{1.0f, 2.0f, 3.0f});
+ const std::size_t h1 = std::hash>{}(v);
+ const std::size_t h2 = std::hash>{}(Vector3{1.0f, 2.0f, 3.0f});
EXPECT_EQ(h1, h2);
// point_to_same_direction
@@ -40,18 +40,18 @@ TEST(LinearAlgebraExtra, FormatterAndHashVector3)
TEST(LinearAlgebraExtra, FormatterAndHashVector4)
{
Vector4 v{1.0f, 2.0f, 3.0f, 4.0f};
- std::string s = std::format("{}", v);
+ const std::string s = std::format("{}", v);
EXPECT_EQ(s, "[1, 2, 3, 4]");
- std::size_t h1 = std::hash>{}(v);
- std::size_t h2 = std::hash>{}(Vector4{1.0f, 2.0f, 3.0f, 4.0f});
+ const std::size_t h1 = std::hash>{}(v);
+ const std::size_t h2 = std::hash>{}(Vector4{1.0f, 2.0f, 3.0f, 4.0f});
EXPECT_EQ(h1, h2);
}
TEST(LinearAlgebraExtra, MatRawArrayAndOperators)
{
Mat<2,2> m{{1.0f, 2.0f},{3.0f,4.0f}};
- auto raw = m.raw_array();
+ const auto raw = m.raw_array();
EXPECT_EQ(raw.size(), 4);
EXPECT_FLOAT_EQ(raw[0], 1.0f);
EXPECT_FLOAT_EQ(raw[3], 4.0f);
diff --git a/tests/general/unit_test_linear_algebra_helpers.cpp b/tests/general/unit_test_linear_algebra_helpers.cpp
index 2cca9120..3483fa0d 100644
--- a/tests/general/unit_test_linear_algebra_helpers.cpp
+++ b/tests/general/unit_test_linear_algebra_helpers.cpp
@@ -12,14 +12,14 @@ using namespace omath;
TEST(LinearAlgebraHelpers, Vector3NoInlineHelpersExecute)
{
- Vector3 a{1.f, 2.f, 3.f};
- Vector3 b{4.f, 5.f, 6.f};
+ constexpr Vector3 a{1.f, 2.f, 3.f};
+ constexpr Vector3 b{4.f, 5.f, 6.f};
// Execute helpers that were made non-inlined
- auto l = a.length();
- auto ang = a.angle_between(b);
- auto perp = a.is_perpendicular(b);
- auto norm = a.normalized();
+ const auto l = a.length();
+ const auto ang = a.angle_between(b);
+ const auto perp = a.is_perpendicular(b);
+ const auto norm = a.normalized();
(void)l; (void)ang; (void)perp; (void)norm;
SUCCEED();
@@ -27,17 +27,17 @@ TEST(LinearAlgebraHelpers, Vector3NoInlineHelpersExecute)
TEST(LinearAlgebraHelpers, TriangleNoInlineHelpersExecute)
{
- Vector3 v1{0.f,0.f,0.f};
- Vector3 v2{3.f,0.f,0.f};
- Vector3 v3{3.f,4.f,0.f};
+ constexpr Vector3 v1{0.f,0.f,0.f};
+ constexpr Vector3 v2{3.f,0.f,0.f};
+ constexpr Vector3 v3{3.f,4.f,0.f};
- Triangle> t{v1, v2, v3};
+ constexpr Triangle> t{v1, v2, v3};
- auto n = t.calculate_normal();
- auto a = t.side_a_length();
- auto b = t.side_b_length();
- auto h = t.hypot();
- auto r = t.is_rectangular();
+ const auto n = t.calculate_normal();
+ const auto a = t.side_a_length();
+ const auto b = t.side_b_length();
+ const auto h = t.hypot();
+ const auto r = t.is_rectangular();
(void)n; (void)a; (void)b; (void)h; (void)r;
SUCCEED();
@@ -47,8 +47,8 @@ TEST(LinearAlgebraHelpers, Vector4NoInlineHelpersExecute)
{
Vector4 v{1.f,2.f,3.f,4.f};
- auto l = v.length();
- auto s = v.sum();
+ const auto l = v.length();
+ const auto s = v.sum();
v.clamp(-10.f, 10.f);
(void)l; (void)s;
diff --git a/tests/general/unit_test_linear_algebra_more.cpp b/tests/general/unit_test_linear_algebra_more.cpp
index dc4dd023..e29a7eed 100644
--- a/tests/general/unit_test_linear_algebra_more.cpp
+++ b/tests/general/unit_test_linear_algebra_more.cpp
@@ -7,32 +7,32 @@ using namespace omath;
TEST(LinearAlgebraMore, Vector3EdgeCases)
{
- Vector3 zero{0.f,0.f,0.f};
- Vector3 v{1.f,0.f,0.f};
+ constexpr Vector3 zero{0.f,0.f,0.f};
+ constexpr Vector3 v{1.f,0.f,0.f};
// angle_between should be unexpected when one vector has zero length
- auto angle = zero.angle_between(v);
+ const auto angle = zero.angle_between(v);
EXPECT_FALSE(static_cast(angle));
// normalized of zero should return zero
- auto nz = zero.normalized();
+ const auto nz = zero.normalized();
EXPECT_EQ(nz.x, 0.f);
EXPECT_EQ(nz.y, 0.f);
EXPECT_EQ(nz.z, 0.f);
// perpendicular case: x-axis and y-axis
- Vector3 x{1.f,0.f,0.f};
- Vector3 y{0.f,1.f,0.f};
+ constexpr Vector3 x{1.f,0.f,0.f};
+ constexpr Vector3 y{0.f,1.f,0.f};
EXPECT_TRUE(x.is_perpendicular(y));
}
TEST(LinearAlgebraMore, TriangleRectangularAndDegenerate)
{
- Vector3 v1{0.f,0.f,0.f};
- Vector3 v2{3.f,0.f,0.f};
- Vector3 v3{3.f,4.f,0.f}; // 3-4-5 triangle, rectangular at v2
+ constexpr Vector3 v1{0.f,0.f,0.f};
+ constexpr Vector3 v2{3.f,0.f,0.f};
+ constexpr Vector3 v3{3.f,4.f,0.f}; // 3-4-5 triangle, rectangular at v2
- Triangle> t{v1,v2,v3};
+ constexpr Triangle> t{v1,v2,v3};
EXPECT_NEAR(t.side_a_length(), 3.f, 1e-6f);
EXPECT_NEAR(t.side_b_length(), 4.f, 1e-6f);
@@ -40,7 +40,7 @@ TEST(LinearAlgebraMore, TriangleRectangularAndDegenerate)
EXPECT_TRUE(t.is_rectangular());
// Degenerate: all points same
- Triangle> d{v1,v1,v1};
+ constexpr Triangle> d{v1,v1,v1};
EXPECT_NEAR(d.side_a_length(), 0.f, 1e-6f);
EXPECT_NEAR(d.side_b_length(), 0.f, 1e-6f);
EXPECT_NEAR(d.hypot(), 0.f, 1e-6f);
@@ -49,7 +49,7 @@ TEST(LinearAlgebraMore, TriangleRectangularAndDegenerate)
TEST(LinearAlgebraMore, Vector4ClampAndComparisons)
{
Vector4 v{10.f, -20.f, 30.f, -40.f};
- auto s = v.sum();
+ const auto s = v.sum();
EXPECT_NEAR(s, -20.f, 1e-6f);
v.clamp(-10.f, 10.f);
@@ -58,7 +58,7 @@ TEST(LinearAlgebraMore, Vector4ClampAndComparisons)
EXPECT_LE(v.y, 10.f);
EXPECT_GE(v.y, -10.f);
- Vector4 a{1.f,2.f,3.f,4.f};
- Vector4 b{2.f,2.f,2.f,2.f};
+ constexpr Vector4 a{1.f,2.f,3.f,4.f};
+ constexpr Vector4 b{2.f,2.f,2.f,2.f};
EXPECT_TRUE(a < b || a > b || a == b); // just exercise comparisons
}
diff --git a/tests/general/unit_test_linear_algebra_more2.cpp b/tests/general/unit_test_linear_algebra_more2.cpp
index 73d7dfdc..e9c4e3f9 100644
--- a/tests/general/unit_test_linear_algebra_more2.cpp
+++ b/tests/general/unit_test_linear_algebra_more2.cpp
@@ -47,7 +47,7 @@ TEST(LinearAlgebraMore2, Vector4NonInlinedHelpers)
EXPECT_GE(v.x, 0.f);
EXPECT_LE(v.z, 2.5f);
- Vector4 shorter{0.1f,0.1f,0.1f,0.1f};
+ constexpr Vector4 shorter{0.1f,0.1f,0.1f,0.1f};
EXPECT_TRUE(shorter < v);
EXPECT_FALSE(v < shorter);
}
@@ -59,7 +59,7 @@ TEST(LinearAlgebraMore2, MatNonInlinedAndStringHelpers)
auto maybe_inv = m.inverted();
EXPECT_TRUE(maybe_inv.has_value());
- auto inv = maybe_inv.value();
+ const auto& inv = maybe_inv.value();
// m * inv should be identity (approximately)
auto prod = m * inv;
@@ -72,14 +72,14 @@ TEST(LinearAlgebraMore2, MatNonInlinedAndStringHelpers)
EXPECT_EQ(t.at(0,1), m.at(1,0));
auto raw = m.raw_array();
- EXPECT_EQ(raw.size(), size_t(4));
+ EXPECT_EQ(raw.size(), static_cast(4));
auto s = m.to_string();
EXPECT_NE(s.size(), 0u);
auto ws = m.to_wstring();
EXPECT_NE(ws.size(), 0u);
- auto u8s = m.to_u8string();
- EXPECT_NE(u8s.size(), 0u);
+ auto u8_s = m.to_u8string();
+ EXPECT_NE(u8_s.size(), 0u);
// to_screen_mat static helper
auto screen = Mat<4,4,float>::to_screen_mat(800.f, 600.f);
diff --git a/tests/general/unit_test_mat.cpp b/tests/general/unit_test_mat.cpp
index 08ed4719..7cfc9c1d 100644
--- a/tests/general/unit_test_mat.cpp
+++ b/tests/general/unit_test_mat.cpp
@@ -154,12 +154,12 @@ TEST_F(UnitTestMat, AssignmentOperator_Move)
// Test static methods
TEST_F(UnitTestMat, StaticMethod_ToScreenMat)
{
- Mat<4, 4> screenMat = Mat<4, 4>::to_screen_mat(800.0f, 600.0f);
- EXPECT_FLOAT_EQ(screenMat.at(0, 0), 400.0f);
- EXPECT_FLOAT_EQ(screenMat.at(1, 1), -300.0f);
- EXPECT_FLOAT_EQ(screenMat.at(3, 0), 400.0f);
- EXPECT_FLOAT_EQ(screenMat.at(3, 1), 300.0f);
- EXPECT_FLOAT_EQ(screenMat.at(3, 3), 1.0f);
+ Mat<4, 4> screen_mat = Mat<4, 4>::to_screen_mat(800.0f, 600.0f);
+ EXPECT_FLOAT_EQ(screen_mat.at(0, 0), 400.0f);
+ EXPECT_FLOAT_EQ(screen_mat.at(1, 1), -300.0f);
+ EXPECT_FLOAT_EQ(screen_mat.at(3, 0), 400.0f);
+ EXPECT_FLOAT_EQ(screen_mat.at(3, 1), 300.0f);
+ EXPECT_FLOAT_EQ(screen_mat.at(3, 3), 1.0f);
}
@@ -220,8 +220,8 @@ TEST(UnitTestMatStandalone, Equanity)
constexpr omath::Vector3 left_handed = {0, 2, 10};
constexpr omath::Vector3 right_handed = {0, 2, -10};
- auto proj_left_handed = omath::mat_perspective_left_handed(90.f, 16.f / 9.f, 0.1, 1000);
- auto proj_right_handed = omath::mat_perspective_right_handed(90.f, 16.f / 9.f, 0.1, 1000);
+ const auto proj_left_handed = omath::mat_perspective_left_handed(90.f, 16.f / 9.f, 0.1, 1000);
+ const auto proj_right_handed = omath::mat_perspective_right_handed(90.f, 16.f / 9.f, 0.1, 1000);
auto ndc_left_handed = proj_left_handed * omath::mat_column_from_vector(left_handed);
auto ndc_right_handed = proj_right_handed * omath::mat_column_from_vector(right_handed);
@@ -233,7 +233,7 @@ TEST(UnitTestMatStandalone, Equanity)
}
TEST(UnitTestMatStandalone, MatPerspectiveLeftHanded)
{
- auto perspective_proj = mat_perspective_left_handed(90.f, 16.f/9.f, 0.1f, 1000.f);
+ const auto perspective_proj = mat_perspective_left_handed(90.f, 16.f/9.f, 0.1f, 1000.f);
auto projected = perspective_proj
* mat_column_from_vector({0, 0, 0.1001});
diff --git a/tests/general/unit_test_mat_coverage_extra.cpp b/tests/general/unit_test_mat_coverage_extra.cpp
index 0c52aba7..bddb26ee 100644
--- a/tests/general/unit_test_mat_coverage_extra.cpp
+++ b/tests/general/unit_test_mat_coverage_extra.cpp
@@ -16,9 +16,9 @@ TEST(MatCoverageExtra, InitListColumnsMismatchThrows) {
TEST(MatCoverageExtra, DeterminantFallbackIsCallable) {
// Call determinant for 1x1 and 2x2 matrices to cover determinant paths
- Mat<1,1> m1{{3.14f}};
+ const Mat<1,1> m1{{3.14f}};
EXPECT_FLOAT_EQ(m1.determinant(), 3.14f);
- Mat<2,2> m2{{{1.0f,2.0f},{3.0f,4.0f}}};
+ const Mat<2,2> m2{{{1.0f,2.0f},{3.0f,4.0f}}};
EXPECT_FLOAT_EQ(m2.determinant(), -2.0f);
}
diff --git a/tests/general/unit_test_mat_more.cpp b/tests/general/unit_test_mat_more.cpp
index 68467fcf..bb023fc4 100644
--- a/tests/general/unit_test_mat_more.cpp
+++ b/tests/general/unit_test_mat_more.cpp
@@ -15,7 +15,7 @@ TEST(MatMore, InitListAndMultiply)
TEST(MatMore, Determinant)
{
- Mat<2,2,double> m{{{1.0,2.0},{2.0,4.0}}}; // singular
- double det = m.determinant();
+ const Mat<2,2,double> m{{{1.0,2.0},{2.0,4.0}}}; // singular
+ const double det = m.determinant();
EXPECT_DOUBLE_EQ(det, 0.0);
}
diff --git a/tests/general/unit_test_navigation_mesh.cpp b/tests/general/unit_test_navigation_mesh.cpp
index 15fab61a..b5ba7b0f 100644
--- a/tests/general/unit_test_navigation_mesh.cpp
+++ b/tests/general/unit_test_navigation_mesh.cpp
@@ -26,8 +26,8 @@ TEST(NavigationMeshTests, SerializeDeserializeRoundTrip)
TEST(NavigationMeshTests, GetClosestVertexWhenEmpty)
{
- NavigationMesh nav;
- Vector3 p{5.f,5.f,5.f};
- auto res = nav.get_closest_vertex(p);
+ const NavigationMesh nav;
+ constexpr Vector3 p{5.f,5.f,5.f};
+ const auto res = nav.get_closest_vertex(p);
EXPECT_FALSE(res.has_value());
}
diff --git a/tests/general/unit_test_pattern_scan_extra.cpp b/tests/general/unit_test_pattern_scan_extra.cpp
index 6fe0f26b..cb371731 100644
--- a/tests/general/unit_test_pattern_scan_extra.cpp
+++ b/tests/general/unit_test_pattern_scan_extra.cpp
@@ -6,23 +6,26 @@ using namespace omath;
TEST(unit_test_pattern_scan_extra, IteratorScanFound)
{
- std::vector buf = {std::byte(0xDE), std::byte(0xAD), std::byte(0xBE), std::byte(0xEF), std::byte(0x00)};
- auto it = PatternScanner::scan_for_pattern(buf.begin(), buf.end(), "DE AD BE EF");
+ std::vector buf = {static_cast(0xDE), static_cast(0xAD),
+ static_cast(0xBE), static_cast(0xEF),
+ static_cast(0x00)};
+ const auto it = PatternScanner::scan_for_pattern(buf.begin(), buf.end(), "DE AD BE EF");
EXPECT_NE(it, buf.end());
EXPECT_EQ(std::distance(buf.begin(), it), 0);
}
TEST(unit_test_pattern_scan_extra, IteratorScanNotFound)
{
- std::vector buf = {std::byte(0x00), std::byte(0x11), std::byte(0x22)};
- auto it = PatternScanner::scan_for_pattern(buf.begin(), buf.end(), "FF EE DD");
+ std::vector buf = {static_cast(0x00), static_cast(0x11),
+ static_cast(0x22)};
+ const auto it = PatternScanner::scan_for_pattern(buf.begin(), buf.end(), "FF EE DD");
EXPECT_EQ(it, buf.end());
}
TEST(unit_test_pattern_scan_extra, ParseInvalidPattern)
{
// invalid hex token should cause the public scan to return end (no match)
- std::vector buf = {std::byte(0x00), std::byte(0x11)};
- auto it = PatternScanner::scan_for_pattern(buf.begin(), buf.end(), "GG HH");
+ std::vector buf = {static_cast(0x00), static_cast(0x11)};
+ const auto it = PatternScanner::scan_for_pattern(buf.begin(), buf.end(), "GG HH");
EXPECT_EQ(it, buf.end());
}
diff --git a/tests/general/unit_test_pe_pattern_scan_file.cpp b/tests/general/unit_test_pe_pattern_scan_file.cpp
index 193ee53c..5e2abb84 100644
--- a/tests/general/unit_test_pe_pattern_scan_file.cpp
+++ b/tests/general/unit_test_pe_pattern_scan_file.cpp
@@ -64,7 +64,7 @@ static bool write_minimal_pe_file(const std::string& path, const std::vector placeholder(section_header_rest, 0);
f.write(placeholder.data(), placeholder.size());
@@ -75,7 +75,7 @@ static bool write_minimal_pe_file(const std::string& path, const std::vector(section_bytes.size());
- const std::uint32_t virtual_address = 0x1000u;
+ constexpr std::uint32_t virtual_address = 0x1000u;
const std::uint32_t size_raw_data = static_cast(section_bytes.size());
const std::uint32_t ptr_raw_data = static_cast(data_pos);
@@ -95,9 +95,9 @@ static bool write_minimal_pe_file(const std::string& path, const std::vector bytes = {0x55, 0x8B, 0xEC, 0x90, 0x90}; // pattern at offset 0
- ASSERT_TRUE(write_minimal_pe_file(path, bytes));
+ constexpr std::string_view path = "./test_minimal_pe.bin";
+ const std::vector bytes = {0x55, 0x8B, 0xEC, 0x90, 0x90}; // pattern at offset 0
+ ASSERT_TRUE(write_minimal_pe_file(path.data(), bytes));
const auto res = PePatternScanner::scan_for_pattern_in_file(path, "55 8B EC", ".text");
EXPECT_TRUE(res.has_value());
@@ -105,9 +105,9 @@ TEST(unit_test_pe_pattern_scan_file, ScanFindsPattern)
TEST(unit_test_pe_pattern_scan_file, ScanMissingPattern)
{
- const std::string path = "./test_minimal_pe_2.bin";
- std::vector bytes = {0x00, 0x01, 0x02, 0x03};
- ASSERT_TRUE(write_minimal_pe_file(path, bytes));
+ constexpr std::string_view path = "./test_minimal_pe_2.bin";
+ const std::vector bytes = {0x00, 0x01, 0x02, 0x03};
+ ASSERT_TRUE(write_minimal_pe_file(path.data(), bytes));
const auto res = PePatternScanner::scan_for_pattern_in_file(path, "FF EE DD", ".text");
EXPECT_FALSE(res.has_value());
diff --git a/tests/general/unit_test_pe_pattern_scan_loaded.cpp b/tests/general/unit_test_pe_pattern_scan_loaded.cpp
index d06dfbff..963cd729 100644
--- a/tests/general/unit_test_pe_pattern_scan_loaded.cpp
+++ b/tests/general/unit_test_pe_pattern_scan_loaded.cpp
@@ -11,23 +11,23 @@ static std::vector make_fake_module(std::uint32_t base_of_code,
std::uint32_t size_code,
const std::vector& code_bytes)
{
- const std::uint32_t e_lfanew = 0x80;
+ constexpr std::uint32_t e_lfanew = 0x80;
const std::uint32_t total_size = e_lfanew + 0x200 + size_code + 0x100;
std::vector buf(total_size, 0);
// DOS header: e_magic at 0, e_lfanew at offset 0x3C
buf[0] = 0x4D; buf[1] = 0x5A; // 'M' 'Z' (little-endian 0x5A4D)
- std::uint32_t le = e_lfanew;
+ constexpr std::uint32_t le = e_lfanew;
std::memcpy(buf.data() + 0x3C, &le, sizeof(le));
// NT signature at e_lfanew
- const std::uint32_t nt_sig = 0x4550; // 'PE\0\0'
+ constexpr std::uint32_t nt_sig = 0x4550; // 'PE\0\0'
std::memcpy(buf.data() + e_lfanew, &nt_sig, sizeof(nt_sig));
// FileHeader is 20 bytes: we only need to ensure its size is present; leave zeros
// OptionalHeader magic (optional header begins at e_lfanew + 4 + sizeof(FileHeader) == e_lfanew + 24)
- const std::uint16_t opt_magic = 0x020B; // x64
+ constexpr std::uint16_t opt_magic = 0x020B; // x64
std::memcpy(buf.data() + e_lfanew + 24, &opt_magic, sizeof(opt_magic));
// size_code is at offset 4 inside OptionalHeader -> absolute e_lfanew + 28
@@ -45,25 +45,25 @@ static std::vector make_fake_module(std::uint32_t base_of_code,
TEST(PePatternScanLoaded, FindsPatternAtBase)
{
- std::vector code = {0x90, 0x01, 0x02, 0x03, 0x04};
+ const std::vector code = {0x90, 0x01, 0x02, 0x03, 0x04};
auto buf = make_fake_module(0x200, static_cast(code.size()), code);
- auto res = PePatternScanner::scan_for_pattern_in_loaded_module(buf.data(), "90 01 02");
+ const auto res = PePatternScanner::scan_for_pattern_in_loaded_module(buf.data(), "90 01 02");
ASSERT_TRUE(res.has_value());
// address should point somewhere in our buffer; check offset
- uintptr_t addr = res.value();
- uintptr_t base = reinterpret_cast(buf.data());
+ const uintptr_t addr = res.value();
+ const uintptr_t base = reinterpret_cast(buf.data());
EXPECT_EQ(addr - base, 0x200u);
}
TEST(PePatternScanLoaded, WildcardMatches)
{
- std::vector code = {0xDE, 0xAD, 0xBE, 0xEF};
+ const std::vector code = {0xDE, 0xAD, 0xBE, 0xEF};
auto buf = make_fake_module(0x300, static_cast(code.size()), code);
- auto res = PePatternScanner::scan_for_pattern_in_loaded_module(buf.data(), "DE ?? BE");
+ const auto res = PePatternScanner::scan_for_pattern_in_loaded_module(buf.data(), "DE ?? BE");
ASSERT_TRUE(res.has_value());
- uintptr_t addr = res.value();
- uintptr_t base = reinterpret_cast(buf.data());
+ const uintptr_t addr = res.value();
+ const uintptr_t base = reinterpret_cast(buf.data());
EXPECT_EQ(addr - base, 0x300u);
}
diff --git a/tests/general/unit_test_pe_pattern_scan_more.cpp b/tests/general/unit_test_pe_pattern_scan_more.cpp
index f68f9af2..36e8e629 100644
--- a/tests/general/unit_test_pe_pattern_scan_more.cpp
+++ b/tests/general/unit_test_pe_pattern_scan_more.cpp
@@ -1,73 +1,111 @@
// Additional tests for PePatternScanner to exercise edge cases and loaded-module scanning
+#include