14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===- unittest/Format/CleanupTest.cpp - Code cleanup unit tests ----------===//
24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//
34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//
54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// License. See LICENSE.TXT for details.
74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//
84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===//
94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Format/Format.h"
114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "../Tooling/RewriterTestContext.h"
134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/Tooling/Core/Replacement.h"
144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "gtest/gtest.h"
164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace clang {
184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace format {
194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace {
204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CleanupTest : public ::testing::Test {
224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string cleanup(llvm::StringRef Code,
244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      const std::vector<tooling::Range> &Ranges,
254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                      const FormatStyle &Style = getLLVMStyle()) {
264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    tooling::Replacements Replaces = format::cleanup(Style, Code, Ranges);
274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Result = applyAllReplacements(Code, Replaces);
294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(Result));
304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return *Result;
314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
344967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, DeleteEmptyNamespaces) {
354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A {\n"
364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace B {\n"
374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace B\n"
384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace A\n\n"
394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace C {\n"
404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace D { int i; }\n"
414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "inline namespace E { namespace { } }\n"
424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "}";
434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n\n\n\n\nnamespace C {\n"
444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "namespace D { int i; }\n   \n"
454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "}";
464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges;
474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(28, 0));
484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(91, 6));
494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(132, 0));
504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
544967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, NamespaceWithSyntaxError) {
554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A {\n"
564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace B {\n" // missing r_brace
574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace A\n\n"
584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace C {\n"
594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace D int i; }\n"
604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "inline namespace E { namespace { } }\n"
614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "}";
624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "namespace A {\n"
634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n\n\nnamespace C {\n"
644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "namespace D int i; }\n   \n"
654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "}";
664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
714967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, EmptyNamespaceNotAffected) {
724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A {\n\n"
734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace {\n\n}}";
744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Even though the namespaces are empty, but the inner most empty namespace
754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // block is not affected by the changed ranges.
764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "namespace A {\n\n"
774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "namespace {\n\n}}";
784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Set the changed range to be the second "\n".
794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges(1, tooling::Range(14, 0));
804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
844967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, EmptyNamespaceWithCommentsNoBreakBeforeBrace) {
854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A {\n"
864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace B {\n"
874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "// Yo\n"
884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace B\n"
894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace A\n"
904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace C { // Yo\n"
914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "}";
924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n\n\n\n\n\n";
934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
984967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, EmptyNamespaceWithCommentsBreakBeforeBrace) {
994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A\n"
1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "/* Yo */ {\n"
1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace B\n"
1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "{\n"
1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "// Yo\n"
1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace B\n"
1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace A\n"
1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace C\n"
1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "{ // Yo\n"
1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "}\n";
1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n\n\n\n\n\n\n\n\n\n";
1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatStyle Style = getLLVMStyle();
1124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style.BraceWrapping.AfterNamespace = true;
1134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges, Style);
1144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1174967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, CtorInitializationSimpleRedundantComma) {
1184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "class A {\nA() : , {} };";
1194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "class A {\nA()  {} };";
1204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges;
1214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(17, 0));
1224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(19, 0));
1234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
1244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() : x(1), {} };";
1274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() : x(1) {} };";
1284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.clear();
1294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(23, 0));
1304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
1314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() :,,,,{} };";
1344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() {} };";
1354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.clear();
1364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(15, 0));
1374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
1384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1414967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, ListSimpleRedundantComma) {
1424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "void f() { std::vector<int> v = {1,2,,,3,{4,5}}; }";
1434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "void f() { std::vector<int> v = {1,2,3,{4,5}}; }";
1444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges;
1454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(40, 0));
1464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
1474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "int main() { f(1,,2,3,,4);}";
1504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "int main() { f(1,2,3,4);}";
1514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.clear();
1524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(17, 0));
1534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(22, 0));
1544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
1554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1584967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, CtorInitializationBracesInParens) {
1594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "class A {\nA() : x({1}),, {} };";
1604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "class A {\nA() : x({1}) {} };";
1614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges;
1624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(24, 0));
1634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(26, 0));
1644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
1654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1684967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, RedundantCommaNotInAffectedRanges) {
1694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code =
1704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class A {\nA() : x({1}), /* comment */, { int x = 0; } };";
1714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected =
1724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      "class A {\nA() : x({1}), /* comment */, { int x = 0; } };";
1734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Set the affected range to be "int x = 0", which does not intercept the
1744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // constructor initialization list.
1754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges(1, tooling::Range(42, 9));
1764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
1774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() : x(1), {} };";
1804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() : x(1), {} };";
1814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // No range. Fixer should do nothing.
1824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.clear();
1834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
1844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
1864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// FIXME: delete comments too.
1884967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, CtorInitializationCommentAroundCommas) {
1894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Remove redundant commas around comment.
1904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "class A {\nA() : x({1}), /* comment */, {} };";
1914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "class A {\nA() : x({1}) /* comment */ {} };";
1924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges;
1934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(25, 0));
1944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges.push_back(tooling::Range(40, 0));
1954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
1964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
1974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
1984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Remove trailing comma and ignore comment.
1994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() : x({1}), // comment\n{} };";
2004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() : x({1}) // comment\n{} };";
2014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges = std::vector<tooling::Range>(1, tooling::Range(25, 0));
2024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
2034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
2044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Remove trailing comma and ignore comment.
2064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() : x({1}), // comment\n , y(1),{} };";
2074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() : x({1}), // comment\n  y(1){} };";
2084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges = std::vector<tooling::Range>(1, tooling::Range(38, 0));
2094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
2104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
2114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Remove trailing comma and ignore comment.
2134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() : x({1}), \n/* comment */, y(1),{} };";
2144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() : x({1}), \n/* comment */ y(1){} };";
2154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges = std::vector<tooling::Range>(1, tooling::Range(40, 0));
2164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
2174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
2184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // Remove trailing comma and ignore comment.
2204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Code = "class A {\nA() : , // comment\n y(1),{} };";
2214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Expected = "class A {\nA() :  // comment\n y(1){} };";
2224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Ranges = std::vector<tooling::Range>(1, tooling::Range(17, 0));
2234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Result = cleanup(Code, Ranges);
2244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
2254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2274967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanupTest, CtorInitializerInNamespace) {
2284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A {\n"
2294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace B {\n" // missing r_brace
2304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace A\n\n"
2314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace C {\n"
2324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "class A { A() : x(0),, {} };\n"
2334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "inline namespace E { namespace { } }\n"
2344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "}";
2354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "namespace A {\n"
2364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n\n\nnamespace C {\n"
2374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "class A { A() : x(0) {} };\n   \n"
2384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "}";
2394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::vector<tooling::Range> Ranges(1, tooling::Range(0, Code.size()));
2404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Result = cleanup(Code, Ranges);
2414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, Result);
2424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
2434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass CleanUpReplacementsTest : public ::testing::Test {
2454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprotected:
2464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacement createReplacement(unsigned Offset, unsigned Length,
2474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                         StringRef Text) {
2484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return tooling::Replacement(FileName, Offset, Length, Text);
2494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacement createInsertion(StringRef HeaderName) {
2524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return createReplacement(UINT_MAX, 0, HeaderName);
2534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  inline std::string apply(StringRef Code,
2564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                           const tooling::Replacements Replaces) {
2574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto CleanReplaces = cleanupAroundReplacements(Code, Replaces, Style);
2584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(CleanReplaces))
2594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        << llvm::toString(CleanReplaces.takeError()) << "\n";
2604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Result = applyAllReplacements(Code, *CleanReplaces);
2614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(Result));
2624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return *Result;
2634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  inline std::string formatAndApply(StringRef Code,
2664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    const tooling::Replacements Replaces) {
2674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto CleanReplaces = cleanupAroundReplacements(Code, Replaces, Style);
2694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(CleanReplaces))
2704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        << llvm::toString(CleanReplaces.takeError()) << "\n";
2714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto FormattedReplaces = formatReplacements(Code, *CleanReplaces, Style);
2724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(FormattedReplaces))
2734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        << llvm::toString(FormattedReplaces.takeError()) << "\n";
2744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto Result = applyAllReplacements(Code, *FormattedReplaces);
2754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    EXPECT_TRUE(static_cast<bool>(Result));
2764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return *Result;
2774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  int getOffset(StringRef Code, int Line, int Column) {
2804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    RewriterTestContext Context;
2814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    FileID ID = Context.createInMemoryFile(FileName, Code);
2824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    auto DecomposedLocation =
2834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar        Context.Sources.getDecomposedLoc(Context.getLocation(ID, Line, Column));
2844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar    return DecomposedLocation.second;
2854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  }
2864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  const std::string FileName = "fix.cpp";
2884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  FormatStyle Style = getLLVMStyle();
2894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar};
2904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
2914967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, FixOnlyAffectedCodeAfterReplacements) {
2924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "namespace A {\n"
2934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace B {\n"
2944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "  int x;\n"
2954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace B\n"
2964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "} // namespace A\n"
2974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
2984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace C {\n"
2994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "namespace D { int i; }\n"
3004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "inline namespace E { namespace { int y; } }\n"
3014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int x=     0;"
3024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "}";
3034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n\nnamespace C {\n"
3044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "namespace D { int i; }\n\n"
3054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x=     0;"
3064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "}";
3074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {
3084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createReplacement(getOffset(Code, 3, 3), 6, ""),
3094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createReplacement(getOffset(Code, 9, 34), 6, "")};
3104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, formatAndApply(Code, Replaces));
3124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3144967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, NoExistingIncludeWithoutDefine) {
3154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "int main() {}";
3164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"a.h\"\n"
3174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int main() {}";
3184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"a.h\"")};
3194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
3204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3224967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, NoExistingIncludeWithDefine) {
3234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#ifndef A_H\n"
3244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define A_H\n"
3254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "class A {};\n"
3264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define MMM 123\n"
3274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#endif";
3284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#ifndef A_H\n"
3294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define A_H\n"
3304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"b.h\"\n"
3314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "class A {};\n"
3324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define MMM 123\n"
3334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#endif";
3344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"b.h\"")};
3364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
3374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertBeforeCategoryWithLowerPriority) {
3404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#ifndef A_H\n"
3414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define A_H\n"
3424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
3434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
3444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
3454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <vector>\n"
3464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "class A {};\n"
3474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define MMM 123\n"
3484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#endif";
3494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#ifndef A_H\n"
3504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define A_H\n"
3514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
3524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
3534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
3544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"a.h\"\n"
3554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
3564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "class A {};\n"
3574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define MMM 123\n"
3584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#endif";
3594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"a.h\"")};
3614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
3624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3644967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertAfterMainHeader) {
3654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"fix.h\"\n"
3664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
3674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int main() {}";
3684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"fix.h\"\n"
3694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <a>\n"
3704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
3714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int main() {}";
3724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <a>")};
3734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp);
3744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
3754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3774967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertBeforeSystemHeaderLLVM) {
3784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include <memory>\n"
3794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
3804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int main() {}";
3814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"z.h\"\n"
3824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <memory>\n"
3834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
3844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int main() {}";
3854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"z.h\"")};
3864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
3874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
3884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
3894967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertAfterSystemHeaderGoogle) {
3904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include <memory>\n"
3914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
3924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int main() {}";
3934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include <memory>\n"
3944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"z.h\"\n"
3954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
3964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int main() {}";
3974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"z.h\"")};
3984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp);
3994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
4004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4024967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertOneIncludeLLVMStyle) {
4034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"x/fix.h\"\n"
4044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"a.h\"\n"
4054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"b.h\"\n"
4064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"clang/Format/Format.h\"\n"
4074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <memory>\n";
4084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"x/fix.h\"\n"
4094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"a.h\"\n"
4104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"b.h\"\n"
4114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"d.h\"\n"
4124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"clang/Format/Format.h\"\n"
4134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"llvm/x/y.h\"\n"
4144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <memory>\n";
4154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"d.h\""),
4164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"llvm/x/y.h\"")};
4174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
4184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4204967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertMultipleIncludesLLVMStyle) {
4214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"x/fix.h\"\n"
4224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"a.h\"\n"
4234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"b.h\"\n"
4244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"clang/Format/Format.h\"\n"
4254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <memory>\n";
4264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"x/fix.h\"\n"
4274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"a.h\"\n"
4284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"b.h\"\n"
4294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"new/new.h\"\n"
4304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"clang/Format/Format.h\"\n"
4314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <memory>\n"
4324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <list>\n";
4334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <list>"),
4344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"new/new.h\"")};
4354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
4364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4384967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertNewSystemIncludeGoogleStyle) {
4394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"x/fix.h\"\n"
4404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
4414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"y/a.h\"\n"
4424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"z/b.h\"\n";
4434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: inserting after the empty line following the main header might be
4444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // prefered.
4454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"x/fix.h\"\n"
4464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
4474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
4484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"y/a.h\"\n"
4494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"z/b.h\"\n";
4504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
4514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp);
4524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
4534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4554967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertMultipleIncludesGoogleStyle) {
4564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"x/fix.h\"\n"
4574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
4584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <vector>\n"
4594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
4604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"y/a.h\"\n"
4614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include \"z/b.h\"\n";
4624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"x/fix.h\"\n"
4634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
4644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
4654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <list>\n"
4664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
4674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"y/a.h\"\n"
4684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"z/b.h\"\n"
4694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"x/x.h\"\n";
4704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <list>"),
4714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"x/x.h\"")};
4724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp);
4734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
4744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4764967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertMultipleNewHeadersAndSortLLVM) {
4774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "\nint x;";
4784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n#include \"fix.h\"\n"
4794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"a.h\"\n"
4804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"b.h\"\n"
4814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"c.h\"\n"
4824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <list>\n"
4834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
4844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;";
4854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"a.h\""),
4864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"c.h\""),
4874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"b.h\""),
4884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include <vector>"),
4894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include <list>"),
4904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"fix.h\"")};
4914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, formatAndApply(Code, Replaces));
4924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
4934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
4944967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, InsertMultipleNewHeadersAndSortGoogle) {
4954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "\nint x;";
4964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n#include \"fix.h\"\n"
4974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <list>\n"
4984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
4994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"a.h\"\n"
5004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"b.h\"\n"
5014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"c.h\"\n"
5024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;";
5034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"a.h\""),
5044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"c.h\""),
5054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"b.h\""),
5064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include <vector>"),
5074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include <list>"),
5084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"fix.h\"")};
5094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  Style = format::getGoogleStyle(format::FormatStyle::LanguageKind::LK_Cpp);
5104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, formatAndApply(Code, Replaces));
5114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5134967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, FormatCorrectLineWhenHeadersAreInserted) {
5144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "\n"
5154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int x;\n"
5164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int    a;\n"
5174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int    a;\n"
5184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int    a;";
5194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "\n#include \"x.h\"\n"
5214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"y.h\"\n"
5224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"clang/x/x.h\"\n"
5234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <list>\n"
5244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
5254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;\n"
5264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int    a;\n"
5274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int b;\n"
5284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int    a;";
5294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {
5304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createReplacement(getOffset(Code, 4, 8), 1, "b"),
5314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createInsertion("#include <vector>"),
5324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createInsertion("#include <list>"),
5334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createInsertion("#include \"clang/x/x.h\""),
5344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createInsertion("#include \"y.h\""),
5354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar      createInsertion("#include \"x.h\"")};
5364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, formatAndApply(Code, Replaces));
5374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5394967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, NotConfusedByDefine) {
5404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "void f() {}\n"
5414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define A \\\n"
5424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "  int i;";
5434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include <vector>\n"
5444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "void f() {}\n"
5454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define A \\\n"
5464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "  int i;";
5474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
5484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, formatAndApply(Code, Replaces));
5494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5514967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, SkippedTopComment) {
5524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "// comment\n"
5534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
5544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "   // comment\n";
5554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "// comment\n"
5564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
5574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "   // comment\n"
5584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n";
5594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
5604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
5614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5634967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, SkippedMixedComments) {
5644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "// comment\n"
5654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "// comment \\\n"
5664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     " comment continued\n"
5674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "/*\n"
5684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "* comment\n"
5694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "*/\n";
5704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "// comment\n"
5714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "// comment \\\n"
5724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         " comment continued\n"
5734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "/*\n"
5744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "* comment\n"
5754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "*/\n"
5764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n";
5774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
5784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
5794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5814967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, MultipleBlockCommentsInOneLine) {
5824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "/*\n"
5834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "* comment\n"
5844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "*/ /* comment\n"
5854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "*/\n"
5864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n\n"
5874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "/* c1 */ /*c2 */\n";
5884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "/*\n"
5894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "* comment\n"
5904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "*/ /* comment\n"
5914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "*/\n"
5924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n\n"
5934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "/* c1 */ /*c2 */\n"
5944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n";
5954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
5964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
5974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
5984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
5994967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, CodeAfterComments) {
6004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "/*\n"
6014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "* comment\n"
6024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "*/ /* comment\n"
6034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "*/\n"
6044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n\n"
6054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "/* c1 */ /*c2 */\n"
6064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "\n"
6074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int x;\n";
6084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "/*\n"
6094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "* comment\n"
6104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "*/ /* comment\n"
6114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "*/\n"
6124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n\n"
6134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "/* c1 */ /*c2 */\n"
6144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "\n"
6154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
6164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;\n";
6174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6214967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, FakeHeaderGuardIfDef) {
6224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "// comment \n"
6234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#ifdef X\n"
6244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define X\n";
6254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "// comment \n"
6264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
6274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#ifdef X\n"
6284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define X\n";
6294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6334967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, RealHeaderGuardAfterComments) {
6344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "// comment \n"
6354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#ifndef X\n"
6364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define X\n"
6374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int x;\n"
6384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define Y 1\n";
6394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "// comment \n"
6404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#ifndef X\n"
6414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define X\n"
6424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
6434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;\n"
6444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define Y 1\n";
6454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6494967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, IfNDefWithNoDefine) {
6504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "// comment \n"
6514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#ifndef X\n"
6524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int x;\n"
6534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define Y 1\n";
6544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "// comment \n"
6554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
6564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#ifndef X\n"
6574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;\n"
6584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define Y 1\n";
6594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6634967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, HeaderGuardWithComment) {
6644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "// comment \n"
6654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#ifndef X // comment\n"
6664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "// comment\n"
6674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "/* comment\n"
6684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "*/\n"
6694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "/* comment */ #define X\n"
6704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "int x;\n"
6714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#define Y 1\n";
6724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "// comment \n"
6734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#ifndef X // comment\n"
6744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "// comment\n"
6754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "/* comment\n"
6764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "*/\n"
6774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "/* comment */ #define X\n"
6784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
6794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "int x;\n"
6804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#define Y 1\n";
6814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6854967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, EmptyCode) {
6864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "";
6874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include <vector>\n";
6884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
6914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
6924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// FIXME: although this case does not crash, the insertion is wrong. A '\n'
6934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// should be inserted between the two #includes.
6944967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, NoNewLineAtTheEndOfCode) {
6954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include <map>";
6964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include <map>#include <vector>\n";
6974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>")};
6984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
6994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7014967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, SkipExistingHeaders) {
7024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"a.h\"\n"
7034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <vector>\n";
7044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"a.h\"\n"
7054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n";
7064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include <vector>"),
7074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include \"a.h\"")};
7084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
7094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7114967a710c84587c654b56c828382219c3937dacbPirama Arumuga NainarTEST_F(CleanUpReplacementsTest, AddIncludesWithDifferentForms) {
7124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Code = "#include \"a.h\"\n"
7134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                     "#include <vector>\n";
7144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  // FIXME: this might not be the best behavior.
7154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  std::string Expected = "#include \"a.h\"\n"
7164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include \"vector\"\n"
7174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <vector>\n"
7184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                         "#include <a.h>\n";
7194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  tooling::Replacements Replaces = {createInsertion("#include \"vector\""),
7204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar                                    createInsertion("#include <a.h>")};
7214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar  EXPECT_EQ(Expected, apply(Code, Replaces));
7224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}
7234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar
7244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace
7254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace format
7264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end namespace clang
727