//===-- SymbolDocumentationTests.cpp --------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "SymbolDocumentation.h"
#include "support/Markup.h"
#include "clang/Basic/CommentOptions.h"
#include "llvm/ADT/StringRef.h"
#include "gtest/gtest.h"
namespace clang {
namespace clangd {
TEST(SymbolDocumentation, Parse) {
CommentOptions CommentOpts;
struct Case {
llvm::StringRef Documentation;
llvm::StringRef ExpectedRenderEscapedMarkdown;
llvm::StringRef ExpectedRenderMarkdown;
llvm::StringRef ExpectedRenderPlainText;
} Cases[] = {
{
"foo bar",
"foo bar",
"foo bar",
"foo bar",
},
{
"foo\nbar\n",
"foo\nbar",
"foo\nbar",
"foo bar",
},
{
"foo\n\nbar\n",
"foo\n\nbar",
"foo\n\nbar",
"foo\n\nbar",
},
{
"foo \\p bar baz",
"foo `bar` baz",
"foo `bar` baz",
"foo bar baz",
},
{
"foo \\e bar baz",
"foo \\*bar\\* baz",
"foo *bar* baz",
"foo *bar* baz",
},
{
"foo \\b bar baz",
"foo \\*\\*bar\\*\\* baz",
"foo **bar** baz",
"foo **bar** baz",
},
{
"foo \\ref bar baz",
"foo \\*\\*\\\\ref\\*\\* \\*bar\\* baz",
"foo **\\ref** *bar* baz",
"foo **\\ref** *bar* baz",
},
{
"foo @ref bar baz",
"foo \\*\\*@ref\\*\\* \\*bar\\* baz",
"foo **@ref** *bar* baz",
"foo **@ref** *bar* baz",
},
{
"\\brief this is a \\n\nbrief description",
"\\*\\*\\\\brief\\*\\* this is a \nbrief description",
"**\\brief** this is a \nbrief description",
"**\\brief** this is a\nbrief description",
},
{
"\\throw exception foo",
"\\*\\*\\\\throw\\*\\* \\*exception\\* foo",
"**\\throw** *exception* foo",
"**\\throw** *exception* foo",
},
{
"\\brief this is a brief description\n\n\\li item 1\n\\li item "
"2\n\\arg item 3",
"\\*\\*\\\\brief\\*\\* this is a brief description\n\n- item 1\n\n- "
"item "
"2\n\n- "
"item 3",
"**\\brief** this is a brief description\n\n- item 1\n\n- item "
"2\n\n- "
"item 3",
"**\\brief** this is a brief description\n\n- item 1\n\n- item "
"2\n\n- "
"item 3",
},
{
"\\defgroup mygroup this is a group\nthis is not a group description",
"\\*\\*@defgroup\\*\\* `mygroup this is a group`\n\nthis is not a "
"group "
"description",
"**@defgroup** `mygroup this is a group`\n\nthis is not a group "
"description",
"**@defgroup** `mygroup this is a group`\n\nthis is not a group "
"description",
},
{
"\\verbatim\nthis is a\nverbatim block containing\nsome verbatim "
"text\n\\endverbatim",
"\\*\\*@verbatim\\*\\*\n\n```\nthis is a\nverbatim block "
"containing\nsome "
"verbatim text\n```\n\n\\*\\*@endverbatim\\*\\*",
"**@verbatim**\n\n```\nthis is a\nverbatim block containing\nsome "
"verbatim text\n```\n\n**@endverbatim**",
"**@verbatim**\n\nthis is a\nverbatim block containing\nsome "
"verbatim text\n\n**@endverbatim**",
},
{
"@param foo this is a parameter\n@param bar this is another "
"parameter",
"",
"",
"",
},
{
"@brief brief docs\n\n@param foo this is a parameter\n\nMore "
"description\ndocumentation",
"\\*\\*@brief\\*\\* brief docs\n\nMore description\ndocumentation",
"**@brief** brief docs\n\nMore description\ndocumentation",
"**@brief** brief docs\n\nMore description documentation",
},
{
"this is a bold text\nnormal text\nthis is an italic "
"text\nthis is a code block
",
"\\this is a bold text\\\nnormal text\n\\this is an italic "
"text\\\n\\this is a code block\\
",
"\\this is a bold text\\\nnormal text\n\\this is an italic "
"text\\\n\\this is a code block\\
",
"this is a bold text normal text this is an italic "
"text this is a code block
",
},
};
for (const auto &C : Cases) {
markup::Document Doc;
SymbolDocCommentVisitor SymbolDoc(C.Documentation, CommentOpts);
SymbolDoc.docToMarkup(Doc);
EXPECT_EQ(Doc.asPlainText(), C.ExpectedRenderPlainText);
EXPECT_EQ(Doc.asMarkdown(), C.ExpectedRenderMarkdown);
EXPECT_EQ(Doc.asEscapedMarkdown(), C.ExpectedRenderEscapedMarkdown);
}
}
} // namespace clangd
} // namespace clang