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