123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #include "catch.hpp"
- #include "AdhocCliCommParser.hh"
- #include <string>
- #include <vector>
- using namespace std;
- static vector<string> parse(const string& stream)
- {
- vector<string> result;
- AdhocCliCommParser parser([&](const string& cmd) { result.push_back(cmd); });
- parser.parse(stream.data(), stream.size());
- return result;
- }
- TEST_CASE("AdhocCliCommParser")
- {
- SECTION("whitespace") {
- CHECK(parse("<command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse(" \t<command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse("<command>foo</command>\n ") ==
- vector<string>{"foo"});
- CHECK(parse(" \n\n<command>foo</command> \t\n ") ==
- vector<string>{"foo"});
- }
- SECTION("multiple commands") {
- CHECK(parse("<command>foo</command><command>bar</command>") ==
- vector<string>{"foo", "bar"});
- CHECK(parse("<command>foo</command> <command>bar</command>") ==
- vector<string>{"foo", "bar"});
- }
- SECTION("XML-entities") {
- CHECK(parse("<command>&</command>") ==
- vector<string>{"&"});
- CHECK(parse("<command>'</command>") ==
- vector<string>{"'"});
- CHECK(parse("<command>"</command>") ==
- vector<string>{"\""});
- CHECK(parse("<command><</command>") ==
- vector<string>{"<"});
- CHECK(parse("<command>></command>") ==
- vector<string>{">"});
- CHECK(parse("<command>A</command>") ==
- vector<string>{"A"});
- CHECK(parse("<command>A</command>") ==
- vector<string>{"A"});
- CHECK(parse("<command><command></command>") ==
- vector<string>{"<command>"});
- }
- SECTION("tags other than <command> are ignored") {
- CHECK(parse("<openmsx-control> <command>foo</command> </openmsx-control>") ==
- vector<string>{"foo"});
- CHECK(parse("<openmsx-control> <unknown>foo</unknown> <command>foo</command>") ==
- vector<string>{"foo"});
- }
- SECTION("errors, but we do recover") {
- CHECK(parse("<command>&unknown;</command><command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse("<command>&#fffffff;</command><command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse("<<<<<command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse("<foo></bar><command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse("</command><command>foo</command>") ==
- vector<string>{"foo"});
- CHECK(parse("<command>bar</foobar><command>foo</command>") ==
- vector<string>{"foo"});
- }
- SECTION("old (XML) parser didn't accept this, AdhocCliCommParser does") {
- // new parser ignores the <openmsx-control> tag
- CHECK(parse("<openmsx-control></openmsx-control><command>foo</command>") ==
- vector<string>{"foo"});
- }
- SECTION("old (XML) parser did accept this, AdhocCliCommParser does not") {
- // attributes are no longer accepted
- CHECK(parse("<command value=\"3\">foo</command>") ==
- vector<string>{});
- // tags nested in the <command> tag are no longer accepted
- CHECK(parse("<command><bla></bla>foo</command>") ==
- vector<string>{});
- // The shorthand notation for an empty tag is no longer recognized:
- // sort-of OK, was before an empty command, now no command
- CHECK(parse("<command/>") ==
- vector<string>{});
- }
- }
|