// Host tests for htmlToPlainText(), used to render dictionary definitions that // cannot be laid out as styled pages. #include #include #include "HtmlToPlainText.h" namespace { TEST(HtmlToPlainText, StripsTagsAndKeepsText) { EXPECT_EQ(htmlToPlainText("quixotic adj."), "quixotic adj."); EXPECT_EQ(htmlToPlainText("in span"), "in span"); EXPECT_EQ(htmlToPlainText("plain"), "plain"); EXPECT_EQ(htmlToPlainText(""), ""); } TEST(HtmlToPlainText, BlockElementsBecomeBreaks) { EXPECT_EQ(htmlToPlainText("a
b"), "a\nb"); EXPECT_EQ(htmlToPlainText("
a
b
"), "a\nb"); EXPECT_EQ(htmlToPlainText("

a

b

"), "a\n\nb"); // Consecutive breaks do not stack up. EXPECT_EQ(htmlToPlainText("a


b"), "a\nb"); } TEST(HtmlToPlainText, HeadingsBreakLikeParagraphs) { // tagBreak() lists h1-h6 among the paragraph-breaking names, so they must // actually reach that comparison -- a name scan that stops at the first digit // reads "h1" as "h" and the heading runs into the text after it. for (const char* tag : {"h1", "h2", "h3", "h4", "h5", "h6"}) { const std::string html = std::string("<") + tag + ">titlebody"; EXPECT_EQ(htmlToPlainText(html), "title\n\nbody") << tag; } EXPECT_EQ(htmlToPlainText("
after"), "after"); } TEST(HtmlToPlainText, DecodesEntities) { EXPECT_EQ(htmlToPlainText("Tom & Jerry"), "Tom & Jerry"); EXPECT_EQ(htmlToPlainText("a b"), "a\xC2\xA0" "b"); EXPECT_EQ(htmlToPlainText("AB"), "AB"); EXPECT_EQ(htmlToPlainText("—"), "\xE2\x80\x94"); // Not entities: left as written rather than swallowed. EXPECT_EQ(htmlToPlainText("¬anentity;"), "¬anentity;"); EXPECT_EQ(htmlToPlainText("100% & up"), "100% & up"); } TEST(HtmlToPlainText, TrimsSurroundingWhitespace) { EXPECT_EQ(htmlToPlainText("

only

"), "only"); EXPECT_EQ(htmlToPlainText("text "), "text"); EXPECT_EQ(htmlToPlainText("a\tb"), "a b"); EXPECT_EQ(htmlToPlainText("
a"), "a"); } TEST(HtmlToPlainText, SurvivesMalformedMarkup) { EXPECT_EQ(htmlToPlainText("a kept"), "kept"); } } // namespace