|  | //===- unittest/Format/BracesInserterTest.cpp -----------------------------===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "FormatTestBase.h" | 
|  |  | 
|  | #define DEBUG_TYPE "braces-inserter-test" | 
|  |  | 
|  | namespace clang { | 
|  | namespace format { | 
|  | namespace test { | 
|  | namespace { | 
|  |  | 
|  | class BracesInserterTest : public FormatTestBase {}; | 
|  |  | 
|  | TEST_F(BracesInserterTest, InsertBraces) { | 
|  | FormatStyle Style = getLLVMStyle(); | 
|  | Style.InsertBraces = true; | 
|  |  | 
|  | verifyFormat("// clang-format off\n" | 
|  | "// comment\n" | 
|  | "if (a) f();\n" | 
|  | "// clang-format on\n" | 
|  | "if (b) {\n" | 
|  | "  g();\n" | 
|  | "}", | 
|  | "// clang-format off\n" | 
|  | "// comment\n" | 
|  | "if (a) f();\n" | 
|  | "// clang-format on\n" | 
|  | "if (b) g();", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  switch (b) {\n" | 
|  | "  case 1:\n" | 
|  | "    c = 0;\n" | 
|  | "    break;\n" | 
|  | "  default:\n" | 
|  | "    c = 1;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | "if (a)\n" | 
|  | "  switch (b) {\n" | 
|  | "  case 1:\n" | 
|  | "    c = 0;\n" | 
|  | "    break;\n" | 
|  | "  default:\n" | 
|  | "    c = 1;\n" | 
|  | "  }", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("for (auto node : nodes) {\n" | 
|  | "  if (node) {\n" | 
|  | "    break;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | "for (auto node : nodes)\n" | 
|  | "  if (node)\n" | 
|  | "    break;", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("for (auto node : nodes) {\n" | 
|  | "  if (node)\n" | 
|  | "}", | 
|  | "for (auto node : nodes)\n" | 
|  | "  if (node)", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("do {\n" | 
|  | "  --a;\n" | 
|  | "} while (a);", | 
|  | "do\n" | 
|  | "  --a;\n" | 
|  | "while (a);", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (i) {\n" | 
|  | "  ++i;\n" | 
|  | "} else {\n" | 
|  | "  --i;\n" | 
|  | "}", | 
|  | "if (i)\n" | 
|  | "  ++i;\n" | 
|  | "else {\n" | 
|  | "  --i;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("void f() {\n" | 
|  | "  while (j--) {\n" | 
|  | "    while (i) {\n" | 
|  | "      --i;\n" | 
|  | "    }\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | "void f() {\n" | 
|  | "  while (j--)\n" | 
|  | "    while (i)\n" | 
|  | "      --i;\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("f({\n" | 
|  | "  if (a) {\n" | 
|  | "    g();\n" | 
|  | "  }\n" | 
|  | "});", | 
|  | "f({\n" | 
|  | "  if (a)\n" | 
|  | "    g();\n" | 
|  | "});", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  f();\n" | 
|  | "} else if (b) {\n" | 
|  | "  g();\n" | 
|  | "} else {\n" | 
|  | "  h();\n" | 
|  | "}", | 
|  | "if (a)\n" | 
|  | "  f();\n" | 
|  | "else if (b)\n" | 
|  | "  g();\n" | 
|  | "else\n" | 
|  | "  h();", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  f();\n" | 
|  | "}\n" | 
|  | "// comment\n" | 
|  | "/* comment */", | 
|  | "if (a)\n" | 
|  | "  f();\n" | 
|  | "// comment\n" | 
|  | "/* comment */", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  // foo\n" | 
|  | "  // bar\n" | 
|  | "  f();\n" | 
|  | "}", | 
|  | "if (a)\n" | 
|  | "  // foo\n" | 
|  | "  // bar\n" | 
|  | "  f();", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) { //\n" | 
|  | "  b = 1;\n" | 
|  | "}", | 
|  | "if (a) //\n" | 
|  | "  b = 1;", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) { // comment\n" | 
|  | "  // comment\n" | 
|  | "  f();\n" | 
|  | "}", | 
|  | "if (a) // comment\n" | 
|  | "  // comment\n" | 
|  | "  f();", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  f(); // comment\n" | 
|  | "}", | 
|  | "if (a)\n" | 
|  | "  f(); // comment", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a) {\n" | 
|  | "  f();\n" | 
|  | "}\n" | 
|  | "#undef A\n" | 
|  | "#undef B", | 
|  | "if (a)\n" | 
|  | "  f();\n" | 
|  | "#undef A\n" | 
|  | "#undef B", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a)\n" | 
|  | "#ifdef A\n" | 
|  | "  f();\n" | 
|  | "#else\n" | 
|  | "  g();\n" | 
|  | "#endif", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("#if 0\n" | 
|  | "#elif 1\n" | 
|  | "#endif\n" | 
|  | "void f() {\n" | 
|  | "  if (a) {\n" | 
|  | "    g();\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | "#if 0\n" | 
|  | "#elif 1\n" | 
|  | "#endif\n" | 
|  | "void f() {\n" | 
|  | "  if (a) g();\n" | 
|  | "}", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("do {\n" | 
|  | "#if 0\n" | 
|  | "#else\n" | 
|  | "  if (b) {\n" | 
|  | "#endif\n" | 
|  | "  }\n" | 
|  | "} while (0);", | 
|  | Style); | 
|  |  | 
|  | Style.RemoveBracesLLVM = true; | 
|  | verifyFormat("if (a) //\n" | 
|  | "  return b;", | 
|  | Style); | 
|  | Style.RemoveBracesLLVM = false; | 
|  |  | 
|  | Style.ColumnLimit = 15; | 
|  |  | 
|  | verifyFormat("#define A     \\\n" | 
|  | "  if (a)      \\\n" | 
|  | "    f();", | 
|  | Style); | 
|  |  | 
|  | verifyFormat("if (a + b >\n" | 
|  | "    c) {\n" | 
|  | "  f();\n" | 
|  | "}", | 
|  | "if (a + b > c)\n" | 
|  | "  f();", | 
|  | Style); | 
|  |  | 
|  | Style.BreakBeforeBraces = FormatStyle::BS_Custom; | 
|  | Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always; | 
|  |  | 
|  | verifyFormat("if (a) //\n" | 
|  | "{\n" | 
|  | "  b = 1;\n" | 
|  | "}", | 
|  | "if (a) //\n" | 
|  | "  b = 1;", | 
|  | Style); | 
|  | } | 
|  |  | 
|  | TEST_F(BracesInserterTest, InsertBracesRange) { | 
|  | FormatStyle Style = getLLVMStyle(); | 
|  | Style.InsertBraces = true; | 
|  |  | 
|  | const StringRef Code("while (a)\n" | 
|  | "  if (b)\n" | 
|  | "    return;"); | 
|  |  | 
|  | verifyFormat("while (a) {\n" | 
|  | "  if (b)\n" | 
|  | "    return;\n" | 
|  | "}", | 
|  | Code, Style, {tooling::Range(0, 9)}); // line 1 | 
|  |  | 
|  | verifyFormat("while (a) {\n" | 
|  | "  if (b) {\n" | 
|  | "    return;\n" | 
|  | "  }\n" | 
|  | "}", | 
|  | Code, Style, {tooling::Range(0, 18)}); // lines 1-2 | 
|  |  | 
|  | verifyFormat("while (a)\n" | 
|  | "  if (b) {\n" | 
|  | "    return;\n" | 
|  | "  }", | 
|  | Code, Style, {tooling::Range(10, 8)}); // line 2 | 
|  |  | 
|  | verifyFormat(Code, Code, Style, {tooling::Range(19, 11)}); // line 3 | 
|  | } | 
|  |  | 
|  | } // namespace | 
|  | } // namespace test | 
|  | } // namespace format | 
|  | } // namespace clang |