//===- 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
