Fix bug when serializing class types
All checks were successful
buildbot/IOCore-linux-builder Build done.
buildbot/IOCore-macos-builder Build done.
buildbot/IOCore-freebsd-builder Build done.

This commit is contained in:
S David 2024-08-04 19:28:17 -04:00
parent 5217f97acb
commit ca4048c038
2 changed files with 61 additions and 9 deletions

View File

@ -98,8 +98,8 @@ insert_in_toml_table(toml::table& tbl, const char* fieldName, const T& obj)
{
using value_type = std::decay_t<T>;
if constexpr (is_not_toml_native_t<value_type>) {
auto subtable = to_toml_table<T>(obj);
if constexpr (is_not_toml_native_t<value_type> || std::is_class_v<value_type>) {
auto subtable = to_toml_table(obj);
tbl.insert_or_assign(fieldName, subtable);
} else {
@ -117,9 +117,9 @@ extract_from_toml_table(const toml::table& tbl, const char* fieldName, T& output
"Missing field " + std::string(fieldName)
);
}
if constexpr (is_not_toml_native_t<value_type>) {
if constexpr (is_not_toml_native_t<value_type> || std::is_class_v<value_type>) {
auto subtable = *(tbl[fieldName].as_table());
from_toml_table<T>(subtable, output);
from_toml_table(subtable, output);
} else {
output = tbl[fieldName].value<T>().value();
}

View File

@ -24,17 +24,29 @@ BEGIN_TEST_SUITE("Util.Toml")
IOCORE_TOML_SERIALIZABLE(SimpleStruct, field1, field2);
};
struct SimpleStruct2 {
int fieldA;
struct ComplexStruct {
IOCORE_TOML_SERIALIZABLE(SimpleStruct2, fieldA);
};
struct StructWithEnum {
int field1;
int field2;
Colors foreground;
IOCORE_TOML_SERIALIZABLE(
ComplexStruct, field1, field2, foreground
StructWithEnum, field1, field2, foreground
);
};
struct CompositeStruct {
SimpleStruct part1;
SimpleStruct2 part2;
IOCORE_TOML_SERIALIZABLE(CompositeStruct, part1, part2);
};
TEST_CASE("IOCORE_TOML_TO Macro works")
{
toml::table tbl;
@ -44,11 +56,28 @@ BEGIN_TEST_SUITE("Util.Toml")
IOCORE_TOML_TO(field2);
REQUIRE(tbl.size() == 2);
}
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works")
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works with SimpleStruct")
{
toml::table table;
ComplexStruct data = { 11, 22, Green };
ComplexStruct newdest;
SimpleStruct data = { 10, 20 };
SimpleStruct newdest;
table = to_toml_table(data);
from_toml_table(table, newdest);
CHECK(table.size() == 2);
CHECK(table["field1"].value<int>() == 10);
CHECK(table["field2"].value<int>() == 20);
CHECK(newdest.field1 == data.field1);
CHECK(newdest.field2 == data.field2);
}
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works with StructWithEnum")
{
toml::table table;
StructWithEnum data = { 11, 22, Green };
StructWithEnum newdest;
table = to_toml_table(data);
from_toml_table(table, newdest);
@ -63,6 +92,29 @@ BEGIN_TEST_SUITE("Util.Toml")
CHECK(newdest.field2 == data.field2);
CHECK(newdest.foreground == data.foreground);
}
TEST_CASE("IOCORE_TOML_SERIALIZABLE Macro works with CompositeStruct")
{
toml::table table;
CompositeStruct data = { { 10, 20 }, { 30 } };
CompositeStruct newdest;
table = to_toml_table(data);
from_toml_table(table, newdest);
CHECK(table.size() == 2);
CHECK(table["part1"].as_table()->size() == 2);
CHECK(table["part2"].as_table()->size() == 1);
CHECK(table["part1"]["field1"].value<int>() == 10);
CHECK(table["part1"]["field2"].value<int>() == 20);
CHECK(table["part2"]["fieldA"].value<int>() == 30);
CHECK(newdest.part1.field1 == data.part1.field1);
CHECK(newdest.part1.field2 == data.part1.field2);
CHECK(newdest.part2.fieldA == data.part2.fieldA);
}
}
// clang-format off