Files
clice/unittests/Support/JSON.cpp
2024-12-08 15:21:27 +08:00

83 lines
1.7 KiB
C++

#include "Test.h"
namespace clice {
namespace {
struct ValueRef {
std::size_t index;
};
} // namespace
template <>
struct json::Serde<ValueRef> {
constexpr inline static bool stateful = true;
std::vector<int>& encoder;
std::vector<int>& decoder;
json::Value serialize(const ValueRef& ref) {
return json::Value(decoder[ref.index]);
}
ValueRef deserialize(const json::Value& value) {
encoder.emplace_back(*value.getAsInteger());
return ValueRef{encoder.size() - 1};
}
};
namespace {
TEST(Support, JSON) {
struct Point {
int x;
int y;
};
json::Value object = json::Object{
{"x", 1},
{"y", 2},
};
auto point = json::deserialize<Point>(std::move(object));
ASSERT_EQ(point.x, 1);
ASSERT_EQ(point.y, 2);
auto result = json::serialize(point);
ASSERT_EQ(result, object);
}
TEST(Support, StatefulSerde) {
struct Refs {
std::vector<ValueRef> data;
};
static_assert(json::stateful_serde<Refs>);
Refs refs;
refs.data.emplace_back(4);
refs.data.emplace_back(3);
refs.data.emplace_back(2);
refs.data.emplace_back(1);
refs.data.emplace_back(0);
std::vector<int> encoder;
std::vector<int> decoder = {1, 2, 3, 4, 5};
json::Serde<ValueRef> serde{encoder, decoder};
auto result = json::serialize(refs, serde);
ASSERT_EQ(result,
json::Value(json::Object{
{"data", {5, 4, 3, 2, 1}}
}));
auto refs2 = json::deserialize<Refs>(result, serde);
ASSERT_EQ(refs2.data.size(), 5);
for(std::size_t i = 0; i < refs2.data.size(); ++i) {
ASSERT_EQ(refs2.data[i].index, i);
}
}
} // namespace
} // namespace clice