//===-- 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, UnhandledDocs) { 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", "", "", "", }, { "\\throw exception foo", "\\*\\*\\\\throw\\*\\* \\*exception\\* foo", "**\\throw** *exception* foo", "**\\throw** *exception* foo", }, { R"(\brief this is a brief description \li item 1 \li item 2 \arg item 3)", R"(- item 1 - item 2 - item 3)", R"(- item 1 - item 2 - item 3)", R"(- item 1 - item 2 - 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", }, { R"(\verbatim this is a verbatim block containing some verbatim text \endverbatim)", R"(\*\*@verbatim\*\* ``` this is a verbatim block containing some verbatim text ``` \*\*@endverbatim\*\*)", R"(**@verbatim** ``` this is a verbatim block containing some verbatim text ``` **@endverbatim**)", R"(**@verbatim** this is a verbatim block containing some verbatim text **@endverbatim**)", }, { "@param foo this is a parameter\n@param bar this is another " "parameter", "", "", "", }, { R"(@brief brief docs @param foo this is a parameter \brief another brief? \details these are details More description documentation)", R"(\*\*\\brief\*\* another brief? \*\*\\details\*\* these are details More description documentation)", R"(**\brief** another brief? **\details** these are details More description documentation)", R"(**\brief** another brief? **\details** these are details More description documentation)", }, { R"(this is a bold text normal textthis is an italic text this is a code block)", R"(\this is a bold text\ normal text\this is an italic text\ \this is a code block\)", R"(\this is a bold text\ normal text\this is an italic text\ \this is a code block\)", "this is a bold text normal textthis 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