9#include "clang/Basic/LLVM.h"
10#include "llvm/ADT/StringRef.h"
11#include "gmock/gmock.h"
12#include "gtest/gtest.h"
19std::string escape(llvm::StringRef
Text) {
23std::string dontEscape(llvm::StringRef
Text) {
28 return testing::ExplainMatchResult(::testing::HasSubstr(std::string{
'\\',
C}),
29 arg, result_listener);
33 return testing::ExplainMatchResult(::testing::Not(::testing::HasSubstr(
"\\")),
34 arg, result_listener);
37TEST(Render, Escaping) {
39 std::string
Punctuation = R
"txt(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)txt";
40 std::string EscapedPunc = R"txt(!"#$%&'()\*+,-./:;<=>?@[\\]^\_\`{|}~)txt";
44 EXPECT_EQ(escape(
"`foo`"), R
"(\`foo\`)");
45 EXPECT_EQ(escape("`foo"), R
"(\`foo)");
46 EXPECT_EQ(escape("foo`"), R
"(foo\`)");
47 EXPECT_EQ(escape("``foo``"), R
"(\`\`foo\`\`)");
49 EXPECT_EQ(escape(
"```"), R
"(\`\`\`)");
50 EXPECT_EQ(escape(
"~~~"), R
"(\~~~)");
53 EXPECT_THAT(escape(
"## Heading"), escaped(
'#'));
54 EXPECT_THAT(escape(
"Foo # bar"), escapedNone());
55 EXPECT_EQ(escape(
"---"), R
"(\---)");
56 EXPECT_EQ(escape("-"), R
"(\-)");
57 EXPECT_EQ(escape("==="), R
"(\===)");
58 EXPECT_EQ(escape("="), R
"(\=)");
59 EXPECT_EQ(escape("***"), R
"(\*\*\*)");
62 EXPECT_THAT(escape(
"<pre"), escaped(
'<'));
63 EXPECT_THAT(escape(
"< pre"), escapedNone());
64 EXPECT_THAT(escape(
"if a<b then"), escaped(
'<'));
65 EXPECT_THAT(escape(
"if a<b then c."), escapedNone());
66 EXPECT_THAT(escape(
"if a<b then c='foo'."), escaped(
'<'));
67 EXPECT_THAT(escape(
"std::vector<T>"), escaped(
'<'));
68 EXPECT_THAT(escape(
"std::vector<std::string>"), escaped(
'<'));
69 EXPECT_THAT(escape(
"std::map<int, int>"), escapedNone());
71 EXPECT_THAT(escape(
"Email <foo@bar.com>"), escapedNone());
72 EXPECT_THAT(escape(
"Website <http://foo.bar>"), escapedNone());
75 EXPECT_THAT(escape(
"- foo"), escaped(
'-'));
76 EXPECT_THAT(escape(
"* foo"), escaped(
'*'));
77 EXPECT_THAT(escape(
"+ foo"), escaped(
'+'));
78 EXPECT_THAT(escape(
"+"), escaped(
'+'));
79 EXPECT_THAT(escape(
"a + foo"), escapedNone());
80 EXPECT_THAT(escape(
"a+ foo"), escapedNone());
81 EXPECT_THAT(escape(
"1. foo"), escaped(
'.'));
82 EXPECT_THAT(escape(
"a. foo"), escapedNone());
85 EXPECT_EQ(escape(
"*foo*"), R
"(\*foo\*)");
86 EXPECT_EQ(escape("**foo**"), R
"(\*\*foo\*\*)");
87 EXPECT_THAT(escape("*foo"), escaped(
'*'));
88 EXPECT_THAT(escape(
"foo *"), escapedNone());
89 EXPECT_THAT(escape(
"foo * bar"), escapedNone());
90 EXPECT_THAT(escape(
"foo_bar"), escapedNone());
91 EXPECT_THAT(escape(
"foo _bar"), escaped(
'_'));
92 EXPECT_THAT(escape(
"foo_ bar"), escaped(
'_'));
93 EXPECT_THAT(escape(
"foo _ bar"), escapedNone());
96 EXPECT_THAT(escape(
"fish &chips;"), escaped(
'&'));
97 EXPECT_THAT(escape(
"fish & chips;"), escapedNone());
98 EXPECT_THAT(escape(
"fish &chips"), escapedNone());
99 EXPECT_THAT(escape(
"foo * bar"), escaped(
'&'));
100 EXPECT_THAT(escape(
"foo ¯ bar"), escaped(
'&'));
101 EXPECT_THAT(escape(
"foo &?; bar"), escapedNone());
104 EXPECT_THAT(escape(
"[foo](bar)"), escaped(
']'));
105 EXPECT_THAT(escape(
"[foo]: bar"), escaped(
']'));
107 EXPECT_THAT(escape(
"[foo][]"), escapedNone());
108 EXPECT_THAT(escape(
"[foo][bar]"), escapedNone());
109 EXPECT_THAT(escape(
"[foo]"), escapedNone());
113 P.appendCode(
"* foo !+ bar * baz");
114 EXPECT_EQ(
P.asEscapedMarkdown(),
"`* foo !+ bar * baz`");
118 P.appendCode(
"foo`bar`baz",
true);
119 EXPECT_EQ(
P.asEscapedMarkdown(),
"`foo``bar``baz`");
121 EXPECT_EQ(
P.asPlainText(),
"'foo`bar`baz'");
125 P.appendCode(
"`foo");
126 EXPECT_EQ(
P.asEscapedMarkdown(),
"` ``foo `");
128 P.appendCode(
"foo`");
129 EXPECT_EQ(
P.asEscapedMarkdown(),
"` foo`` `");
131 P.appendCode(
"`foo`");
132 EXPECT_EQ(
P.asEscapedMarkdown(),
"` ``foo`` `");
136 D.addCodeBlock(
"foobarbaz `\nqux");
137 EXPECT_EQ(
D.asEscapedMarkdown(),
"```cpp\n"
141 D.addCodeBlock(
"foobarbaz ``\nqux");
142 EXPECT_THAT(
D.asEscapedMarkdown(),
"```cpp\n"
143 "foobarbaz ``\nqux\n"
146 D.addCodeBlock(
"foobarbaz ```\nqux");
147 EXPECT_EQ(
D.asEscapedMarkdown(),
"````cpp\n"
148 "foobarbaz ```\nqux\n"
151 D.addCodeBlock(
"foobarbaz ` `` ``` ```` `\nqux");
152 EXPECT_EQ(
D.asEscapedMarkdown(),
"`````cpp\n"
153 "foobarbaz ` `` ``` ```` `\nqux\n"
157TEST(Render, NoEscaping) {
159 std::string
Punctuation = R
"txt(!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~)txt";
163 EXPECT_THAT(dontEscape(
"`foo`"), escapedNone());
164 EXPECT_THAT(dontEscape(
"`foo"), escapedNone());
165 EXPECT_THAT(dontEscape(
"foo`"), escapedNone());
166 EXPECT_THAT(dontEscape(
"``foo``"), escapedNone());
168 EXPECT_THAT(dontEscape(
"```"), escapedNone());
169 EXPECT_THAT(dontEscape(
"~~~"), escapedNone());
172 EXPECT_THAT(dontEscape(
"## Heading"), escapedNone());
173 EXPECT_THAT(dontEscape(
"Foo # bar"), escapedNone());
174 EXPECT_THAT(dontEscape(
"---"), escapedNone());
175 EXPECT_THAT(dontEscape(
"-"), escapedNone());
176 EXPECT_THAT(dontEscape(
"==="), escapedNone());
177 EXPECT_THAT(dontEscape(
"="), escapedNone());
178 EXPECT_THAT(dontEscape(
"***"), escapedNone());
181 EXPECT_THAT(dontEscape(
"<pre"), escaped(
'<'));
182 EXPECT_THAT(dontEscape(
"< pre"), escapedNone());
183 EXPECT_THAT(dontEscape(
"if a<b then"), escaped(
'<'));
184 EXPECT_THAT(dontEscape(
"if a<b then c."), escapedNone());
185 EXPECT_THAT(dontEscape(
"if a<b then c='foo'."), escaped(
'<'));
186 EXPECT_THAT(dontEscape(
"std::vector<T>"), escaped(
'<'));
187 EXPECT_THAT(dontEscape(
"std::vector<std::string>"), escaped(
'<'));
188 EXPECT_THAT(dontEscape(
"std::map<int, int>"), escapedNone());
190 EXPECT_THAT(dontEscape(
"Email <foo@bar.com>"), escapedNone());
191 EXPECT_THAT(dontEscape(
"Website <http://foo.bar>"), escapedNone());
194 EXPECT_THAT(dontEscape(
"- foo"), escapedNone());
195 EXPECT_THAT(dontEscape(
"* foo"), escapedNone());
196 EXPECT_THAT(dontEscape(
"+ foo"), escapedNone());
197 EXPECT_THAT(dontEscape(
"+"), escapedNone());
198 EXPECT_THAT(dontEscape(
"a + foo"), escapedNone());
199 EXPECT_THAT(dontEscape(
"a+ foo"), escapedNone());
200 EXPECT_THAT(dontEscape(
"1. foo"), escapedNone());
201 EXPECT_THAT(dontEscape(
"a. foo"), escapedNone());
204 EXPECT_THAT(dontEscape(
"*foo*"), escapedNone());
205 EXPECT_THAT(dontEscape(
"**foo**"), escapedNone());
206 EXPECT_THAT(dontEscape(
"*foo"), escapedNone());
207 EXPECT_THAT(dontEscape(
"foo *"), escapedNone());
208 EXPECT_THAT(dontEscape(
"foo * bar"), escapedNone());
209 EXPECT_THAT(dontEscape(
"foo_bar"), escapedNone());
210 EXPECT_THAT(dontEscape(
"foo _bar"), escapedNone());
211 EXPECT_THAT(dontEscape(
"foo_ bar"), escapedNone());
212 EXPECT_THAT(dontEscape(
"foo _ bar"), escapedNone());
215 EXPECT_THAT(dontEscape(
"fish &chips;"), escaped(
'&'));
216 EXPECT_THAT(dontEscape(
"fish & chips;"), escapedNone());
217 EXPECT_THAT(dontEscape(
"fish &chips"), escapedNone());
218 EXPECT_THAT(dontEscape(
"foo * bar"), escaped(
'&'));
219 EXPECT_THAT(dontEscape(
"foo ¯ bar"), escaped(
'&'));
220 EXPECT_THAT(dontEscape(
"foo &?; bar"), escapedNone());
223 EXPECT_THAT(dontEscape(
"[foo](bar)"), escapedNone());
224 EXPECT_THAT(dontEscape(
"[foo]: bar"), escapedNone());
226 EXPECT_THAT(dontEscape(
"[foo][]"), escapedNone());
227 EXPECT_THAT(dontEscape(
"[foo][bar]"), escapedNone());
228 EXPECT_THAT(dontEscape(
"[foo]"), escapedNone());
232 P.appendCode(
"* foo !+ bar * baz");
233 EXPECT_EQ(
P.asMarkdown(),
"`* foo !+ bar * baz`");
237 P.appendCode(
"foo`bar`baz",
true);
238 EXPECT_EQ(
P.asMarkdown(),
"`foo``bar``baz`");
242 P.appendCode(
"`foo");
243 EXPECT_EQ(
P.asMarkdown(),
"` ``foo `");
245 P.appendCode(
"foo`");
246 EXPECT_EQ(
P.asMarkdown(),
"` foo`` `");
248 P.appendCode(
"`foo`");
249 EXPECT_EQ(
P.asMarkdown(),
"` ``foo`` `");
253 D.addCodeBlock(
"foobarbaz `\nqux");
254 EXPECT_EQ(
D.asMarkdown(),
"```cpp\n"
258 D.addCodeBlock(
"foobarbaz ``\nqux");
259 EXPECT_THAT(
D.asMarkdown(),
"```cpp\n"
260 "foobarbaz ``\nqux\n"
263 D.addCodeBlock(
"foobarbaz ```\nqux");
264 EXPECT_EQ(
D.asMarkdown(),
"````cpp\n"
265 "foobarbaz ```\nqux\n"
268 D.addCodeBlock(
"foobarbaz ` `` ``` ```` `\nqux");
269 EXPECT_EQ(
D.asMarkdown(),
"`````cpp\n"
270 "foobarbaz ` `` ``` ```` `\nqux\n"
280 P.appendText(
"after ");
281 EXPECT_EQ(
P.asEscapedMarkdown(),
"after");
282 EXPECT_EQ(
P.asMarkdown(),
"after");
283 EXPECT_EQ(
P.asPlainText(),
"after");
285 P.appendCode(
"foobar").appendSpace();
286 EXPECT_EQ(
P.asEscapedMarkdown(),
"after `foobar`");
287 EXPECT_EQ(
P.asMarkdown(),
"after `foobar`");
288 EXPECT_EQ(
P.asPlainText(),
"after foobar");
291 EXPECT_EQ(
P.asEscapedMarkdown(),
"after `foobar` bat");
292 EXPECT_EQ(
P.asMarkdown(),
"after `foobar` bat");
293 EXPECT_EQ(
P.asPlainText(),
"after foobar bat");
295 P.appendCode(
"no").appendCode(
"space");
296 EXPECT_EQ(
P.asEscapedMarkdown(),
"after `foobar` bat`no` `space`");
297 EXPECT_EQ(
P.asMarkdown(),
"after `foobar` bat`no` `space`");
298 EXPECT_EQ(
P.asPlainText(),
"after foobar batno space");
300 P.appendText(
" text");
301 EXPECT_EQ(
P.asEscapedMarkdown(),
"after `foobar` bat`no` `space` text");
302 EXPECT_EQ(
P.asMarkdown(),
"after `foobar` bat`no` `space` text");
303 EXPECT_EQ(
P.asPlainText(),
"after foobar batno space text");
305 P.appendSpace().appendCode(
"code").appendText(
".\n newline");
306 EXPECT_EQ(
P.asEscapedMarkdown(),
307 "after `foobar` bat`no` `space` text `code`. \n newline");
308 EXPECT_EQ(
P.asMarkdown(),
309 "after `foobar` bat`no` `space` text `code`. \n newline");
310 EXPECT_EQ(
P.asPlainText(),
"after foobar batno space text code.\nnewline");
320 P.appendText(
"after ");
321 EXPECT_EQ(
P.asEscapedMarkdown(),
"after");
322 EXPECT_EQ(
P.asMarkdown(),
"after");
323 EXPECT_EQ(
P.asPlainText(),
"after");
325 P.appendText(
"foobar");
326 EXPECT_EQ(
P.asEscapedMarkdown(),
"after foobar");
327 EXPECT_EQ(
P.asMarkdown(),
"after foobar");
328 EXPECT_EQ(
P.asPlainText(),
"after foobar");
330 P.appendText(
" bat");
331 EXPECT_EQ(
P.asEscapedMarkdown(),
"after foobar bat");
332 EXPECT_EQ(
P.asMarkdown(),
"after foobar bat");
333 EXPECT_EQ(
P.asPlainText(),
"after foobar bat");
336 EXPECT_EQ(
P.asEscapedMarkdown(),
"after foobar batbaz");
337 EXPECT_EQ(
P.asMarkdown(),
"after foobar batbaz");
338 EXPECT_EQ(
P.asPlainText(),
"after foobar batbaz");
340 P.appendText(
" faz ");
341 EXPECT_EQ(
P.asEscapedMarkdown(),
"after foobar batbaz faz");
342 EXPECT_EQ(
P.asMarkdown(),
"after foobar batbaz faz");
343 EXPECT_EQ(
P.asPlainText(),
"after foobar batbaz faz");
345 P.appendText(
" bar ");
346 EXPECT_EQ(
P.asEscapedMarkdown(),
"after foobar batbaz faz bar");
347 EXPECT_EQ(
P.asMarkdown(),
"after foobar batbaz faz bar");
348 EXPECT_EQ(
P.asPlainText(),
"after foobar batbaz faz bar");
351 EXPECT_EQ(
P.asEscapedMarkdown(),
"after foobar batbaz faz bar qux");
352 EXPECT_EQ(
P.asMarkdown(),
"after foobar batbaz faz bar qux");
353 EXPECT_EQ(
P.asPlainText(),
"after foobar batbaz faz bar qux");
363 P.appendText(
"after \n");
364 EXPECT_EQ(
P.asEscapedMarkdown(),
"after");
365 EXPECT_EQ(
P.asMarkdown(),
"after");
366 EXPECT_EQ(
P.asPlainText(),
"after");
368 P.appendText(
" foobar\n");
369 EXPECT_EQ(
P.asEscapedMarkdown(),
"after \n foobar");
370 EXPECT_EQ(
P.asMarkdown(),
"after \n foobar");
371 EXPECT_EQ(
P.asPlainText(),
"after\nfoobar");
373 P.appendText(
"- bat\n");
374 EXPECT_EQ(
P.asEscapedMarkdown(),
"after \n foobar \n\\- bat");
375 EXPECT_EQ(
P.asMarkdown(),
"after \n foobar\n- bat");
376 EXPECT_EQ(
P.asPlainText(),
"after\nfoobar\n- bat");
378 P.appendText(
"- baz");
379 EXPECT_EQ(
P.asEscapedMarkdown(),
"after \n foobar \n\\- bat \n\\- baz");
380 EXPECT_EQ(
P.asMarkdown(),
"after \n foobar\n- bat\n- baz");
381 EXPECT_EQ(
P.asPlainText(),
"after\nfoobar\n- bat\n- baz");
383 P.appendText(
" faz ");
384 EXPECT_EQ(
P.asEscapedMarkdown(),
385 "after \n foobar \n\\- bat \n\\- baz faz");
386 EXPECT_EQ(
P.asMarkdown(),
"after \n foobar\n- bat\n- baz faz");
387 EXPECT_EQ(
P.asPlainText(),
"after\nfoobar\n- bat\n- baz faz");
394 std::string EscapedMarkdown;
398 {
"Line ending with dot.\nForces a visual linebreak.",
399 "Line ending with dot. \nForces a visual linebreak.",
400 "Line ending with dot. \nForces a visual linebreak.",
401 "Line ending with dot.\nForces a visual linebreak."},
402 {
"Line ending with colon:\nForces a visual linebreak.",
403 "Line ending with colon: \nForces a visual linebreak.",
404 "Line ending with colon: \nForces a visual linebreak.",
405 "Line ending with colon:\nForces a visual linebreak."},
406 {
"Line ending with semicolon:\nForces a visual linebreak.",
407 "Line ending with semicolon: \nForces a visual linebreak.",
408 "Line ending with semicolon: \nForces a visual linebreak.",
409 "Line ending with semicolon:\nForces a visual linebreak."},
410 {
"Line ending with comma,\nForces a visual linebreak.",
411 "Line ending with comma, \nForces a visual linebreak.",
412 "Line ending with comma, \nForces a visual linebreak.",
413 "Line ending with comma,\nForces a visual linebreak."},
414 {
"Line ending with exclamation mark!\nForces a visual linebreak.",
415 "Line ending with exclamation mark! \nForces a visual linebreak.",
416 "Line ending with exclamation mark! \nForces a visual linebreak.",
417 "Line ending with exclamation mark!\nForces a visual linebreak."},
418 {
"Line ending with question mark?\nForces a visual linebreak.",
419 "Line ending with question mark? \nForces a visual linebreak.",
420 "Line ending with question mark? \nForces a visual linebreak.",
421 "Line ending with question mark?\nForces a visual linebreak."},
424 for (
const auto &C : Cases) {
426 P.appendText(
C.Text);
427 EXPECT_EQ(
P.asEscapedMarkdown(),
C.EscapedMarkdown);
428 EXPECT_EQ(
P.asMarkdown(),
C.Markdown);
429 EXPECT_EQ(
P.asPlainText(),
C.PlainText);
437 std::string EscapedMarkdown;
441 {
"Visual linebreak for\n- list items\n- and so on",
442 "Visual linebreak for \n\\- list items \n\\- and so on",
443 "Visual linebreak for\n- list items\n- and so on",
444 "Visual linebreak for\n- list items\n- and so on"},
445 {
"Visual linebreak for\n* list items\n* and so on",
446 "Visual linebreak for \n\\* list items \n\\* and so on",
447 "Visual linebreak for\n* list items\n* and so on",
448 "Visual linebreak for\n* list items\n* and so on"},
449 {
"Visual linebreak for\n@command any doxygen command\n\\other other "
451 "Visual linebreak for \n@command any doxygen command \n\\\\other "
452 "other doxygen command",
453 "Visual linebreak for \n@command any doxygen command \n\\other other "
455 "Visual linebreak for\n@command any doxygen command\n\\other other "
457 {
"Visual linebreak for\n>blockquoute line 1\n> blockquoute line 2",
458 "Visual linebreak for \n\\>blockquoute line 1 \n\\> blockquoute line "
460 "Visual linebreak for\n>blockquoute line 1\n> blockquoute line 2",
461 "Visual linebreak for\n>blockquoute line 1\n> blockquoute line 2"},
462 {
"Visual linebreak for\n# Heading 1\ntext under heading\n## Heading "
463 "2\ntext under heading 2",
464 "Visual linebreak for \n\\# Heading 1\ntext under heading \n\\## "
465 "Heading 2\ntext under heading 2",
466 "Visual linebreak for\n# Heading 1\ntext under heading\n## Heading "
467 "2\ntext under heading 2",
468 "Visual linebreak for\n# Heading 1 text under heading\n## Heading 2 "
469 "text under heading 2"},
470 {
"Visual linebreak for\n`inline code`",
471 "Visual linebreak for \n\\`inline code\\`",
472 "Visual linebreak for\n`inline code`",
473 "Visual linebreak for\n`inline code`"},
476 for (
const auto &C : Cases) {
478 P.appendText(
C.Text);
479 EXPECT_EQ(
P.asEscapedMarkdown(),
C.EscapedMarkdown);
480 EXPECT_EQ(
P.asMarkdown(),
C.Markdown);
481 EXPECT_EQ(
P.asPlainText(),
C.PlainText);
489 P.appendText(
"foo\n \t baz");
490 P.appendCode(
" bar\n");
491 EXPECT_EQ(
P.asEscapedMarkdown(),
"foo\n \t baz`bar`");
492 EXPECT_EQ(
P.asMarkdown(),
"foo\n \t baz`bar`");
493 EXPECT_EQ(
P.asPlainText(),
"foo bazbar");
498 P.appendText(
" foo bar ");
499 P.appendText(
" baz ");
500 EXPECT_EQ(
P.asEscapedMarkdown(),
"foo bar baz");
501 EXPECT_EQ(
P.asMarkdown(),
"foo bar baz");
502 EXPECT_EQ(
P.asPlainText(),
"foo bar baz");
508 P.appendText(
" \n foo\nbar\n ");
509 P.appendCode(
" \n foo\nbar \n ");
510 EXPECT_EQ(
P.asEscapedMarkdown(),
"foo\nbar\n `foo bar`");
511 EXPECT_EQ(
P.asMarkdown(),
"foo\nbar\n `foo bar`");
512 EXPECT_EQ(
P.asPlainText(),
"foo bar foo bar");
517 P.appendBoldText(
"");
518 EXPECT_EQ(
P.asEscapedMarkdown(),
"");
519 EXPECT_EQ(
P.asMarkdown(),
"");
520 EXPECT_EQ(
P.asPlainText(),
"");
522 P.appendBoldText(
" \n foo\nbar\n ");
523 EXPECT_EQ(
P.asEscapedMarkdown(),
"\\*\\*foo bar\\*\\*");
524 EXPECT_EQ(
P.asMarkdown(),
"**foo bar**");
525 EXPECT_EQ(
P.asPlainText(),
"**foo bar**");
527 P.appendSpace().appendBoldText(
"foobar");
528 EXPECT_EQ(
P.asEscapedMarkdown(),
"\\*\\*foo bar\\*\\* \\*\\*foobar\\*\\*");
529 EXPECT_EQ(
P.asMarkdown(),
"**foo bar** **foobar**");
530 EXPECT_EQ(
P.asPlainText(),
"**foo bar** **foobar**");
535 P.appendEmphasizedText(
"");
536 EXPECT_EQ(
P.asEscapedMarkdown(),
"");
537 EXPECT_EQ(
P.asMarkdown(),
"");
538 EXPECT_EQ(
P.asPlainText(),
"");
540 P.appendEmphasizedText(
" \n foo\nbar\n ");
541 EXPECT_EQ(
P.asEscapedMarkdown(),
"\\*foo bar\\*");
542 EXPECT_EQ(
P.asMarkdown(),
"*foo bar*");
543 EXPECT_EQ(
P.asPlainText(),
"*foo bar*");
545 P.appendSpace().appendEmphasizedText(
"foobar");
546 EXPECT_EQ(
P.asEscapedMarkdown(),
"\\*foo bar\\* \\*foobar\\*");
547 EXPECT_EQ(
P.asMarkdown(),
"*foo bar* *foobar*");
548 EXPECT_EQ(
P.asPlainText(),
"*foo bar* *foobar*");
551TEST(Document, Separators) {
553 D.addParagraph().appendText(
"foo");
554 D.addCodeBlock(
"test");
555 D.addParagraph().appendText(
"bar");
557 const char ExpectedMarkdown[] = R
"md(foo
564 EXPECT_EQ(D.asEscapedMarkdown(), ExpectedMarkdown);
565 EXPECT_EQ(D.asMarkdown(), ExpectedMarkdown);
567 const char ExpectedText[] = R
"pt(foo
572 EXPECT_EQ(D.asPlainText(), ExpectedText);
575TEST(Document, Ruler) {
577 D.addParagraph().appendText("foo");
581 D.addParagraph().appendText(
"bar");
582 EXPECT_EQ(
D.asEscapedMarkdown(),
"foo\n\n---\nbar");
583 EXPECT_EQ(
D.asMarkdown(),
"foo\n\n---\nbar");
584 EXPECT_EQ(
D.asPlainText(),
"foo\n\nbar");
587 D.addParagraph().appendText(
"foo");
589 D.addCodeBlock(
"bar");
591 EXPECT_EQ(
D.asEscapedMarkdown(),
"foo\n\n---\n```cpp\nbar\n```");
592 EXPECT_EQ(
D.asMarkdown(),
"foo\n\n---\n```cpp\nbar\n```");
593 EXPECT_EQ(
D.asPlainText(),
"foo\n\nbar");
597 D.addParagraph().appendText(
"foo");
600 EXPECT_EQ(
D.asEscapedMarkdown(),
"foo");
601 EXPECT_EQ(
D.asMarkdown(),
"foo");
602 EXPECT_EQ(
D.asPlainText(),
"foo");
606 D.addParagraph().appendText(
"foo");
607 EXPECT_EQ(
D.asEscapedMarkdown(),
"foo\n\n---\nfoo");
608 EXPECT_EQ(
D.asMarkdown(),
"foo\n\n---\nfoo");
609 EXPECT_EQ(
D.asPlainText(),
"foo\n\nfoo");
612TEST(Document, Append) {
614 D.addParagraph().appendText(
"foo");
618 E.addParagraph().appendText(
"bar");
619 D.append(std::move(E));
620 EXPECT_EQ(
D.asEscapedMarkdown(),
"foo\n\n---\nbar");
621 EXPECT_EQ(
D.asMarkdown(),
"foo\n\n---\nbar");
624TEST(Document, Heading) {
626 D.addHeading(1).appendText(
"foo");
627 D.addHeading(2).appendText(
"bar");
628 D.addParagraph().appendText(
"baz");
629 EXPECT_EQ(
D.asEscapedMarkdown(),
"# foo\n\n## bar\n\nbaz");
630 EXPECT_EQ(
D.asMarkdown(),
"# foo\n\n## bar\n\nbaz");
631 EXPECT_EQ(
D.asPlainText(),
"foo\n\nbar\n\nbaz");
634TEST(CodeBlock, Render) {
637 D.addCodeBlock(
"foo\n bar\n baz");
639 llvm::StringRef ExpectedMarkdown =
645 llvm::StringRef ExpectedPlainText =
649 EXPECT_EQ(D.asEscapedMarkdown(), ExpectedMarkdown);
650 EXPECT_EQ(D.asMarkdown(), ExpectedMarkdown);
651 EXPECT_EQ(D.asPlainText(), ExpectedPlainText);
652 D.addCodeBlock("foo");
663 EXPECT_EQ(D.asEscapedMarkdown(), ExpectedMarkdown);
664 EXPECT_EQ(D.asMarkdown(), ExpectedMarkdown);
671 EXPECT_EQ(D.asPlainText(), ExpectedPlainText);
675 EXPECT_EQ(D2.asEscapedMarkdown(),
"```cpp\n```");
676 EXPECT_EQ(D2.asMarkdown(),
"```cpp\n```");
677 EXPECT_EQ(D2.asPlainText(),
"");
680TEST(BulletList, Render) {
683 L.addItem().addParagraph().appendText(
"foo");
684 EXPECT_EQ(L.asEscapedMarkdown(),
"- foo");
685 EXPECT_EQ(L.asMarkdown(),
"- foo");
686 EXPECT_EQ(L.asPlainText(),
"- foo");
688 L.addItem().addParagraph().appendText(
"bar");
689 llvm::StringRef Expected = R
"md(- foo
691 EXPECT_EQ(L.asEscapedMarkdown(), Expected);
692 EXPECT_EQ(L.asMarkdown(), Expected);
693 EXPECT_EQ(L.asPlainText(), Expected);
696 Document &
D = L.addItem();
698 D.addParagraph().appendText(
"foo");
699 D.addParagraph().appendText(
"baz");
702 Document &Inner =
D.addBulletList().addItem();
703 Inner.addParagraph().appendText(
"foo");
706 BulletList &InnerList = Inner.addBulletList();
708 Document &DeepDoc = InnerList.addItem();
709 DeepDoc.addParagraph().appendText(
"baz");
710 DeepDoc.addParagraph().appendText(
"baz");
711 StringRef ExpectedMarkdown = R
"md(- foo
722 EXPECT_EQ(L.asEscapedMarkdown(), ExpectedMarkdown);
723 EXPECT_EQ(L.asMarkdown(), ExpectedMarkdown);
724 StringRef ExpectedPlainText = R"pt(- foo
735 EXPECT_EQ(L.asPlainText(), ExpectedPlainText);
738 Inner.addParagraph().appendText(
"after");
739 ExpectedMarkdown = R
"md(- foo
752 EXPECT_EQ(L.asEscapedMarkdown(), ExpectedMarkdown);
753 EXPECT_EQ(L.asMarkdown(), ExpectedMarkdown);
754 ExpectedPlainText = R"pt(- foo
767 EXPECT_EQ(L.asPlainText(), ExpectedPlainText);
Represents parts of the markup that can contain strings, like inline code, code block or plain text.
std::string asMarkdown() const
Doesn't contain any trailing newlines.
Paragraph & appendText(llvm::StringRef Text)
Append plain text to the end of the string.
std::string asEscapedMarkdown() const
Doesn't contain any trailing newlines and escaped markdown syntax.
FIXME: Skip testing on windows temporarily due to the different escaping code mode.
TEST(BackgroundQueueTest, Priority)
cppcoreguidelines::ProBoundsAvoidUncheckedContainerAccessCheck P
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//