#ifndef RYML_SINGLE_HEADER #include #include #endif #include #include "./test_case.hpp" #include "./test_suite/test_suite_events.hpp" #include "./test_suite/test_suite_events_emitter.cpp" // HACK namespace c4 { namespace yml { void test_evts(csubstr src, std::string expected) { Tree tree = parse_in_arena(src); #if RYML_DBG print_tree(tree); #endif auto actual = emit_events(tree); EXPECT_EQ(actual, expected); } TEST(events, empty) { test_evts( R"()", R"(+STR -STR )" ); } TEST(events, empty_whitespace) { test_evts( R"( )", R"(+STR -STR )" ); } TEST(events, empty_whitespace_newlines) { test_evts( R"( )", R"(+STR -STR )" ); } TEST(events, empty_whitespace_newlines_comments) { test_evts( R"( # a comment )", R"(+STR -STR )" ); } TEST(events, docval) { test_evts( R"('quoted val' )", R"(+STR +DOC =VAL 'quoted val -DOC -STR )" ); } TEST(events, docsep) { test_evts( R"(--- 'quoted val' --- another ... --- and yet another ... --- ... )", R"(+STR +DOC --- =VAL 'quoted val -DOC +DOC --- =VAL :another -DOC +DOC --- =VAL :and yet another -DOC +DOC --- =VAL : -DOC -STR )" ); } TEST(events, docsep_v2) { test_evts( R"( doc1 --- doc2 ... doc3 )", R"(+STR +DOC --- =VAL :doc1 -DOC +DOC --- =VAL :doc2 -DOC +DOC --- =VAL :doc3 -DOC -STR )" ); } TEST(events, basic_map) { test_evts( "{foo: bar}", R"(+STR +DOC +MAP =VAL :foo =VAL :bar -MAP -DOC -STR )" ); } TEST(events, basic_seq) { test_evts( "[foo, bar]", R"(+STR +DOC +SEQ =VAL :foo =VAL :bar -SEQ -DOC -STR )" ); } TEST(events, escapes) { test_evts( R"("\t\ \ \r\n\0\f\/\a\v\e\N\_\L\P \b")", "+STR\n" "+DOC\n" "=VAL '\\t\\t \\r\\n\\0\\f/\\a\\v\\e\\N\\_\\L\\P \\b" "\n" "-DOC\n" "-STR\n" ); } TEST(events, dquo_bytes) { test_evts( R"("\x0a\x0a\u263A\x0a\x55\x56\x57\x0a\u2705\U0001D11E")", "+STR\n" "+DOC\n" "=VAL '\\n\\n☺\\nUVW\\n✅𝄞" "\n" "-DOC\n" "-STR\n" ); } TEST(events, sets) { test_evts( R"(--- !!set ? Mark McGwire ? Sammy Sosa ? Ken Griff )", R"(+STR +DOC --- +MAP =VAL :Mark McGwire =VAL : =VAL :Sammy Sosa =VAL : =VAL :Ken Griff =VAL : -MAP -DOC -STR )"); } TEST(events, binary) { test_evts( R"(canonical: !!binary "\ R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\ OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\ AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=" generic: !!binary | R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5 OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+ +f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC AgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= description: The binary value above is a tiny arrow encoded as a gif image. )", R"(+STR +DOC +MAP =VAL :canonical =VAL 'R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5OTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLCAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs= =VAL :generic =VAL 'R0lGODlhDAAMAIQAAP//9/X17unp5WZmZgAAAOfn515eXvPz7Y6OjuDg4J+fn5\nOTk6enp56enmlpaWNjY6Ojo4SEhP/++f/++f/++f/++f/++f/++f/++f/++f/+\n+f/++f/++f/++f/++f/++SH+Dk1hZGUgd2l0aCBHSU1QACwAAAAADAAMAAAFLC\nAgjoEwnuNAFOhpEMTRiggcz4BNJHrv/zCFcLiwMWYNG84BwwEeECcgggoBADs=\n =VAL :description =VAL :The binary value above is a tiny arrow encoded as a gif image. -MAP -DOC -STR )"); } TEST(events, tag_directives_6CK3) { test_evts( R"( %TAG !e! tag:example.com,2000:app/ --- - !local foo - !!str bar - !e!tag%21 baz )", R"(+STR +DOC --- +SEQ =VAL :foo =VAL :bar =VAL :baz -SEQ -DOC -STR )"); } TEST(events, tag_directives_6VLF) { test_evts( R"( %FOO bar baz # Should be ignored # with a warning. --- "foo" )", R"(+STR +DOC --- =VAL 'foo -DOC -STR )"); } TEST(events, tag_directives_6WLZ) { test_evts( R"( # Private --- !foo "bar" ... # Global %TAG ! tag:example.com,2000:app/ --- !foo "bar" )", R"(+STR +DOC --- =VAL 'bar -DOC +DOC --- =VAL 'bar -DOC -STR )"); } TEST(events, tag_directives_9WXW) { test_evts( R"( # Private #--- # note this is commented out !foo "bar" ... # Global %TAG ! tag:example.com,2000:app/ --- !foo "bar" )", R"(+STR +DOC --- =VAL 'bar -DOC +DOC --- =VAL 'bar -DOC -STR )"); } TEST(events, tag_directives_7FWL) { test_evts( R"(! foo : ! baz )", R"(+STR +DOC +MAP =VAL :foo =VAL :baz -MAP -DOC -STR )"); } TEST(events, tag_directives_P76L) { test_evts( R"( %TAG !! tag:example.com,2000:app/ --- !!int 1 - 3 # Interval, not integer )", R"(+STR +DOC --- =VAL :1 - 3 -DOC -STR )"); } TEST(events, tag_directives_S4JQ) { test_evts( R"( - "12" - 12 - ! 12 )", R"(+STR +DOC +SEQ =VAL '12 =VAL :12 =VAL :12 -SEQ -DOC -STR )"); } TEST(events, tag_directives_lookup) { test_evts( R"( %TAG !m! !my- --- # Bulb here !m!light fluorescent ... %TAG !m! !meta- --- # Color here !m!light green )", R"(+STR +DOC --- =VAL :fluorescent -DOC +DOC --- =VAL :green -DOC -STR )"); } //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // The other test executables are written to contain the declarative-style // YmlTestCases. This executable does not have any but the build setup // assumes it does, and links with the test lib, which requires an existing // get_case() function. So this is here to act as placeholder until (if?) // proper test cases are added here. This was detected in #47 (thanks // @cburgard). Case const* get_case(csubstr) { return nullptr; } } // namespace yml } // namespace c4