Finalize the toml serialization API refactor.

Additionally: Standardize the data structures used in Toml unit tests
This commit is contained in:
S David 2024-09-03 22:41:00 -04:00
parent 2c3b417b40
commit acee324843
5 changed files with 32 additions and 29 deletions

View File

@ -55,7 +55,7 @@ add_toml_field(const TField& obj, const char* fieldName, toml::table& tbl)
if constexpr (std::is_enum_v<value_type>) {
add_toml_enum_field(obj, fieldName, tbl);
} else if constexpr (std::is_same_v<char, value_type>) {
tbl.insert_or_assign(fieldName, std::string(1, obj));
tbl.insert_or_assign(fieldName, static_cast<int>(obj));
return;
} else {
if constexpr (is_toml_type_t<value_type>) {
@ -80,7 +80,7 @@ extract_toml_field(const toml::table& tbl, const char* fieldName, TField& output
if constexpr (std::is_enum_v<value_type>) {
extract_toml_enum_field(tbl, fieldName, output);
} else if constexpr (std::is_same_v<char, value_type>) {
output = tbl[fieldName].value<std::string>()->at(0);
output = tbl[fieldName].value<int>().value();
} else if constexpr (is_toml_type_t<value_type>) {
output = tbl[fieldName].value<value_type>().value();
} else {

View File

@ -234,22 +234,23 @@ BEGIN_TEST_SUITE("elemental::TomlConfigFile")
{
auto config_file = TomlConfigFile(kInputFilePath);
config_file.set(ComplexStruct{
{ 11, 22 }, { 30, 0 }, { 1, 2, Red }, Blue, ns::Windowed });
{ 11, 'c' }, { 30, 0 }, { 1, 2, Red }, Blue, ns::Windowed });
auto toml_data = config_file.getTomlTable();
REQUIRE(toml_data["part1"]["field1"].value<int>() == 11);
REQUIRE(
toml_data["part1"]["field2"].value<std::string>() == "c"
);
REQUIRE(toml_data["part2"]["field_a"].value<int>() == 30);
REQUIRE(toml_data["part2"]["field_b"].value<int>() == 0);
REQUIRE(toml_data["part1"]["field2"].value<int>() == 'c');
REQUIRE(toml_data["part2"]["field1"].value<int>() == 30);
REQUIRE(toml_data["part2"]["field2"].value<int>() == 0);
REQUIRE(toml_data["part3"]["field1"].value<int>() == 1);
REQUIRE(toml_data["part3"]["field2"].value<int>() == 2);
REQUIRE(toml_data["part3"]["foreground"].value<int>() == Red);
REQUIRE(
toml_data["part3"]["foreground"].value<std::string>() ==
"Red"
);
REQUIRE(toml_data["background"].value<int>() == Blue);
REQUIRE(toml_data["mode"].value<int>() == ns::Windowed);
REQUIRE(toml_data["background"].value<std::string>() == "Blue");
REQUIRE(toml_data["mode"].value<std::string>() == "Windowed");
}
}
// clang-format off

View File

@ -28,7 +28,7 @@ BEGIN_TEST_SUITE("IOCore::TomlTable")
auto data = SimpleClass{ 11, 22 };
TomlTable table = data;
CHECK(table.size() == 3);
CHECK(table.size() == 2);
CHECK(table["field1"].value<int>() == 11);
CHECK(table["field2"].value<int>() == 22);
@ -36,7 +36,7 @@ BEGIN_TEST_SUITE("IOCore::TomlTable")
TEST_CASE("IOCore::TomlTable core operators complex struct")
{
auto data = ComplexStruct{};
data.part1 = { 1, 2 };
data.part1 = { 1, 'a' };
data.part2 = { 3, 4 };
data.part3 = { 5, 6, Blue };
data.background = Red;
@ -48,15 +48,17 @@ BEGIN_TEST_SUITE("IOCore::TomlTable")
REQUIRE(table.size() == 5);
CHECK(table["part1"]["field1"].value<int>() == 1);
CHECK(table["part1"]["field2"].value<int>() == 2);
CHECK(table["part1"]["field2"].value<int>() == 'a');
CHECK(table["part2"]["field1"].value<int>() == 3);
CHECK(table["part2"]["field2"].value<int>() == 4);
CHECK(table["part3"]["field1"].value<int>() == 5);
CHECK(table["part3"]["field2"].value<int>() == 6);
CHECK(table["part3"]["foreground"].value<int>() == Blue);
CHECK(table["background"].value<int>() == Red);
CHECK(table["mode"].value<int>() == ns::Windowed);
CHECK(
table["part3"]["foreground"].value<std::string>() == "Blue"
);
CHECK(table["background"].value<std::string>() == "Red");
CHECK(table["mode"].value<std::string>() == "Windowed");
}
}

View File

@ -42,11 +42,11 @@ BEGIN_TEST_SUITE("Util.Toml")
from_toml(result, deserialized);
REQUIRE(result.size() == 2);
CHECK(result.at("field_a").value<int>() == 1);
CHECK(result.at("field_b").value<int>() == 22);
CHECK(result.at("field1").value<int>() == 1);
CHECK(result.at("field2").value<int>() == 22);
CHECK(deserialized.field_a == 1);
CHECK(deserialized.field_b == 22);
CHECK(deserialized.field1 == 1);
CHECK(deserialized.field2 == 22);
}
TEST_CASE("StructWithEnum Serializes")
{
@ -81,8 +81,8 @@ BEGIN_TEST_SUITE("Util.Toml")
CHECK(deserialized.part1.field1 == data.part1.field1);
CHECK(deserialized.part1.field2 == data.part1.field2);
CHECK(deserialized.part2.field_a == data.part2.field_a);
CHECK(deserialized.part2.field_b == data.part2.field_b);
CHECK(deserialized.part2.field1 == data.part2.field1);
CHECK(deserialized.part2.field2 == data.part2.field2);
}
TEST_CASE("ComplexStruct Serializes")
@ -103,8 +103,8 @@ BEGIN_TEST_SUITE("Util.Toml")
CHECK(deserialized.part1.field1 == data.part1.field1);
CHECK(deserialized.part1.field2 == data.part1.field2);
CHECK(deserialized.part2.field_a == data.part2.field_a);
CHECK(deserialized.part2.field_b == data.part2.field_b);
CHECK(deserialized.part2.field1 == data.part2.field1);
CHECK(deserialized.part2.field2 == data.part2.field2);
CHECK(deserialized.part3.field1 == data.part3.field1);
CHECK(deserialized.part3.field2 == data.part3.field2);
CHECK(deserialized.part3.foreground == data.part3.foreground);

View File

@ -35,16 +35,16 @@ TOML_STRUCT(SimpleStruct, field1, field2);
class SimpleClass {
public:
int field_a;
int field_b;
int field1;
int field2;
auto operator==(const SimpleClass& other) const -> bool
{
return field_a == other.field_a && field_b == other.field_b;
return field1 == other.field1 && field2 == other.field2;
}
private:
TOML_CLASS(SimpleClass, field_a, field_b);
TOML_CLASS(SimpleClass, field1, field2);
};
struct StructWithEnum {