1d246a5acSDaniel Jasper //===- unittest/Format/FormatTestSelective.cpp - Formatting unit tests ----===//
2d246a5acSDaniel Jasper //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d246a5acSDaniel Jasper //
7d246a5acSDaniel Jasper //===----------------------------------------------------------------------===//
8d246a5acSDaniel Jasper 
9d246a5acSDaniel Jasper #include "FormatTestUtils.h"
10d246a5acSDaniel Jasper #include "clang/Format/Format.h"
11d246a5acSDaniel Jasper #include "llvm/Support/Debug.h"
12d246a5acSDaniel Jasper #include "gtest/gtest.h"
13d246a5acSDaniel Jasper 
14d246a5acSDaniel Jasper #define DEBUG_TYPE "format-test"
15d246a5acSDaniel Jasper 
16d246a5acSDaniel Jasper namespace clang {
17d246a5acSDaniel Jasper namespace format {
18d246a5acSDaniel Jasper namespace {
19d246a5acSDaniel Jasper 
20d246a5acSDaniel Jasper class FormatTestSelective : public ::testing::Test {
21d246a5acSDaniel Jasper protected:
format(llvm::StringRef Code,unsigned Offset,unsigned Length)22d246a5acSDaniel Jasper   std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length) {
233538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << "---\n");
243538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << Code << "\n\n");
25d246a5acSDaniel Jasper     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
26bcda54b6SKrasimir Georgiev     FormattingAttemptStatus Status;
27d246a5acSDaniel Jasper     tooling::Replacements Replaces =
28bcda54b6SKrasimir Georgiev         reformat(Style, Code, Ranges, "<stdin>", &Status);
29bcda54b6SKrasimir Georgiev     EXPECT_TRUE(Status.FormatComplete) << Code << "\n\n";
304f8d9943SEric Liu     auto Result = applyAllReplacements(Code, Replaces);
314f8d9943SEric Liu     EXPECT_TRUE(static_cast<bool>(Result));
323538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
334f8d9943SEric Liu     return *Result;
34d246a5acSDaniel Jasper   }
35d246a5acSDaniel Jasper 
36d246a5acSDaniel Jasper   FormatStyle Style = getLLVMStyle();
37d246a5acSDaniel Jasper };
38d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,RemovesTrailingWhitespaceOfFormattedLine)39d246a5acSDaniel Jasper TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
40d246a5acSDaniel Jasper   EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0));
41d246a5acSDaniel Jasper   EXPECT_EQ("int a;", format("int a;         ", 0, 0));
42d246a5acSDaniel Jasper   EXPECT_EQ("int a;\n", format("int a;  \n   \n   \n ", 0, 0));
43d246a5acSDaniel Jasper   EXPECT_EQ("int a;\nint b;    ", format("int a;  \nint b;    ", 0, 0));
44d246a5acSDaniel Jasper }
45d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,FormatsCorrectRegionForLeadingWhitespace)46d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
47a1036e5dSDaniel Jasper   EXPECT_EQ("{int b;\n"
48a1036e5dSDaniel Jasper             "  int a;\n"
49a1036e5dSDaniel Jasper             "}",
50a1036e5dSDaniel Jasper             format("{int b;\n  int  a;}", 8, 0));
51a1036e5dSDaniel Jasper   EXPECT_EQ("{\n"
52a1036e5dSDaniel Jasper             "  int b;\n"
53a1036e5dSDaniel Jasper             "  int  a;}",
54a1036e5dSDaniel Jasper             format("{int b;\n  int  a;}", 7, 0));
55d246a5acSDaniel Jasper 
56d246a5acSDaniel Jasper   Style.ColumnLimit = 12;
57d246a5acSDaniel Jasper   EXPECT_EQ("#define A  \\\n"
58d246a5acSDaniel Jasper             "  int a;   \\\n"
59d246a5acSDaniel Jasper             "  int b;",
60d246a5acSDaniel Jasper             format("#define A  \\\n"
61d246a5acSDaniel Jasper                    "  int a;   \\\n"
62d246a5acSDaniel Jasper                    "    int b;",
63d246a5acSDaniel Jasper                    26, 0));
64d246a5acSDaniel Jasper   EXPECT_EQ("#define A  \\\n"
65d246a5acSDaniel Jasper             "  int a;   \\\n"
66d246a5acSDaniel Jasper             "  int b;",
67d246a5acSDaniel Jasper             format("#define A  \\\n"
68d246a5acSDaniel Jasper                    "  int a;   \\\n"
69d246a5acSDaniel Jasper                    "  int b;",
70d246a5acSDaniel Jasper                    25, 0));
71d246a5acSDaniel Jasper }
72d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,FormatLineWhenInvokedOnTrailingNewline)73d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatLineWhenInvokedOnTrailingNewline) {
74d246a5acSDaniel Jasper   EXPECT_EQ("int  b;\n\nint a;", format("int  b;\n\nint a;", 8, 0));
75d246a5acSDaniel Jasper   EXPECT_EQ("int b;\n\nint a;", format("int  b;\n\nint a;", 7, 0));
76d246a5acSDaniel Jasper 
77d246a5acSDaniel Jasper   // This might not strictly be correct, but is likely good in all practical
78d246a5acSDaniel Jasper   // cases.
79d246a5acSDaniel Jasper   EXPECT_EQ("int b;\nint a;", format("int  b;int a;", 7, 0));
80d246a5acSDaniel Jasper }
81d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,RemovesWhitespaceWhenTriggeredOnEmptyLine)82d246a5acSDaniel Jasper TEST_F(FormatTestSelective, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
83d246a5acSDaniel Jasper   EXPECT_EQ("int  a;\n\n int b;", format("int  a;\n  \n\n int b;", 8, 0));
84d246a5acSDaniel Jasper   EXPECT_EQ("int  a;\n\n int b;", format("int  a;\n  \n\n int b;", 9, 0));
85d246a5acSDaniel Jasper }
86d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,ReformatsMovedLines)87d246a5acSDaniel Jasper TEST_F(FormatTestSelective, ReformatsMovedLines) {
88d246a5acSDaniel Jasper   EXPECT_EQ(
89d246a5acSDaniel Jasper       "template <typename T> T *getFETokenInfo() const {\n"
90d246a5acSDaniel Jasper       "  return static_cast<T *>(FETokenInfo);\n"
91d246a5acSDaniel Jasper       "}\n"
92d246a5acSDaniel Jasper       "int  a; // <- Should not be formatted",
93d246a5acSDaniel Jasper       format(
94d246a5acSDaniel Jasper           "template<typename T>\n"
95d246a5acSDaniel Jasper           "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
96d246a5acSDaniel Jasper           "int  a; // <- Should not be formatted",
97d246a5acSDaniel Jasper           9, 5));
98d246a5acSDaniel Jasper }
99d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,FormatsIfWithoutCompoundStatement)100d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatsIfWithoutCompoundStatement) {
10115000a12SPaul Hoad   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
102d246a5acSDaniel Jasper   EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1));
103d246a5acSDaniel Jasper   EXPECT_EQ("if (a) return; // comment",
104d246a5acSDaniel Jasper             format("if(a)\nreturn; // comment", 20, 1));
105d246a5acSDaniel Jasper }
106d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,FormatsCommentsLocally)107d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatsCommentsLocally) {
108d246a5acSDaniel Jasper   EXPECT_EQ("int a;    // comment\n"
109d246a5acSDaniel Jasper             "int    b; // comment",
110d246a5acSDaniel Jasper             format("int   a; // comment\n"
111d246a5acSDaniel Jasper                    "int    b; // comment",
112d246a5acSDaniel Jasper                    0, 0));
113d246a5acSDaniel Jasper   EXPECT_EQ("int a; // comment\n"
114d246a5acSDaniel Jasper             "       // line 2\n"
115d246a5acSDaniel Jasper             "int b;",
116d246a5acSDaniel Jasper             format("int   a; // comment\n"
117d246a5acSDaniel Jasper                    "            // line 2\n"
118d246a5acSDaniel Jasper                    "int b;",
119d246a5acSDaniel Jasper                    28, 0));
12091834227SKrasimir Georgiev   EXPECT_EQ("int   a; // comment\n"
12191834227SKrasimir Georgiev             "// comment 2\n"
12291834227SKrasimir Georgiev             "int b;",
12391834227SKrasimir Georgiev             format("int   a; // comment\n"
12491834227SKrasimir Georgiev                    "// comment 2\n"
125ece7e95fSmydeveloperday                    "int b;",
126ece7e95fSmydeveloperday                    28, 0));
127d246a5acSDaniel Jasper   EXPECT_EQ("int aaaaaa; // comment\n"
128d246a5acSDaniel Jasper             "int b;\n"
129d246a5acSDaniel Jasper             "int c; // unrelated comment",
130d246a5acSDaniel Jasper             format("int aaaaaa; // comment\n"
131d246a5acSDaniel Jasper                    "int b;\n"
132d246a5acSDaniel Jasper                    "int   c; // unrelated comment",
133d246a5acSDaniel Jasper                    31, 0));
134d246a5acSDaniel Jasper 
135d246a5acSDaniel Jasper   EXPECT_EQ("int a; // This\n"
136d246a5acSDaniel Jasper             "       // is\n"
137d246a5acSDaniel Jasper             "       // a",
138d246a5acSDaniel Jasper             format("int a;      // This\n"
139d246a5acSDaniel Jasper                    "            // is\n"
140d246a5acSDaniel Jasper                    "            // a",
141d246a5acSDaniel Jasper                    0, 0));
142d246a5acSDaniel Jasper   EXPECT_EQ("int a; // This\n"
143d246a5acSDaniel Jasper             "       // is\n"
144d246a5acSDaniel Jasper             "       // a\n"
145d246a5acSDaniel Jasper             "// This is b\n"
146d246a5acSDaniel Jasper             "int b;",
147d246a5acSDaniel Jasper             format("int a; // This\n"
148d246a5acSDaniel Jasper                    "     // is\n"
149d246a5acSDaniel Jasper                    "     // a\n"
150d246a5acSDaniel Jasper                    "// This is b\n"
151d246a5acSDaniel Jasper                    "int b;",
152d246a5acSDaniel Jasper                    0, 0));
153d246a5acSDaniel Jasper   EXPECT_EQ("int a; // This\n"
154d246a5acSDaniel Jasper             "       // is\n"
155d246a5acSDaniel Jasper             "       // a\n"
156d246a5acSDaniel Jasper             "\n"
157d246a5acSDaniel Jasper             "//This is unrelated",
158d246a5acSDaniel Jasper             format("int a; // This\n"
159d246a5acSDaniel Jasper                    "     // is\n"
160d246a5acSDaniel Jasper                    "     // a\n"
161d246a5acSDaniel Jasper                    "\n"
162d246a5acSDaniel Jasper                    "//This is unrelated",
163d246a5acSDaniel Jasper                    0, 0));
164d246a5acSDaniel Jasper   EXPECT_EQ("int a;\n"
165d246a5acSDaniel Jasper             "// This is\n"
166d246a5acSDaniel Jasper             "// not formatted.   ",
167d246a5acSDaniel Jasper             format("int a;\n"
168d246a5acSDaniel Jasper                    "// This is\n"
169d246a5acSDaniel Jasper                    "// not formatted.   ",
170d246a5acSDaniel Jasper                    0, 0));
171417fc815SDaniel Jasper   EXPECT_EQ("int x;  // Format this line.\n"
172417fc815SDaniel Jasper             "int xx; //\n"
173417fc815SDaniel Jasper             "int xxxxx; //",
174417fc815SDaniel Jasper             format("int x; // Format this line.\n"
175417fc815SDaniel Jasper                    "int xx; //\n"
176417fc815SDaniel Jasper                    "int xxxxx; //",
177417fc815SDaniel Jasper                    0, 0));
178d246a5acSDaniel Jasper }
179d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,ContinueReindenting)1800dddcf78SManuel Klimek TEST_F(FormatTestSelective, ContinueReindenting) {
1810dddcf78SManuel Klimek   // When we change an indent, we continue formatting as long as following
1820dddcf78SManuel Klimek   // lines are not indented correctly.
1830dddcf78SManuel Klimek   EXPECT_EQ("int   i;\n"
1840dddcf78SManuel Klimek             "int b;\n"
1850dddcf78SManuel Klimek             "int c;\n"
1860dddcf78SManuel Klimek             "int d;\n"
1870dddcf78SManuel Klimek             "int e;\n"
1880dddcf78SManuel Klimek             "  int f;\n",
1890dddcf78SManuel Klimek             format("int   i;\n"
1900dddcf78SManuel Klimek                    "  int b;\n"
1910dddcf78SManuel Klimek                    " int   c;\n"
1920dddcf78SManuel Klimek                    "  int d;\n"
1930dddcf78SManuel Klimek                    "int e;\n"
1940dddcf78SManuel Klimek                    "  int f;\n",
1950dddcf78SManuel Klimek                    11, 0));
1960dddcf78SManuel Klimek }
1970dddcf78SManuel Klimek 
TEST_F(FormatTestSelective,ReindentClosingBrace)1980dddcf78SManuel Klimek TEST_F(FormatTestSelective, ReindentClosingBrace) {
1990dddcf78SManuel Klimek   EXPECT_EQ("int   i;\n"
2000dddcf78SManuel Klimek             "int f() {\n"
2010dddcf78SManuel Klimek             "  int a;\n"
2020dddcf78SManuel Klimek             "  int b;\n"
2030dddcf78SManuel Klimek             "}\n"
2040dddcf78SManuel Klimek             " int c;\n",
2050dddcf78SManuel Klimek             format("int   i;\n"
2060dddcf78SManuel Klimek                    "  int f(){\n"
2070dddcf78SManuel Klimek                    "int a;\n"
2080dddcf78SManuel Klimek                    "int b;\n"
2090dddcf78SManuel Klimek                    "  }\n"
2100dddcf78SManuel Klimek                    " int c;\n",
2110dddcf78SManuel Klimek                    11, 0));
2120dddcf78SManuel Klimek   EXPECT_EQ("void f() {\n"
2130dddcf78SManuel Klimek             "  if (foo) {\n"
2140dddcf78SManuel Klimek             "    b();\n"
2150dddcf78SManuel Klimek             "  } else {\n"
2160dddcf78SManuel Klimek             "    c();\n"
2170dddcf78SManuel Klimek             "  }\n"
2180dddcf78SManuel Klimek             "int d;\n"
2190dddcf78SManuel Klimek             "}\n",
2200dddcf78SManuel Klimek             format("void f() {\n"
2210dddcf78SManuel Klimek                    "  if (foo) {\n"
2220dddcf78SManuel Klimek                    "b();\n"
2230dddcf78SManuel Klimek                    "}else{\n"
2240dddcf78SManuel Klimek                    "c();\n"
2250dddcf78SManuel Klimek                    "}\n"
2260dddcf78SManuel Klimek                    "int d;\n"
2270dddcf78SManuel Klimek                    "}\n",
2280dddcf78SManuel Klimek                    13, 0));
2290dddcf78SManuel Klimek   EXPECT_EQ("int i = []() {\n"
2300dddcf78SManuel Klimek             "  class C {\n"
2310dddcf78SManuel Klimek             "    int a;\n"
2320dddcf78SManuel Klimek             "    int b;\n"
2330dddcf78SManuel Klimek             "  };\n"
2340dddcf78SManuel Klimek             "  int c;\n"
2350dddcf78SManuel Klimek             "};\n",
2360dddcf78SManuel Klimek             format("int i = []() {\n"
2370dddcf78SManuel Klimek                    "  class C{\n"
2380dddcf78SManuel Klimek                    "int a;\n"
2390dddcf78SManuel Klimek                    "int b;\n"
2400dddcf78SManuel Klimek                    "};\n"
2410dddcf78SManuel Klimek                    "int c;\n"
2420dddcf78SManuel Klimek                    "  };\n",
2430dddcf78SManuel Klimek                    17, 0));
2440dddcf78SManuel Klimek }
2450dddcf78SManuel Klimek 
TEST_F(FormatTestSelective,IndividualStatementsOfNestedBlocks)246d246a5acSDaniel Jasper TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
247d246a5acSDaniel Jasper   EXPECT_EQ("DEBUG({\n"
248d246a5acSDaniel Jasper             "  int i;\n"
249d246a5acSDaniel Jasper             "  int        j;\n"
250d246a5acSDaniel Jasper             "});",
251d246a5acSDaniel Jasper             format("DEBUG(   {\n"
252d246a5acSDaniel Jasper                    "  int        i;\n"
253d246a5acSDaniel Jasper                    "  int        j;\n"
254d246a5acSDaniel Jasper                    "}   )  ;",
255d246a5acSDaniel Jasper                    20, 1));
256d246a5acSDaniel Jasper   EXPECT_EQ("DEBUG(   {\n"
257d246a5acSDaniel Jasper             "  int        i;\n"
258d246a5acSDaniel Jasper             "  int j;\n"
259d246a5acSDaniel Jasper             "}   )  ;",
260d246a5acSDaniel Jasper             format("DEBUG(   {\n"
261d246a5acSDaniel Jasper                    "  int        i;\n"
262d246a5acSDaniel Jasper                    "  int        j;\n"
263d246a5acSDaniel Jasper                    "}   )  ;",
264d246a5acSDaniel Jasper                    41, 1));
265d246a5acSDaniel Jasper   EXPECT_EQ("DEBUG(   {\n"
266d246a5acSDaniel Jasper             "    int        i;\n"
267d246a5acSDaniel Jasper             "    int j;\n"
268d246a5acSDaniel Jasper             "}   )  ;",
269d246a5acSDaniel Jasper             format("DEBUG(   {\n"
270d246a5acSDaniel Jasper                    "    int        i;\n"
271d246a5acSDaniel Jasper                    "    int        j;\n"
272d246a5acSDaniel Jasper                    "}   )  ;",
273d246a5acSDaniel Jasper                    41, 1));
274d246a5acSDaniel Jasper   EXPECT_EQ("DEBUG({\n"
275d246a5acSDaniel Jasper             "  int i;\n"
276d246a5acSDaniel Jasper             "  int j;\n"
277d246a5acSDaniel Jasper             "});",
278d246a5acSDaniel Jasper             format("DEBUG(   {\n"
279d246a5acSDaniel Jasper                    "    int        i;\n"
280d246a5acSDaniel Jasper                    "    int        j;\n"
281d246a5acSDaniel Jasper                    "}   )  ;",
282d246a5acSDaniel Jasper                    20, 1));
283d246a5acSDaniel Jasper 
284d246a5acSDaniel Jasper   EXPECT_EQ("Debug({\n"
285d246a5acSDaniel Jasper             "        if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
286d246a5acSDaniel Jasper             "          return;\n"
287d246a5acSDaniel Jasper             "      },\n"
288d246a5acSDaniel Jasper             "      a);",
289d246a5acSDaniel Jasper             format("Debug({\n"
290d246a5acSDaniel Jasper                    "        if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
291d246a5acSDaniel Jasper                    "             return;\n"
292d246a5acSDaniel Jasper                    "      },\n"
293d246a5acSDaniel Jasper                    "      a);",
294d246a5acSDaniel Jasper                    50, 1));
295d246a5acSDaniel Jasper   EXPECT_EQ("DEBUG({\n"
296d246a5acSDaniel Jasper             "  DEBUG({\n"
297d246a5acSDaniel Jasper             "    int a;\n"
298d246a5acSDaniel Jasper             "    int b;\n"
299d246a5acSDaniel Jasper             "  }) ;\n"
300d246a5acSDaniel Jasper             "});",
301d246a5acSDaniel Jasper             format("DEBUG({\n"
302d246a5acSDaniel Jasper                    "  DEBUG({\n"
303d246a5acSDaniel Jasper                    "    int a;\n"
304d246a5acSDaniel Jasper                    "    int    b;\n" // Format this line only.
305d246a5acSDaniel Jasper                    "  }) ;\n"        // Don't touch this line.
306d246a5acSDaniel Jasper                    "});",
307d246a5acSDaniel Jasper                    35, 0));
308d246a5acSDaniel Jasper   EXPECT_EQ("DEBUG({\n"
309d246a5acSDaniel Jasper             "  int a; //\n"
310d246a5acSDaniel Jasper             "});",
311d246a5acSDaniel Jasper             format("DEBUG({\n"
312d246a5acSDaniel Jasper                    "    int a; //\n"
313d246a5acSDaniel Jasper                    "});",
314d246a5acSDaniel Jasper                    0, 0));
315d246a5acSDaniel Jasper   EXPECT_EQ("someFunction(\n"
316d246a5acSDaniel Jasper             "    [] {\n"
317d246a5acSDaniel Jasper             "      // Only with this comment.\n"
318d246a5acSDaniel Jasper             "      int i; // invoke formatting here.\n"
319d246a5acSDaniel Jasper             "    }, // force line break\n"
320d246a5acSDaniel Jasper             "    aaa);",
321d246a5acSDaniel Jasper             format("someFunction(\n"
322d246a5acSDaniel Jasper                    "    [] {\n"
323d246a5acSDaniel Jasper                    "      // Only with this comment.\n"
324d246a5acSDaniel Jasper                    "      int   i; // invoke formatting here.\n"
325d246a5acSDaniel Jasper                    "    }, // force line break\n"
326d246a5acSDaniel Jasper                    "    aaa);",
327d246a5acSDaniel Jasper                    63, 1));
328d246a5acSDaniel Jasper 
329d246a5acSDaniel Jasper   EXPECT_EQ("int longlongname; // comment\n"
330d246a5acSDaniel Jasper             "int x = f({\n"
331d246a5acSDaniel Jasper             "  int x; // comment\n"
332d246a5acSDaniel Jasper             "  int y; // comment\n"
333d246a5acSDaniel Jasper             "});",
334d246a5acSDaniel Jasper             format("int longlongname; // comment\n"
335d246a5acSDaniel Jasper                    "int x = f({\n"
336d246a5acSDaniel Jasper                    "  int x; // comment\n"
337d246a5acSDaniel Jasper                    "  int y; // comment\n"
338d246a5acSDaniel Jasper                    "});",
339d246a5acSDaniel Jasper                    65, 0));
340d246a5acSDaniel Jasper   EXPECT_EQ("int s = f({\n"
341d246a5acSDaniel Jasper             "  class X {\n"
342d246a5acSDaniel Jasper             "  public:\n"
343d246a5acSDaniel Jasper             "    void f();\n"
344d246a5acSDaniel Jasper             "  };\n"
345d246a5acSDaniel Jasper             "});",
346d246a5acSDaniel Jasper             format("int s = f({\n"
347d246a5acSDaniel Jasper                    "  class X {\n"
348d246a5acSDaniel Jasper                    "    public:\n"
349d246a5acSDaniel Jasper                    "    void f();\n"
350d246a5acSDaniel Jasper                    "  };\n"
351d246a5acSDaniel Jasper                    "});",
352d246a5acSDaniel Jasper                    0, 0));
35335ca66deSDaniel Jasper   EXPECT_EQ("SomeFunction(\n"
35435ca66deSDaniel Jasper             "    [] {\n"
35535ca66deSDaniel Jasper             "      int i;\n"
35635ca66deSDaniel Jasper             "      return i;\n" // Format this line.
35735ca66deSDaniel Jasper             "    },\n"
35835ca66deSDaniel Jasper             "    [] {\n"
35935ca66deSDaniel Jasper             "       return 2;\n" // Don't fix this.
36035ca66deSDaniel Jasper             "    });",
36135ca66deSDaniel Jasper             format("SomeFunction(\n"
36235ca66deSDaniel Jasper                    "    [] {\n"
36335ca66deSDaniel Jasper                    "      int i;\n"
36435ca66deSDaniel Jasper                    "       return i;\n" // Format this line.
36535ca66deSDaniel Jasper                    "    },\n"
36635ca66deSDaniel Jasper                    "    [] {\n"
36735ca66deSDaniel Jasper                    "       return 2;\n" // Don't fix this.
36835ca66deSDaniel Jasper                    "    });",
36935ca66deSDaniel Jasper                    40, 0));
370d246a5acSDaniel Jasper }
371d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,WrongIndent)372f83834feSDaniel Jasper TEST_F(FormatTestSelective, WrongIndent) {
373f83834feSDaniel Jasper   EXPECT_EQ("namespace {\n"
374f83834feSDaniel Jasper             "int i;\n"
375f83834feSDaniel Jasper             "int j;\n"
376f83834feSDaniel Jasper             "}",
377f83834feSDaniel Jasper             format("namespace {\n"
378f83834feSDaniel Jasper                    "  int i;\n" // Format here.
379f83834feSDaniel Jasper                    "  int j;\n"
380f83834feSDaniel Jasper                    "}",
381f83834feSDaniel Jasper                    15, 0));
382f83834feSDaniel Jasper   EXPECT_EQ("namespace {\n"
383f83834feSDaniel Jasper             "  int i;\n"
384f83834feSDaniel Jasper             "  int j;\n"
385f83834feSDaniel Jasper             "}",
386f83834feSDaniel Jasper             format("namespace {\n"
387f83834feSDaniel Jasper                    "  int i;\n"
388f83834feSDaniel Jasper                    "  int j;\n" // Format here.
389f83834feSDaniel Jasper                    "}",
390f83834feSDaniel Jasper                    24, 0));
391f83834feSDaniel Jasper }
392f83834feSDaniel Jasper 
TEST_F(FormatTestSelective,AlwaysFormatsEntireMacroDefinitions)393d246a5acSDaniel Jasper TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
3947fdbb3feSDaniel Jasper   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
395d246a5acSDaniel Jasper   EXPECT_EQ("int  i;\n"
396d246a5acSDaniel Jasper             "#define A \\\n"
397d246a5acSDaniel Jasper             "  int i;  \\\n"
398d246a5acSDaniel Jasper             "  int j\n"
399d246a5acSDaniel Jasper             "int  k;",
400d246a5acSDaniel Jasper             format("int  i;\n"
401d246a5acSDaniel Jasper                    "#define A  \\\n"
402d246a5acSDaniel Jasper                    " int   i    ;  \\\n"
403d246a5acSDaniel Jasper                    " int   j\n"
404d246a5acSDaniel Jasper                    "int  k;",
405d246a5acSDaniel Jasper                    8, 0)); // 8: position of "#define".
406d246a5acSDaniel Jasper   EXPECT_EQ("int  i;\n"
407d246a5acSDaniel Jasper             "#define A \\\n"
408d246a5acSDaniel Jasper             "  int i;  \\\n"
409d246a5acSDaniel Jasper             "  int j\n"
410d246a5acSDaniel Jasper             "int  k;",
411d246a5acSDaniel Jasper             format("int  i;\n"
412d246a5acSDaniel Jasper                    "#define A  \\\n"
413d246a5acSDaniel Jasper                    " int   i    ;  \\\n"
414d246a5acSDaniel Jasper                    " int   j\n"
415d246a5acSDaniel Jasper                    "int  k;",
416d246a5acSDaniel Jasper                    45, 0)); // 45: position of "j".
417d246a5acSDaniel Jasper }
418d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,ReformatRegionAdjustsIndent)419d246a5acSDaniel Jasper TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
420d246a5acSDaniel Jasper   EXPECT_EQ("{\n"
421d246a5acSDaniel Jasper             "{\n"
422d246a5acSDaniel Jasper             "a;\n"
423d246a5acSDaniel Jasper             "b;\n"
424d246a5acSDaniel Jasper             "}\n"
425d246a5acSDaniel Jasper             "}",
426d246a5acSDaniel Jasper             format("{\n"
427d246a5acSDaniel Jasper                    "{\n"
428d246a5acSDaniel Jasper                    "a;\n"
429d246a5acSDaniel Jasper                    "     b;\n"
430d246a5acSDaniel Jasper                    "}\n"
431d246a5acSDaniel Jasper                    "}",
432d246a5acSDaniel Jasper                    13, 2));
433d246a5acSDaniel Jasper   EXPECT_EQ("{\n"
434d246a5acSDaniel Jasper             "{\n"
435d246a5acSDaniel Jasper             "  a;\n"
436d246a5acSDaniel Jasper             "  b;\n"
437a1036e5dSDaniel Jasper             "  c;\n"
438a1036e5dSDaniel Jasper             " d;\n"
439d246a5acSDaniel Jasper             "}\n"
440d246a5acSDaniel Jasper             "}",
441d246a5acSDaniel Jasper             format("{\n"
442d246a5acSDaniel Jasper                    "{\n"
443d246a5acSDaniel Jasper                    "     a;\n"
444d246a5acSDaniel Jasper                    "   b;\n"
445a1036e5dSDaniel Jasper                    "  c;\n"
446a1036e5dSDaniel Jasper                    " d;\n"
447d246a5acSDaniel Jasper                    "}\n"
448d246a5acSDaniel Jasper                    "}",
449d246a5acSDaniel Jasper                    9, 2));
450d246a5acSDaniel Jasper   EXPECT_EQ("{\n"
451d246a5acSDaniel Jasper             "{\n"
452d246a5acSDaniel Jasper             "public:\n"
453d246a5acSDaniel Jasper             "  b;\n"
454d246a5acSDaniel Jasper             "}\n"
455d246a5acSDaniel Jasper             "}",
456d246a5acSDaniel Jasper             format("{\n"
457d246a5acSDaniel Jasper                    "{\n"
458d246a5acSDaniel Jasper                    "public:\n"
459d246a5acSDaniel Jasper                    "     b;\n"
460d246a5acSDaniel Jasper                    "}\n"
461d246a5acSDaniel Jasper                    "}",
462d246a5acSDaniel Jasper                    17, 2));
463d246a5acSDaniel Jasper   EXPECT_EQ("{\n"
464d246a5acSDaniel Jasper             "{\n"
465d246a5acSDaniel Jasper             "a;\n"
466d246a5acSDaniel Jasper             "}\n"
467d246a5acSDaniel Jasper             "{\n"
468d246a5acSDaniel Jasper             "  b; //\n"
469d246a5acSDaniel Jasper             "}\n"
470d246a5acSDaniel Jasper             "}",
471d246a5acSDaniel Jasper             format("{\n"
472d246a5acSDaniel Jasper                    "{\n"
473d246a5acSDaniel Jasper                    "a;\n"
474d246a5acSDaniel Jasper                    "}\n"
475d246a5acSDaniel Jasper                    "{\n"
476d246a5acSDaniel Jasper                    "           b; //\n"
477d246a5acSDaniel Jasper                    "}\n"
478d246a5acSDaniel Jasper                    "}",
479d246a5acSDaniel Jasper                    22, 2));
480d246a5acSDaniel Jasper   EXPECT_EQ("  {\n"
481d246a5acSDaniel Jasper             "    a; //\n"
482d246a5acSDaniel Jasper             "  }",
483d246a5acSDaniel Jasper             format("  {\n"
484d246a5acSDaniel Jasper                    "a; //\n"
485d246a5acSDaniel Jasper                    "  }",
486d246a5acSDaniel Jasper                    4, 2));
487d246a5acSDaniel Jasper   EXPECT_EQ("void f() {}\n"
488d246a5acSDaniel Jasper             "void g() {}",
489d246a5acSDaniel Jasper             format("void f() {}\n"
490d246a5acSDaniel Jasper                    "void g() {}",
491d246a5acSDaniel Jasper                    13, 0));
492d246a5acSDaniel Jasper   EXPECT_EQ("int a; // comment\n"
493d246a5acSDaniel Jasper             "       // line 2\n"
494d246a5acSDaniel Jasper             "int b;",
495d246a5acSDaniel Jasper             format("int a; // comment\n"
496d246a5acSDaniel Jasper                    "       // line 2\n"
497d246a5acSDaniel Jasper                    "  int b;",
498d246a5acSDaniel Jasper                    35, 0));
499d246a5acSDaniel Jasper 
500d246a5acSDaniel Jasper   EXPECT_EQ(" void f() {\n"
501d246a5acSDaniel Jasper             "#define A 1\n"
502d246a5acSDaniel Jasper             " }",
503d246a5acSDaniel Jasper             format(" void f() {\n"
504d246a5acSDaniel Jasper                    "     #define A 1\n" // Format this line.
505d246a5acSDaniel Jasper                    " }",
506d246a5acSDaniel Jasper                    20, 0));
507d246a5acSDaniel Jasper   EXPECT_EQ(" void f() {\n"
508d246a5acSDaniel Jasper             "    int i;\n"
509d246a5acSDaniel Jasper             "#define A \\\n"
510d246a5acSDaniel Jasper             "    int i;  \\\n"
511d246a5acSDaniel Jasper             "   int j;\n"
512d246a5acSDaniel Jasper             "    int k;\n"
513d246a5acSDaniel Jasper             " }",
514d246a5acSDaniel Jasper             format(" void f() {\n"
515d246a5acSDaniel Jasper                    "    int i;\n"
516d246a5acSDaniel Jasper                    "#define A \\\n"
517d246a5acSDaniel Jasper                    "    int i;  \\\n"
518d246a5acSDaniel Jasper                    "   int j;\n"
519d246a5acSDaniel Jasper                    "      int k;\n" // Format this line.
520d246a5acSDaniel Jasper                    " }",
521d246a5acSDaniel Jasper                    67, 0));
522d246a5acSDaniel Jasper 
523d246a5acSDaniel Jasper   Style.ColumnLimit = 11;
524d246a5acSDaniel Jasper   EXPECT_EQ("  int a;\n"
525d246a5acSDaniel Jasper             "  void\n"
526d246a5acSDaniel Jasper             "  ffffff() {\n"
527d246a5acSDaniel Jasper             "  }",
528d246a5acSDaniel Jasper             format("  int a;\n"
529d246a5acSDaniel Jasper                    "void ffffff() {}",
530d246a5acSDaniel Jasper                    11, 0));
531d246a5acSDaniel Jasper }
532d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,UnderstandsTabs)533d246a5acSDaniel Jasper TEST_F(FormatTestSelective, UnderstandsTabs) {
534d246a5acSDaniel Jasper   Style.IndentWidth = 8;
535d246a5acSDaniel Jasper   Style.UseTab = FormatStyle::UT_Always;
5367fdbb3feSDaniel Jasper   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
537d246a5acSDaniel Jasper   EXPECT_EQ("void f() {\n"
538d246a5acSDaniel Jasper             "\tf();\n"
539d246a5acSDaniel Jasper             "\tg();\n"
540d246a5acSDaniel Jasper             "}",
541d246a5acSDaniel Jasper             format("void f() {\n"
542d246a5acSDaniel Jasper                    "\tf();\n"
543d246a5acSDaniel Jasper                    "\tg();\n"
544d246a5acSDaniel Jasper                    "}",
545d246a5acSDaniel Jasper                    0, 0));
546d246a5acSDaniel Jasper   EXPECT_EQ("void f() {\n"
547d246a5acSDaniel Jasper             "\tf();\n"
548d246a5acSDaniel Jasper             "\tg();\n"
549d246a5acSDaniel Jasper             "}",
550d246a5acSDaniel Jasper             format("void f() {\n"
551d246a5acSDaniel Jasper                    "\tf();\n"
552d246a5acSDaniel Jasper                    "\tg();\n"
553d246a5acSDaniel Jasper                    "}",
554d246a5acSDaniel Jasper                    16, 0));
555d246a5acSDaniel Jasper   EXPECT_EQ("void f() {\n"
556d246a5acSDaniel Jasper             "  \tf();\n"
557d246a5acSDaniel Jasper             "\tg();\n"
558d246a5acSDaniel Jasper             "}",
559d246a5acSDaniel Jasper             format("void f() {\n"
560d246a5acSDaniel Jasper                    "  \tf();\n"
561d246a5acSDaniel Jasper                    "  \tg();\n"
562d246a5acSDaniel Jasper                    "}",
563d246a5acSDaniel Jasper                    21, 0));
564d246a5acSDaniel Jasper }
565d246a5acSDaniel Jasper 
TEST_F(FormatTestSelective,StopFormattingWhenLeavingScope)566f67c3246SDaniel Jasper TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
567f67c3246SDaniel Jasper   EXPECT_EQ(
568f67c3246SDaniel Jasper       "void f() {\n"
569f67c3246SDaniel Jasper       "  if (a) {\n"
570f67c3246SDaniel Jasper       "    g();\n"
571f67c3246SDaniel Jasper       "    h();\n"
572f67c3246SDaniel Jasper       "  }\n"
573f67c3246SDaniel Jasper       "\n"
574f67c3246SDaniel Jasper       "void g() {\n"
575f67c3246SDaniel Jasper       "}",
576f67c3246SDaniel Jasper       format("void f() {\n"
577f67c3246SDaniel Jasper              "  if (a) {\n" // Assume this was added without the closing brace.
578f67c3246SDaniel Jasper              "  g();\n"
579f67c3246SDaniel Jasper              "  h();\n"
580f67c3246SDaniel Jasper              "}\n"
581f67c3246SDaniel Jasper              "\n"
582f67c3246SDaniel Jasper              "void g() {\n" // Make sure not to format this.
583f67c3246SDaniel Jasper              "}",
584f67c3246SDaniel Jasper              15, 0));
585f67c3246SDaniel Jasper }
586f67c3246SDaniel Jasper 
TEST_F(FormatTestSelective,SelectivelyRequoteJavaScript)58797439926SDaniel Jasper TEST_F(FormatTestSelective, SelectivelyRequoteJavaScript) {
58897439926SDaniel Jasper   Style = getGoogleStyle(FormatStyle::LK_JavaScript);
589ece7e95fSmydeveloperday   EXPECT_EQ("var x = \"a\";\n"
59097439926SDaniel Jasper             "var x = 'a';\n"
59197439926SDaniel Jasper             "var x = \"a\";",
59297439926SDaniel Jasper             format("var x = \"a\";\n"
59397439926SDaniel Jasper                    "var x = \"a\";\n"
59497439926SDaniel Jasper                    "var x = \"a\";",
59597439926SDaniel Jasper                    20, 0));
59697439926SDaniel Jasper }
59797439926SDaniel Jasper 
TEST_F(FormatTestSelective,KeepsIndentAfterCommentSectionImport)598a1c30937SKrasimir Georgiev TEST_F(FormatTestSelective, KeepsIndentAfterCommentSectionImport) {
599a1c30937SKrasimir Georgiev   std::string Code = "#include <a> // line 1\n" // 23 chars long
600a1c30937SKrasimir Georgiev                      "             // line 2\n" // 23 chars long
601a1c30937SKrasimir Georgiev                      "\n"                       // this newline is char 47
602a1c30937SKrasimir Georgiev                      "int i;";                  // this line is not indented
603a1c30937SKrasimir Georgiev   EXPECT_EQ(Code, format(Code, 47, 1));
604a1c30937SKrasimir Georgiev }
605a1c30937SKrasimir Georgiev 
TEST_F(FormatTestSelective,DontAssert)6060ae2464fSMarek Kurdej TEST_F(FormatTestSelective, DontAssert) {
6070ae2464fSMarek Kurdej   // https://llvm.org/PR53880
6080ae2464fSMarek Kurdej   std::string Code = "void f() {\n"
6090ae2464fSMarek Kurdej                      "  return a == 8 ? 32 : 16;\n"
6100ae2464fSMarek Kurdej                      "}\n";
6110ae2464fSMarek Kurdej   EXPECT_EQ(Code, format(Code, 40, 0));
612*14c30c70SMarek Kurdej 
613*14c30c70SMarek Kurdej   // https://llvm.org/PR56352
614*14c30c70SMarek Kurdej   Style.CompactNamespaces = true;
615*14c30c70SMarek Kurdej   Style.NamespaceIndentation = FormatStyle::NI_All;
616*14c30c70SMarek Kurdej   Code = "\n"
617*14c30c70SMarek Kurdej          "namespace ns1 { namespace ns2 {\n"
618*14c30c70SMarek Kurdej          "}}";
619*14c30c70SMarek Kurdej   EXPECT_EQ(Code, format(Code, 0, 0));
6200ae2464fSMarek Kurdej }
6210ae2464fSMarek Kurdej 
622d246a5acSDaniel Jasper } // end namespace
623d246a5acSDaniel Jasper } // end namespace format
624d246a5acSDaniel Jasper } // end namespace clang
625