// 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 + ">title" + tag + ">body";
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