simplified test code to reduce bloat and improve compile times

This commit is contained in:
Mark Gillard 2020-06-29 01:57:59 +03:00
parent 25c020bb43
commit 40a1a03315
21 changed files with 963 additions and 918 deletions

View File

@ -11,9 +11,11 @@
*/
#include <iostream>
#include "utf8_console.h"
#define TOML_EXCEPTIONS 0
#define TOML_UNRELEASED_FEATURES 0
#include <toml++/toml.h>
using namespace std::string_view_literals;
using toml::operator""_sz;

View File

@ -11,8 +11,10 @@
#include <iostream>
#include <fstream>
#include "utf8_console.h"
#define TOML_UNRELEASED_FEATURES 1
#include <toml++/toml.h>
using namespace std::string_view_literals;
int main(int argc, char** argv)

View File

@ -12,8 +12,10 @@
#include <array>
#include <ctime>
#include "utf8_console.h"
#define TOML_UNRELEASED_FEATURES 1
#define TOML_PARSER 0
#include <toml++/toml.h>
using namespace std::string_view_literals;
namespace

View File

@ -11,8 +11,10 @@
#include <iostream>
#include <fstream>
#include "utf8_console.h"
#define TOML_UNRELEASED_FEATURES 1
#include <toml++/toml.h>
using namespace std::string_view_literals;
int main(int argc, char** argv)

View File

@ -248,7 +248,7 @@ class TomlTest:
return self.__expected
def __str__(self):
return 'static constexpr auto {} = S(R"({})"sv);'.format(
return 'static constexpr auto {} = R"({})"sv;'.format(
self.__identifier,
self.__data,
)

View File

@ -15,21 +15,21 @@ namespace {
namespace valid
{
static constexpr auto burntsushi_array_empty = S(R"(thevoid = [[[[[]]]]])"sv);
static constexpr auto burntsushi_array_nospaces = S(R"(ints = [1,2,3])"sv);
static constexpr auto burntsushi_array_string_quote_comma_2 = S(R"(title = [ " \", ",])"sv);
static constexpr auto burntsushi_array_string_quote_comma = S(R"(title = [
static constexpr auto burntsushi_array_empty = R"(thevoid = [[[[[]]]]])"sv;
static constexpr auto burntsushi_array_nospaces = R"(ints = [1,2,3])"sv;
static constexpr auto burntsushi_array_string_quote_comma_2 = R"(title = [ " \", ",])"sv;
static constexpr auto burntsushi_array_string_quote_comma = R"(title = [
"Client: \"XXXX\", Job: XXXX",
"Code: XXXX"
])"sv);
static constexpr auto burntsushi_array_string_with_comma = S(R"(title = [
])"sv;
static constexpr auto burntsushi_array_string_with_comma = R"(title = [
"Client: XXXX, Job: XXXX",
"Code: XXXX"
])"sv);
static constexpr auto burntsushi_array_table_array_string_backslash = S(R"(foo = [ { bar="\"{{baz}}\""} ])"sv);
static constexpr auto burntsushi_arrays_hetergeneous = S(R"(mixed = [[1, 2], ["a", "b"], [1.1, 2.1]])"sv);
static constexpr auto burntsushi_arrays_nested = S(R"(nest = [["a"], ["b"]])"sv);
static constexpr auto burntsushi_arrays = S(R"(ints = [1, 2, 3]
])"sv;
static constexpr auto burntsushi_array_table_array_string_backslash = R"(foo = [ { bar="\"{{baz}}\""} ])"sv;
static constexpr auto burntsushi_arrays_hetergeneous = R"(mixed = [[1, 2], ["a", "b"], [1.1, 2.1]])"sv;
static constexpr auto burntsushi_arrays_nested = R"(nest = [["a"], ["b"]])"sv;
static constexpr auto burntsushi_arrays = R"(ints = [1, 2, 3]
floats = [1.1, 2.1, 3.1]
strings = ["a", "b", "c"]
dates = [
@ -40,14 +40,14 @@ dates = [
comments = [
1,
2, #this is ok
])"sv);
static constexpr auto burntsushi_bool = S(R"(t = true
f = false)"sv);
static constexpr auto burntsushi_comments_at_eof = S(R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line)"sv);
static constexpr auto burntsushi_comments_at_eof2 = S(R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line)"sv);
static constexpr auto burntsushi_comments_everywhere = S(R"(# Top comment.
])"sv;
static constexpr auto burntsushi_bool = R"(t = true
f = false)"sv;
static constexpr auto burntsushi_comments_at_eof = R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line)"sv;
static constexpr auto burntsushi_comments_at_eof2 = R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line)"sv;
static constexpr auto burntsushi_comments_everywhere = R"(# Top comment.
# Top comment.
# Top comment.
@ -70,63 +70,63 @@ more = [ # Comment
# Evil.
# Evil.
# ] Did I fool you?
] # Hopefully not.)"sv);
static constexpr auto burntsushi_datetime_timezone = S(R"(bestdayever = 2017-06-06T12:34:56-05:00)"sv);
static constexpr auto burntsushi_double_quote_escape = S(R"(test = "\"one\"")"sv);
static constexpr auto burntsushi_empty = S(R"()"sv);
static constexpr auto burntsushi_escaped_escape = S(R"(answer = "\\x64")"sv);
static constexpr auto burntsushi_example = S(R"(best-day-ever = 1987-07-05T17:45:00Z
] # Hopefully not.)"sv;
static constexpr auto burntsushi_datetime_timezone = R"(bestdayever = 2017-06-06T12:34:56-05:00)"sv;
static constexpr auto burntsushi_double_quote_escape = R"(test = "\"one\"")"sv;
static constexpr auto burntsushi_empty = R"()"sv;
static constexpr auto burntsushi_escaped_escape = R"(answer = "\\x64")"sv;
static constexpr auto burntsushi_example = R"(best-day-ever = 1987-07-05T17:45:00Z
[numtheory]
boring = false
perfection = [6, 28, 496])"sv);
static constexpr auto burntsushi_exponent_part_float = S(R"(million = 1e6
perfection = [6, 28, 496])"sv;
static constexpr auto burntsushi_exponent_part_float = R"(million = 1e6
minustenth = -1E-1
beast = 6.66E2)"sv);
static constexpr auto burntsushi_float_exponent = S(R"(lower = 3e2
beast = 6.66E2)"sv;
static constexpr auto burntsushi_float_exponent = R"(lower = 3e2
upper = 3E2
neg = 3e-2
pos = 3E+2
zero = 3e0
pointlower = 3.1e2
pointupper = 3.1E2)"sv);
static constexpr auto burntsushi_float_underscore = S(R"(before = 3_141.5927
pointupper = 3.1E2)"sv;
static constexpr auto burntsushi_float_underscore = R"(before = 3_141.5927
after = 3141.592_7
exponent = 3e1_4)"sv);
static constexpr auto burntsushi_float = S(R"(pi = 3.14
exponent = 3e1_4)"sv;
static constexpr auto burntsushi_float = R"(pi = 3.14
pospi = +3.14
negpi = -3.14
zero-intpart = 0.123)"sv);
static constexpr auto burntsushi_implicit_and_explicit_after = S(R"([a.b.c]
zero-intpart = 0.123)"sv;
static constexpr auto burntsushi_implicit_and_explicit_after = R"([a.b.c]
answer = 42
[a]
better = 43)"sv);
static constexpr auto burntsushi_implicit_and_explicit_before = S(R"([a]
better = 43)"sv;
static constexpr auto burntsushi_implicit_and_explicit_before = R"([a]
better = 43
[a.b.c]
answer = 42)"sv);
static constexpr auto burntsushi_implicit_groups = S(R"([a.b.c]
answer = 42)"sv);
static constexpr auto burntsushi_inline_table_array = S(R"(people = [{first_name = "Bruce", last_name = "Springsteen"},
answer = 42)"sv;
static constexpr auto burntsushi_implicit_groups = R"([a.b.c]
answer = 42)"sv;
static constexpr auto burntsushi_inline_table_array = R"(people = [{first_name = "Bruce", last_name = "Springsteen"},
{first_name = "Eric", last_name = "Clapton"},
{first_name = "Bob", last_name = "Seger"}])"sv);
static constexpr auto burntsushi_inline_table = S(R"(name = { first = "Tom", last = "Preston-Werner" }
{first_name = "Bob", last_name = "Seger"}])"sv;
static constexpr auto burntsushi_inline_table = R"(name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
simple = { a = 1 }
str-key = { "a" = 1 }
table-array = [{ "a" = 1 }, { "b" = 2 }])"sv);
static constexpr auto burntsushi_integer_underscore = S(R"(kilo = 1_000)"sv);
static constexpr auto burntsushi_integer = S(R"(answer = 42
table-array = [{ "a" = 1 }, { "b" = 2 }])"sv;
static constexpr auto burntsushi_integer_underscore = R"(kilo = 1_000)"sv;
static constexpr auto burntsushi_integer = R"(answer = 42
posanswer = +42
neganswer = -42
zero = 0)"sv);
static constexpr auto burntsushi_key_equals_nospace = S(R"(answer=42)"sv);
static constexpr auto burntsushi_key_numeric = S(R"(1 = 1)"sv);
static constexpr auto burntsushi_key_space = S(R"("a b" = 1)"sv);
static constexpr auto burntsushi_key_special_chars = S(R"("~!@$^&*()_+-`1234567890[]|/?><.,;:'" = 1)"sv);
static constexpr auto burntsushi_keys_with_dots = S(R"(plain = 1
zero = 0)"sv;
static constexpr auto burntsushi_key_equals_nospace = R"(answer=42)"sv;
static constexpr auto burntsushi_key_numeric = R"(1 = 1)"sv;
static constexpr auto burntsushi_key_space = R"("a b" = 1)"sv;
static constexpr auto burntsushi_key_special_chars = R"("~!@$^&*()_+-`1234567890[]|/?><.,;:'" = 1)"sv;
static constexpr auto burntsushi_keys_with_dots = R"(plain = 1
"with.dot" = 2
[plain_table]
@ -135,12 +135,12 @@ plain = 3
[table.withdot]
plain = 5
"key.with.dots" = 6)"sv);
static constexpr auto burntsushi_long_float = S(R"(longpi = 3.141592653589793
neglongpi = -3.141592653589793)"sv);
static constexpr auto burntsushi_long_integer = S(R"(answer = 9223372036854775807
neganswer = -9223372036854775808)"sv);
static constexpr auto burntsushi_multiline_string = S(R"(multiline_empty_one = """"""
"key.with.dots" = 6)"sv;
static constexpr auto burntsushi_long_float = R"(longpi = 3.141592653589793
neglongpi = -3.141592653589793)"sv;
static constexpr auto burntsushi_long_integer = R"(answer = 9223372036854775807
neganswer = -9223372036854775808)"sv;
static constexpr auto burntsushi_multiline_string = R"(multiline_empty_one = """"""
multiline_empty_two = """
"""
multiline_empty_three = """\
@ -162,13 +162,13 @@ equivalent_three = """\
The quick brown \
fox jumps over \
the lazy dog.\
""")"sv);
static constexpr auto burntsushi_nested_inline_table_array = S(R"(a = [ { b = {} } ])"sv);
static constexpr auto burntsushi_newline_crlf = S(R"(os = "DOS"
newline = "crlf")"sv);
static constexpr auto burntsushi_newline_lf = S(R"(os = "unix"
newline = "lf")"sv);
static constexpr auto burntsushi_raw_multiline_string = S(R"(oneline = '''This string has a ' quote character.'''
""")"sv;
static constexpr auto burntsushi_nested_inline_table_array = R"(a = [ { b = {} } ])"sv;
static constexpr auto burntsushi_newline_crlf = R"(os = "DOS"
newline = "crlf")"sv;
static constexpr auto burntsushi_newline_lf = R"(os = "unix"
newline = "lf")"sv;
static constexpr auto burntsushi_raw_multiline_string = R"(oneline = '''This string has a ' quote character.'''
firstnl = '''
This string has a ' quote character.'''
multiline = '''
@ -176,28 +176,28 @@ This string
has ' a quote character
and more than
one newline
in it.''')"sv);
static constexpr auto burntsushi_raw_string = S(R"(backspace = 'This string has a \b backspace character.'
in it.''')"sv;
static constexpr auto burntsushi_raw_string = R"(backspace = 'This string has a \b backspace character.'
tab = 'This string has a \t tab character.'
newline = 'This string has a \n new line character.'
formfeed = 'This string has a \f form feed character.'
carriage = 'This string has a \r carriage return character.'
slash = 'This string has a \/ slash character.'
backslash = 'This string has a \\ backslash character.')"sv);
static constexpr auto burntsushi_right_curly_brace_after_boolean = S(R"(black = { python=">3.6", version=">=18.9b0", allow_prereleases=true })"sv);
static constexpr auto burntsushi_string_empty = S(R"(answer = "")"sv);
static constexpr auto burntsushi_string_nl = S(R"(nl_mid = "val\nue"
backslash = 'This string has a \\ backslash character.')"sv;
static constexpr auto burntsushi_right_curly_brace_after_boolean = R"(black = { python=">3.6", version=">=18.9b0", allow_prereleases=true })"sv;
static constexpr auto burntsushi_string_empty = R"(answer = "")"sv;
static constexpr auto burntsushi_string_nl = R"(nl_mid = "val\nue"
nl_end = """value\n"""
lit_nl_end = '''value\n'''
lit_nl_mid = 'val\nue'
lit_nl_uni = 'val\ue')"sv);
static constexpr auto burntsushi_string_simple = S(R"(answer = "You are not drinking enough whisky.")"sv);
static constexpr auto burntsushi_string_with_pound = S(R"(pound = "We see no # comments here."
poundcomment = "But there are # some comments here." # Did I # mess you up?)"sv);
static constexpr auto burntsushi_table_array_implicit = S(R"([[albums.songs]]
name = "Glory Days")"sv);
static constexpr auto burntsushi_table_array_many = S(R"([[people]]
lit_nl_uni = 'val\ue')"sv;
static constexpr auto burntsushi_string_simple = R"(answer = "You are not drinking enough whisky.")"sv;
static constexpr auto burntsushi_string_with_pound = R"(pound = "We see no # comments here."
poundcomment = "But there are # some comments here." # Did I # mess you up?)"sv;
static constexpr auto burntsushi_table_array_implicit = R"([[albums.songs]]
name = "Glory Days")"sv;
static constexpr auto burntsushi_table_array_many = R"([[people]]
first_name = "Bruce"
last_name = "Springsteen"
@ -207,8 +207,8 @@ last_name = "Clapton"
[[people]]
first_name = "Bob"
last_name = "Seger")"sv);
static constexpr auto burntsushi_table_array_nest = S(R"([[albums]]
last_name = "Seger")"sv;
static constexpr auto burntsushi_table_array_nest = R"([[albums]]
name = "Born to Run"
[[albums.songs]]
@ -224,55 +224,55 @@ name = "Born in the USA"
name = "Glory Days"
[[albums.songs]]
name = "Dancing in the Dark")"sv);
static constexpr auto burntsushi_table_array_one = S(R"([[people]]
name = "Dancing in the Dark")"sv;
static constexpr auto burntsushi_table_array_one = R"([[people]]
first_name = "Bruce"
last_name = "Springsteen")"sv);
static constexpr auto burntsushi_table_array_table_array = S(R"([[a]]
last_name = "Springsteen")"sv;
static constexpr auto burntsushi_table_array_table_array = R"([[a]]
[[a.b]]
[a.b.c]
d = "val0"
[[a.b]]
[a.b.c]
d = "val1")"sv);
static constexpr auto burntsushi_table_empty = S(R"([a])"sv);
static constexpr auto burntsushi_table_no_eol = S(R"([table])"sv);
static constexpr auto burntsushi_table_sub_empty = S(R"([a]
[a.b])"sv);
static constexpr auto burntsushi_table_whitespace = S(R"(["valid key"])"sv);
static constexpr auto burntsushi_table_with_literal_string = S(R"(['a']
d = "val1")"sv;
static constexpr auto burntsushi_table_empty = R"([a])"sv;
static constexpr auto burntsushi_table_no_eol = R"([table])"sv;
static constexpr auto burntsushi_table_sub_empty = R"([a]
[a.b])"sv;
static constexpr auto burntsushi_table_whitespace = R"(["valid key"])"sv;
static constexpr auto burntsushi_table_with_literal_string = R"(['a']
[a.'"b"']
[a.'"b"'.c]
answer = 42)"sv);
static constexpr auto burntsushi_table_with_pound = S(R"(["key#group"]
answer = 42)"sv);
static constexpr auto burntsushi_table_with_single_quotes = S(R"(['a']
answer = 42)"sv;
static constexpr auto burntsushi_table_with_pound = R"(["key#group"]
answer = 42)"sv;
static constexpr auto burntsushi_table_with_single_quotes = R"(['a']
[a.'b']
[a.'b'.c]
answer = 42)"sv);
static constexpr auto burntsushi_underscored_float = S(R"(electron_mass = 9_109.109_383e-3_4)"sv);
static constexpr auto burntsushi_underscored_integer = S(R"(million = 1_000_000)"sv);
static constexpr auto burntsushi_unicode_escape = S(R"(answer4 = "\u03B4"
answer8 = "\U000003B4")"sv);
static constexpr auto burntsushi_unicode_literal = S(R"(answer = "δ")"sv);
static constexpr auto iarna_spec_array_1 = S(R"(integers = [ 1, 2, 3 ])"sv);
static constexpr auto iarna_spec_array_2 = S(R"(colors = [ "red", "yellow", "green" ])"sv);
static constexpr auto iarna_spec_array_3 = S(R"(nested_array_of_int = [ [ 1, 2 ], [3, 4, 5] ])"sv);
static constexpr auto iarna_spec_array_4 = S(R"(string_array = [ "all", 'strings', """are the same""", '''type'''])"sv);
static constexpr auto iarna_spec_array_5 = S(R"(nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ])"sv);
static constexpr auto iarna_spec_array_7 = S(R"(integers2 = [
answer = 42)"sv;
static constexpr auto burntsushi_underscored_float = R"(electron_mass = 9_109.109_383e-3_4)"sv;
static constexpr auto burntsushi_underscored_integer = R"(million = 1_000_000)"sv;
static constexpr auto burntsushi_unicode_escape = R"(answer4 = "\u03B4"
answer8 = "\U000003B4")"sv;
static constexpr auto burntsushi_unicode_literal = R"(answer = "δ")"sv;
static constexpr auto iarna_spec_array_1 = R"(integers = [ 1, 2, 3 ])"sv;
static constexpr auto iarna_spec_array_2 = R"(colors = [ "red", "yellow", "green" ])"sv;
static constexpr auto iarna_spec_array_3 = R"(nested_array_of_int = [ [ 1, 2 ], [3, 4, 5] ])"sv;
static constexpr auto iarna_spec_array_4 = R"(string_array = [ "all", 'strings', """are the same""", '''type'''])"sv;
static constexpr auto iarna_spec_array_5 = R"(nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ])"sv;
static constexpr auto iarna_spec_array_7 = R"(integers2 = [
1, 2, 3
])"sv);
static constexpr auto iarna_spec_array_8 = S(R"(integers3 = [
])"sv;
static constexpr auto iarna_spec_array_8 = R"(integers3 = [
1,
2, # this is ok
])"sv);
static constexpr auto iarna_spec_array_mixed_number_types = S(R"(numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ])"sv);
static constexpr auto iarna_spec_array_more_mixed_types = S(R"(contributors = [
])"sv;
static constexpr auto iarna_spec_array_mixed_number_types = R"(numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ])"sv;
static constexpr auto iarna_spec_array_more_mixed_types = R"(contributors = [
"Foo Bar <foo@example.com>",
{ name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" }
])"sv);
static constexpr auto iarna_spec_array_of_tables_1 = S(R"([[products]]
])"sv;
static constexpr auto iarna_spec_array_of_tables_1 = R"([[products]]
name = "Hammer"
sku = 738594937
@ -281,8 +281,8 @@ sku = 738594937
[[products]]
name = "Nail"
sku = 284758393
color = "gray")"sv);
static constexpr auto iarna_spec_array_of_tables_2 = S(R"([[fruit]]
color = "gray")"sv;
static constexpr auto iarna_spec_array_of_tables_2 = R"([[fruit]]
name = "apple"
[fruit.physical]
@ -299,47 +299,47 @@ color = "gray")"sv);
name = "banana"
[[fruit.variety]]
name = "plantain")"sv);
static constexpr auto iarna_spec_array_of_tables_3 = S(R"(points = [ { x = 1, y = 2, z = 3 },
name = "plantain")"sv;
static constexpr auto iarna_spec_array_of_tables_3 = R"(points = [ { x = 1, y = 2, z = 3 },
{ x = 7, y = 8, z = 9 },
{ x = 2, y = 4, z = 8 } ])"sv);
static constexpr auto iarna_spec_boolean_1 = S(R"(bool1 = true)"sv);
static constexpr auto iarna_spec_boolean_2 = S(R"(bool1 = false)"sv);
static constexpr auto iarna_spec_case_sensitive = S(R"(# TOML is case sensitive.
{ x = 2, y = 4, z = 8 } ])"sv;
static constexpr auto iarna_spec_boolean_1 = R"(bool1 = true)"sv;
static constexpr auto iarna_spec_boolean_2 = R"(bool1 = false)"sv;
static constexpr auto iarna_spec_case_sensitive = R"(# TOML is case sensitive.
abc = 123
ABC = 456)"sv);
static constexpr auto iarna_spec_comment_mid_array = S(R"(# eol commetns can go anywhere
ABC = 456)"sv;
static constexpr auto iarna_spec_comment_mid_array = R"(# eol commetns can go anywhere
abc = [ # this is valid
123,#as is this
456 #so is this
]# and this
# here too)"sv);
static constexpr auto iarna_spec_comment_mid_string = S(R"(another = "# This is not a comment")"sv);
static constexpr auto iarna_spec_comment_tab = S(R"(# This is a full-line comment with a tab in the middle
key = "value" # This is a commen with a tab in the middle at the end of a line)"sv);
static constexpr auto iarna_spec_comment = S(R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line)"sv);
static constexpr auto iarna_spec_date_local_1 = S(R"(ld1 = 1979-05-27)"sv);
static constexpr auto iarna_spec_date_time_1 = S(R"(odt1 = 1979-05-27T07:32:00Z)"sv);
static constexpr auto iarna_spec_date_time_2 = S(R"(odt2 = 1979-05-27T00:32:00-07:00)"sv);
static constexpr auto iarna_spec_date_time_3 = S(R"(odt3 = 1979-05-27T00:32:00.999999-07:00)"sv);
static constexpr auto iarna_spec_date_time_4 = S(R"(odt4 = 1979-05-27 07:32:00Z)"sv);
static constexpr auto iarna_spec_date_time_5 = S(R"(odt5 = 1979-05-27T07:32:00.123Z)"sv);
static constexpr auto iarna_spec_date_time_local_1 = S(R"(ldt1 = 1979-05-27T07:32:00)"sv);
static constexpr auto iarna_spec_dotted_keys_1 = S(R"(name = "Orange"
# here too)"sv;
static constexpr auto iarna_spec_comment_mid_string = R"(another = "# This is not a comment")"sv;
static constexpr auto iarna_spec_comment_tab = R"(# This is a full-line comment with a tab in the middle
key = "value" # This is a commen with a tab in the middle at the end of a line)"sv;
static constexpr auto iarna_spec_comment = R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line)"sv;
static constexpr auto iarna_spec_date_local_1 = R"(ld1 = 1979-05-27)"sv;
static constexpr auto iarna_spec_date_time_1 = R"(odt1 = 1979-05-27T07:32:00Z)"sv;
static constexpr auto iarna_spec_date_time_2 = R"(odt2 = 1979-05-27T00:32:00-07:00)"sv;
static constexpr auto iarna_spec_date_time_3 = R"(odt3 = 1979-05-27T00:32:00.999999-07:00)"sv;
static constexpr auto iarna_spec_date_time_4 = R"(odt4 = 1979-05-27 07:32:00Z)"sv;
static constexpr auto iarna_spec_date_time_5 = R"(odt5 = 1979-05-27T07:32:00.123Z)"sv;
static constexpr auto iarna_spec_date_time_local_1 = R"(ldt1 = 1979-05-27T07:32:00)"sv;
static constexpr auto iarna_spec_dotted_keys_1 = R"(name = "Orange"
physical.color = "orange"
physical.shape = "round"
site."google.com" = true)"sv);
static constexpr auto iarna_spec_dotted_keys_2 = S(R"(a . b = 23)"sv);
static constexpr auto iarna_spec_dotted_keys_3 = S(R"(a . b = 23)"sv);
static constexpr auto iarna_spec_empty_key_name_1 = S(R"("" = "blank" # VALID but discouraged)"sv);
static constexpr auto iarna_spec_empty_key_name_2 = S(R"('' = "blank" # VALID but discouraged)"sv);
static constexpr auto iarna_spec_extend_dotted_object_1 = S(R"(# This makes the key "fruit" into a table.
site."google.com" = true)"sv;
static constexpr auto iarna_spec_dotted_keys_2 = R"(a . b = 23)"sv;
static constexpr auto iarna_spec_dotted_keys_3 = R"(a . b = 23)"sv;
static constexpr auto iarna_spec_empty_key_name_1 = R"("" = "blank" # VALID but discouraged)"sv;
static constexpr auto iarna_spec_empty_key_name_2 = R"('' = "blank" # VALID but discouraged)"sv;
static constexpr auto iarna_spec_extend_dotted_object_1 = R"(# This makes the key "fruit" into a table.
fruit.apple.smooth = true
# So then you can add to the table "fruit" like so:
fruit.orange = 2)"sv);
static constexpr auto iarna_spec_extend_dotted_object_2 = S(R"(# VALID BUT DISCOURAGED
fruit.orange = 2)"sv;
static constexpr auto iarna_spec_extend_dotted_object_2 = R"(# VALID BUT DISCOURAGED
apple.type = "fruit"
orange.type = "fruit"
@ -348,8 +348,8 @@ apple.skin = "thin"
orange.skin = "thick"
apple.color = "red"
orange.color = "orange")"sv);
static constexpr auto iarna_spec_extend_dotted_object_3 = S(R"(# RECOMMENDED
orange.color = "orange")"sv;
static constexpr auto iarna_spec_extend_dotted_object_3 = R"(# RECOMMENDED
apple.type = "fruit"
apple.skin = "thin"
@ -357,51 +357,51 @@ apple.color = "red"
orange.type = "fruit"
orange.skin = "thick"
orange.color = "orange")"sv);
static constexpr auto iarna_spec_float_1 = S(R"(flt1 = +1.0)"sv);
static constexpr auto iarna_spec_float_10 = S(R"(sf1 = inf # positive infinity)"sv);
static constexpr auto iarna_spec_float_11 = S(R"(sf2 = +inf # positive infinity)"sv);
static constexpr auto iarna_spec_float_12 = S(R"(sf2 = -inf # negative infinity)"sv);
static constexpr auto iarna_spec_float_13 = S(R"(sf4 = nan # actual sNaN/qNaN encoding is implementation specific)"sv);
static constexpr auto iarna_spec_float_14 = S(R"(sf5 = +nan # same as `nan`)"sv);
static constexpr auto iarna_spec_float_15 = S(R"(sf6 = -nan # valid, actual encoding is implementation specific)"sv);
static constexpr auto iarna_spec_float_2 = S(R"(flt2 = 3.1415)"sv);
static constexpr auto iarna_spec_float_3 = S(R"(flt3 = -0.01)"sv);
static constexpr auto iarna_spec_float_4 = S(R"(flt4 = 5e+22)"sv);
static constexpr auto iarna_spec_float_5 = S(R"(flt5 = 1e06)"sv);
static constexpr auto iarna_spec_float_6 = S(R"(flt6 = -2E-2)"sv);
static constexpr auto iarna_spec_float_7 = S(R"(flt7 = 6.626e-34)"sv);
static constexpr auto iarna_spec_float_8 = S(R"(flt8 = 224_617.445_991_228)"sv);
static constexpr auto iarna_spec_float_9 = S(R"(flt9 = -0e0)"sv);
static constexpr auto iarna_spec_int_1 = S(R"(int1 = +99)"sv);
static constexpr auto iarna_spec_int_2 = S(R"(int2 = 42)"sv);
static constexpr auto iarna_spec_int_3 = S(R"(int3 = 0)"sv);
static constexpr auto iarna_spec_int_3a = S(R"(int3 = +0)"sv);
static constexpr auto iarna_spec_int_3b = S(R"(int3 = -0)"sv);
static constexpr auto iarna_spec_int_4 = S(R"(int4 = -17)"sv);
static constexpr auto iarna_spec_int_5 = S(R"(int5 = 1_000)"sv);
static constexpr auto iarna_spec_int_6 = S(R"(int6 = 5_349_221)"sv);
static constexpr auto iarna_spec_int_7 = S(R"(int7 = 1_2_3_4_5 # VALID but discouraged)"sv);
static constexpr auto iarna_spec_int_bin1 = S(R"(bin1 = 0b11010110)"sv);
static constexpr auto iarna_spec_int_hex1 = S(R"(hex1 = 0xDEADBEEF)"sv);
static constexpr auto iarna_spec_int_hex2 = S(R"(hex2 = 0xdeadbeef)"sv);
static constexpr auto iarna_spec_int_hex3 = S(R"(hex3 = 0xdead_beef)"sv);
static constexpr auto iarna_spec_int_max = S(R"(max=9_223_372_036_854_775_807)"sv);
static constexpr auto iarna_spec_int_min = S(R"(min=-9_223_372_036_854_775_808)"sv);
static constexpr auto iarna_spec_int_oct1 = S(R"(oct1 = 0o01234567)"sv);
static constexpr auto iarna_spec_int_oct2 = S(R"(oct2 = 0o755 # useful for Unix file permissions)"sv);
static constexpr auto iarna_spec_key_value_pair_1 = S(R"(key = "value")"sv);
static constexpr auto iarna_spec_key_value_pair_2 = S(R"(bare_key = "value")"sv);
static constexpr auto iarna_spec_key_value_pair_3 = S(R"(bare-key = "value")"sv);
static constexpr auto iarna_spec_key_value_pair_4 = S(R"(1234 = "value")"sv);
static constexpr auto iarna_spec_key_value_pair_5 = S(R"(1234="value")"sv);
static constexpr auto iarna_spec_key_value_pair_6 = S(R"(-=1)"sv);
static constexpr auto iarna_spec_key_value_pair_7 = S(R"(_=1)"sv);
static constexpr auto iarna_spec_key_value_pair_8 = S(R"(-_-_-_-_-=1)"sv);
static constexpr auto iarna_spec_key_value_pair_9 = S(R"(3.14159 = "pi")"sv);
static constexpr auto iarna_spec_quoted_basic_keys_1 = S(R"("ʎǝʞ" = "value")"sv);
static constexpr auto iarna_spec_quoted_literal_keys_1 = S(R"('quoted "value"' = "value")"sv);
static constexpr auto iarna_spec_readme_example = S(R"(# This is a TOML document.
orange.color = "orange")"sv;
static constexpr auto iarna_spec_float_1 = R"(flt1 = +1.0)"sv;
static constexpr auto iarna_spec_float_10 = R"(sf1 = inf # positive infinity)"sv;
static constexpr auto iarna_spec_float_11 = R"(sf2 = +inf # positive infinity)"sv;
static constexpr auto iarna_spec_float_12 = R"(sf2 = -inf # negative infinity)"sv;
static constexpr auto iarna_spec_float_13 = R"(sf4 = nan # actual sNaN/qNaN encoding is implementation specific)"sv;
static constexpr auto iarna_spec_float_14 = R"(sf5 = +nan # same as `nan`)"sv;
static constexpr auto iarna_spec_float_15 = R"(sf6 = -nan # valid, actual encoding is implementation specific)"sv;
static constexpr auto iarna_spec_float_2 = R"(flt2 = 3.1415)"sv;
static constexpr auto iarna_spec_float_3 = R"(flt3 = -0.01)"sv;
static constexpr auto iarna_spec_float_4 = R"(flt4 = 5e+22)"sv;
static constexpr auto iarna_spec_float_5 = R"(flt5 = 1e06)"sv;
static constexpr auto iarna_spec_float_6 = R"(flt6 = -2E-2)"sv;
static constexpr auto iarna_spec_float_7 = R"(flt7 = 6.626e-34)"sv;
static constexpr auto iarna_spec_float_8 = R"(flt8 = 224_617.445_991_228)"sv;
static constexpr auto iarna_spec_float_9 = R"(flt9 = -0e0)"sv;
static constexpr auto iarna_spec_int_1 = R"(int1 = +99)"sv;
static constexpr auto iarna_spec_int_2 = R"(int2 = 42)"sv;
static constexpr auto iarna_spec_int_3 = R"(int3 = 0)"sv;
static constexpr auto iarna_spec_int_3a = R"(int3 = +0)"sv;
static constexpr auto iarna_spec_int_3b = R"(int3 = -0)"sv;
static constexpr auto iarna_spec_int_4 = R"(int4 = -17)"sv;
static constexpr auto iarna_spec_int_5 = R"(int5 = 1_000)"sv;
static constexpr auto iarna_spec_int_6 = R"(int6 = 5_349_221)"sv;
static constexpr auto iarna_spec_int_7 = R"(int7 = 1_2_3_4_5 # VALID but discouraged)"sv;
static constexpr auto iarna_spec_int_bin1 = R"(bin1 = 0b11010110)"sv;
static constexpr auto iarna_spec_int_hex1 = R"(hex1 = 0xDEADBEEF)"sv;
static constexpr auto iarna_spec_int_hex2 = R"(hex2 = 0xdeadbeef)"sv;
static constexpr auto iarna_spec_int_hex3 = R"(hex3 = 0xdead_beef)"sv;
static constexpr auto iarna_spec_int_max = R"(max=9_223_372_036_854_775_807)"sv;
static constexpr auto iarna_spec_int_min = R"(min=-9_223_372_036_854_775_808)"sv;
static constexpr auto iarna_spec_int_oct1 = R"(oct1 = 0o01234567)"sv;
static constexpr auto iarna_spec_int_oct2 = R"(oct2 = 0o755 # useful for Unix file permissions)"sv;
static constexpr auto iarna_spec_key_value_pair_1 = R"(key = "value")"sv;
static constexpr auto iarna_spec_key_value_pair_2 = R"(bare_key = "value")"sv;
static constexpr auto iarna_spec_key_value_pair_3 = R"(bare-key = "value")"sv;
static constexpr auto iarna_spec_key_value_pair_4 = R"(1234 = "value")"sv;
static constexpr auto iarna_spec_key_value_pair_5 = R"(1234="value")"sv;
static constexpr auto iarna_spec_key_value_pair_6 = R"(-=1)"sv;
static constexpr auto iarna_spec_key_value_pair_7 = R"(_=1)"sv;
static constexpr auto iarna_spec_key_value_pair_8 = R"(-_-_-_-_-=1)"sv;
static constexpr auto iarna_spec_key_value_pair_9 = R"(3.14159 = "pi")"sv;
static constexpr auto iarna_spec_quoted_basic_keys_1 = R"("ʎǝʞ" = "value")"sv;
static constexpr auto iarna_spec_quoted_literal_keys_1 = R"('quoted "value"' = "value")"sv;
static constexpr auto iarna_spec_readme_example = R"(# This is a TOML document.
title = "TOML Example"
@ -433,143 +433,143 @@ data = [ ["gamma", "delta"], [1, 2] ]
hosts = [
"alpha",
"omega"
])"sv);
static constexpr auto iarna_spec_string_basic_multiline_1 = S(R"(str1 = """
])"sv;
static constexpr auto iarna_spec_string_basic_multiline_1 = R"(str1 = """
Roses are red
Violets are blue""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_2 = S(R"(str = """
Violets are blue""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_2 = R"(str = """
The quick brown \
fox jumps over \
the lazy dog.""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_3 = S(R"(str = """\
the lazy dog.""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_3 = R"(str = """\
The quick brown \
fox jumps over \
the lazy dog.\
""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_5 = S(R"(ml-escaped-nl = """
""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_5 = R"(ml-escaped-nl = """
foo \
bar \\
baz \\\
quux""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_6 = S(R"(str4 = """Here are two quotation marks: "". Simple enough.""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_7 = S(R"(str5 = """Here are three quotation marks: ""\".""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_8 = S(R"(str6 = """Here are fifteen quotation marks: ""\"""\"""\"""\"""\".""")"sv);
static constexpr auto iarna_spec_string_basic_multiline_9 = S(R"(str7 = """"This," she said, "is just a pointless statement."""")"sv);
static constexpr auto iarna_spec_string_basic_tab_multiline = S(R"(str = """This is a tab""")"sv);
static constexpr auto iarna_spec_string_basic_tab = S(R"(str = "This is a tab")"sv);
static constexpr auto iarna_spec_string_basic = S(R"(str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF.")"sv);
static constexpr auto iarna_spec_string_literal_1 = S(R"(winpath = 'C:\Users\nodejs\templates')"sv);
static constexpr auto iarna_spec_string_literal_2 = S(R"(winpath2 = '\\ServerX\admin$\system32\')"sv);
static constexpr auto iarna_spec_string_literal_3 = S(R"(quoted = 'Tom "Dubs" Preston-Werner')"sv);
static constexpr auto iarna_spec_string_literal_4 = S(R"(regex = '<\i\c*\s*>')"sv);
static constexpr auto iarna_spec_string_literal_multiline_1 = S(R"(regex2 = '''I [dw]on't need \d{2} apples''')"sv);
static constexpr auto iarna_spec_string_literal_multiline_2 = S(R"(lines = '''
quux""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_6 = R"(str4 = """Here are two quotation marks: "". Simple enough.""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_7 = R"(str5 = """Here are three quotation marks: ""\".""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_8 = R"(str6 = """Here are fifteen quotation marks: ""\"""\"""\"""\"""\".""")"sv;
static constexpr auto iarna_spec_string_basic_multiline_9 = R"(str7 = """"This," she said, "is just a pointless statement."""")"sv;
static constexpr auto iarna_spec_string_basic_tab_multiline = R"(str = """This is a tab""")"sv;
static constexpr auto iarna_spec_string_basic_tab = R"(str = "This is a tab")"sv;
static constexpr auto iarna_spec_string_basic = R"(str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF.")"sv;
static constexpr auto iarna_spec_string_literal_1 = R"(winpath = 'C:\Users\nodejs\templates')"sv;
static constexpr auto iarna_spec_string_literal_2 = R"(winpath2 = '\\ServerX\admin$\system32\')"sv;
static constexpr auto iarna_spec_string_literal_3 = R"(quoted = 'Tom "Dubs" Preston-Werner')"sv;
static constexpr auto iarna_spec_string_literal_4 = R"(regex = '<\i\c*\s*>')"sv;
static constexpr auto iarna_spec_string_literal_multiline_1 = R"(regex2 = '''I [dw]on't need \d{2} apples''')"sv;
static constexpr auto iarna_spec_string_literal_multiline_2 = R"(lines = '''
The first newline is
trimmed in raw strings.
All other whitespace
is preserved.
''')"sv);
static constexpr auto iarna_spec_string_literal_multiline_3 = S(R"(quot15 = '''Here are fifteen quotation marks: """""""""""""""''')"sv);
static constexpr auto iarna_spec_string_literal_multiline_4 = S(R"(str = ''''That,' she said, 'is still pointless.'''')"sv);
static constexpr auto iarna_spec_table_1 = S(R"([table-1]
''')"sv;
static constexpr auto iarna_spec_string_literal_multiline_3 = R"(quot15 = '''Here are fifteen quotation marks: """""""""""""""''')"sv;
static constexpr auto iarna_spec_string_literal_multiline_4 = R"(str = ''''That,' she said, 'is still pointless.'''')"sv;
static constexpr auto iarna_spec_table_1 = R"([table-1]
key1 = "some string"
key2 = 123
[table-2]
key1 = "another string"
key2 = 456)"sv);
static constexpr auto iarna_spec_table_2 = S(R"([dog."tater.man"]
type.name = "pug")"sv);
static constexpr auto iarna_spec_table_3 = S(R"([a.b.c])"sv);
static constexpr auto iarna_spec_table_4 = S(R"([ d.e.f ] # same as [d.e.f])"sv);
static constexpr auto iarna_spec_table_5 = S(R"([ g . h . i ] # same as [g.h.i])"sv);
static constexpr auto iarna_spec_table_6 = S(R"([ j . "ʞ" . 'l' ] # same as [j."ʞ".'l'])"sv);
static constexpr auto iarna_spec_table_7 = S(R"(# [x] you
key2 = 456)"sv;
static constexpr auto iarna_spec_table_2 = R"([dog."tater.man"]
type.name = "pug")"sv;
static constexpr auto iarna_spec_table_3 = R"([a.b.c])"sv;
static constexpr auto iarna_spec_table_4 = R"([ d.e.f ] # same as [d.e.f])"sv;
static constexpr auto iarna_spec_table_5 = R"([ g . h . i ] # same as [g.h.i])"sv;
static constexpr auto iarna_spec_table_6 = R"([ j . "ʞ" . 'l' ] # same as [j."ʞ".'l'])"sv;
static constexpr auto iarna_spec_table_7 = R"(# [x] you
# [x.y] don't
# [x.y.z] need these
[x.y.z.w] # for this to work
[x] # defining a super-table afterwards is ok)"sv);
static constexpr auto iarna_spec_table_8 = S(R"([fruit]
[x] # defining a super-table afterwards is ok)"sv;
static constexpr auto iarna_spec_table_8 = R"([fruit]
apple.color = "red"
apple.taste.sweet = true
[fruit.apple.texture] # you can add sub-tables
smooth = true)"sv);
static constexpr auto iarna_spec_table_inline_1 = S(R"(name = { first = "Tom", last = "Preston-Werner" })"sv);
static constexpr auto iarna_spec_table_inline_2 = S(R"(point = { x = 1, y = 2 })"sv);
static constexpr auto iarna_spec_table_inline_3 = S(R"(animal = { type.name = "pug" })"sv);
static constexpr auto iarna_spec_table = S(R"([table])"sv);
static constexpr auto iarna_spec_time_1 = S(R"(lt1 = 07:32:00)"sv);
smooth = true)"sv;
static constexpr auto iarna_spec_table_inline_1 = R"(name = { first = "Tom", last = "Preston-Werner" })"sv;
static constexpr auto iarna_spec_table_inline_2 = R"(point = { x = 1, y = 2 })"sv;
static constexpr auto iarna_spec_table_inline_3 = R"(animal = { type.name = "pug" })"sv;
static constexpr auto iarna_spec_table = R"([table])"sv;
static constexpr auto iarna_spec_time_1 = R"(lt1 = 07:32:00)"sv;
}
namespace invalid
{
static constexpr auto burntsushi_datetime_malformed_no_leads = S(R"(no-leads = 1987-7-05T17:45:00Z)"sv);
static constexpr auto burntsushi_datetime_malformed_no_secs = S(R"(no-secs = 1987-07-05T17:45Z)"sv);
static constexpr auto burntsushi_datetime_malformed_no_t = S(R"(no-t = 1987-07-0517:45:00Z)"sv);
static constexpr auto burntsushi_datetime_malformed_with_milli = S(R"(with-milli = 1987-07-5T17:45:00.12Z)"sv);
static constexpr auto burntsushi_duplicate_key_table = S(R"([fruit]
static constexpr auto burntsushi_datetime_malformed_no_leads = R"(no-leads = 1987-7-05T17:45:00Z)"sv;
static constexpr auto burntsushi_datetime_malformed_no_secs = R"(no-secs = 1987-07-05T17:45Z)"sv;
static constexpr auto burntsushi_datetime_malformed_no_t = R"(no-t = 1987-07-0517:45:00Z)"sv;
static constexpr auto burntsushi_datetime_malformed_with_milli = R"(with-milli = 1987-07-5T17:45:00.12Z)"sv;
static constexpr auto burntsushi_duplicate_key_table = R"([fruit]
type = "apple"
[fruit.type]
apple = "yes")"sv);
static constexpr auto burntsushi_duplicate_keys = S(R"(dupe = false
dupe = true)"sv);
static constexpr auto burntsushi_duplicate_tables = S(R"([a]
[a])"sv);
static constexpr auto burntsushi_empty_implicit_table = S(R"([naughty..naughty])"sv);
static constexpr auto burntsushi_empty_table = S(R"([])"sv);
static constexpr auto burntsushi_float_leading_zero_neg = S(R"(leading-zero = -03.14)"sv);
static constexpr auto burntsushi_float_leading_zero_pos = S(R"(leading-zero = +03.14)"sv);
static constexpr auto burntsushi_float_leading_zero = S(R"(leading-zero = 03.14)"sv);
static constexpr auto burntsushi_float_no_leading_zero = S(R"(answer = .12345
neganswer = -.12345)"sv);
static constexpr auto burntsushi_float_no_trailing_digits = S(R"(answer = 1.
neganswer = -1.)"sv);
static constexpr auto burntsushi_float_underscore_after_point = S(R"(bad = 1._2)"sv);
static constexpr auto burntsushi_float_underscore_after = S(R"(bad = 1.2_)"sv);
static constexpr auto burntsushi_float_underscore_before_point = S(R"(bad = 1_.2)"sv);
static constexpr auto burntsushi_float_underscore_before = S(R"(bad = _1.2)"sv);
static constexpr auto burntsushi_inline_table_linebreak = S(R"(simple = { a = 1
})"sv);
static constexpr auto burntsushi_integer_leading_zero_neg = S(R"(leading-zero = -012)"sv);
static constexpr auto burntsushi_integer_leading_zero_pos = S(R"(leading-zero = +012)"sv);
static constexpr auto burntsushi_integer_leading_zero = S(R"(leading-zero = 012)"sv);
static constexpr auto burntsushi_integer_underscore_after = S(R"(bad = 123_)"sv);
static constexpr auto burntsushi_integer_underscore_before = S(R"(bad = _123)"sv);
static constexpr auto burntsushi_integer_underscore_double = S(R"(bad = 1__23)"sv);
static constexpr auto burntsushi_key_after_array = S(R"([[agencies]] owner = "S Cjelli")"sv);
static constexpr auto burntsushi_key_after_table = S(R"([error] this = "should not be here")"sv);
static constexpr auto burntsushi_key_empty = S(R"(= 1)"sv);
static constexpr auto burntsushi_key_hash = S(R"(a# = 1)"sv);
static constexpr auto burntsushi_key_newline = S(R"(a
= 1)"sv);
static constexpr auto burntsushi_key_no_eol = S(R"(a = 1 b = 2)"sv);
static constexpr auto burntsushi_key_open_bracket = S(R"([abc = 1)"sv);
static constexpr auto burntsushi_key_single_open_bracket = S(R"([)"sv);
static constexpr auto burntsushi_key_space = S(R"(a b = 1)"sv);
static constexpr auto burntsushi_key_start_bracket = S(R"([a]
apple = "yes")"sv;
static constexpr auto burntsushi_duplicate_keys = R"(dupe = false
dupe = true)"sv;
static constexpr auto burntsushi_duplicate_tables = R"([a]
[a])"sv;
static constexpr auto burntsushi_empty_implicit_table = R"([naughty..naughty])"sv;
static constexpr auto burntsushi_empty_table = R"([])"sv;
static constexpr auto burntsushi_float_leading_zero_neg = R"(leading-zero = -03.14)"sv;
static constexpr auto burntsushi_float_leading_zero_pos = R"(leading-zero = +03.14)"sv;
static constexpr auto burntsushi_float_leading_zero = R"(leading-zero = 03.14)"sv;
static constexpr auto burntsushi_float_no_leading_zero = R"(answer = .12345
neganswer = -.12345)"sv;
static constexpr auto burntsushi_float_no_trailing_digits = R"(answer = 1.
neganswer = -1.)"sv;
static constexpr auto burntsushi_float_underscore_after_point = R"(bad = 1._2)"sv;
static constexpr auto burntsushi_float_underscore_after = R"(bad = 1.2_)"sv;
static constexpr auto burntsushi_float_underscore_before_point = R"(bad = 1_.2)"sv;
static constexpr auto burntsushi_float_underscore_before = R"(bad = _1.2)"sv;
static constexpr auto burntsushi_inline_table_linebreak = R"(simple = { a = 1
})"sv;
static constexpr auto burntsushi_integer_leading_zero_neg = R"(leading-zero = -012)"sv;
static constexpr auto burntsushi_integer_leading_zero_pos = R"(leading-zero = +012)"sv;
static constexpr auto burntsushi_integer_leading_zero = R"(leading-zero = 012)"sv;
static constexpr auto burntsushi_integer_underscore_after = R"(bad = 123_)"sv;
static constexpr auto burntsushi_integer_underscore_before = R"(bad = _123)"sv;
static constexpr auto burntsushi_integer_underscore_double = R"(bad = 1__23)"sv;
static constexpr auto burntsushi_key_after_array = R"([[agencies]] owner = "S Cjelli")"sv;
static constexpr auto burntsushi_key_after_table = R"([error] this = "should not be here")"sv;
static constexpr auto burntsushi_key_empty = R"(= 1)"sv;
static constexpr auto burntsushi_key_hash = R"(a# = 1)"sv;
static constexpr auto burntsushi_key_newline = R"(a
= 1)"sv;
static constexpr auto burntsushi_key_no_eol = R"(a = 1 b = 2)"sv;
static constexpr auto burntsushi_key_open_bracket = R"([abc = 1)"sv;
static constexpr auto burntsushi_key_single_open_bracket = R"([)"sv;
static constexpr auto burntsushi_key_space = R"(a b = 1)"sv;
static constexpr auto burntsushi_key_start_bracket = R"([a]
[xyz = 5
[b])"sv);
static constexpr auto burntsushi_key_two_equals = S(R"(key= = 1)"sv);
static constexpr auto burntsushi_llbrace = S(R"([ [table]])"sv);
static constexpr auto burntsushi_multi_line_inline_table = S(R"(json_like = {
[b])"sv;
static constexpr auto burntsushi_key_two_equals = R"(key= = 1)"sv;
static constexpr auto burntsushi_llbrace = R"([ [table]])"sv;
static constexpr auto burntsushi_multi_line_inline_table = R"(json_like = {
first = "Tom",
last = "Preston-Werner"
})"sv);
static constexpr auto burntsushi_multi_line_string_no_close = S(R"(invalid = """
this will fail)"sv);
static constexpr auto burntsushi_rrbrace = S(R"([[table] ])"sv);
static constexpr auto burntsushi_string_bad_byte_escape = S(R"(naughty = "\xAg")"sv);
static constexpr auto burntsushi_string_bad_codepoint = S(R"(invalid-codepoint = "This string contains a non scalar unicode codepoint \uD801")"sv);
static constexpr auto burntsushi_string_bad_escape = S(R"(invalid-escape = "This string has a bad \a escape character.")"sv);
static constexpr auto burntsushi_string_bad_slash_escape = S(R"(invalid-escape = "This string has a bad \/ escape character.")"sv);
static constexpr auto burntsushi_string_bad_uni_esc = S(R"(str = "val\ue")"sv);
static constexpr auto burntsushi_string_byte_escapes = S(R"(answer = "\x33")"sv);
static constexpr auto burntsushi_string_no_close = S(R"(no-ending-quote = "One time, at band camp)"sv);
static constexpr auto burntsushi_table_array_implicit = S(R"(# This test is a bit tricky. It should fail because the first use of
})"sv;
static constexpr auto burntsushi_multi_line_string_no_close = R"(invalid = """
this will fail)"sv;
static constexpr auto burntsushi_rrbrace = R"([[table] ])"sv;
static constexpr auto burntsushi_string_bad_byte_escape = R"(naughty = "\xAg")"sv;
static constexpr auto burntsushi_string_bad_codepoint = R"(invalid-codepoint = "This string contains a non scalar unicode codepoint \uD801")"sv;
static constexpr auto burntsushi_string_bad_escape = R"(invalid-escape = "This string has a bad \a escape character.")"sv;
static constexpr auto burntsushi_string_bad_slash_escape = R"(invalid-escape = "This string has a bad \/ escape character.")"sv;
static constexpr auto burntsushi_string_bad_uni_esc = R"(str = "val\ue")"sv;
static constexpr auto burntsushi_string_byte_escapes = R"(answer = "\x33")"sv;
static constexpr auto burntsushi_string_no_close = R"(no-ending-quote = "One time, at band camp)"sv;
static constexpr auto burntsushi_table_array_implicit = R"(# This test is a bit tricky. It should fail because the first use of
# `[[albums.songs]]` without first declaring `albums` implies that `albums`
# must be a table. The alternative would be quite weird. Namely, it wouldn't
# comply with the TOML spec: "Each double-bracketed sub-table will belong to
@ -582,40 +582,40 @@ neganswer = -1.)"sv);
name = "Glory Days"
[[albums]]
name = "Born in the USA")"sv);
static constexpr auto burntsushi_table_array_malformed_bracket = S(R"([[albums]
name = "Born to Run")"sv);
static constexpr auto burntsushi_table_array_malformed_empty = S(R"([[]]
name = "Born to Run")"sv);
static constexpr auto burntsushi_table_empty = S(R"([])"sv);
static constexpr auto burntsushi_table_nested_brackets_close = S(R"([a]b]
zyx = 42)"sv);
static constexpr auto burntsushi_table_nested_brackets_open = S(R"([a[b]
zyx = 42)"sv);
static constexpr auto burntsushi_table_whitespace = S(R"([invalid key])"sv);
static constexpr auto burntsushi_table_with_pound = S(R"([key#group]
answer = 42)"sv);
static constexpr auto burntsushi_text_after_array_entries = S(R"(array = [
name = "Born in the USA")"sv;
static constexpr auto burntsushi_table_array_malformed_bracket = R"([[albums]
name = "Born to Run")"sv;
static constexpr auto burntsushi_table_array_malformed_empty = R"([[]]
name = "Born to Run")"sv;
static constexpr auto burntsushi_table_empty = R"([])"sv;
static constexpr auto burntsushi_table_nested_brackets_close = R"([a]b]
zyx = 42)"sv;
static constexpr auto burntsushi_table_nested_brackets_open = R"([a[b]
zyx = 42)"sv;
static constexpr auto burntsushi_table_whitespace = R"([invalid key])"sv;
static constexpr auto burntsushi_table_with_pound = R"([key#group]
answer = 42)"sv;
static constexpr auto burntsushi_text_after_array_entries = R"(array = [
"Is there life after an array separator?", No
"Entry"
])"sv);
static constexpr auto burntsushi_text_after_integer = S(R"(answer = 42 the ultimate answer?)"sv);
static constexpr auto burntsushi_text_after_string = S(R"(string = "Is there life after strings?" No.)"sv);
static constexpr auto burntsushi_text_after_table = S(R"([error] this shouldn't be here)"sv);
static constexpr auto burntsushi_text_before_array_separator = S(R"(array = [
])"sv;
static constexpr auto burntsushi_text_after_integer = R"(answer = 42 the ultimate answer?)"sv;
static constexpr auto burntsushi_text_after_string = R"(string = "Is there life after strings?" No.)"sv;
static constexpr auto burntsushi_text_after_table = R"([error] this shouldn't be here)"sv;
static constexpr auto burntsushi_text_before_array_separator = R"(array = [
"Is there life before an array separator?" No,
"Entry"
])"sv);
static constexpr auto burntsushi_text_in_array = S(R"(array = [
])"sv;
static constexpr auto burntsushi_text_in_array = R"(array = [
"Entry 1",
I don't belong,
"Entry 2",
])"sv);
static constexpr auto iarna_array_of_tables_1 = S(R"(# INVALID TOML DOC
])"sv;
static constexpr auto iarna_array_of_tables_1 = R"(# INVALID TOML DOC
fruit = []
[[fruit]] # Not allowed)"sv);
static constexpr auto iarna_array_of_tables_2 = S(R"(# INVALID TOML DOC
[[fruit]] # Not allowed)"sv;
static constexpr auto iarna_array_of_tables_2 = R"(# INVALID TOML DOC
[[fruit]]
name = "apple"
@ -624,83 +624,83 @@ fruit = []
# This table conflicts with the previous table
[fruit.variety]
name = "granny smith")"sv);
static constexpr auto iarna_bare_key_1 = S(R"(bare!key = 123)"sv);
static constexpr auto iarna_bare_key_2 = S(R"(barekey
= 123)"sv);
static constexpr auto iarna_bare_key_3 = S(R"(barekey =)"sv);
static constexpr auto iarna_inline_table_imutable_1 = S(R"([product]
name = "granny smith")"sv;
static constexpr auto iarna_bare_key_1 = R"(bare!key = 123)"sv;
static constexpr auto iarna_bare_key_2 = R"(barekey
= 123)"sv;
static constexpr auto iarna_bare_key_3 = R"(barekey =)"sv;
static constexpr auto iarna_inline_table_imutable_1 = R"([product]
type = { name = "Nail" }
type.edible = false # INVALID)"sv);
static constexpr auto iarna_inline_table_imutable_2 = S(R"([product]
type.edible = false # INVALID)"sv;
static constexpr auto iarna_inline_table_imutable_2 = R"([product]
type.name = "Nail"
type = { edible = false } # INVALID)"sv);
static constexpr auto iarna_inline_table_trailing_comma = S(R"(abc = { abc = 123, })"sv);
static constexpr auto iarna_int_0_padded = S(R"(int = 0123)"sv);
static constexpr auto iarna_int_signed_bin = S(R"(bin = +0b10)"sv);
static constexpr auto iarna_int_signed_hex = S(R"(hex = +0xab)"sv);
static constexpr auto iarna_int_signed_oct = S(R"(oct = +0o23)"sv);
static constexpr auto iarna_key_value_pair_1 = S(R"(key = # INVALID)"sv);
static constexpr auto iarna_key_value_pair_2 = S(R"(first = "Tom" last = "Preston-Werner" # INVALID)"sv);
static constexpr auto iarna_multiple_dot_key = S(R"(# THE FOLLOWING IS INVALID
type = { edible = false } # INVALID)"sv;
static constexpr auto iarna_inline_table_trailing_comma = R"(abc = { abc = 123, })"sv;
static constexpr auto iarna_int_0_padded = R"(int = 0123)"sv;
static constexpr auto iarna_int_signed_bin = R"(bin = +0b10)"sv;
static constexpr auto iarna_int_signed_hex = R"(hex = +0xab)"sv;
static constexpr auto iarna_int_signed_oct = R"(oct = +0o23)"sv;
static constexpr auto iarna_key_value_pair_1 = R"(key = # INVALID)"sv;
static constexpr auto iarna_key_value_pair_2 = R"(first = "Tom" last = "Preston-Werner" # INVALID)"sv;
static constexpr auto iarna_multiple_dot_key = R"(# THE FOLLOWING IS INVALID
# This defines the value of fruit.apple to be an integer.
fruit.apple = 1
# But then this treats fruit.apple like it's a table.
# You can't turn an integer into a table.
fruit.apple.smooth = true)"sv);
static constexpr auto iarna_multiple_key = S(R"(# DO NOT DO THIS
fruit.apple.smooth = true)"sv;
static constexpr auto iarna_multiple_key = R"(# DO NOT DO THIS
name = "Tom"
name = "Pradyun")"sv);
static constexpr auto iarna_no_key_name = S(R"(= "no key name" # INVALID)"sv);
static constexpr auto iarna_string_basic_multiline_invalid_backslash = S(R"(a = """
name = "Pradyun")"sv;
static constexpr auto iarna_no_key_name = R"(= "no key name" # INVALID)"sv;
static constexpr auto iarna_string_basic_multiline_invalid_backslash = R"(a = """
foo \ \n
bar""")"sv);
static constexpr auto iarna_string_basic_multiline_out_of_range_unicode_escape_1 = S(R"(a = """\UFFFFFFFF""")"sv);
static constexpr auto iarna_string_basic_multiline_out_of_range_unicode_escape_2 = S(R"(a = """\U00D80000""")"sv);
static constexpr auto iarna_string_basic_multiline_quotes = S(R"(str5 = """Here are three quotation marks: """.""")"sv);
static constexpr auto iarna_string_basic_multiline_unknown_escape = S(R"(a = """\@""")"sv);
static constexpr auto iarna_string_basic_out_of_range_unicode_escape_1 = S(R"(a = "\UFFFFFFFF")"sv);
static constexpr auto iarna_string_basic_out_of_range_unicode_escape_2 = S(R"(a = "\U00D80000")"sv);
static constexpr auto iarna_string_basic_unknown_escape = S(R"(a = "\@")"sv);
static constexpr auto iarna_string_literal_multiline_quotes = S(R"(apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID)"sv);
static constexpr auto iarna_table_1 = S(R"(# DO NOT DO THIS
bar""")"sv;
static constexpr auto iarna_string_basic_multiline_out_of_range_unicode_escape_1 = R"(a = """\UFFFFFFFF""")"sv;
static constexpr auto iarna_string_basic_multiline_out_of_range_unicode_escape_2 = R"(a = """\U00D80000""")"sv;
static constexpr auto iarna_string_basic_multiline_quotes = R"(str5 = """Here are three quotation marks: """.""")"sv;
static constexpr auto iarna_string_basic_multiline_unknown_escape = R"(a = """\@""")"sv;
static constexpr auto iarna_string_basic_out_of_range_unicode_escape_1 = R"(a = "\UFFFFFFFF")"sv;
static constexpr auto iarna_string_basic_out_of_range_unicode_escape_2 = R"(a = "\U00D80000")"sv;
static constexpr auto iarna_string_basic_unknown_escape = R"(a = "\@")"sv;
static constexpr auto iarna_string_literal_multiline_quotes = R"(apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID)"sv;
static constexpr auto iarna_table_1 = R"(# DO NOT DO THIS
[fruit]
apple = "red"
[fruit]
orange = "orange")"sv);
static constexpr auto iarna_table_2 = S(R"(# DO NOT DO THIS EITHER
orange = "orange")"sv;
static constexpr auto iarna_table_2 = R"(# DO NOT DO THIS EITHER
[fruit]
apple = "red"
[fruit.apple]
texture = "smooth")"sv);
static constexpr auto iarna_table_3 = S(R"([fruit]
texture = "smooth")"sv;
static constexpr auto iarna_table_3 = R"([fruit]
apple.color = "red"
apple.taste.sweet = true
[fruit.apple] # INVALID)"sv);
static constexpr auto iarna_table_4 = S(R"([fruit]
[fruit.apple] # INVALID)"sv;
static constexpr auto iarna_table_4 = R"([fruit]
apple.color = "red"
apple.taste.sweet = true
[fruit.apple.taste] # INVALID)"sv);
static constexpr auto iarna_table_invalid_1 = S(R"([fruit.physical] # subtable, but to which parent element should it belong?
[fruit.apple.taste] # INVALID)"sv;
static constexpr auto iarna_table_invalid_1 = R"([fruit.physical] # subtable, but to which parent element should it belong?
color = "red"
shape = "round"
[[fruit]] # parser must throw an error upon discovering that "fruit" is
# an array rather than a table
name = "apple")"sv);
static constexpr auto iarna_table_invalid_2 = S(R"(# INVALID TOML DOC
name = "apple")"sv;
static constexpr auto iarna_table_invalid_2 = R"(# INVALID TOML DOC
fruit = []
[[fruit]] # Not allowed)"sv);
static constexpr auto iarna_table_invalid_3 = S(R"(# INVALID TOML DOC
[[fruit]] # Not allowed)"sv;
static constexpr auto iarna_table_invalid_3 = R"(# INVALID TOML DOC
[[fruit]]
name = "apple"
@ -713,8 +713,8 @@ fruit = []
[fruit.physical]
color = "red"
shape = "round")"sv);
static constexpr auto iarna_table_invalid_4 = S(R"(# INVALID TOML DOC
shape = "round")"sv;
static constexpr auto iarna_table_invalid_4 = R"(# INVALID TOML DOC
[[fruit]]
name = "apple"
@ -727,7 +727,7 @@ fruit = []
# INVALID: This array of tables conflicts with the previous table
[[fruit.physical]]
color = "green")"sv);
color = "green")"sv;
}
}

View File

@ -26,11 +26,6 @@
#error TOML_EXCEPTIONS does not match TOML_COMPILER_EXCEPTIONS (default behaviour should be to match)
#endif
TOML_PUSH_WARNINGS
TOML_DISABLE_ALL_WARNINGS
#include <ostream>
TOML_POP_WARNINGS
namespace toml
{
using std::declval;

View File

@ -11,7 +11,7 @@ TEST_CASE("arrays - moving")
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(test = [ "foo" ])"sv),
R"(test = [ "foo" ])"sv,
[&](table&& tbl)
{
CHECK(tbl.source().begin == source_position{ 1, 1 });

View File

@ -11,7 +11,7 @@ TEST_CASE("tables - moving")
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(test = { val1 = "foo" })"sv),
R"(test = { val1 = "foo" })"sv,
[&](table&& tbl)
{
CHECK(tbl.source().begin == source_position{ 1, 1 });

View File

@ -9,7 +9,7 @@ TEST_CASE("parsing - arrays")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
integers = [ 1, 2, 3 ]
integers2 = [
1, 2, 3
@ -22,7 +22,7 @@ TEST_CASE("parsing - arrays")
nested_array_of_int = [ [ 1, 2 ], [3, 4, 5] ]
nested_mixed_array = [ [ 1, 2 ], ["a", "b", "c"] ]
string_array = [ "all", 'strings', """are the same""", '''type''' ]
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("integers")].as<array>());
@ -103,14 +103,14 @@ TEST_CASE("parsing - arrays")
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# Mixed-type arrays are allowed
numbers = [ 0.1, 0.2, 0.5, 1, 2, 5 ]
contributors = [
"Foo Bar <foo@example.com>",
{ name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" }
]
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("numbers")].as<array>());

View File

@ -9,10 +9,10 @@ TEST_CASE("parsing - booleans")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
bool1 = true
bool2 = false
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("bool1")] == true);
@ -21,12 +21,12 @@ TEST_CASE("parsing - booleans")
);
// "Always lowercase."
parsing_should_fail(FILE_LINE_ARGS, S("bool = True"sv));
parsing_should_fail(FILE_LINE_ARGS, S("bool = TRUE"sv));
parsing_should_fail(FILE_LINE_ARGS, S("bool = tRUE"sv));
parsing_should_fail(FILE_LINE_ARGS, S("bool = False"sv));
parsing_should_fail(FILE_LINE_ARGS, S("bool = FALSE"sv));
parsing_should_fail(FILE_LINE_ARGS, S("bool = fALSE"sv));
parsing_should_fail(FILE_LINE_ARGS, "bool = True"sv);
parsing_should_fail(FILE_LINE_ARGS, "bool = TRUE"sv);
parsing_should_fail(FILE_LINE_ARGS, "bool = tRUE"sv);
parsing_should_fail(FILE_LINE_ARGS, "bool = False"sv);
parsing_should_fail(FILE_LINE_ARGS, "bool = FALSE"sv);
parsing_should_fail(FILE_LINE_ARGS, "bool = fALSE"sv);
// value tests
parse_expected_value(FILE_LINE_ARGS, " true", true);

View File

@ -9,10 +9,10 @@ TEST_CASE("parsing - comments")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(# This is a full-line comment
R"(# This is a full-line comment
key = "value" # This is a comment at the end of a line
another = "# This is not a comment"
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl.size() == 2);
@ -23,7 +23,7 @@ TEST_CASE("parsing - comments")
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(# this = "looks like a KVP but is commented out)"sv),
R"(# this = "looks like a KVP but is commented out)"sv,
[](table&& tbl)
{
CHECK(tbl.size() == 0);
@ -34,15 +34,15 @@ TEST_CASE("parsing - comments")
{
// toml/issues/567 (disallow non-TAB control characters in comments)
// 00 - 08
parsing_should_fail(FILE_LINE_ARGS, S("# \u0000 some trailing garbage"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0001"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0002"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0003"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0004"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0005"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0006"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0007"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0008"sv));
parsing_should_fail(FILE_LINE_ARGS, "# \u0000 some trailing garbage"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0001"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0002"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0003"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0004"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0005"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0006"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0007"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0008"sv);
// skip tab and line breaks (real and otherwise)
// \u0009 is \t
@ -52,26 +52,26 @@ TEST_CASE("parsing - comments")
// \u000D is \r
// 0E - 1F
parsing_should_fail(FILE_LINE_ARGS, S("# \u000E"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u000F"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0010"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0011"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0012"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0013"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0014"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0015"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0016"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0017"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0018"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u0019"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u001A"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u001B"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u001C"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u001D"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u001E"sv));
parsing_should_fail(FILE_LINE_ARGS, S("# \u001F"sv));
parsing_should_fail(FILE_LINE_ARGS, "# \u000E"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u000F"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0010"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0011"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0012"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0013"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0014"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0015"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0016"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0017"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0018"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u0019"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u001A"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u001B"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u001C"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u001D"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u001E"sv);
parsing_should_fail(FILE_LINE_ARGS, "# \u001F"sv);
// 7F
parsing_should_fail(FILE_LINE_ARGS, S("# \u007F"sv));
parsing_should_fail(FILE_LINE_ARGS, "# \u007F"sv);
}
#else
{

View File

@ -12,7 +12,7 @@ TEST_CASE("parsing - dates and times")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
odt1 = 1979-05-27T07:32:00Z
odt2 = 1979-05-27T00:32:00-07:00
odt3 = 1979-05-27T00:32:00.999999-07:00
@ -22,7 +22,7 @@ TEST_CASE("parsing - dates and times")
ld1 = 1979-05-27
lt1 = 07:32:00
lt2 = 00:32:00.999999
)"sv),
)"sv,
[](table&& tbl)
{
static constexpr auto odt1 = date_time{ { 1979, 5, 27 }, { 7, 32 }, {} };
@ -132,35 +132,35 @@ TEST_CASE("parsing - dates and times")
#endif
// eof tests
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-0"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 10:20:30."sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 10:20:3"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 10:20:"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-0"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 10:20:30."sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 10:20:3"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 10:20:"sv);
#if !TOML_LANG_UNRELEASED // toml/issues/671 (allow omission of seconds)
parsing_should_fail(FILE_LINE_ARGS, S("val = 10:20"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 10:20"sv);
#endif
parsing_should_fail(FILE_LINE_ARGS, S("val = 10:2"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 10:"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 10:2"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 10:"sv);
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:30.04-09:3"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:30.04-09:"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:30.04-09"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:30.04-0"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:30.04-"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:30."sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:3"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20:"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:30.04-09:3"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:30.04-09:"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:30.04-09"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:30.04-0"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:30.04-"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:30."sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:3"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20:"sv);
#if !TOML_LANG_UNRELEASED // toml/issues/671 (allow omission of seconds)
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:20"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:20"sv);
#endif
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:2"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10:"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 10"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1987-03-16 1"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:2"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10:"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 10"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1987-03-16 1"sv);
}
TOML_POP_WARNINGS

View File

@ -11,7 +11,7 @@ TEST_CASE("parsing - floats")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# fractional
flt1 = +1.0
flt2 = 3.1415
@ -26,7 +26,7 @@ TEST_CASE("parsing - floats")
flt7 = 6.626e-34
flt8 = 224_617.445_991_228
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("flt1")] == 1.0);
@ -41,14 +41,14 @@ TEST_CASE("parsing - floats")
);
// "Each underscore must be surrounded by at least one digit on each side."
parsing_should_fail(FILE_LINE_ARGS, S("flt8 = 224_617.445_991_228_"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt8 = _224_617.445_991_228"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt8 = 224__617.445_991_228"sv));
parsing_should_fail(FILE_LINE_ARGS, "flt8 = 224_617.445_991_228_"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt8 = _224_617.445_991_228"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt8 = 224__617.445_991_228"sv);
// "Float values -0.0 and +0.0 are valid and should map according to IEEE 754."
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(zeroes = [-0.0, +0.0])"sv),
R"(zeroes = [-0.0, +0.0])"sv,
[](table&& tbl)
{
CHECK(tbl[S("zeroes")][0] == -0.0);
@ -58,32 +58,32 @@ TEST_CASE("parsing - floats")
// "A float consists of an integer part followed by a fractional part and/or an exponent part"
// (i.e. omitting the leading digits before the '.' is not legal in TOML)
parsing_should_fail(FILE_LINE_ARGS, S("flt = .1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +.1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -.1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = .1e1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = .1e+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = .1e-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +.1e1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +.1e+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +.1e-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -.1e1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -.1e+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -.1e-1"sv));
parsing_should_fail(FILE_LINE_ARGS, "flt = .1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +.1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -.1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = .1e1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = .1e+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = .1e-1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +.1e1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +.1e+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +.1e-1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -.1e1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -.1e+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -.1e-1"sv);
// likewise, so is omitting digits _after_ the '.'
parsing_should_fail(FILE_LINE_ARGS, S("flt = 1."sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +1."sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -1."sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = 1.e1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = 1.e+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = 1.e-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +1.e1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +1.e+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = +1.e-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -1.e1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -1.e+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("flt = -1.e-1"sv));
parsing_should_fail(FILE_LINE_ARGS, "flt = 1."sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +1."sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -1."sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = 1.e1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = 1.e+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = 1.e-1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +1.e1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +1.e+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = +1.e-1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -1.e1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -1.e+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "flt = -1.e-1"sv);
// value tests
parse_expected_value( FILE_LINE_ARGS, "1e1"sv, 1e1);
@ -162,24 +162,24 @@ TEST_CASE("parsing - floats")
parse_expected_value(FILE_LINE_ARGS, " -0x10.1p+1"sv, -0x10.1p+1);
parse_expected_value(FILE_LINE_ARGS, " +0x10.1p-1"sv, +0x10.1p-1);
#else
parsing_should_fail(FILE_LINE_ARGS, S(" val = 0x10p1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 0x10p-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 0x10p+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -0x10p1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -0x10p-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +0x10p1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +0x10p+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -0x10p+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +0x10p-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 0x10.1p1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 0x10.1p-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 0x10.1p+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -0x10.1p1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -0x10.1p-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +0x10.1p1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +0x10.1p+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -0x10.1p+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +0x10.1p-1"sv));
parsing_should_fail(FILE_LINE_ARGS, " val = 0x10p1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 0x10p-1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 0x10p+1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -0x10p1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -0x10p-1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +0x10p1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +0x10p+1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -0x10p+1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +0x10p-1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 0x10.1p1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 0x10.1p-1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 0x10.1p+1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -0x10.1p1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -0x10.1p-1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +0x10.1p1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +0x10.1p+1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -0x10.1p+1"sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +0x10.1p-1"sv);
#endif
}
@ -187,7 +187,7 @@ TEST_CASE("parsing - inf and nan")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# infinity
sf1 = inf # positive infinity
sf2 = +inf # positive infinity
@ -197,7 +197,7 @@ TEST_CASE("parsing - inf and nan")
sf4 = nan # actual sNaN/qNaN encoding is implementation specific
sf5 = +nan # same as `nan`
sf6 = -nan # valid, actual encoding is implementation specific
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("sf1")] == std::numeric_limits<double>::infinity());
@ -209,36 +209,36 @@ TEST_CASE("parsing - inf and nan")
}
);
parsing_should_fail(FILE_LINE_ARGS, S(" val = NaN "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = Nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = NAN "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +NaN "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +Nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +NAN "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -NaN "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -Nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -NAN "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 1.nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 1,nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = .nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = ,nan "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = nan.1 "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = nan,1 "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = nan. "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = nan, "sv));
parsing_should_fail(FILE_LINE_ARGS, " val = NaN "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = Nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = NAN "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +NaN "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +Nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +NAN "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -NaN "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -Nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -NAN "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 1.nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 1,nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = .nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = ,nan "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = nan.1 "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = nan,1 "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = nan. "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = nan, "sv);
parsing_should_fail(FILE_LINE_ARGS, S(" val = Inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = INF "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +Inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = +INF "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -Inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = -INF "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 1.inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = 1,inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = .inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = ,inf "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = inf.1 "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = inf,1 "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = inf. "sv));
parsing_should_fail(FILE_LINE_ARGS, S(" val = inf, "sv));
parsing_should_fail(FILE_LINE_ARGS, " val = Inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = INF "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +Inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = +INF "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -Inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = -INF "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 1.inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = 1,inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = .inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = ,inf "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = inf.1 "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = inf,1 "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = inf. "sv);
parsing_should_fail(FILE_LINE_ARGS, " val = inf, "sv);
}

View File

@ -9,7 +9,7 @@ TEST_CASE("parsing - integers (decimal)")
{
parsing_should_succeed(
FILE_LINE_ARGS,
BOM_PREFIX S(R"(
BOM_PREFIX R"(
int1 = +99
int2 = 42
int3 = 0
@ -17,7 +17,7 @@ TEST_CASE("parsing - integers (decimal)")
int5 = 1_000
int6 = 5_349_221
int7 = 1_2_3_4_5 # VALID but discouraged
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("int1")] == 99);
@ -31,23 +31,23 @@ TEST_CASE("parsing - integers (decimal)")
);
// "Each underscore must be surrounded by at least one digit on each side."
parsing_should_fail(FILE_LINE_ARGS, S("int5 = 1__000"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int5 = _1_000"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int5 = 1_000_"sv));
parsing_should_fail(FILE_LINE_ARGS, "int5 = 1__000"sv);
parsing_should_fail(FILE_LINE_ARGS, "int5 = _1_000"sv);
parsing_should_fail(FILE_LINE_ARGS, "int5 = 1_000_"sv);
// "Leading zeroes are not allowed."
parsing_should_fail(FILE_LINE_ARGS, S("int1 = +099"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int2 = 042"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int3 = 00"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int4 = -017"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int5 = 01_000"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int6 = 05_349_221"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int7 = 01_2_3_4_5"sv));
parsing_should_fail(FILE_LINE_ARGS, "int1 = +099"sv);
parsing_should_fail(FILE_LINE_ARGS, "int2 = 042"sv);
parsing_should_fail(FILE_LINE_ARGS, "int3 = 00"sv);
parsing_should_fail(FILE_LINE_ARGS, "int4 = -017"sv);
parsing_should_fail(FILE_LINE_ARGS, "int5 = 01_000"sv);
parsing_should_fail(FILE_LINE_ARGS, "int6 = 05_349_221"sv);
parsing_should_fail(FILE_LINE_ARGS, "int7 = 01_2_3_4_5"sv);
// "Integer values -0 and +0 are valid and identical to an unprefixed zero."
parsing_should_succeed(
FILE_LINE_ARGS,
S("zeroes = [-0, +0]"sv),
"zeroes = [-0, +0]"sv,
[](table&& tbl)
{
CHECK(tbl[S("zeroes")][0] == 0);
@ -56,20 +56,20 @@ TEST_CASE("parsing - integers (decimal)")
);
// "64 bit (signed long) range expected (9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)."
parse_expected_value(FILE_LINE_ARGS, "9223372036854775807"sv, INT64_MAX);
parse_expected_value(FILE_LINE_ARGS, "-9223372036854775808"sv, INT64_MIN);
parsing_should_fail(FILE_LINE_ARGS, S("val = 9223372036854775808"sv)); // INT64_MAX + 1
parsing_should_fail(FILE_LINE_ARGS, S("val = -9223372036854775809"sv)); // INT64_MIN - 1
parse_expected_value(FILE_LINE_ARGS, "9223372036854775807"sv, INT64_MAX);
parse_expected_value(FILE_LINE_ARGS, "-9223372036854775808"sv, INT64_MIN);
parsing_should_fail(FILE_LINE_ARGS, "val = 9223372036854775808"sv); // INT64_MAX + 1
parsing_should_fail(FILE_LINE_ARGS, "val = -9223372036854775809"sv); // INT64_MIN - 1
// signs in weird places
parsing_should_fail(FILE_LINE_ARGS, S("val = +-1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = -+1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = ++1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = --1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1-"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 1+"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = -1+"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = +1-"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = +-1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = -+1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = ++1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = --1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1-"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 1+"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = -1+"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = +1-"sv);
// value tests
parse_expected_value(FILE_LINE_ARGS, "0"sv, 0);
@ -89,7 +89,7 @@ TEST_CASE("parsing - integers (hex, bin, oct)")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# hexadecimal with prefix `0x`
hex1 = 0xDEADBEEF
hex2 = 0xdeadbeef
@ -101,7 +101,7 @@ TEST_CASE("parsing - integers (hex, bin, oct)")
# binary with prefix `0b`
bin1 = 0b11010110
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("hex1")] == 0xDEADBEEF);
@ -114,25 +114,25 @@ TEST_CASE("parsing - integers (hex, bin, oct)")
);
// "leading + is not allowed"
parsing_should_fail(FILE_LINE_ARGS, S("hex1 = +0xDEADBEEF"sv));
parsing_should_fail(FILE_LINE_ARGS, S("hex2 = +0xdeadbeef"sv));
parsing_should_fail(FILE_LINE_ARGS, S("hex3 = +0xdead_beef"sv));
parsing_should_fail(FILE_LINE_ARGS, S("oct1 = +0o01234567"sv));
parsing_should_fail(FILE_LINE_ARGS, S("oct2 = +0o7550"sv));
parsing_should_fail(FILE_LINE_ARGS, S("int6 = +05_349_221"sv));
parsing_should_fail(FILE_LINE_ARGS, S("bin1 = +0b11010110"sv));
parsing_should_fail(FILE_LINE_ARGS, "hex1 = +0xDEADBEEF"sv);
parsing_should_fail(FILE_LINE_ARGS, "hex2 = +0xdeadbeef"sv);
parsing_should_fail(FILE_LINE_ARGS, "hex3 = +0xdead_beef"sv);
parsing_should_fail(FILE_LINE_ARGS, "oct1 = +0o01234567"sv);
parsing_should_fail(FILE_LINE_ARGS, "oct2 = +0o7550"sv);
parsing_should_fail(FILE_LINE_ARGS, "int6 = +05_349_221"sv);
parsing_should_fail(FILE_LINE_ARGS, "bin1 = +0b11010110"sv);
// "leading zeros are allowed (after the prefix)"
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
hex1 = 0x000DEADBEEF
hex2 = 0x00000deadbeef
hex3 = 0x0dead_beef
oct1 = 0o0001234567
oct2 = 0o000755
bin1 = 0b0000011010110
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("hex1")] == 0xDEADBEEF);
@ -145,18 +145,18 @@ TEST_CASE("parsing - integers (hex, bin, oct)")
);
// "***Non-negative*** integer values may also be expressed in hexadecimal, octal, or binary"
parsing_should_fail(FILE_LINE_ARGS, S("val = -0x1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = -0o1"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = -0b1"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = -0x1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = -0o1"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = -0b1"sv);
// "64 bit (signed long) range expected (9,223,372,036,854,775,808 to 9,223,372,036,854,775,807)."
// (ignoring INT64_MIN because toml doesn't allow these forms to represent negative values)
parse_expected_value(FILE_LINE_ARGS, "0x7FFFFFFFFFFFFFFF"sv, INT64_MAX);
parse_expected_value(FILE_LINE_ARGS, "0o777777777777777777777"sv, INT64_MAX);
parse_expected_value(FILE_LINE_ARGS, "0b111111111111111111111111111111111111111111111111111111111111111"sv, INT64_MAX);
parsing_should_fail(FILE_LINE_ARGS, S("val = 0x8000000000000000"sv)); // INT64_MAX + 1
parsing_should_fail(FILE_LINE_ARGS, S("val = 0o1000000000000000000000"sv));
parsing_should_fail(FILE_LINE_ARGS, S("val = 0b1000000000000000000000000000000000000000000000000000000000000000"sv));
parsing_should_fail(FILE_LINE_ARGS, "val = 0x8000000000000000"sv); // INT64_MAX + 1
parsing_should_fail(FILE_LINE_ARGS, "val = 0o1000000000000000000000"sv);
parsing_should_fail(FILE_LINE_ARGS, "val = 0b1000000000000000000000000000000000000000000000000000000000000000"sv);
// value tests
parse_expected_value(FILE_LINE_ARGS, "0xDEADBEEF"sv, 0xDEADBEEF);

View File

@ -9,13 +9,13 @@ TEST_CASE("parsing - key-value pairs")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
key = "value"
bare_key = "value"
bare-key = "value"
1234 = "value"
"" = "blank"
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl.size() == 5);
@ -27,18 +27,18 @@ TEST_CASE("parsing - key-value pairs")
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(key = # INVALID)"sv));
parsing_should_fail(FILE_LINE_ARGS, R"(key = # INVALID)"sv);
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
"127.0.0.1" = "value"
"character encoding" = "value"
"ʎǝʞ" = "value"
'key2' = "value"
'quoted "value"' = "value"
'' = 'blank'
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("127.0.0.1")] == S("value"sv));
@ -50,26 +50,26 @@ TEST_CASE("parsing - key-value pairs")
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(= "no key name")"sv));
parsing_should_fail(FILE_LINE_ARGS, R"(= "no key name")"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# DO NOT DO THIS
name = "Tom"
name = "Pradyun"
)"sv));
)"sv);
}
TEST_CASE("parsing - key-value pairs (dotted)")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
name = "Orange"
physical.color = "orange"
physical.shape = "round"
site."google.com" = true
3.14159 = "pi"
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl.size() == 4);
@ -84,10 +84,10 @@ TEST_CASE("parsing - key-value pairs (dotted)")
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
fruit.apple.smooth = true
fruit.orange = 2
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("fruit")][S("apple")][S("smooth")] == true);
@ -95,15 +95,15 @@ TEST_CASE("parsing - key-value pairs (dotted)")
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# THIS IS INVALID
fruit.apple = 1
fruit.apple.smooth = true
)"sv));
)"sv);
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# VALID BUT DISCOURAGED
apple.type = "fruit"
@ -114,7 +114,7 @@ TEST_CASE("parsing - key-value pairs (dotted)")
apple.color = "red"
orange.color = "orange"
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("apple")][S("type")] == S("fruit"sv));
@ -128,7 +128,7 @@ TEST_CASE("parsing - key-value pairs (dotted)")
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# RECOMMENDED
apple.type = "fruit"
@ -138,7 +138,7 @@ TEST_CASE("parsing - key-value pairs (dotted)")
orange.type = "fruit"
orange.skin = "thick"
orange.color = "orange"
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("apple")][S("type")] == S("fruit"sv));
@ -154,10 +154,10 @@ TEST_CASE("parsing - key-value pairs (dotted)")
#if TOML_LANG_UNRELEASED
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
key+1 = 0
ʎǝʞ2 = 0
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl.size() == 2);
@ -177,222 +177,222 @@ TEST_CASE("parsing - key-value pairs (string keys)")
// https://github.com/toml-lang/toml/issues/733.
// whitespace stripped, fail duplicate keys
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
a = 2
a = 3
)"sv));
)"sv);
// only surrounding whitespace is stripped, fail: illegal key name or syntax error
parsing_should_fail(FILE_LINE_ARGS, S("a b = 3"sv));
parsing_should_fail(FILE_LINE_ARGS, "a b = 3"sv);
// whitespace is allowed when quoted, fail duplicate key
parsing_should_succeed(FILE_LINE_ARGS, S("\"a b\" = 3"sv));
parsing_should_succeed(FILE_LINE_ARGS, S("'a b' = 3"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, "\"a b\" = 3"sv);
parsing_should_succeed(FILE_LINE_ARGS, "'a b' = 3"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
"a b" = 3
'a b' = 3
)"sv));
)"sv);
// whitespace is allowed when quoted, but not collapsed, success
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
"a b" = 3
'a b' = 3
)"sv));
)"sv);
// whitespace relevant, but fail: duplicate key
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
"a " = 2
'a ' = 3
)"sv));
)"sv);
// whitespace relevant, and not collapsed, success
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
"a " = 2
"a " = 3
)"sv));
)"sv);
// whitespace can be escaped, success, different keys (whitespace escapes are not normalized)
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
"a\n" = 2
"a\r" = 3
"a\t" = 3
"a\f" = 3
)"sv));
)"sv);
// valid keys composed of various string/non-string mixes types
parsing_should_succeed(FILE_LINE_ARGS, S(R"(a = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"('a' = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("a" = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"(a.b = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"('a'.b = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("a".b = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"(a.'b' = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"('a'.'b' = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("a".'b' = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"(a."b" = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"('a'."b" = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("a"."b" = 3)"sv));
parsing_should_succeed(FILE_LINE_ARGS, R"(a = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"('a' = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("a" = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"(a.b = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"('a'.b = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("a".b = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"(a.'b' = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"('a'.'b' = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("a".'b' = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"(a."b" = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"('a'."b" = 3)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("a"."b" = 3)"sv);
// multi-line strings can't be used in keys
parsing_should_fail(FILE_LINE_ARGS, S(R"('''a''' = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"("""a""" = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(a.'''b''' = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(a."""b""" = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, R"('''a''' = 3)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"("""a""" = 3)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(a.'''b''' = 3)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(a."""b""" = 3)"sv);
// whitespace relevant (success test, values are NOTE equal)
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
a = " to do "
b = "to do"
)"sv), [](table&& tbl)
)"sv, [](table&& tbl)
{
CHECK(tbl[S("a")] == S(" to do "sv));
CHECK(tbl[S("b")] == S("to do"sv));
});
// values must be quoted, syntax error
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
a = to do
b = todo
)"sv));
)"sv);
// different quotes, fail duplicate keys
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
a = 2
'a' = 2
)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
'a' = 2
"a" = 2
)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
'a' = 2
"""a""" = 2
)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
'''a''' = 2
"""a""" = 2
)"sv));
)"sv);
// success test, capital not equal to small
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
a = 2
A = 3
)"sv));
)"sv);
// inner quotes are not stripped from value, a & b are equal, value surrounded by quotes
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
a = "\"quoted\""
b = """"quoted""""
)"sv), [](table&& tbl)
)"sv, [](table&& tbl)
{
CHECK(tbl[S("a")] == S("\"quoted\""sv));
CHECK(tbl[S("b")] == S("\"quoted\""sv));
});
// quote correction is not applied, fail syntax error
parsing_should_fail(FILE_LINE_ARGS, S(R"("a = "test")"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"('a = 'test')"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"("a = 'test")"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"('a = "test')"sv));
parsing_should_fail(FILE_LINE_ARGS, R"("a = "test")"sv);
parsing_should_fail(FILE_LINE_ARGS, R"('a = 'test')"sv);
parsing_should_fail(FILE_LINE_ARGS, R"("a = 'test")"sv);
parsing_should_fail(FILE_LINE_ARGS, R"('a = "test')"sv);
// quotes cannot appear in keys this way, fail syntax error
parsing_should_fail(FILE_LINE_ARGS, S(R"("a'b = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"("a"b = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, R"("a'b = 3)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"("a"b = 3)"sv);
// escaped quotes and single quotes can appear this way, fail duplicate keys
parsing_should_succeed(FILE_LINE_ARGS, S(R"("a'b" = 2)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("a\u0027b" = 4)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"("a'b" = 2)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("a\u0027b" = 4)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
"a'b" = 2
"a\u0027b" = 4
)"sv));
)"sv);
// literal strings, escapes are not escaped, success, since keys are valid and not equal
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
'a"b' = 2
'a\"b' = 4
)"sv));
)"sv);
// escapes must be compared after unescaping, fail duplicate key
parsing_should_succeed(FILE_LINE_ARGS, S(R"(a = 1)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("\u0061" = 2)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(a = 1)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("\u0061" = 2)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
a = 1
"\u0061" = 2
)"sv));
)"sv);
// escaping requires quotes, syntax error
parsing_should_fail(FILE_LINE_ARGS, S(R"(\u0061 = 2)"sv));
parsing_should_fail(FILE_LINE_ARGS, R"(\u0061 = 2)"sv);
// empty keys are allowed, but can only appear once, fail duplicate key
parsing_should_succeed(FILE_LINE_ARGS, S(R"("" = 2)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"('' = 3)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"("" = 2)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"('' = 3)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
"" = 2
'' = 3
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, fail duplicate key
parsing_should_succeed(FILE_LINE_ARGS, S(R"(1234 = 5)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("1234" = 5)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(1234 = 5)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("1234" = 5)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
1234 = 5
"1234" = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, fail duplicate key
parsing_should_succeed(FILE_LINE_ARGS, S(R"(1234 = 5)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"('1234' = 5)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(1234 = 5)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"('1234' = 5)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
1234 = 5
'1234' = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, valid, different keys
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
1234 = 5
01234 = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, valid, different keys
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
12e3 = 4
12000 = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, valid, different keys, one dotted
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
1.2e3 = 4
1200 = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, success, cause one is dotted
parsing_should_succeed(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(
1.2e3 = 4
"1.2e3" = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, fail duplicate keys
parsing_should_succeed(FILE_LINE_ARGS, S(R"(12e3 = 4)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("12e3" = 5)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(12e3 = 4)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("12e3" = 5)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
12e3 = 4
"12e3" = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, fail duplicate dotted keys
parsing_should_succeed(FILE_LINE_ARGS, S(R"(1.2e3 = 4)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"(1."2e3" = 5)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(1.2e3 = 4)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"(1."2e3" = 5)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
1.2e3 = 4
1."2e3" = 5
)"sv));
)"sv);
// bare keys can be numerals, but are interpreted as strings, fail duplicate dotted keys
parsing_should_succeed(FILE_LINE_ARGS, S(R"(1.2e3 = 4)"sv));
parsing_should_succeed(FILE_LINE_ARGS, S(R"("1".2e3 = 5)"sv));
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_succeed(FILE_LINE_ARGS, R"(1.2e3 = 4)"sv);
parsing_should_succeed(FILE_LINE_ARGS, R"("1".2e3 = 5)"sv);
parsing_should_fail(FILE_LINE_ARGS, R"(
1.2e3 = 4
"1".2e3 = 5
)"sv));
)"sv);
}

View File

@ -10,7 +10,7 @@ TOML_DISABLE_INIT_WARNINGS
TEST_CASE("parsing - TOML spec example")
{
static constexpr auto toml_text = S(R"(
static constexpr auto toml_text = R"(
# This is a TOML document.
title = "TOML Example"
@ -44,7 +44,7 @@ TEST_CASE("parsing - TOML spec example")
"alpha",
"omega"
]
)"sv);
)"sv;
parsing_should_succeed(
FILE_LINE_ARGS,

View File

@ -9,7 +9,7 @@ TEST_CASE("parsing - strings")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
str = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
str1 = """
@ -20,7 +20,7 @@ str2 = """
Roses are red
Violets are blue"""
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("str")] == S("I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."sv));
@ -31,7 +31,7 @@ Violets are blue"""
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# The following strings are byte-for-byte equivalent:
str1 = "The quick brown fox jumps over the lazy dog."
@ -55,7 +55,7 @@ str6 = """Here are fifteen quotation marks: ""\"""\"""\"""\"""\"."""
# "This," she said, "is just a pointless statement."
str7 = """"This," she said, "is just a pointless statement.""""
)"sv),
)"sv,
[](table&& tbl)
{
static constexpr auto quick_brown_fox = S("The quick brown fox jumps over the lazy dog."sv);
@ -69,11 +69,11 @@ str7 = """"This," she said, "is just a pointless statement.""""
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(str5 = """Here are three quotation marks: """.""")"sv));
parsing_should_fail(FILE_LINE_ARGS, R"(str5 = """Here are three quotation marks: """.""")"sv);
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# What you see is what you get.
winpath = 'C:\Users\nodejs\templates'
winpath2 = '\\ServerX\admin$\system32\'
@ -93,7 +93,7 @@ trimmed in raw strings.
All other whitespace
is preserved.
'''
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("winpath")] == S(R"(C:\Users\nodejs\templates)"sv));
@ -117,7 +117,7 @@ trimmed in raw strings.
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
quot15 = '''Here are fifteen quotation marks: """""""""""""""'''
# apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID
@ -125,7 +125,7 @@ apos15 = "Here are fifteen apostrophes: '''''''''''''''"
# 'That's still pointless', she said.
str = ''''That's still pointless', she said.'''
)"sv),
)"sv,
[](table&& tbl)
{
CHECK(tbl[S("quot15")] == S(R"(Here are fifteen quotation marks: """"""""""""""")"sv));
@ -134,7 +134,7 @@ str = ''''That's still pointless', she said.'''
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID)"sv));
parsing_should_fail(FILE_LINE_ARGS, R"(apos15 = '''Here are fifteen apostrophes: '''''''''''''''''' # INVALID)"sv);
// value tests
parse_expected_value(

View File

@ -9,7 +9,7 @@ TEST_CASE("parsing - tables")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
[table]
[table-1]
@ -42,7 +42,7 @@ apple.taste.sweet = true
[fruit.apple.texture] # you can add sub-tables
smooth = true
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("table")].as<table>());
@ -89,7 +89,7 @@ smooth = true
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# DO NOT DO THIS
[fruit]
@ -97,9 +97,9 @@ apple = "red"
[fruit]
orange = "orange"
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# DO NOT DO THIS EITHER
[fruit]
@ -107,32 +107,32 @@ apple = "red"
[fruit.apple]
texture = "smooth"
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
[fruit]
apple.color = "red"
apple.taste.sweet = true
[fruit.apple]
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
[fruit]
apple.color = "red"
apple.taste.sweet = true
[fruit.apple.taste]
)"sv));
)"sv);
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# VALID BUT DISCOURAGED
[fruit.apple]
[animal]
[fruit.orange]
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("animal")].as<table>());
@ -149,12 +149,12 @@ apple.taste.sweet = true
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
# RECOMMENDED
[fruit.apple]
[fruit.orange]
[animal]
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("animal")].as<table>());
@ -168,21 +168,21 @@ apple.taste.sweet = true
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"([])"sv));
parsing_should_fail(FILE_LINE_ARGS, R"([])"sv);
}
TEST_CASE("parsing - inline tables")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
name = { first = "Tom", last = "Preston-Werner" }
point = { x = 1, y = 2 }
animal = { type.name = "pug" }
[product]
type = { name = "Nail" }
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("name")].as<table>());
@ -209,27 +209,27 @@ type = { name = "Nail" }
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
[product]
type = { name = "Nail" }
type.edible = false # INVALID
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
[product]
type.name = "Nail"
type = { edible = false } # INVALID
)"sv));
)"sv);
// "newlines are allowed between the curly braces [if] they are valid within a value."
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
test = { val1 = "foo", val2 = [
1, 2,
3
], val3 = "bar" }
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("test")].as<table>());
@ -249,12 +249,12 @@ test = { val1 = "foo", val2 = [
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
name = {
first = "Tom",
last = "Preston-Werner",
}
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("name")].as<table>());
@ -268,15 +268,15 @@ name = {
#else
{
// "A terminating comma (also called trailing comma) is not permitted after the last key/value pair in an inline table."
parsing_should_fail(FILE_LINE_ARGS, S(R"(name = { first = "Tom", last = "Preston-Werner", })"sv));
parsing_should_fail(FILE_LINE_ARGS, R"(name = { first = "Tom", last = "Preston-Werner", })"sv);
// "No newlines are allowed between the curly braces unless they are valid within a value."
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
name = {
first = "Tom",
last = "Preston-Werner"
}
)"sv));
)"sv);
}
#endif
@ -287,7 +287,7 @@ TEST_CASE("parsing - arrays-of-tables")
{
parsing_should_succeed(
FILE_LINE_ARGS,
S(R"(
R"(
points = [ { x = 1, y = 2, z = 3 },
{ x = 7, y = 8, z = 9 },
{ x = 2, y = 4, z = 8 } ]
@ -323,7 +323,7 @@ color = "gray"
[[fruit.variety]]
name = "plantain"
)"sv),
)"sv,
[](table&& tbl)
{
REQUIRE(tbl[S("points")].as<array>());
@ -393,7 +393,7 @@ color = "gray"
}
);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# INVALID TOML DOC
[fruit.physical] # subtable, but to which parent element should it belong?
color = "red"
@ -402,16 +402,16 @@ color = "gray"
[[fruit]] # parser must throw an error upon discovering that "fruit" is
# an array rather than a table
name = "apple"
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# INVALID TOML DOC
fruit = []
[[fruit]] # Not allowed
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# INVALID TOML DOC
[[fruit]]
name = "apple"
@ -422,9 +422,9 @@ fruit = []
# INVALID: This table conflicts with the previous array of tables
[fruit.variety]
name = "granny smith"
)"sv));
)"sv);
parsing_should_fail(FILE_LINE_ARGS, S(R"(
parsing_should_fail(FILE_LINE_ARGS, R"(
# INVALID TOML DOC
[[fruit]]
name = "apple"
@ -436,6 +436,6 @@ fruit = []
# INVALID: This array of tables conflicts with the previous table
[[fruit.physical]]
color = "green"
)"sv));
)"sv);
}

View File

@ -5,6 +5,181 @@
#include "tests.h"
bool parsing_should_succeed(
std::string_view test_file,
uint32_t test_line,
std::string_view toml_str,
pss_func&& func,
std::string_view source_path)
{
INFO("["sv << test_file << ", line "sv << test_line << "] "sv << "parsing_should_succeed(\""sv << toml_str << "\")"sv)
constexpr auto validate_table = [](table&& tabl, std::string_view path) -> table&&
{
INFO("Validating table source information"sv)
CHECK(tabl.source().begin != source_position{});
CHECK(tabl.source().end != source_position{});
if (path.empty())
CHECK(tabl.source().path == nullptr);
else
{
REQUIRE(tabl.source().path != nullptr);
CHECK(*tabl.source().path == path);
}
return std::move(tabl);
};
#if TOML_EXCEPTIONS
try
{
{
INFO("Parsing string directly"sv)
if (func)
func(validate_table(toml::parse(toml_str, source_path), source_path));
else
validate_table(toml::parse(toml_str, source_path), source_path);
}
{
INFO("Parsing from a string stream"sv)
std::stringstream ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
if (func)
func(validate_table(toml::parse(ss, source_path), source_path));
else
validate_table(toml::parse(ss, source_path), source_path);
}
}
catch (const parse_error& err)
{
FORCE_FAIL(
"Parse error on line "sv << err.source().begin.line
<< ", column "sv << err.source().begin.column
<< ":\n"sv << err.description()
);
return false;
}
#else
{
INFO("Parsing string directly"sv)
parse_result result = toml::parse(toml_str, source_path);
if (result)
{
if (func)
func(validate_table(std::move(result), source_path));
else
validate_table(std::move(result), source_path);
}
else
{
FORCE_FAIL(
"Parse error on line "sv << result.error().source().begin.line
<< ", column "sv << result.error().source().begin.column
<< ":\n"sv << result.error().description()
);
}
}
{
INFO("Parsing from a string stream"sv)
std::stringstream ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
parse_result result = toml::parse(ss, source_path);
if (result)
{
if (func)
func(validate_table(std::move(result), source_path));
else
validate_table(std::move(result), source_path);
}
else
{
FORCE_FAIL(
"Parse error on line "sv << result.error().source().begin.line
<< ", column "sv << result.error().source().begin.column
<< ":\n"sv << result.error().description()
);
}
}
#endif
return true;
}
bool parsing_should_fail(
std::string_view test_file,
uint32_t test_line,
std::string_view toml_str)
{
INFO("["sv << test_file << ", line "sv << test_line << "] "sv << "parsing_should_fail(\""sv << toml_str << "\")"sv)
#if TOML_EXCEPTIONS
static constexpr auto run_tests = [](auto&& fn)
{
try
{
fn();
}
catch (const parse_error&)
{
SUCCEED("parse_error thrown OK"sv);
return true;
}
catch (const std::exception& exc)
{
FORCE_FAIL("Expected parsing failure, saw exception: "sv << exc.what());
return false;
}
catch (...)
{
FORCE_FAIL("Expected parsing failure, saw unspecified exception"sv);
return false;
}
FORCE_FAIL("Expected parsing failure"sv);
return false;
};
auto result = run_tests([=]()
{
[[maybe_unused]] auto res = toml::parse(toml_str);
});
result = result && run_tests([=]()
{
std::stringstream ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
[[maybe_unused]] auto res = toml::parse(ss);
});
return result;
#else
static constexpr auto run_tests = [](auto&& fn)
{
if (parse_result result = fn(); !result)
{
SUCCEED("parse_error generated OK"sv);
return true;
}
FORCE_FAIL("Expected parsing failure"sv);
};
return run_tests([=]() { return toml::parse(toml_str); })
&& run_tests([=]()
{
std::stringstream ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
return toml::parse(ss);
});
#endif
}
template bool parse_expected_value(std::string_view, uint32_t, std::string_view, const int&);
template bool parse_expected_value(std::string_view, uint32_t, std::string_view, const unsigned int&);
template bool parse_expected_value(std::string_view, uint32_t, std::string_view, const bool&);

View File

@ -17,11 +17,13 @@
TOML_PUSH_WARNINGS
TOML_DISABLE_ALL_WARNINGS
#include "catch2.h"
#include <sstream>
namespace toml {}
using namespace Catch::literals;
using namespace toml;
TOML_POP_WARNINGS
#define FILE_LINE_ARGS std::string_view{ __FILE__ }, __LINE__
@ -41,194 +43,58 @@ TOML_POP_WARNINGS
while (false)
#endif
// function_view - adapted from here: https://vittorioromeo.info/index/blog/passing_functions_to_functions.html
template <typename Func>
class function_view;
template <typename R, typename... P>
class function_view<R(P...)> final
{
private:
using func_type = R(P...);
using eraser_func_type = R(void*, P&&...);
mutable void* ptr_ = {};
mutable eraser_func_type* eraser = {};
public:
function_view() noexcept = default;
template <typename T>
function_view(T&& x) noexcept
: ptr_{ reinterpret_cast<void*>(std::addressof(x)) }
{
eraser = [](void* ptr, P&&... xs) -> R
{
return (*reinterpret_cast<std::add_pointer_t<std::remove_reference_t<T>>>(ptr))(std::forward<P>(xs)...);
};
}
decltype(auto) operator()(P&&... xs) const
{
return eraser(ptr_, std::forward<P>(xs)...);
}
[[nodiscard]] operator bool() const noexcept { return !!ptr_; }
};
using pss_func = function_view<void(toml::table&&)>;
bool parsing_should_succeed(
std::string_view test_file,
uint32_t test_line,
std::string_view toml_str,
pss_func&& func = {},
std::string_view source_path = {});
bool parsing_should_fail(
std::string_view test_file,
uint32_t test_line,
std::string_view toml_str);
TOML_PUSH_WARNINGS
TOML_DISABLE_FLOAT_WARNINGS
template <typename Char, typename Func = std::false_type>
inline bool parsing_should_succeed(
std::string_view test_file,
uint32_t test_line,
std::basic_string_view<Char> toml_str,
Func&& func = {},
std::string_view source_path = {})
{
INFO(
"["sv << test_file << ", line "sv << test_line << "] "sv
<< "parsing_should_succeed(\""sv << std::string_view(reinterpret_cast<const char*>(toml_str.data()), toml_str.length()) << "\")"sv
)
constexpr auto validate_table = [](table&& tabl, std::string_view path) -> table&&
{
INFO("Validating table source information"sv)
CHECK(tabl.source().begin != source_position{});
CHECK(tabl.source().end != source_position{});
if (path.empty())
CHECK(tabl.source().path == nullptr);
else
{
REQUIRE(tabl.source().path != nullptr);
CHECK(*tabl.source().path == path);
}
return std::move(tabl);
};
static constexpr auto is_functor = !std::is_same_v<impl::remove_cvref_t<Func>, std::false_type>;
#if TOML_EXCEPTIONS
try
{
{
INFO("Parsing string directly"sv)
if constexpr (is_functor)
std::forward<Func>(func)(validate_table(toml::parse(toml_str, source_path), source_path));
else
validate_table(toml::parse(toml_str, source_path), source_path);
}
{
INFO("Parsing from a string stream"sv)
std::basic_stringstream<Char, std::char_traits<Char>, std::allocator<Char>> ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
if constexpr (is_functor)
std::forward<Func>(func)(validate_table(toml::parse(ss, source_path), source_path));
else
validate_table(toml::parse(ss, source_path), source_path);
}
}
catch (const parse_error& err)
{
FORCE_FAIL(
"Parse error on line "sv << err.source().begin.line
<< ", column "sv << err.source().begin.column
<< ":\n"sv << err.description()
);
return false;
}
#else
{
INFO("Parsing string directly"sv)
parse_result result = toml::parse(toml_str, source_path);
if (result)
{
if constexpr (is_functor)
std::forward<Func>(func)(validate_table(std::move(result), source_path));
else
validate_table(std::move(result), source_path);
}
else
{
FORCE_FAIL(
"Parse error on line "sv << result.error().source().begin.line
<< ", column "sv << result.error().source().begin.column
<< ":\n"sv << result.error().description()
);
}
}
{
INFO("Parsing from a string stream"sv)
std::basic_stringstream<Char, std::char_traits<Char>, std::allocator<Char>> ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
parse_result result = toml::parse(ss, source_path);
if (result)
{
if constexpr (is_functor)
std::forward<Func>(func)(validate_table(std::move(result), source_path));
else
validate_table(std::move(result), source_path);
}
else
{
FORCE_FAIL(
"Parse error on line "sv << result.error().source().begin.line
<< ", column "sv << result.error().source().begin.column
<< ":\n"sv << result.error().description()
);
}
}
#endif
return true;
}
template <typename Char>
inline bool parsing_should_fail(
std::string_view test_file,
uint32_t test_line,
std::basic_string_view<Char> toml_str)
{
INFO(
"["sv << test_file << ", line "sv << test_line << "] "sv
<< "parsing_should_fail(\""sv << std::string_view(reinterpret_cast<const char*>(toml_str.data()), toml_str.length()) << "\")"sv
)
#if TOML_EXCEPTIONS
static constexpr auto run_tests = [](auto&& fn)
{
try
{
fn();
}
catch (const parse_error&)
{
SUCCEED("parse_error thrown OK"sv);
return true;
}
catch (const std::exception& exc)
{
FORCE_FAIL("Expected parsing failure, saw exception: "sv << exc.what());
return false;
}
catch (...)
{
FORCE_FAIL("Expected parsing failure, saw unspecified exception"sv);
return false;
}
FORCE_FAIL("Expected parsing failure"sv);
return false;
};
auto result = run_tests([=]()
{
[[maybe_unused]] auto res = toml::parse(toml_str);
});
result = result && run_tests([=]()
{
std::basic_stringstream<Char, std::char_traits<Char>, std::allocator<Char>> ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
[[maybe_unused]] auto res = toml::parse(ss);
});
return result;
#else
static constexpr auto run_tests = [](auto&& fn)
{
if (parse_result result = fn(); !result)
{
SUCCEED("parse_error generated OK"sv);
return true;
}
FORCE_FAIL("Expected parsing failure"sv);
};
return run_tests([=]() { return toml::parse(toml_str); })
&& run_tests([=]()
{
std::basic_stringstream<Char, std::char_traits<Char>, std::allocator<Char>> ss;
ss.write(toml_str.data(), static_cast<std::streamsize>(toml_str.length()));
return toml::parse(ss);
});
#endif
}
template <typename T>
inline bool parse_expected_value(
std::string_view test_file,
@ -387,7 +253,8 @@ inline bool parse_expected_value(
return true;
}
// manually instantiate some templates to reduce test compilation time (chosen using ClangBuildAnalyzer)
// manually instantiate some templates to reduce obj bloat and test compilation time
extern template bool parse_expected_value(std::string_view, uint32_t, std::string_view, const int&);
extern template bool parse_expected_value(std::string_view, uint32_t, std::string_view, const unsigned int&);
extern template bool parse_expected_value(std::string_view, uint32_t, std::string_view, const bool&);