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>"!@</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> <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