AdhocCliCommParser_test.cc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "catch.hpp"
  2. #include "AdhocCliCommParser.hh"
  3. #include <string>
  4. #include <vector>
  5. using namespace std;
  6. static vector<string> parse(const string& stream)
  7. {
  8. vector<string> result;
  9. AdhocCliCommParser parser([&](const string& cmd) { result.push_back(cmd); });
  10. parser.parse(stream.data(), stream.size());
  11. return result;
  12. }
  13. TEST_CASE("AdhocCliCommParser")
  14. {
  15. SECTION("whitespace") {
  16. CHECK(parse("<command>foo</command>") ==
  17. vector<string>{"foo"});
  18. CHECK(parse(" \t<command>foo</command>") ==
  19. vector<string>{"foo"});
  20. CHECK(parse("<command>foo</command>\n ") ==
  21. vector<string>{"foo"});
  22. CHECK(parse(" \n\n<command>foo</command> \t\n ") ==
  23. vector<string>{"foo"});
  24. }
  25. SECTION("multiple commands") {
  26. CHECK(parse("<command>foo</command><command>bar</command>") ==
  27. vector<string>{"foo", "bar"});
  28. CHECK(parse("<command>foo</command> <command>bar</command>") ==
  29. vector<string>{"foo", "bar"});
  30. }
  31. SECTION("XML-entities") {
  32. CHECK(parse("<command>&amp;</command>") ==
  33. vector<string>{"&"});
  34. CHECK(parse("<command>&apos;</command>") ==
  35. vector<string>{"'"});
  36. CHECK(parse("<command>&quot;</command>") ==
  37. vector<string>{"\""});
  38. CHECK(parse("<command>&lt;</command>") ==
  39. vector<string>{"<"});
  40. CHECK(parse("<command>&gt;</command>") ==
  41. vector<string>{">"});
  42. CHECK(parse("<command>&#65;</command>") ==
  43. vector<string>{"A"});
  44. CHECK(parse("<command>&#x41;</command>") ==
  45. vector<string>{"A"});
  46. CHECK(parse("<command>&lt;command&gt;</command>") ==
  47. vector<string>{"<command>"});
  48. }
  49. SECTION("tags other than <command> are ignored") {
  50. CHECK(parse("<openmsx-control> <command>foo</command> </openmsx-control>") ==
  51. vector<string>{"foo"});
  52. CHECK(parse("<openmsx-control> <unknown>foo</unknown> <command>foo</command>") ==
  53. vector<string>{"foo"});
  54. }
  55. SECTION("errors, but we do recover") {
  56. CHECK(parse("<command>&unknown;</command><command>foo</command>") ==
  57. vector<string>{"foo"});
  58. CHECK(parse("<command>&#fffffff;</command><command>foo</command>") ==
  59. vector<string>{"foo"});
  60. CHECK(parse("<<<<<command>foo</command>") ==
  61. vector<string>{"foo"});
  62. CHECK(parse("<foo></bar><command>foo</command>") ==
  63. vector<string>{"foo"});
  64. CHECK(parse("</command><command>foo</command>") ==
  65. vector<string>{"foo"});
  66. CHECK(parse("<command>bar</foobar><command>foo</command>") ==
  67. vector<string>{"foo"});
  68. }
  69. SECTION("old (XML) parser didn't accept this, AdhocCliCommParser does") {
  70. // new parser ignores the <openmsx-control> tag
  71. CHECK(parse("<openmsx-control></openmsx-control><command>foo</command>") ==
  72. vector<string>{"foo"});
  73. }
  74. SECTION("old (XML) parser did accept this, AdhocCliCommParser does not") {
  75. // attributes are no longer accepted
  76. CHECK(parse("<command value=\"3\">foo</command>") ==
  77. vector<string>{});
  78. // tags nested in the <command> tag are no longer accepted
  79. CHECK(parse("<command><bla></bla>foo</command>") ==
  80. vector<string>{});
  81. // The shorthand notation for an empty tag is no longer recognized:
  82. // sort-of OK, was before an empty command, now no command
  83. CHECK(parse("<command/>") ==
  84. vector<string>{});
  85. }
  86. }