|  | //===- unittest/AST/CommentTextTest.cpp - Comment text extraction test ----===// | 
|  | // | 
|  | // 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 | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // 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 "llvm/Support/MemoryBuffer.h" | 
|  | #include "llvm/Support/VirtualFileSystem.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 | 
|  | } | 
|  |  | 
|  | TEST_F(CommentTextTest, EmptyFormattedText) { | 
|  | // Test that empty formatted text doesn't cause crash. | 
|  | const char *ExpectedOutput = ""; | 
|  | auto Formatted = formatComment("//!<"); | 
|  | EXPECT_EQ(ExpectedOutput, Formatted); | 
|  | } | 
|  |  | 
|  | } // namespace clang |