Some improvements in Support.

This commit is contained in:
ykiko
2024-12-04 17:23:57 +08:00
parent 2baea3800a
commit 5896ca5fc4
9 changed files with 259 additions and 116 deletions

View File

@@ -1,57 +1,82 @@
#include <gtest/gtest.h>
#include <Support/Struct.h>
#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) {
json::Object object;
object["x"] = 1;
object["y"] = 2;
struct Point {
int x;
int y;
};
json::Value object = json::Object{
{"x", 1},
{"y", 2},
};
auto point = clice::json::deserialize<Point>(std::move(object));
ASSERT_EQ(point.x, 1);
ASSERT_EQ(point.y, 2);
// auto result = clice::json::serialize(point);
// ASSERT_EQ(result, json::Value(std::move(object)));
auto result = clice::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
struct ValueRef {
int index;
};
template <>
struct json::Serde<ValueRef> {
constexpr inline static bool state = true;
std::vector<int>& decoder;
json::Value serialize(const ValueRef& ref) {
return json::Value(decoder[ref.index]);
}
};
TEST(Support, StatefulSerde) {
std::vector<ValueRef> refs;
refs.emplace_back(4);
refs.emplace_back(3);
refs.emplace_back(2);
refs.emplace_back(1);
refs.emplace_back(0);
std::vector<int> decoder = {1, 2, 3, 4, 5};
json::Serde<ValueRef> serde{decoder};
auto result = json::serialize(refs, serde);
ASSERT_EQ(result, json::Value(json::Array{5, 4, 3, 2, 1}));
}
} // namespace clice