xref: /aosp_15_r20/external/clang/unittests/Format/FormatTestSelective.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===- unittest/Format/FormatTestSelective.cpp - Formatting unit tests ----===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li 
10*67e74705SXin Li #include "FormatTestUtils.h"
11*67e74705SXin Li #include "clang/Format/Format.h"
12*67e74705SXin Li #include "llvm/Support/Debug.h"
13*67e74705SXin Li #include "gtest/gtest.h"
14*67e74705SXin Li 
15*67e74705SXin Li #define DEBUG_TYPE "format-test"
16*67e74705SXin Li 
17*67e74705SXin Li namespace clang {
18*67e74705SXin Li namespace format {
19*67e74705SXin Li namespace {
20*67e74705SXin Li 
21*67e74705SXin Li class FormatTestSelective : public ::testing::Test {
22*67e74705SXin Li protected:
format(llvm::StringRef Code,unsigned Offset,unsigned Length)23*67e74705SXin Li   std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length) {
24*67e74705SXin Li     DEBUG(llvm::errs() << "---\n");
25*67e74705SXin Li     DEBUG(llvm::errs() << Code << "\n\n");
26*67e74705SXin Li     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
27*67e74705SXin Li     bool IncompleteFormat = false;
28*67e74705SXin Li     tooling::Replacements Replaces =
29*67e74705SXin Li         reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
30*67e74705SXin Li     EXPECT_FALSE(IncompleteFormat) << Code << "\n\n";
31*67e74705SXin Li     auto Result = applyAllReplacements(Code, Replaces);
32*67e74705SXin Li     EXPECT_TRUE(static_cast<bool>(Result));
33*67e74705SXin Li     DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
34*67e74705SXin Li     return *Result;
35*67e74705SXin Li   }
36*67e74705SXin Li 
37*67e74705SXin Li   FormatStyle Style = getLLVMStyle();
38*67e74705SXin Li };
39*67e74705SXin Li 
TEST_F(FormatTestSelective,RemovesTrailingWhitespaceOfFormattedLine)40*67e74705SXin Li TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
41*67e74705SXin Li   EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0));
42*67e74705SXin Li   EXPECT_EQ("int a;", format("int a;         ", 0, 0));
43*67e74705SXin Li   EXPECT_EQ("int a;\n", format("int a;  \n   \n   \n ", 0, 0));
44*67e74705SXin Li   EXPECT_EQ("int a;\nint b;    ", format("int a;  \nint b;    ", 0, 0));
45*67e74705SXin Li }
46*67e74705SXin Li 
TEST_F(FormatTestSelective,FormatsCorrectRegionForLeadingWhitespace)47*67e74705SXin Li TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
48*67e74705SXin Li   EXPECT_EQ("{int b;\n"
49*67e74705SXin Li             "  int a;\n"
50*67e74705SXin Li             "}",
51*67e74705SXin Li             format("{int b;\n  int  a;}", 8, 0));
52*67e74705SXin Li   EXPECT_EQ("{\n"
53*67e74705SXin Li             "  int b;\n"
54*67e74705SXin Li             "  int  a;}",
55*67e74705SXin Li             format("{int b;\n  int  a;}", 7, 0));
56*67e74705SXin Li 
57*67e74705SXin Li   Style.ColumnLimit = 12;
58*67e74705SXin Li   EXPECT_EQ("#define A  \\\n"
59*67e74705SXin Li             "  int a;   \\\n"
60*67e74705SXin Li             "  int b;",
61*67e74705SXin Li             format("#define A  \\\n"
62*67e74705SXin Li                    "  int a;   \\\n"
63*67e74705SXin Li                    "    int b;",
64*67e74705SXin Li                    26, 0));
65*67e74705SXin Li   EXPECT_EQ("#define A  \\\n"
66*67e74705SXin Li             "  int a;   \\\n"
67*67e74705SXin Li             "  int b;",
68*67e74705SXin Li             format("#define A  \\\n"
69*67e74705SXin Li                    "  int a;   \\\n"
70*67e74705SXin Li                    "  int b;",
71*67e74705SXin Li                    25, 0));
72*67e74705SXin Li }
73*67e74705SXin Li 
TEST_F(FormatTestSelective,FormatLineWhenInvokedOnTrailingNewline)74*67e74705SXin Li TEST_F(FormatTestSelective, FormatLineWhenInvokedOnTrailingNewline) {
75*67e74705SXin Li   EXPECT_EQ("int  b;\n\nint a;", format("int  b;\n\nint a;", 8, 0));
76*67e74705SXin Li   EXPECT_EQ("int b;\n\nint a;", format("int  b;\n\nint a;", 7, 0));
77*67e74705SXin Li 
78*67e74705SXin Li   // This might not strictly be correct, but is likely good in all practical
79*67e74705SXin Li   // cases.
80*67e74705SXin Li   EXPECT_EQ("int b;\nint a;", format("int  b;int a;", 7, 0));
81*67e74705SXin Li }
82*67e74705SXin Li 
TEST_F(FormatTestSelective,RemovesWhitespaceWhenTriggeredOnEmptyLine)83*67e74705SXin Li TEST_F(FormatTestSelective, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
84*67e74705SXin Li   EXPECT_EQ("int  a;\n\n int b;", format("int  a;\n  \n\n int b;", 8, 0));
85*67e74705SXin Li   EXPECT_EQ("int  a;\n\n int b;", format("int  a;\n  \n\n int b;", 9, 0));
86*67e74705SXin Li }
87*67e74705SXin Li 
TEST_F(FormatTestSelective,ReformatsMovedLines)88*67e74705SXin Li TEST_F(FormatTestSelective, ReformatsMovedLines) {
89*67e74705SXin Li   EXPECT_EQ(
90*67e74705SXin Li       "template <typename T> T *getFETokenInfo() const {\n"
91*67e74705SXin Li       "  return static_cast<T *>(FETokenInfo);\n"
92*67e74705SXin Li       "}\n"
93*67e74705SXin Li       "int  a; // <- Should not be formatted",
94*67e74705SXin Li       format(
95*67e74705SXin Li           "template<typename T>\n"
96*67e74705SXin Li           "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
97*67e74705SXin Li           "int  a; // <- Should not be formatted",
98*67e74705SXin Li           9, 5));
99*67e74705SXin Li }
100*67e74705SXin Li 
TEST_F(FormatTestSelective,FormatsIfWithoutCompoundStatement)101*67e74705SXin Li TEST_F(FormatTestSelective, FormatsIfWithoutCompoundStatement) {
102*67e74705SXin Li   Style.AllowShortIfStatementsOnASingleLine = true;
103*67e74705SXin Li   EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1));
104*67e74705SXin Li   EXPECT_EQ("if (a) return; // comment",
105*67e74705SXin Li             format("if(a)\nreturn; // comment", 20, 1));
106*67e74705SXin Li }
107*67e74705SXin Li 
TEST_F(FormatTestSelective,FormatsCommentsLocally)108*67e74705SXin Li TEST_F(FormatTestSelective, FormatsCommentsLocally) {
109*67e74705SXin Li   EXPECT_EQ("int a;    // comment\n"
110*67e74705SXin Li             "int    b; // comment",
111*67e74705SXin Li             format("int   a; // comment\n"
112*67e74705SXin Li                    "int    b; // comment",
113*67e74705SXin Li                    0, 0));
114*67e74705SXin Li   EXPECT_EQ("int   a; // comment\n"
115*67e74705SXin Li             "         // line 2\n"
116*67e74705SXin Li             "int b;",
117*67e74705SXin Li             format("int   a; // comment\n"
118*67e74705SXin Li                    "            // line 2\n"
119*67e74705SXin Li                    "int b;",
120*67e74705SXin Li                    28, 0));
121*67e74705SXin Li   EXPECT_EQ("int aaaaaa; // comment\n"
122*67e74705SXin Li             "int b;\n"
123*67e74705SXin Li             "int c; // unrelated comment",
124*67e74705SXin Li             format("int aaaaaa; // comment\n"
125*67e74705SXin Li                    "int b;\n"
126*67e74705SXin Li                    "int   c; // unrelated comment",
127*67e74705SXin Li                    31, 0));
128*67e74705SXin Li 
129*67e74705SXin Li   EXPECT_EQ("int a; // This\n"
130*67e74705SXin Li             "       // is\n"
131*67e74705SXin Li             "       // a",
132*67e74705SXin Li             format("int a;      // This\n"
133*67e74705SXin Li                    "            // is\n"
134*67e74705SXin Li                    "            // a",
135*67e74705SXin Li                    0, 0));
136*67e74705SXin Li   EXPECT_EQ("int a; // This\n"
137*67e74705SXin Li             "       // is\n"
138*67e74705SXin Li             "       // a\n"
139*67e74705SXin Li             "// This is b\n"
140*67e74705SXin Li             "int b;",
141*67e74705SXin Li             format("int a; // This\n"
142*67e74705SXin Li                    "     // is\n"
143*67e74705SXin Li                    "     // a\n"
144*67e74705SXin Li                    "// This is b\n"
145*67e74705SXin Li                    "int b;",
146*67e74705SXin Li                    0, 0));
147*67e74705SXin Li   EXPECT_EQ("int a; // This\n"
148*67e74705SXin Li             "       // is\n"
149*67e74705SXin Li             "       // a\n"
150*67e74705SXin Li             "\n"
151*67e74705SXin Li             "//This is unrelated",
152*67e74705SXin Li             format("int a; // This\n"
153*67e74705SXin Li                    "     // is\n"
154*67e74705SXin Li                    "     // a\n"
155*67e74705SXin Li                    "\n"
156*67e74705SXin Li                    "//This is unrelated",
157*67e74705SXin Li                    0, 0));
158*67e74705SXin Li   EXPECT_EQ("int a;\n"
159*67e74705SXin Li             "// This is\n"
160*67e74705SXin Li             "// not formatted.   ",
161*67e74705SXin Li             format("int a;\n"
162*67e74705SXin Li                    "// This is\n"
163*67e74705SXin Li                    "// not formatted.   ",
164*67e74705SXin Li                    0, 0));
165*67e74705SXin Li   EXPECT_EQ("int x;  // Format this line.\n"
166*67e74705SXin Li             "int xx; //\n"
167*67e74705SXin Li             "int xxxxx; //",
168*67e74705SXin Li             format("int x; // Format this line.\n"
169*67e74705SXin Li                    "int xx; //\n"
170*67e74705SXin Li                    "int xxxxx; //",
171*67e74705SXin Li                    0, 0));
172*67e74705SXin Li }
173*67e74705SXin Li 
TEST_F(FormatTestSelective,IndividualStatementsOfNestedBlocks)174*67e74705SXin Li TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
175*67e74705SXin Li   EXPECT_EQ("DEBUG({\n"
176*67e74705SXin Li             "  int i;\n"
177*67e74705SXin Li             "  int        j;\n"
178*67e74705SXin Li             "});",
179*67e74705SXin Li             format("DEBUG(   {\n"
180*67e74705SXin Li                    "  int        i;\n"
181*67e74705SXin Li                    "  int        j;\n"
182*67e74705SXin Li                    "}   )  ;",
183*67e74705SXin Li                    20, 1));
184*67e74705SXin Li   EXPECT_EQ("DEBUG(   {\n"
185*67e74705SXin Li             "  int        i;\n"
186*67e74705SXin Li             "  int j;\n"
187*67e74705SXin Li             "}   )  ;",
188*67e74705SXin Li             format("DEBUG(   {\n"
189*67e74705SXin Li                    "  int        i;\n"
190*67e74705SXin Li                    "  int        j;\n"
191*67e74705SXin Li                    "}   )  ;",
192*67e74705SXin Li                    41, 1));
193*67e74705SXin Li   EXPECT_EQ("DEBUG(   {\n"
194*67e74705SXin Li             "    int        i;\n"
195*67e74705SXin Li             "    int j;\n"
196*67e74705SXin Li             "}   )  ;",
197*67e74705SXin Li             format("DEBUG(   {\n"
198*67e74705SXin Li                    "    int        i;\n"
199*67e74705SXin Li                    "    int        j;\n"
200*67e74705SXin Li                    "}   )  ;",
201*67e74705SXin Li                    41, 1));
202*67e74705SXin Li   EXPECT_EQ("DEBUG({\n"
203*67e74705SXin Li             "  int i;\n"
204*67e74705SXin Li             "  int j;\n"
205*67e74705SXin Li             "});",
206*67e74705SXin Li             format("DEBUG(   {\n"
207*67e74705SXin Li                    "    int        i;\n"
208*67e74705SXin Li                    "    int        j;\n"
209*67e74705SXin Li                    "}   )  ;",
210*67e74705SXin Li                    20, 1));
211*67e74705SXin Li 
212*67e74705SXin Li   EXPECT_EQ("Debug({\n"
213*67e74705SXin Li             "        if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
214*67e74705SXin Li             "          return;\n"
215*67e74705SXin Li             "      },\n"
216*67e74705SXin Li             "      a);",
217*67e74705SXin Li             format("Debug({\n"
218*67e74705SXin Li                    "        if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
219*67e74705SXin Li                    "             return;\n"
220*67e74705SXin Li                    "      },\n"
221*67e74705SXin Li                    "      a);",
222*67e74705SXin Li                    50, 1));
223*67e74705SXin Li   EXPECT_EQ("DEBUG({\n"
224*67e74705SXin Li             "  DEBUG({\n"
225*67e74705SXin Li             "    int a;\n"
226*67e74705SXin Li             "    int b;\n"
227*67e74705SXin Li             "  }) ;\n"
228*67e74705SXin Li             "});",
229*67e74705SXin Li             format("DEBUG({\n"
230*67e74705SXin Li                    "  DEBUG({\n"
231*67e74705SXin Li                    "    int a;\n"
232*67e74705SXin Li                    "    int    b;\n" // Format this line only.
233*67e74705SXin Li                    "  }) ;\n"        // Don't touch this line.
234*67e74705SXin Li                    "});",
235*67e74705SXin Li                    35, 0));
236*67e74705SXin Li   EXPECT_EQ("DEBUG({\n"
237*67e74705SXin Li             "  int a; //\n"
238*67e74705SXin Li             "});",
239*67e74705SXin Li             format("DEBUG({\n"
240*67e74705SXin Li                    "    int a; //\n"
241*67e74705SXin Li                    "});",
242*67e74705SXin Li                    0, 0));
243*67e74705SXin Li   EXPECT_EQ("someFunction(\n"
244*67e74705SXin Li             "    [] {\n"
245*67e74705SXin Li             "      // Only with this comment.\n"
246*67e74705SXin Li             "      int i; // invoke formatting here.\n"
247*67e74705SXin Li             "    }, // force line break\n"
248*67e74705SXin Li             "    aaa);",
249*67e74705SXin Li             format("someFunction(\n"
250*67e74705SXin Li                    "    [] {\n"
251*67e74705SXin Li                    "      // Only with this comment.\n"
252*67e74705SXin Li                    "      int   i; // invoke formatting here.\n"
253*67e74705SXin Li                    "    }, // force line break\n"
254*67e74705SXin Li                    "    aaa);",
255*67e74705SXin Li                    63, 1));
256*67e74705SXin Li 
257*67e74705SXin Li   EXPECT_EQ("int longlongname; // comment\n"
258*67e74705SXin Li             "int x = f({\n"
259*67e74705SXin Li             "  int x; // comment\n"
260*67e74705SXin Li             "  int y; // comment\n"
261*67e74705SXin Li             "});",
262*67e74705SXin Li             format("int longlongname; // comment\n"
263*67e74705SXin Li                    "int x = f({\n"
264*67e74705SXin Li                    "  int x; // comment\n"
265*67e74705SXin Li                    "  int y; // comment\n"
266*67e74705SXin Li                    "});",
267*67e74705SXin Li                    65, 0));
268*67e74705SXin Li   EXPECT_EQ("int s = f({\n"
269*67e74705SXin Li             "  class X {\n"
270*67e74705SXin Li             "  public:\n"
271*67e74705SXin Li             "    void f();\n"
272*67e74705SXin Li             "  };\n"
273*67e74705SXin Li             "});",
274*67e74705SXin Li             format("int s = f({\n"
275*67e74705SXin Li                    "  class X {\n"
276*67e74705SXin Li                    "    public:\n"
277*67e74705SXin Li                    "    void f();\n"
278*67e74705SXin Li                    "  };\n"
279*67e74705SXin Li                    "});",
280*67e74705SXin Li                    0, 0));
281*67e74705SXin Li   EXPECT_EQ("SomeFunction(\n"
282*67e74705SXin Li             "    [] {\n"
283*67e74705SXin Li             "      int i;\n"
284*67e74705SXin Li             "      return i;\n" // Format this line.
285*67e74705SXin Li             "    },\n"
286*67e74705SXin Li             "    [] {\n"
287*67e74705SXin Li             "       return 2;\n" // Don't fix this.
288*67e74705SXin Li             "    });",
289*67e74705SXin Li             format("SomeFunction(\n"
290*67e74705SXin Li                    "    [] {\n"
291*67e74705SXin Li                    "      int i;\n"
292*67e74705SXin Li                    "       return i;\n" // Format this line.
293*67e74705SXin Li                    "    },\n"
294*67e74705SXin Li                    "    [] {\n"
295*67e74705SXin Li                    "       return 2;\n" // Don't fix this.
296*67e74705SXin Li                    "    });",
297*67e74705SXin Li                    40, 0));
298*67e74705SXin Li }
299*67e74705SXin Li 
TEST_F(FormatTestSelective,WrongIndent)300*67e74705SXin Li TEST_F(FormatTestSelective, WrongIndent) {
301*67e74705SXin Li   EXPECT_EQ("namespace {\n"
302*67e74705SXin Li             "int i;\n"
303*67e74705SXin Li             "int j;\n"
304*67e74705SXin Li             "}",
305*67e74705SXin Li             format("namespace {\n"
306*67e74705SXin Li                    "  int i;\n" // Format here.
307*67e74705SXin Li                    "  int j;\n"
308*67e74705SXin Li                    "}",
309*67e74705SXin Li                    15, 0));
310*67e74705SXin Li   EXPECT_EQ("namespace {\n"
311*67e74705SXin Li             "  int i;\n"
312*67e74705SXin Li             "  int j;\n"
313*67e74705SXin Li             "}",
314*67e74705SXin Li             format("namespace {\n"
315*67e74705SXin Li                    "  int i;\n"
316*67e74705SXin Li                    "  int j;\n" // Format here.
317*67e74705SXin Li                    "}",
318*67e74705SXin Li                    24, 0));
319*67e74705SXin Li }
320*67e74705SXin Li 
TEST_F(FormatTestSelective,AlwaysFormatsEntireMacroDefinitions)321*67e74705SXin Li TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
322*67e74705SXin Li   Style.AlignEscapedNewlinesLeft = true;
323*67e74705SXin Li   EXPECT_EQ("int  i;\n"
324*67e74705SXin Li             "#define A \\\n"
325*67e74705SXin Li             "  int i;  \\\n"
326*67e74705SXin Li             "  int j\n"
327*67e74705SXin Li             "int  k;",
328*67e74705SXin Li             format("int  i;\n"
329*67e74705SXin Li                    "#define A  \\\n"
330*67e74705SXin Li                    " int   i    ;  \\\n"
331*67e74705SXin Li                    " int   j\n"
332*67e74705SXin Li                    "int  k;",
333*67e74705SXin Li                    8, 0)); // 8: position of "#define".
334*67e74705SXin Li   EXPECT_EQ("int  i;\n"
335*67e74705SXin Li             "#define A \\\n"
336*67e74705SXin Li             "  int i;  \\\n"
337*67e74705SXin Li             "  int j\n"
338*67e74705SXin Li             "int  k;",
339*67e74705SXin Li             format("int  i;\n"
340*67e74705SXin Li                    "#define A  \\\n"
341*67e74705SXin Li                    " int   i    ;  \\\n"
342*67e74705SXin Li                    " int   j\n"
343*67e74705SXin Li                    "int  k;",
344*67e74705SXin Li                    45, 0)); // 45: position of "j".
345*67e74705SXin Li }
346*67e74705SXin Li 
TEST_F(FormatTestSelective,ReformatRegionAdjustsIndent)347*67e74705SXin Li TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
348*67e74705SXin Li   EXPECT_EQ("{\n"
349*67e74705SXin Li             "{\n"
350*67e74705SXin Li             "a;\n"
351*67e74705SXin Li             "b;\n"
352*67e74705SXin Li             "}\n"
353*67e74705SXin Li             "}",
354*67e74705SXin Li             format("{\n"
355*67e74705SXin Li                    "{\n"
356*67e74705SXin Li                    "a;\n"
357*67e74705SXin Li                    "     b;\n"
358*67e74705SXin Li                    "}\n"
359*67e74705SXin Li                    "}",
360*67e74705SXin Li                    13, 2));
361*67e74705SXin Li   EXPECT_EQ("{\n"
362*67e74705SXin Li             "{\n"
363*67e74705SXin Li             "  a;\n"
364*67e74705SXin Li             "  b;\n"
365*67e74705SXin Li             "  c;\n"
366*67e74705SXin Li             " d;\n"
367*67e74705SXin Li             "}\n"
368*67e74705SXin Li             "}",
369*67e74705SXin Li             format("{\n"
370*67e74705SXin Li                    "{\n"
371*67e74705SXin Li                    "     a;\n"
372*67e74705SXin Li                    "   b;\n"
373*67e74705SXin Li                    "  c;\n"
374*67e74705SXin Li                    " d;\n"
375*67e74705SXin Li                    "}\n"
376*67e74705SXin Li                    "}",
377*67e74705SXin Li                    9, 2));
378*67e74705SXin Li   EXPECT_EQ("{\n"
379*67e74705SXin Li             "{\n"
380*67e74705SXin Li             "public:\n"
381*67e74705SXin Li             "  b;\n"
382*67e74705SXin Li             "}\n"
383*67e74705SXin Li             "}",
384*67e74705SXin Li             format("{\n"
385*67e74705SXin Li                    "{\n"
386*67e74705SXin Li                    "public:\n"
387*67e74705SXin Li                    "     b;\n"
388*67e74705SXin Li                    "}\n"
389*67e74705SXin Li                    "}",
390*67e74705SXin Li                    17, 2));
391*67e74705SXin Li   EXPECT_EQ("{\n"
392*67e74705SXin Li             "{\n"
393*67e74705SXin Li             "a;\n"
394*67e74705SXin Li             "}\n"
395*67e74705SXin Li             "{\n"
396*67e74705SXin Li             "  b; //\n"
397*67e74705SXin Li             "}\n"
398*67e74705SXin Li             "}",
399*67e74705SXin Li             format("{\n"
400*67e74705SXin Li                    "{\n"
401*67e74705SXin Li                    "a;\n"
402*67e74705SXin Li                    "}\n"
403*67e74705SXin Li                    "{\n"
404*67e74705SXin Li                    "           b; //\n"
405*67e74705SXin Li                    "}\n"
406*67e74705SXin Li                    "}",
407*67e74705SXin Li                    22, 2));
408*67e74705SXin Li   EXPECT_EQ("  {\n"
409*67e74705SXin Li             "    a; //\n"
410*67e74705SXin Li             "  }",
411*67e74705SXin Li             format("  {\n"
412*67e74705SXin Li                    "a; //\n"
413*67e74705SXin Li                    "  }",
414*67e74705SXin Li                    4, 2));
415*67e74705SXin Li   EXPECT_EQ("void f() {}\n"
416*67e74705SXin Li             "void g() {}",
417*67e74705SXin Li             format("void f() {}\n"
418*67e74705SXin Li                    "void g() {}",
419*67e74705SXin Li                    13, 0));
420*67e74705SXin Li   EXPECT_EQ("int a; // comment\n"
421*67e74705SXin Li             "       // line 2\n"
422*67e74705SXin Li             "int b;",
423*67e74705SXin Li             format("int a; // comment\n"
424*67e74705SXin Li                    "       // line 2\n"
425*67e74705SXin Li                    "  int b;",
426*67e74705SXin Li                    35, 0));
427*67e74705SXin Li 
428*67e74705SXin Li   EXPECT_EQ(" void f() {\n"
429*67e74705SXin Li             "#define A 1\n"
430*67e74705SXin Li             " }",
431*67e74705SXin Li             format(" void f() {\n"
432*67e74705SXin Li                    "     #define A 1\n" // Format this line.
433*67e74705SXin Li                    " }",
434*67e74705SXin Li                    20, 0));
435*67e74705SXin Li   EXPECT_EQ(" void f() {\n"
436*67e74705SXin Li             "    int i;\n"
437*67e74705SXin Li             "#define A \\\n"
438*67e74705SXin Li             "    int i;  \\\n"
439*67e74705SXin Li             "   int j;\n"
440*67e74705SXin Li             "    int k;\n"
441*67e74705SXin Li             " }",
442*67e74705SXin Li             format(" void f() {\n"
443*67e74705SXin Li                    "    int i;\n"
444*67e74705SXin Li                    "#define A \\\n"
445*67e74705SXin Li                    "    int i;  \\\n"
446*67e74705SXin Li                    "   int j;\n"
447*67e74705SXin Li                    "      int k;\n" // Format this line.
448*67e74705SXin Li                    " }",
449*67e74705SXin Li                    67, 0));
450*67e74705SXin Li 
451*67e74705SXin Li   Style.ColumnLimit = 11;
452*67e74705SXin Li   EXPECT_EQ("  int a;\n"
453*67e74705SXin Li             "  void\n"
454*67e74705SXin Li             "  ffffff() {\n"
455*67e74705SXin Li             "  }",
456*67e74705SXin Li             format("  int a;\n"
457*67e74705SXin Li                    "void ffffff() {}",
458*67e74705SXin Li                    11, 0));
459*67e74705SXin Li }
460*67e74705SXin Li 
TEST_F(FormatTestSelective,UnderstandsTabs)461*67e74705SXin Li TEST_F(FormatTestSelective, UnderstandsTabs) {
462*67e74705SXin Li   Style.IndentWidth = 8;
463*67e74705SXin Li   Style.UseTab = FormatStyle::UT_Always;
464*67e74705SXin Li   Style.AlignEscapedNewlinesLeft = true;
465*67e74705SXin Li   EXPECT_EQ("void f() {\n"
466*67e74705SXin Li             "\tf();\n"
467*67e74705SXin Li             "\tg();\n"
468*67e74705SXin Li             "}",
469*67e74705SXin Li             format("void f() {\n"
470*67e74705SXin Li                    "\tf();\n"
471*67e74705SXin Li                    "\tg();\n"
472*67e74705SXin Li                    "}",
473*67e74705SXin Li                    0, 0));
474*67e74705SXin Li   EXPECT_EQ("void f() {\n"
475*67e74705SXin Li             "\tf();\n"
476*67e74705SXin Li             "\tg();\n"
477*67e74705SXin Li             "}",
478*67e74705SXin Li             format("void f() {\n"
479*67e74705SXin Li                    "\tf();\n"
480*67e74705SXin Li                    "\tg();\n"
481*67e74705SXin Li                    "}",
482*67e74705SXin Li                    16, 0));
483*67e74705SXin Li   EXPECT_EQ("void f() {\n"
484*67e74705SXin Li             "  \tf();\n"
485*67e74705SXin Li             "\tg();\n"
486*67e74705SXin Li             "}",
487*67e74705SXin Li             format("void f() {\n"
488*67e74705SXin Li                    "  \tf();\n"
489*67e74705SXin Li                    "  \tg();\n"
490*67e74705SXin Li                    "}",
491*67e74705SXin Li                    21, 0));
492*67e74705SXin Li }
493*67e74705SXin Li 
TEST_F(FormatTestSelective,StopFormattingWhenLeavingScope)494*67e74705SXin Li TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
495*67e74705SXin Li   EXPECT_EQ(
496*67e74705SXin Li       "void f() {\n"
497*67e74705SXin Li       "  if (a) {\n"
498*67e74705SXin Li       "    g();\n"
499*67e74705SXin Li       "    h();\n"
500*67e74705SXin Li       "}\n"
501*67e74705SXin Li       "\n"
502*67e74705SXin Li       "void g() {\n"
503*67e74705SXin Li       "}",
504*67e74705SXin Li       format("void f() {\n"
505*67e74705SXin Li              "  if (a) {\n" // Assume this was added without the closing brace.
506*67e74705SXin Li              "  g();\n"
507*67e74705SXin Li              "  h();\n"
508*67e74705SXin Li              "}\n"
509*67e74705SXin Li              "\n"
510*67e74705SXin Li              "void g() {\n" // Make sure not to format this.
511*67e74705SXin Li              "}",
512*67e74705SXin Li              15, 0));
513*67e74705SXin Li }
514*67e74705SXin Li 
TEST_F(FormatTestSelective,SelectivelyRequoteJavaScript)515*67e74705SXin Li TEST_F(FormatTestSelective, SelectivelyRequoteJavaScript) {
516*67e74705SXin Li   Style = getGoogleStyle(FormatStyle::LK_JavaScript);
517*67e74705SXin Li   EXPECT_EQ(
518*67e74705SXin Li       "var x = \"a\";\n"
519*67e74705SXin Li       "var x = 'a';\n"
520*67e74705SXin Li       "var x = \"a\";",
521*67e74705SXin Li       format("var x = \"a\";\n"
522*67e74705SXin Li              "var x = \"a\";\n"
523*67e74705SXin Li              "var x = \"a\";",
524*67e74705SXin Li              20, 0));
525*67e74705SXin Li }
526*67e74705SXin Li 
527*67e74705SXin Li } // end namespace
528*67e74705SXin Li } // end namespace format
529*67e74705SXin Li } // end namespace clang
530