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

54 lines
2.1 KiB
C++
Raw Normal View History

2026-04-05 19:10:31 +08:00
#include <gtest/gtest.h>
#include <XCEngine/Rendering/Picking/ObjectIdCodec.h>
2026-04-05 19:10:31 +08:00
2026-04-10 01:57:15 +08:00
#include <limits>
2026-04-05 19:10:31 +08:00
using namespace XCEngine::Rendering;
2026-04-10 01:57:15 +08:00
TEST(ObjectIdEncoding_Test, ConvertsValidRuntimeObjectIdLosslessly) {
constexpr uint64_t objectId = 0x00ABCDEFu;
RenderObjectId renderObjectId = kInvalidRenderObjectId;
EXPECT_TRUE(CanConvertRuntimeObjectIdToRenderObjectId(objectId));
EXPECT_TRUE(TryConvertRuntimeObjectIdToRenderObjectId(objectId, renderObjectId));
EXPECT_EQ(renderObjectId, 0x00ABCDEFu);
EXPECT_EQ(ConvertRenderObjectIdToRuntimeObjectId(renderObjectId), objectId);
}
TEST(ObjectIdEncoding_Test, RejectsInvalidAndOverflowRuntimeObjectIds) {
RenderObjectId renderObjectId = 123u;
EXPECT_FALSE(CanConvertRuntimeObjectIdToRenderObjectId(0u));
EXPECT_FALSE(TryConvertRuntimeObjectIdToRenderObjectId(0u, renderObjectId));
EXPECT_EQ(renderObjectId, kInvalidRenderObjectId);
2026-04-05 19:10:31 +08:00
2026-04-10 01:57:15 +08:00
const uint64_t overflowObjectId =
static_cast<uint64_t>(std::numeric_limits<RenderObjectId>::max()) + 1ull;
renderObjectId = 456u;
EXPECT_FALSE(CanConvertRuntimeObjectIdToRenderObjectId(overflowObjectId));
EXPECT_FALSE(TryConvertRuntimeObjectIdToRenderObjectId(overflowObjectId, renderObjectId));
EXPECT_EQ(renderObjectId, kInvalidRenderObjectId);
2026-04-05 19:10:31 +08:00
}
2026-04-10 01:57:15 +08:00
TEST(ObjectIdEncoding_Test, DecodesColorBackToRenderObjectId) {
2026-04-05 19:10:31 +08:00
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);
2026-04-10 01:57:15 +08:00
EXPECT_EQ(DecodeRenderObjectIdFromColor(r, g, b, a), 0x78563412u);
EXPECT_EQ(ConvertRenderObjectIdToRuntimeObjectId(DecodeRenderObjectIdFromColor(r, g, b, a)), 0x78563412ull);
2026-04-05 19:10:31 +08:00
}
2026-04-10 01:57:15 +08:00
TEST(ObjectIdEncoding_Test, EncodesColorChannelsFromRenderObjectId) {
const auto encodedColor = EncodeRenderObjectIdToColor(0x78563412u);
2026-04-05 19:10:31 +08:00
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);
}