Some improvements in Support.
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user