| //===- unittest/AST/CommentTextTest.cpp - Comment text extraction test ----===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // Tests for user-friendly output formatting of comments, i.e. |
| // RawComment::getFormattedText(). |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "clang/AST/RawCommentList.h" |
| #include "clang/Basic/CommentOptions.h" |
| #include "clang/Basic/Diagnostic.h" |
| #include "clang/Basic/DiagnosticIDs.h" |
| #include "clang/Basic/FileManager.h" |
| #include "clang/Basic/FileSystemOptions.h" |
| #include "clang/Basic/SourceLocation.h" |
| #include "clang/Basic/SourceManager.h" |
| #include "clang/Basic/VirtualFileSystem.h" |
| #include "llvm/Support/MemoryBuffer.h" |
| #include <gtest/gtest.h> |
| |
| namespace clang { |
| |
| class CommentTextTest : public ::testing::Test { |
| protected: |
| std::string formatComment(llvm::StringRef CommentText) { |
| SourceManagerForFile FileSourceMgr("comment-test.cpp", CommentText); |
| SourceManager& SourceMgr = FileSourceMgr.get(); |
| |
| auto CommentStartOffset = CommentText.find("/"); |
| assert(CommentStartOffset != llvm::StringRef::npos); |
| FileID File = SourceMgr.getMainFileID(); |
| |
| SourceRange CommentRange( |
| SourceMgr.getLocForStartOfFile(File).getLocWithOffset( |
| CommentStartOffset), |
| SourceMgr.getLocForEndOfFile(File)); |
| CommentOptions EmptyOpts; |
| // FIXME: technically, merged that we set here is incorrect, but that |
| // shouldn't matter. |
| RawComment Comment(SourceMgr, CommentRange, EmptyOpts, /*Merged=*/true); |
| DiagnosticsEngine Diags(new DiagnosticIDs, new DiagnosticOptions); |
| return Comment.getFormattedText(SourceMgr, Diags); |
| } |
| }; |
| |
| TEST_F(CommentTextTest, FormattedText) { |
| // clang-format off |
| auto ExpectedOutput = |
| R"(This function does this and that. |
| For example, |
| Runnning it in that case will give you |
| this result. |
| That's about it.)"; |
| // Two-slash comments. |
| auto Formatted = formatComment( |
| R"cpp( |
| // This function does this and that. |
| // For example, |
| // Runnning it in that case will give you |
| // this result. |
| // That's about it.)cpp"); |
| EXPECT_EQ(ExpectedOutput, Formatted); |
| |
| // Three-slash comments. |
| Formatted = formatComment( |
| R"cpp( |
| /// This function does this and that. |
| /// For example, |
| /// Runnning it in that case will give you |
| /// this result. |
| /// That's about it.)cpp"); |
| EXPECT_EQ(ExpectedOutput, Formatted); |
| |
| // Block comments. |
| Formatted = formatComment( |
| R"cpp( |
| /* This function does this and that. |
| * For example, |
| * Runnning it in that case will give you |
| * this result. |
| * That's about it.*/)cpp"); |
| EXPECT_EQ(ExpectedOutput, Formatted); |
| |
| // Doxygen-style block comments. |
| Formatted = formatComment( |
| R"cpp( |
| /** This function does this and that. |
| * For example, |
| * Runnning it in that case will give you |
| * this result. |
| * That's about it.*/)cpp"); |
| EXPECT_EQ(ExpectedOutput, Formatted); |
| |
| // Weird indentation. |
| Formatted = formatComment( |
| R"cpp( |
| // This function does this and that. |
| // For example, |
| // Runnning it in that case will give you |
| // this result. |
| // That's about it.)cpp"); |
| EXPECT_EQ(ExpectedOutput, Formatted); |
| // clang-format on |
| } |
| |
| TEST_F(CommentTextTest, KeepsDoxygenControlSeqs) { |
| // clang-format off |
| auto ExpectedOutput = |
| R"(\brief This is the brief part of the comment. |
| \param a something about a. |
| @param b something about b.)"; |
| |
| auto Formatted = formatComment( |
| R"cpp( |
| /// \brief This is the brief part of the comment. |
| /// \param a something about a. |
| /// @param b something about b.)cpp"); |
| EXPECT_EQ(ExpectedOutput, Formatted); |
| // clang-format on |
| } |
| |
| } // namespace clang |