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

} // namespace clang
