Files
clice/tests/unit/Support/Binary.cpp
2025-08-03 17:43:42 +08:00

212 lines
5.5 KiB
C++

#include "Test/Tester.h"
#include "Support/Binary.h"
namespace clice::testing {
namespace {
template <typename Object, typename... Ts>
constexpr inline bool check_sections =
std::is_same_v<binary::layout_t<Object>, std::tuple<binary::Section<Ts>...>>;
TEST(Binary, String) {
static_assert(check_sections<std::string, char>);
{
std::string s1 = "";
auto [buffer, proxy] = binary::serialize(s1);
EXPECT_EQ(s1.size(), proxy.size());
for(auto i = 0; i < proxy.size(); i++) {
EXPECT_EQ(s1[i], proxy[i].value());
}
EXPECT_EQ(s1, proxy.as_string());
std::string s2 = binary::deserialize(proxy);
EXPECT_EQ(s1, s2);
}
{
std::string s1 = "123";
auto [buffer, proxy] = binary::serialize(s1);
EXPECT_EQ(s1.size(), proxy.size());
for(auto i = 0; i < proxy.size(); i++) {
EXPECT_EQ(s1[i], proxy[i].value());
}
EXPECT_EQ(s1, proxy.as_string());
std::string s2 = binary::deserialize(proxy);
EXPECT_EQ(s1, s2);
}
{
std::string s1 = "11111111111111111111111111111111111111111111111111111111111111111";
auto [buffer, proxy] = binary::serialize(s1);
EXPECT_EQ(s1.size(), proxy.size());
for(auto i = 0; i < proxy.size(); i++) {
EXPECT_EQ(s1[i], proxy[i].value());
}
EXPECT_EQ(s1, proxy.as_string());
std::string s2 = binary::deserialize(proxy);
EXPECT_EQ(s1, s2);
}
}
TEST(Binary, Array) {
static_assert(check_sections<std::vector<int>, int>);
{
std::vector<int> vec1 = {};
auto [buffer, proxy] = binary::serialize(vec1);
EXPECT_EQ(vec1.size(), proxy.size());
for(auto i = 0; i < proxy.size(); i++) {
EXPECT_EQ(vec1[i], proxy[i].value());
}
EXPECT_EQ(vec1, proxy.as_array().vec());
std::vector vec2 = binary::deserialize(proxy);
EXPECT_EQ(vec1, vec2);
}
{
std::vector vec1 = {1, 2, 3};
auto [buffer, proxy] = binary::serialize(vec1);
EXPECT_EQ(vec1.size(), proxy.size());
for(auto i = 0; i < proxy.size(); i++) {
EXPECT_EQ(vec1[i], proxy[i].value());
}
EXPECT_EQ(vec1, proxy.as_array().vec());
std::vector vec2 = binary::deserialize(proxy);
EXPECT_EQ(vec1, vec2);
}
{
std::vector vec1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto [buffer, proxy] = binary::serialize(vec1);
EXPECT_EQ(vec1.size(), proxy.size());
for(auto i = 0; i < proxy.size(); i++) {
EXPECT_EQ(vec1[i], proxy[i].value());
}
EXPECT_EQ(vec1, proxy.as_array().vec());
std::vector vec2 = binary::deserialize(proxy);
EXPECT_EQ(vec1, vec2);
}
}
TEST(Binary, StringArray) {
static_assert(check_sections<std::vector<std::string>, std::string, char>);
std::vector<std::string> sv = {"1", "22", "333", "444"};
auto [buffer, proxy] = binary::serialize(sv);
EXPECT_EQ(sv.size(), proxy.size());
for(auto i = 0; i < sv.size(); i++) {
EXPECT_EQ(sv[i], proxy[i].as_string());
}
std::vector sv2 = binary::deserialize(proxy);
EXPECT_EQ(sv, sv2);
}
struct Point {
uint32_t x;
uint32_t y;
};
TEST(Binary, Struct) {
{
static_assert(binary::is_directly_binarizable_v<Point>);
static_assert(std::same_as<binary::binarify_t<Point>, Point>);
static_assert(check_sections<Point>);
Point p = {1, 2};
auto [buffer, proxy] = binary::serialize(p);
EXPECT_EQ(proxy->x, 1);
EXPECT_EQ(proxy->y, 2);
EXPECT_EQ(p, proxy.value());
auto p2 = binary::deserialize(proxy);
EXPECT_EQ(p, p2);
}
struct Foo {
uint32_t age;
std::string name;
std::vector<int> scores;
};
{
static_assert(!binary::is_directly_binarizable_v<Foo>);
static_assert(check_sections<Foo, char, int>);
Foo foo = {
0,
"123",
{1, 2, 3},
};
auto [buffer, proxy] = binary::serialize(foo);
EXPECT_EQ(proxy.get<"age">().value(), 0);
EXPECT_EQ(proxy.get<"name">().as_string(), "123");
EXPECT_EQ(proxy.get<"scores">().as_array().vec(), std::vector{1, 2, 3});
auto foo2 = binary::deserialize(proxy);
EXPECT_EQ(foo, foo2);
};
struct Points {
std::vector<Point> points;
};
{
static_assert(!binary::is_directly_binarizable_v<Points>);
static_assert(check_sections<Points, Point>);
Points points{
{
Point{1, 2},
Point{3, 4},
},
};
auto [buffer, proxy] = binary::serialize(points);
auto points2 = proxy.get<"points">();
EXPECT_EQ(points2[0].value(), Point{1, 2});
EXPECT_EQ(points2[1].value(), Point{3, 4});
auto points3 = binary::deserialize(proxy);
EXPECT_EQ(points, points3);
}
}
struct Node {
int value;
std::vector<Node> nodes;
};
TEST(Binary, Recursively) {
Node node = {
1,
{{3},
{4},
{
5,
{
{3},
{4},
{5},
},
}},
};
static_assert(!binary::is_directly_binarizable_v<Node>);
static_assert(check_sections<Node, Node>);
auto [buffer, proxy] = binary::serialize(node);
auto node2 = binary::deserialize(proxy);
EXPECT_EQ(node, node2);
}
} // namespace
} // namespace clice::testing