9 #include "clang/Basic/LLVM.h"
10 #include "llvm/ADT/StringRef.h"
11 #include "llvm/Support/raw_ostream.h"
12 #include "gmock/gmock.h"
13 #include "gtest/gtest.h"
20 std::string escape(llvm::StringRef Text) {
21 return Paragraph().appendText(
Text.str()).asMarkdown();
25 return testing::ExplainMatchResult(::testing::HasSubstr(std::string{
'\\', C}),
26 arg, result_listener);
30 return testing::ExplainMatchResult(::testing::Not(::testing::HasSubstr(
"\\")),
31 arg, result_listener);
34 TEST(Render, Escaping) {
36 std::string
Punctuation = R
"txt(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)txt";
37 std::string EscapedPunc = R"txt(!"#$%&'()\*+,-./:;<=>?@[\\]^\_\`{|}~)txt";
41 EXPECT_EQ(escape(
"`foo`"), R
"(\`foo\`)");
42 EXPECT_EQ(escape("`foo"), R
"(\`foo)");
43 EXPECT_EQ(escape("foo`"), R
"(foo\`)");
44 EXPECT_EQ(escape("``foo``"), R
"(\`\`foo\`\`)");
46 EXPECT_EQ(escape(
"```"), R
"(\`\`\`)");
47 EXPECT_EQ(escape(
"~~~"), R
"(\~~~)");
50 EXPECT_THAT(escape(
"## Heading"), escaped(
'#'));
51 EXPECT_THAT(escape(
"Foo # bar"), escapedNone());
52 EXPECT_EQ(escape(
"---"), R
"(\---)");
53 EXPECT_EQ(escape("-"), R
"(\-)");
54 EXPECT_EQ(escape("==="), R
"(\===)");
55 EXPECT_EQ(escape("="), R
"(\=)");
56 EXPECT_EQ(escape("***"), R
"(\*\*\*)");
59 EXPECT_THAT(escape(
"<pre"), escaped(
'<'));
60 EXPECT_THAT(escape(
"< pre"), escapedNone());
61 EXPECT_THAT(escape(
"if a<b then"), escaped(
'<'));
62 EXPECT_THAT(escape(
"if a<b then c."), escapedNone());
63 EXPECT_THAT(escape(
"if a<b then c='foo'."), escaped(
'<'));
64 EXPECT_THAT(escape(
"std::vector<T>"), escaped(
'<'));
65 EXPECT_THAT(escape(
"std::vector<std::string>"), escaped(
'<'));
66 EXPECT_THAT(escape(
"std::map<int, int>"), escapedNone());
68 EXPECT_THAT(escape(
"Email <foo@bar.com>"), escapedNone());
69 EXPECT_THAT(escape(
"Website <http://foo.bar>"), escapedNone());
72 EXPECT_THAT(escape(
"- foo"), escaped(
'-'));
73 EXPECT_THAT(escape(
"* foo"), escaped(
'*'));
74 EXPECT_THAT(escape(
"+ foo"), escaped(
'+'));
75 EXPECT_THAT(escape(
"+"), escaped(
'+'));
76 EXPECT_THAT(escape(
"a + foo"), escapedNone());
77 EXPECT_THAT(escape(
"a+ foo"), escapedNone());
78 EXPECT_THAT(escape(
"1. foo"), escaped(
'.'));
79 EXPECT_THAT(escape(
"a. foo"), escapedNone());
82 EXPECT_EQ(escape(
"*foo*"), R
"(\*foo\*)");
83 EXPECT_EQ(escape("**foo**"), R
"(\*\*foo\*\*)");
84 EXPECT_THAT(escape("*foo"), escaped(
'*'));
85 EXPECT_THAT(escape(
"foo *"), escapedNone());
86 EXPECT_THAT(escape(
"foo * bar"), escapedNone());
87 EXPECT_THAT(escape(
"foo_bar"), escapedNone());
88 EXPECT_THAT(escape(
"foo _bar"), escaped(
'_'));
89 EXPECT_THAT(escape(
"foo_ bar"), escaped(
'_'));
90 EXPECT_THAT(escape(
"foo _ bar"), escapedNone());
93 EXPECT_THAT(escape(
"fish &chips;"), escaped(
'&'));
94 EXPECT_THAT(escape(
"fish & chips;"), escapedNone());
95 EXPECT_THAT(escape(
"fish &chips"), escapedNone());
96 EXPECT_THAT(escape(
"foo * bar"), escaped(
'&'));
97 EXPECT_THAT(escape(
"foo ¯ bar"), escaped(
'&'));
98 EXPECT_THAT(escape(
"foo &?; bar"), escapedNone());
101 EXPECT_THAT(escape(
"[foo](bar)"), escaped(
']'));
102 EXPECT_THAT(escape(
"[foo]: bar"), escaped(
']'));
104 EXPECT_THAT(escape(
"[foo][]"), escapedNone());
105 EXPECT_THAT(escape(
"[foo][bar]"), escapedNone());
106 EXPECT_THAT(escape(
"[foo]"), escapedNone());
109 Paragraph P = Paragraph();
110 P.appendCode(
"* foo !+ bar * baz");
111 EXPECT_EQ(P.asMarkdown(),
"`* foo !+ bar * baz`");
115 P.appendCode(
"foo`bar`baz",
true);
116 EXPECT_EQ(P.asMarkdown(),
"`foo``bar``baz`");
118 EXPECT_EQ(P.asPlainText(),
"'foo`bar`baz'");
122 P.appendCode(
"`foo");
123 EXPECT_EQ(P.asMarkdown(),
"` ``foo `");
125 P.appendCode(
"foo`");
126 EXPECT_EQ(P.asMarkdown(),
"` foo`` `");
128 P.appendCode(
"`foo`");
129 EXPECT_EQ(P.asMarkdown(),
"` ``foo`` `");
133 D.addCodeBlock(
"foobarbaz `\nqux");
134 EXPECT_EQ(D.asMarkdown(),
"```cpp\n"
138 D.addCodeBlock(
"foobarbaz ``\nqux");
139 EXPECT_THAT(D.asMarkdown(),
"```cpp\n"
140 "foobarbaz ``\nqux\n"
143 D.addCodeBlock(
"foobarbaz ```\nqux");
144 EXPECT_EQ(D.asMarkdown(),
"````cpp\n"
145 "foobarbaz ```\nqux\n"
148 D.addCodeBlock(
"foobarbaz ` `` ``` ```` `\nqux");
149 EXPECT_EQ(D.asMarkdown(),
"`````cpp\n"
150 "foobarbaz ` `` ``` ```` `\nqux\n"
154 TEST(Paragraph, Chunks) {
155 Paragraph P = Paragraph();
156 P.appendText(
"One ");
157 P.appendCode(
"fish");
158 P.appendText(
", two ");
159 P.appendCode(
"fish",
true);
161 EXPECT_EQ(P.asMarkdown(),
"One `fish`, two `fish`");
162 EXPECT_EQ(P.asPlainText(),
"One fish, two `fish`");
165 TEST(Paragraph, SeparationOfChunks) {
171 P.appendText(
"after ");
172 EXPECT_EQ(P.asMarkdown(),
"after");
173 EXPECT_EQ(P.asPlainText(),
"after");
175 P.appendCode(
"foobar").appendSpace();
176 EXPECT_EQ(P.asMarkdown(),
"after `foobar`");
177 EXPECT_EQ(P.asPlainText(),
"after foobar");
180 EXPECT_EQ(P.asMarkdown(),
"after `foobar` bat");
181 EXPECT_EQ(P.asPlainText(),
"after foobar bat");
183 P.appendCode(
"no").appendCode(
"space");
184 EXPECT_EQ(P.asMarkdown(),
"after `foobar` bat`no` `space`");
185 EXPECT_EQ(P.asPlainText(),
"after foobar batno space");
188 TEST(Paragraph, ExtraSpaces) {
191 P.appendText(
"foo\n \t baz");
192 P.appendCode(
" bar\n");
193 EXPECT_EQ(P.asMarkdown(),
"foo baz`bar`");
194 EXPECT_EQ(P.asPlainText(),
"foo bazbar");
197 TEST(Paragraph, SpacesCollapsed) {
199 P.appendText(
" foo bar ");
200 P.appendText(
" baz ");
201 EXPECT_EQ(P.asMarkdown(),
"foo bar baz");
202 EXPECT_EQ(P.asPlainText(),
"foo bar baz");
205 TEST(Paragraph, NewLines) {
208 P.appendText(
" \n foo\nbar\n ");
209 P.appendCode(
" \n foo\nbar \n ");
210 EXPECT_EQ(P.asMarkdown(),
"foo bar `foo bar`");
211 EXPECT_EQ(P.asPlainText(),
"foo bar foo bar");
214 TEST(Document, Separators) {
216 D.addParagraph().appendText(
"foo");
217 D.addCodeBlock(
"test");
218 D.addParagraph().appendText(
"bar");
220 const char ExpectedMarkdown[] = R
"md(foo
225 EXPECT_EQ(D.asMarkdown(), ExpectedMarkdown);
227 const char ExpectedText[] = R
"pt(foo
232 EXPECT_EQ(D.asPlainText(), ExpectedText);
235 TEST(Document, Ruler) {
237 D.addParagraph().appendText("foo");
241 D.addParagraph().appendText(
"bar");
242 EXPECT_EQ(D.asMarkdown(),
"foo \n\n---\nbar");
243 EXPECT_EQ(D.asPlainText(),
"foo\n\nbar");
246 D.addParagraph().appendText(
"foo");
248 D.addCodeBlock(
"bar");
250 EXPECT_EQ(D.asMarkdown(),
"foo \n\n---\n```cpp\nbar\n```");
251 EXPECT_EQ(D.asPlainText(),
"foo\n\nbar");
255 D.addParagraph().appendText(
"foo");
258 EXPECT_EQ(D.asMarkdown(),
"foo");
259 EXPECT_EQ(D.asPlainText(),
"foo");
263 D.addParagraph().appendText(
"foo");
264 EXPECT_EQ(D.asMarkdown(),
"foo \n\n---\nfoo");
265 EXPECT_EQ(D.asPlainText(),
"foo\n\nfoo");
268 TEST(Document, Append) {
270 D.addParagraph().appendText(
"foo");
274 E.addParagraph().appendText(
"bar");
275 D.append(std::move(
E));
276 EXPECT_EQ(D.asMarkdown(),
"foo \n\n---\nbar");
279 TEST(Document, Heading) {
281 D.addHeading(1).appendText(
"foo");
282 D.addHeading(2).appendText(
"bar");
283 D.addParagraph().appendText(
"baz");
284 EXPECT_EQ(D.asMarkdown(),
"# foo \n## bar \nbaz");
285 EXPECT_EQ(D.asPlainText(),
"foo\nbar\nbaz");
288 TEST(CodeBlock, Render) {
291 D.addCodeBlock(
"foo\n bar\n baz");
293 llvm::StringRef ExpectedMarkdown =
299 llvm::StringRef ExpectedPlainText =
303 EXPECT_EQ(D.asMarkdown(), ExpectedMarkdown);
304 EXPECT_EQ(D.asPlainText(), ExpectedPlainText);
305 D.addCodeBlock("foo");
315 EXPECT_EQ(D.asMarkdown(), ExpectedMarkdown);
322 EXPECT_EQ(D.asPlainText(), ExpectedPlainText);
325 TEST(BulletList, Render) {
328 L.addItem().addParagraph().appendText(
"foo");
329 EXPECT_EQ(L.asMarkdown(),
"- foo");
330 EXPECT_EQ(L.asPlainText(),
"- foo");
332 L.addItem().addParagraph().appendText(
"bar");
333 llvm::StringRef
Expected = R
"md(- foo
335 EXPECT_EQ(L.asMarkdown(), Expected);
336 EXPECT_EQ(L.asPlainText(), Expected);
339 Document &D = L.addItem();
341 D.addParagraph().appendText(
"foo");
342 D.addParagraph().appendText(
"baz");
345 Document &
Inner = D.addBulletList().addItem();
346 Inner.addParagraph().appendText(
"foo");
349 BulletList &InnerList =
Inner.addBulletList();
351 Document &DeepDoc = InnerList.addItem();
352 DeepDoc.addParagraph().appendText(
"baz");
353 DeepDoc.addParagraph().appendText(
"baz");
354 StringRef ExpectedMarkdown = R
"md(- foo
361 EXPECT_EQ(L.asMarkdown(), ExpectedMarkdown);
362 StringRef ExpectedPlainText = R"pt(- foo
369 EXPECT_EQ(L.asPlainText(), ExpectedPlainText);
372 Inner.addParagraph().appendText(
"after");
373 ExpectedMarkdown = R
"md(- foo
382 EXPECT_EQ(L.asMarkdown(), ExpectedMarkdown);
383 ExpectedPlainText = R"pt(- foo
391 EXPECT_EQ(L.asPlainText(), ExpectedPlainText);