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