tomlplusplus/tests/parsing_key_value_pairs.cpp
Mark Gillard cb000809b0 support for upcoming TOML v1.0.0 release
see https://github.com/toml-lang/toml/issues/698 for info about TOML v1.0.0

also:
- fixed some parser error-paths not returning early enough when exceptions were disabled
- added more specific error messages for parsing errors relating to prohibited codepoints
- added compilation speed improvements (particularly for platforms lacking floating-point `std::to_chars`)
- added many minor documentation improvements
- added additional tests
2020-04-03 00:39:21 +03:00

157 lines
3.4 KiB
C++

#include "tests.h"
TEST_CASE("parsing - key-value pairs")
{
parsing_should_succeed(S(R"(
key = "value"
bare_key = "value"
bare-key = "value"
1234 = "value"
"" = "blank"
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl.size() == 5);
CHECK(tbl[S("key")] == S("value"sv));
CHECK(tbl[S("bare_key")] == S("value"sv));
CHECK(tbl[S("bare-key")] == S("value"sv));
CHECK(tbl[S("1234")] == S("value"sv));
CHECK(tbl[S("")] == S("blank"sv));
}
);
parsing_should_fail(S(R"(key = # INVALID)"sv));
parsing_should_succeed(S(R"(
"127.0.0.1" = "value"
"character encoding" = "value"
"ʎǝʞ" = "value"
'key2' = "value"
'quoted "value"' = "value"
'' = 'blank'
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl[S("127.0.0.1")] == S("value"sv));
CHECK(tbl[S("character encoding")] == S("value"sv));
CHECK(tbl[S("ʎǝʞ")] == S("value"sv));
CHECK(tbl[S("key2")] == S("value"sv));
CHECK(tbl[S("quoted \"value\"")] == S("value"sv));
CHECK(tbl[S("")] == S("blank"sv));
}
);
parsing_should_fail(S(R"(= "no key name")"sv));
parsing_should_fail(S(R"(
# DO NOT DO THIS
name = "Tom"
name = "Pradyun"
)"sv)
);
}
TEST_CASE("parsing - key-value pairs (dotted)")
{
parsing_should_succeed(S(R"(
name = "Orange"
physical.color = "orange"
physical.shape = "round"
site."google.com" = true
3.14159 = "pi"
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl.size() == 4);
CHECK(tbl[S("name")] == S("Orange"sv));
CHECK(tbl[S("physical")][S("color")] == S("orange"sv));
CHECK(tbl[S("physical")][S("shape")] == S("round"sv));
CHECK(tbl[S("site")][S("google.com")] == true);
CHECK(tbl[S("3")][S("14159")] == S("pi"sv));
}
);
parsing_should_succeed(S(R"(
fruit.apple.smooth = true
fruit.orange = 2
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl[S("fruit")][S("apple")][S("smooth")] == true);
CHECK(tbl[S("fruit")][S("orange")] == 2);
}
);
parsing_should_fail(S(R"(
# THIS IS INVALID
fruit.apple = 1
fruit.apple.smooth = true
)"sv)
);
parsing_should_succeed(S(R"(
# VALID BUT DISCOURAGED
apple.type = "fruit"
orange.type = "fruit"
apple.skin = "thin"
orange.skin = "thick"
apple.color = "red"
orange.color = "orange"
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl[S("apple")][S("type")] == S("fruit"sv));
CHECK(tbl[S("apple")][S("skin")] == S("thin"sv));
CHECK(tbl[S("apple")][S("color")] == S("red"sv));
CHECK(tbl[S("orange")][S("type")] == S("fruit"sv));
CHECK(tbl[S("orange")][S("skin")] == S("thick"sv));
CHECK(tbl[S("orange")][S("color")] == S("orange"sv));
}
);
parsing_should_succeed(S(R"(
# RECOMMENDED
apple.type = "fruit"
apple.skin = "thin"
apple.color = "red"
orange.type = "fruit"
orange.skin = "thick"
orange.color = "orange"
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl[S("apple")][S("type")] == S("fruit"sv));
CHECK(tbl[S("apple")][S("skin")] == S("thin"sv));
CHECK(tbl[S("apple")][S("color")] == S("red"sv));
CHECK(tbl[S("orange")][S("type")] == S("fruit"sv));
CHECK(tbl[S("orange")][S("skin")] == S("thick"sv));
CHECK(tbl[S("orange")][S("color")] == S("orange"sv));
}
);
// toml/issues/644 ('+' in bare keys) & toml/issues/687 (unicode bare keys)
#if TOML_LANG_UNRELEASED
parsing_should_succeed(S(R"(
key+1 = 0
ʎǝʞ2 = 0
)"sv),
[](table&& tbl) noexcept
{
CHECK(tbl.size() == 2);
CHECK(tbl[S("key+1")] == 0);
CHECK(tbl[S("ʎǝʞ2")] == 0);
}
);
#else
parsing_should_fail(R"(key+1 = 0)"sv);
parsing_should_fail(R"(ʎǝʞ2 = 0)"sv);
#endif
}