Files
XCEngine/tests/Rendering/unit/test_object_id_encoding.cpp

84 lines
2.7 KiB
C++
Raw Normal View History

#include <gtest/gtest.h>
#include <XCEngine/Rendering/Picking/ObjectIdCodec.h>
2026-04-27 17:46:47 +08:00
#include <XCEngine/Rendering/Picking/RenderObjectIdRegistry.h>
using namespace XCEngine::Rendering;
2026-04-27 17:46:47 +08:00
TEST(ObjectIdEncoding_Test, RegistryMapsRuntimeObjectIdsToStableRenderObjectIds) {
RenderObjectIdRegistry& registry = RenderObjectIdRegistry::Get();
registry.Reset();
constexpr uint64_t runtimeObjectId = 0x1ABCDEF0123ull;
const RenderObjectId renderObjectId =
registry.GetOrAllocateRenderObjectId(runtimeObjectId);
ASSERT_TRUE(IsValidRenderObjectId(renderObjectId));
EXPECT_EQ(
registry.GetOrAllocateRenderObjectId(runtimeObjectId),
renderObjectId);
RenderObjectId resolvedRenderObjectId = kInvalidRenderObjectId;
EXPECT_TRUE(
registry.TryGetRenderObjectId(
runtimeObjectId,
resolvedRenderObjectId));
EXPECT_EQ(resolvedRenderObjectId, renderObjectId);
2026-04-27 17:46:47 +08:00
uint64_t resolvedRuntimeObjectId = 0u;
EXPECT_TRUE(
registry.TryResolveRuntimeObjectId(
renderObjectId,
resolvedRuntimeObjectId));
EXPECT_EQ(resolvedRuntimeObjectId, runtimeObjectId);
EXPECT_EQ(
registry.ResolveRuntimeObjectId(renderObjectId),
runtimeObjectId);
}
2026-04-27 17:46:47 +08:00
TEST(ObjectIdEncoding_Test, RegistryRejectsInvalidRuntimeAndRenderObjectIds) {
RenderObjectIdRegistry& registry = RenderObjectIdRegistry::Get();
registry.Reset();
2026-04-27 17:46:47 +08:00
EXPECT_EQ(
registry.GetOrAllocateRenderObjectId(0u),
kInvalidRenderObjectId);
2026-04-27 17:46:47 +08:00
RenderObjectId renderObjectId = 123u;
EXPECT_FALSE(
registry.TryGetRenderObjectId(
0u,
renderObjectId));
EXPECT_EQ(renderObjectId, kInvalidRenderObjectId);
2026-04-27 17:46:47 +08:00
uint64_t runtimeObjectId = 99u;
EXPECT_FALSE(
registry.TryResolveRuntimeObjectId(
kInvalidRenderObjectId,
runtimeObjectId));
EXPECT_EQ(runtimeObjectId, 0u);
EXPECT_EQ(
registry.ResolveRuntimeObjectId(kInvalidRenderObjectId),
0u);
}
TEST(ObjectIdEncoding_Test, DecodesColorBackToRenderObjectId) {
constexpr uint8_t r = 0x12u;
constexpr uint8_t g = 0x34u;
constexpr uint8_t b = 0x56u;
constexpr uint8_t a = 0x78u;
EXPECT_EQ(DecodeEncodedObjectIdFromColor(r, g, b, a), 0x78563412u);
EXPECT_EQ(DecodeRenderObjectIdFromColor(r, g, b, a), 0x78563412u);
}
TEST(ObjectIdEncoding_Test, EncodesColorChannelsFromRenderObjectId) {
const auto encodedColor = EncodeRenderObjectIdToColor(0x78563412u);
constexpr float kInv255 = 1.0f / 255.0f;
EXPECT_FLOAT_EQ(encodedColor.x, 0x12u * kInv255);
EXPECT_FLOAT_EQ(encodedColor.y, 0x34u * kInv255);
EXPECT_FLOAT_EQ(encodedColor.z, 0x56u * kInv255);
EXPECT_FLOAT_EQ(encodedColor.w, 0x78u * kInv255);
}