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