From 40a1a03315df2ffe2af20a5741eac88e0c2df308 Mon Sep 17 00:00:00 2001 From: Mark Gillard Date: Mon, 29 Jun 2020 01:57:59 +0300 Subject: [PATCH] simplified test code to reduce bloat and improve compile times --- examples/error_printer.cpp | 2 + examples/simple_parser.cpp | 2 + examples/toml_generator.cpp | 4 +- examples/toml_to_json_transcoder.cpp | 2 + python/generate_conformance_tests.py | 2 +- tests/conformance.cpp | 730 +++++++++++++-------------- tests/impl_toml.cpp | 5 - tests/manipulating_arrays.cpp | 2 +- tests/manipulating_tables.cpp | 2 +- tests/parsing_arrays.cpp | 8 +- tests/parsing_booleans.cpp | 16 +- tests/parsing_comments.cpp | 62 +-- tests/parsing_dates_and_times.cpp | 52 +- tests/parsing_floats.cpp | 162 +++--- tests/parsing_integers.cpp | 84 +-- tests/parsing_key_value_pairs.cpp | 232 ++++----- tests/parsing_spec_example.cpp | 4 +- tests/parsing_strings.cpp | 20 +- tests/parsing_tables.cpp | 76 +-- tests/tests.cpp | 175 +++++++ tests/tests.h | 239 ++------- 21 files changed, 963 insertions(+), 918 deletions(-) diff --git a/examples/error_printer.cpp b/examples/error_printer.cpp index db20718..20784de 100644 --- a/examples/error_printer.cpp +++ b/examples/error_printer.cpp @@ -11,9 +11,11 @@ */ #include #include "utf8_console.h" + #define TOML_EXCEPTIONS 0 #define TOML_UNRELEASED_FEATURES 0 #include + using namespace std::string_view_literals; using toml::operator""_sz; diff --git a/examples/simple_parser.cpp b/examples/simple_parser.cpp index a4f33f9..bd80dd6 100644 --- a/examples/simple_parser.cpp +++ b/examples/simple_parser.cpp @@ -11,8 +11,10 @@ #include #include #include "utf8_console.h" + #define TOML_UNRELEASED_FEATURES 1 #include + using namespace std::string_view_literals; int main(int argc, char** argv) diff --git a/examples/toml_generator.cpp b/examples/toml_generator.cpp index 88cfad7..847d48d 100644 --- a/examples/toml_generator.cpp +++ b/examples/toml_generator.cpp @@ -12,8 +12,10 @@ #include #include #include "utf8_console.h" -#define TOML_UNRELEASED_FEATURES 1 + +#define TOML_PARSER 0 #include + using namespace std::string_view_literals; namespace diff --git a/examples/toml_to_json_transcoder.cpp b/examples/toml_to_json_transcoder.cpp index 953ce6c..8192665 100644 --- a/examples/toml_to_json_transcoder.cpp +++ b/examples/toml_to_json_transcoder.cpp @@ -11,8 +11,10 @@ #include #include #include "utf8_console.h" + #define TOML_UNRELEASED_FEATURES 1 #include + using namespace std::string_view_literals; int main(int argc, char** argv) diff --git a/python/generate_conformance_tests.py b/python/generate_conformance_tests.py index e4ebe29..b3a3b86 100644 --- a/python/generate_conformance_tests.py +++ b/python/generate_conformance_tests.py @@ -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, ) diff --git a/tests/conformance.cpp b/tests/conformance.cpp index e9d8f5a..2b05725 100644 --- a/tests/conformance.cpp +++ b/tests/conformance.cpp @@ -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 ", { 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; } } diff --git a/tests/impl_toml.cpp b/tests/impl_toml.cpp index 9a0ba33..caf6c29 100644 --- a/tests/impl_toml.cpp +++ b/tests/impl_toml.cpp @@ -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 -TOML_POP_WARNINGS - namespace toml { using std::declval; diff --git a/tests/manipulating_arrays.cpp b/tests/manipulating_arrays.cpp index 30418ae..8dd7948 100644 --- a/tests/manipulating_arrays.cpp +++ b/tests/manipulating_arrays.cpp @@ -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 }); diff --git a/tests/manipulating_tables.cpp b/tests/manipulating_tables.cpp index 09b9043..38cde4c 100644 --- a/tests/manipulating_tables.cpp +++ b/tests/manipulating_tables.cpp @@ -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 }); diff --git a/tests/parsing_arrays.cpp b/tests/parsing_arrays.cpp index 82ef636..31b74a9 100644 --- a/tests/parsing_arrays.cpp +++ b/tests/parsing_arrays.cpp @@ -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()); @@ -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 ", { name = "Baz Qux", email = "bazqux@example.com", url = "https://example.com/bazqux" } ] - )"sv), + )"sv, [](table&& tbl) { REQUIRE(tbl[S("numbers")].as()); diff --git a/tests/parsing_booleans.cpp b/tests/parsing_booleans.cpp index a45be41..59d8b5d 100644 --- a/tests/parsing_booleans.cpp +++ b/tests/parsing_booleans.cpp @@ -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); diff --git a/tests/parsing_comments.cpp b/tests/parsing_comments.cpp index f2cf863..bcde031 100644 --- a/tests/parsing_comments.cpp +++ b/tests/parsing_comments.cpp @@ -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 { diff --git a/tests/parsing_dates_and_times.cpp b/tests/parsing_dates_and_times.cpp index 7148ca7..e9fbf2a 100644 --- a/tests/parsing_dates_and_times.cpp +++ b/tests/parsing_dates_and_times.cpp @@ -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 diff --git a/tests/parsing_floats.cpp b/tests/parsing_floats.cpp index a0d74b3..e82ee51 100644 --- a/tests/parsing_floats.cpp +++ b/tests/parsing_floats.cpp @@ -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::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); } diff --git a/tests/parsing_integers.cpp b/tests/parsing_integers.cpp index 373b911..41ed887 100644 --- a/tests/parsing_integers.cpp +++ b/tests/parsing_integers.cpp @@ -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); diff --git a/tests/parsing_key_value_pairs.cpp b/tests/parsing_key_value_pairs.cpp index f28b1e1..4186f65 100644 --- a/tests/parsing_key_value_pairs.cpp +++ b/tests/parsing_key_value_pairs.cpp @@ -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); } diff --git a/tests/parsing_spec_example.cpp b/tests/parsing_spec_example.cpp index ac57097..329a638 100644 --- a/tests/parsing_spec_example.cpp +++ b/tests/parsing_spec_example.cpp @@ -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, diff --git a/tests/parsing_strings.cpp b/tests/parsing_strings.cpp index 025dc6c..a5229e8 100644 --- a/tests/parsing_strings.cpp +++ b/tests/parsing_strings.cpp @@ -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( diff --git a/tests/parsing_tables.cpp b/tests/parsing_tables.cpp index a85fec7..451d56c 100644 --- a/tests/parsing_tables.cpp +++ b/tests/parsing_tables.cpp @@ -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()); @@ -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
()); @@ -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
()); @@ -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
()); @@ -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
()); @@ -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
()); @@ -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()); @@ -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); } diff --git a/tests/tests.cpp b/tests/tests.cpp index de089b6..c3fe276 100644 --- a/tests/tests.cpp +++ b/tests/tests.cpp @@ -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(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(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(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(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&); diff --git a/tests/tests.h b/tests/tests.h index f3c4e8a..08874d6 100644 --- a/tests/tests.h +++ b/tests/tests.h @@ -17,11 +17,13 @@ TOML_PUSH_WARNINGS TOML_DISABLE_ALL_WARNINGS + #include "catch2.h" #include 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 +class function_view; +template +class function_view 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 + function_view(T&& x) noexcept + : ptr_{ reinterpret_cast(std::addressof(x)) } + { + eraser = [](void* ptr, P&&... xs) -> R + { + return (*reinterpret_cast>>(ptr))(std::forward

(xs)...); + }; + } + + decltype(auto) operator()(P&&... xs) const + { + return eraser(ptr_, std::forward

(xs)...); + } + + [[nodiscard]] operator bool() const noexcept { return !!ptr_; } +}; + +using pss_func = function_view; + +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 -inline bool parsing_should_succeed( - std::string_view test_file, - uint32_t test_line, - std::basic_string_view 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(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, std::false_type>; - - #if TOML_EXCEPTIONS - - try - { - { - INFO("Parsing string directly"sv) - if constexpr (is_functor) - std::forward(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, std::allocator> ss; - ss.write(toml_str.data(), static_cast(toml_str.length())); - if constexpr (is_functor) - std::forward(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)(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, std::allocator> ss; - ss.write(toml_str.data(), static_cast(toml_str.length())); - parse_result result = toml::parse(ss, source_path); - if (result) - { - if constexpr (is_functor) - std::forward(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 -inline bool parsing_should_fail( - std::string_view test_file, - uint32_t test_line, - std::basic_string_view toml_str) -{ - INFO( - "["sv << test_file << ", line "sv << test_line << "] "sv - << "parsing_should_fail(\""sv << std::string_view(reinterpret_cast(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, std::allocator> ss; - ss.write(toml_str.data(), static_cast(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, std::allocator> ss; - ss.write(toml_str.data(), static_cast(toml_str.length())); - return toml::parse(ss); - }); - - #endif -} - template 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&);