1 #include "tagsouppullparser.h"
2 
3 #include <sstream>
4 
5 #include "3rd-party/catch.hpp"
6 
7 using namespace newsboat;
8 
9 TEST_CASE("Tagsoup pull parser turns document into a stream of events",
10 	"[TagSoupPullParser]")
11 {
12 	std::istringstream input_stream(
13 		"<test>"
14 		"<foo quux='asdf' bar=\"qqq\">text</foo>"
15 		"more text"
16 		"<more>&quot;&#33;&#x40;</more>"
17 		"<xxx foo=bar baz=\"qu ux\" hi='ho ho ho'></xxx>"
18 		"</test>");
19 
20 	TagSoupPullParser xpp;
21 	TagSoupPullParser::Event e;
22 	xpp.set_input(input_stream);
23 
24 	e = xpp.get_event_type();
25 	REQUIRE(e == TagSoupPullParser::Event::START_DOCUMENT);
26 
27 	e = xpp.next();
28 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
29 	REQUIRE(xpp.get_text() == "test");
30 
31 	e = xpp.next();
32 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
33 	REQUIRE(xpp.get_text() == "foo");
34 	REQUIRE(xpp.get_attribute_value("quux") == "asdf");
35 	REQUIRE(xpp.get_attribute_value("bar") == "qqq");
36 
37 	e = xpp.next();
38 	REQUIRE(e == TagSoupPullParser::Event::TEXT);
39 	REQUIRE(xpp.get_text() == "text");
40 
41 	e = xpp.next();
42 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
43 	REQUIRE(xpp.get_text() == "foo");
44 
45 	e = xpp.next();
46 	REQUIRE(e == TagSoupPullParser::Event::TEXT);
47 	REQUIRE(xpp.get_text() == "more text");
48 
49 	e = xpp.next();
50 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
51 	REQUIRE(xpp.get_text() == "more");
52 
53 	e = xpp.next();
54 	REQUIRE(e == TagSoupPullParser::Event::TEXT);
55 	REQUIRE(xpp.get_text() == "\"!@");
56 
57 	e = xpp.next();
58 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
59 	REQUIRE(xpp.get_text() == "more");
60 
61 	e = xpp.next();
62 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
63 	REQUIRE(xpp.get_text() == "xxx");
64 	REQUIRE(xpp.get_attribute_value("foo") == "bar");
65 	REQUIRE(xpp.get_attribute_value("baz") == "qu ux");
66 	REQUIRE(xpp.get_attribute_value("hi") == "ho ho ho");
67 
68 	e = xpp.next();
69 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
70 	REQUIRE(xpp.get_text() == "xxx");
71 
72 	e = xpp.next();
73 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
74 	REQUIRE(xpp.get_text() == "test");
75 
76 	e = xpp.next();
77 	REQUIRE(e == TagSoupPullParser::Event::END_DOCUMENT);
78 
79 	e = xpp.next();
80 	REQUIRE(e == TagSoupPullParser::Event::END_DOCUMENT);
81 }
82 
83 TEST_CASE("<br>, <br/> and <br /> behave the same way", "[TagSoupPullParser]")
84 {
85 	std::istringstream input_stream;
86 	TagSoupPullParser Parser;
87 	TagSoupPullParser::Event event;
88 
89 	for (auto input : {
90 			"<br>", "<br/>", "<br />"
91 		}) {
SECTION(input)92 		SECTION(input) {
93 			input_stream.str(input);
94 			Parser.set_input(input_stream);
95 
96 			event = Parser.get_event_type();
97 			REQUIRE(event ==
98 				TagSoupPullParser::Event::START_DOCUMENT);
99 
100 			event = Parser.next();
101 			REQUIRE(event == TagSoupPullParser::Event::START_TAG);
102 			REQUIRE(Parser.get_text() == "br");
103 
104 			event = Parser.next();
105 			REQUIRE(event ==
106 				TagSoupPullParser::Event::END_DOCUMENT);
107 		}
108 	}
109 }
110 
111 TEST_CASE("Tagsoup pull parser emits whitespace as is",
112 	"[TagSoupPullParser]")
113 {
114 	std::istringstream input_stream(
115 		"<test>    &lt;4 spaces\n"
116 		"<pre>\n"
117 		"    <span>should have seen spaces</span>"
118 		"</pre>"
119 		"</test>");
120 
121 	TagSoupPullParser xpp;
122 	TagSoupPullParser::Event e;
123 	xpp.set_input(input_stream);
124 
125 	e = xpp.get_event_type();
126 	REQUIRE(e == TagSoupPullParser::Event::START_DOCUMENT);
127 
128 	e = xpp.next();
129 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
130 	REQUIRE(xpp.get_text() == "test");
131 
132 	e = xpp.next();
133 	REQUIRE(e == TagSoupPullParser::Event::TEXT);
134 	REQUIRE(xpp.get_text() == "    <4 spaces\n");
135 
136 	e = xpp.next();
137 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
138 	REQUIRE(xpp.get_text() == "pre");
139 
140 	e = xpp.next();
141 	REQUIRE(e == TagSoupPullParser::Event::TEXT);
142 	REQUIRE(xpp.get_text() == "\n    ");
143 
144 	e = xpp.next();
145 	REQUIRE(e == TagSoupPullParser::Event::START_TAG);
146 	REQUIRE(xpp.get_text() == "span");
147 
148 	e = xpp.next();
149 	REQUIRE(e == TagSoupPullParser::Event::TEXT);
150 	REQUIRE(xpp.get_text() == "should have seen spaces");
151 
152 	e = xpp.next();
153 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
154 	REQUIRE(xpp.get_text() == "span");
155 
156 	e = xpp.next();
157 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
158 	REQUIRE(xpp.get_text() == "pre");
159 
160 	e = xpp.next();
161 	REQUIRE(e == TagSoupPullParser::Event::END_TAG);
162 	REQUIRE(xpp.get_text() == "test");
163 
164 	e = xpp.next();
165 	REQUIRE(e == TagSoupPullParser::Event::END_DOCUMENT);
166 
167 	e = xpp.next();
168 	REQUIRE(e == TagSoupPullParser::Event::END_DOCUMENT);
169 }
170