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