#include "cloud_point_rpc/serialize.hpp" #include #include #include using namespace score; class SerializeEdgeCaseTest : public ::testing::Test {}; // uint8_t round-trip TEST_F(SerializeEdgeCaseTest, Uint8RoundTrip) { uint8_t value = 42; auto buf = serialize(value); EXPECT_EQ(buf.size(), sizeof(uint8_t)); EXPECT_EQ(deserialize(buf), value); } // int32_t round-trip TEST_F(SerializeEdgeCaseTest, Int32RoundTrip) { int32_t value = -12345; auto buf = serialize(value); EXPECT_EQ(buf.size(), sizeof(int32_t)); EXPECT_EQ(deserialize(buf), value); } // uint64_t round-trip with max value TEST_F(SerializeEdgeCaseTest, Uint64MaxRoundTrip) { uint64_t value = std::numeric_limits::max(); auto buf = serialize(value); EXPECT_EQ(buf.size(), sizeof(uint64_t)); EXPECT_EQ(deserialize(buf), value); } // int64_t round-trip with min value TEST_F(SerializeEdgeCaseTest, Int64MinRoundTrip) { int64_t value = std::numeric_limits::min(); auto buf = serialize(value); EXPECT_EQ(buf.size(), sizeof(int64_t)); EXPECT_EQ(deserialize(buf), value); } // float round-trip TEST_F(SerializeEdgeCaseTest, FloatRoundTrip) { float value = 3.14159f; auto buf = serialize(value); EXPECT_EQ(buf.size(), sizeof(float)); EXPECT_FLOAT_EQ(deserialize(buf), value); } // double round-trip TEST_F(SerializeEdgeCaseTest, DoubleRoundTrip) { double value = 2.718281828459045; auto buf = serialize(value); EXPECT_EQ(buf.size(), sizeof(double)); EXPECT_DOUBLE_EQ(deserialize(buf), value); } // zero values TEST_F(SerializeEdgeCaseTest, ZeroValues) { EXPECT_EQ(deserialize(serialize(0)), 0); EXPECT_EQ(deserialize(serialize(0)), 0); EXPECT_FLOAT_EQ(deserialize(serialize(0.0f)), 0.0f); EXPECT_DOUBLE_EQ(deserialize(serialize(0.0)), 0.0); } // inplace_size_embedding TEST_F(SerializeEdgeCaseTest, InplaceSizeEmbedding) { std::string msg = "Hello"; inplace_size_embedding(msg); EXPECT_EQ(msg.size(), 5 + sizeof(uint64_t)); // First 8 bytes should be the size (5) uint64_t size = deserialize( std::vector(msg.begin(), msg.begin() + sizeof(uint64_t))); EXPECT_EQ(size, 5); // Remaining bytes should be the message EXPECT_EQ(msg.substr(sizeof(uint64_t)), "Hello"); } TEST_F(SerializeEdgeCaseTest, InplaceSizeEmbeddingEmpty) { std::string msg; inplace_size_embedding(msg); EXPECT_EQ(msg.size(), sizeof(uint64_t)); uint64_t size = deserialize( std::vector(msg.begin(), msg.begin() + sizeof(uint64_t))); EXPECT_EQ(size, 0); } // Buffer too small for deserialize (unsafe but should not crash in test) TEST_F(SerializeEdgeCaseTest, DeserializeSmallBuffer) { std::vector small_buf{0x01, 0x02}; // This is undefined behavior in current implementation, but we document it // In a hardened implementation, this should throw // For now, just verify it compiles and runs (it's unsafe API usage) // EXPECT_THROW(deserialize(small_buf), std::runtime_error); (void)small_buf; }