123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608 |
- //===- unittest/Format/FormatTestSelective.cpp - Formatting unit tests ----===//
- //
- // 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 "FormatTestUtils.h"
- #include "clang/Format/Format.h"
- #include "llvm/Support/Debug.h"
- #include "gtest/gtest.h"
- #define DEBUG_TYPE "format-test"
- namespace clang {
- namespace format {
- namespace {
- class FormatTestSelective : public ::testing::Test {
- protected:
- std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length) {
- LLVM_DEBUG(llvm::errs() << "---\n");
- LLVM_DEBUG(llvm::errs() << Code << "\n\n");
- std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
- FormattingAttemptStatus Status;
- tooling::Replacements Replaces =
- reformat(Style, Code, Ranges, "<stdin>", &Status);
- EXPECT_TRUE(Status.FormatComplete) << Code << "\n\n";
- auto Result = applyAllReplacements(Code, Replaces);
- EXPECT_TRUE(static_cast<bool>(Result));
- LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
- return *Result;
- }
- FormatStyle Style = getLLVMStyle();
- };
- TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
- EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0));
- EXPECT_EQ("int a;", format("int a; ", 0, 0));
- EXPECT_EQ("int a;\n", format("int a; \n \n \n ", 0, 0));
- EXPECT_EQ("int a;\nint b; ", format("int a; \nint b; ", 0, 0));
- }
- TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
- EXPECT_EQ("{int b;\n"
- " int a;\n"
- "}",
- format("{int b;\n int a;}", 8, 0));
- EXPECT_EQ("{\n"
- " int b;\n"
- " int a;}",
- format("{int b;\n int a;}", 7, 0));
- Style.ColumnLimit = 12;
- EXPECT_EQ("#define A \\\n"
- " int a; \\\n"
- " int b;",
- format("#define A \\\n"
- " int a; \\\n"
- " int b;",
- 26, 0));
- EXPECT_EQ("#define A \\\n"
- " int a; \\\n"
- " int b;",
- format("#define A \\\n"
- " int a; \\\n"
- " int b;",
- 25, 0));
- }
- TEST_F(FormatTestSelective, FormatLineWhenInvokedOnTrailingNewline) {
- EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 8, 0));
- EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 7, 0));
- // This might not strictly be correct, but is likely good in all practical
- // cases.
- EXPECT_EQ("int b;\nint a;", format("int b;int a;", 7, 0));
- }
- TEST_F(FormatTestSelective, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
- EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 8, 0));
- EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 9, 0));
- }
- TEST_F(FormatTestSelective, ReformatsMovedLines) {
- EXPECT_EQ(
- "template <typename T> T *getFETokenInfo() const {\n"
- " return static_cast<T *>(FETokenInfo);\n"
- "}\n"
- "int a; // <- Should not be formatted",
- format(
- "template<typename T>\n"
- "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
- "int a; // <- Should not be formatted",
- 9, 5));
- }
- TEST_F(FormatTestSelective, FormatsIfWithoutCompoundStatement) {
- Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
- EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1));
- EXPECT_EQ("if (a) return; // comment",
- format("if(a)\nreturn; // comment", 20, 1));
- }
- TEST_F(FormatTestSelective, FormatsCommentsLocally) {
- EXPECT_EQ("int a; // comment\n"
- "int b; // comment",
- format("int a; // comment\n"
- "int b; // comment",
- 0, 0));
- EXPECT_EQ("int a; // comment\n"
- " // line 2\n"
- "int b;",
- format("int a; // comment\n"
- " // line 2\n"
- "int b;",
- 28, 0));
- EXPECT_EQ("int a; // comment\n"
- "// comment 2\n"
- "int b;",
- format("int a; // comment\n"
- "// comment 2\n"
- "int b;", 28, 0));
- EXPECT_EQ("int aaaaaa; // comment\n"
- "int b;\n"
- "int c; // unrelated comment",
- format("int aaaaaa; // comment\n"
- "int b;\n"
- "int c; // unrelated comment",
- 31, 0));
- EXPECT_EQ("int a; // This\n"
- " // is\n"
- " // a",
- format("int a; // This\n"
- " // is\n"
- " // a",
- 0, 0));
- EXPECT_EQ("int a; // This\n"
- " // is\n"
- " // a\n"
- "// This is b\n"
- "int b;",
- format("int a; // This\n"
- " // is\n"
- " // a\n"
- "// This is b\n"
- "int b;",
- 0, 0));
- EXPECT_EQ("int a; // This\n"
- " // is\n"
- " // a\n"
- "\n"
- "//This is unrelated",
- format("int a; // This\n"
- " // is\n"
- " // a\n"
- "\n"
- "//This is unrelated",
- 0, 0));
- EXPECT_EQ("int a;\n"
- "// This is\n"
- "// not formatted. ",
- format("int a;\n"
- "// This is\n"
- "// not formatted. ",
- 0, 0));
- EXPECT_EQ("int x; // Format this line.\n"
- "int xx; //\n"
- "int xxxxx; //",
- format("int x; // Format this line.\n"
- "int xx; //\n"
- "int xxxxx; //",
- 0, 0));
- }
- TEST_F(FormatTestSelective, ContinueReindenting) {
- // When we change an indent, we continue formatting as long as following
- // lines are not indented correctly.
- EXPECT_EQ("int i;\n"
- "int b;\n"
- "int c;\n"
- "int d;\n"
- "int e;\n"
- " int f;\n",
- format("int i;\n"
- " int b;\n"
- " int c;\n"
- " int d;\n"
- "int e;\n"
- " int f;\n",
- 11, 0));
- }
- TEST_F(FormatTestSelective, ReindentClosingBrace) {
- EXPECT_EQ("int i;\n"
- "int f() {\n"
- " int a;\n"
- " int b;\n"
- "}\n"
- " int c;\n",
- format("int i;\n"
- " int f(){\n"
- "int a;\n"
- "int b;\n"
- " }\n"
- " int c;\n",
- 11, 0));
- EXPECT_EQ("void f() {\n"
- " if (foo) {\n"
- " b();\n"
- " } else {\n"
- " c();\n"
- " }\n"
- "int d;\n"
- "}\n",
- format("void f() {\n"
- " if (foo) {\n"
- "b();\n"
- "}else{\n"
- "c();\n"
- "}\n"
- "int d;\n"
- "}\n",
- 13, 0));
- EXPECT_EQ("int i = []() {\n"
- " class C {\n"
- " int a;\n"
- " int b;\n"
- " };\n"
- " int c;\n"
- "};\n",
- format("int i = []() {\n"
- " class C{\n"
- "int a;\n"
- "int b;\n"
- "};\n"
- "int c;\n"
- " };\n",
- 17, 0));
- }
- TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
- EXPECT_EQ("DEBUG({\n"
- " int i;\n"
- " int j;\n"
- "});",
- format("DEBUG( {\n"
- " int i;\n"
- " int j;\n"
- "} ) ;",
- 20, 1));
- EXPECT_EQ("DEBUG( {\n"
- " int i;\n"
- " int j;\n"
- "} ) ;",
- format("DEBUG( {\n"
- " int i;\n"
- " int j;\n"
- "} ) ;",
- 41, 1));
- EXPECT_EQ("DEBUG( {\n"
- " int i;\n"
- " int j;\n"
- "} ) ;",
- format("DEBUG( {\n"
- " int i;\n"
- " int j;\n"
- "} ) ;",
- 41, 1));
- EXPECT_EQ("DEBUG({\n"
- " int i;\n"
- " int j;\n"
- "});",
- format("DEBUG( {\n"
- " int i;\n"
- " int j;\n"
- "} ) ;",
- 20, 1));
- EXPECT_EQ("Debug({\n"
- " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
- " return;\n"
- " },\n"
- " a);",
- format("Debug({\n"
- " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
- " return;\n"
- " },\n"
- " a);",
- 50, 1));
- EXPECT_EQ("DEBUG({\n"
- " DEBUG({\n"
- " int a;\n"
- " int b;\n"
- " }) ;\n"
- "});",
- format("DEBUG({\n"
- " DEBUG({\n"
- " int a;\n"
- " int b;\n" // Format this line only.
- " }) ;\n" // Don't touch this line.
- "});",
- 35, 0));
- EXPECT_EQ("DEBUG({\n"
- " int a; //\n"
- "});",
- format("DEBUG({\n"
- " int a; //\n"
- "});",
- 0, 0));
- EXPECT_EQ("someFunction(\n"
- " [] {\n"
- " // Only with this comment.\n"
- " int i; // invoke formatting here.\n"
- " }, // force line break\n"
- " aaa);",
- format("someFunction(\n"
- " [] {\n"
- " // Only with this comment.\n"
- " int i; // invoke formatting here.\n"
- " }, // force line break\n"
- " aaa);",
- 63, 1));
- EXPECT_EQ("int longlongname; // comment\n"
- "int x = f({\n"
- " int x; // comment\n"
- " int y; // comment\n"
- "});",
- format("int longlongname; // comment\n"
- "int x = f({\n"
- " int x; // comment\n"
- " int y; // comment\n"
- "});",
- 65, 0));
- EXPECT_EQ("int s = f({\n"
- " class X {\n"
- " public:\n"
- " void f();\n"
- " };\n"
- "});",
- format("int s = f({\n"
- " class X {\n"
- " public:\n"
- " void f();\n"
- " };\n"
- "});",
- 0, 0));
- EXPECT_EQ("SomeFunction(\n"
- " [] {\n"
- " int i;\n"
- " return i;\n" // Format this line.
- " },\n"
- " [] {\n"
- " return 2;\n" // Don't fix this.
- " });",
- format("SomeFunction(\n"
- " [] {\n"
- " int i;\n"
- " return i;\n" // Format this line.
- " },\n"
- " [] {\n"
- " return 2;\n" // Don't fix this.
- " });",
- 40, 0));
- }
- TEST_F(FormatTestSelective, WrongIndent) {
- EXPECT_EQ("namespace {\n"
- "int i;\n"
- "int j;\n"
- "}",
- format("namespace {\n"
- " int i;\n" // Format here.
- " int j;\n"
- "}",
- 15, 0));
- EXPECT_EQ("namespace {\n"
- " int i;\n"
- " int j;\n"
- "}",
- format("namespace {\n"
- " int i;\n"
- " int j;\n" // Format here.
- "}",
- 24, 0));
- }
- TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
- Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
- EXPECT_EQ("int i;\n"
- "#define A \\\n"
- " int i; \\\n"
- " int j\n"
- "int k;",
- format("int i;\n"
- "#define A \\\n"
- " int i ; \\\n"
- " int j\n"
- "int k;",
- 8, 0)); // 8: position of "#define".
- EXPECT_EQ("int i;\n"
- "#define A \\\n"
- " int i; \\\n"
- " int j\n"
- "int k;",
- format("int i;\n"
- "#define A \\\n"
- " int i ; \\\n"
- " int j\n"
- "int k;",
- 45, 0)); // 45: position of "j".
- }
- TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
- EXPECT_EQ("{\n"
- "{\n"
- "a;\n"
- "b;\n"
- "}\n"
- "}",
- format("{\n"
- "{\n"
- "a;\n"
- " b;\n"
- "}\n"
- "}",
- 13, 2));
- EXPECT_EQ("{\n"
- "{\n"
- " a;\n"
- " b;\n"
- " c;\n"
- " d;\n"
- "}\n"
- "}",
- format("{\n"
- "{\n"
- " a;\n"
- " b;\n"
- " c;\n"
- " d;\n"
- "}\n"
- "}",
- 9, 2));
- EXPECT_EQ("{\n"
- "{\n"
- "public:\n"
- " b;\n"
- "}\n"
- "}",
- format("{\n"
- "{\n"
- "public:\n"
- " b;\n"
- "}\n"
- "}",
- 17, 2));
- EXPECT_EQ("{\n"
- "{\n"
- "a;\n"
- "}\n"
- "{\n"
- " b; //\n"
- "}\n"
- "}",
- format("{\n"
- "{\n"
- "a;\n"
- "}\n"
- "{\n"
- " b; //\n"
- "}\n"
- "}",
- 22, 2));
- EXPECT_EQ(" {\n"
- " a; //\n"
- " }",
- format(" {\n"
- "a; //\n"
- " }",
- 4, 2));
- EXPECT_EQ("void f() {}\n"
- "void g() {}",
- format("void f() {}\n"
- "void g() {}",
- 13, 0));
- EXPECT_EQ("int a; // comment\n"
- " // line 2\n"
- "int b;",
- format("int a; // comment\n"
- " // line 2\n"
- " int b;",
- 35, 0));
- EXPECT_EQ(" void f() {\n"
- "#define A 1\n"
- " }",
- format(" void f() {\n"
- " #define A 1\n" // Format this line.
- " }",
- 20, 0));
- EXPECT_EQ(" void f() {\n"
- " int i;\n"
- "#define A \\\n"
- " int i; \\\n"
- " int j;\n"
- " int k;\n"
- " }",
- format(" void f() {\n"
- " int i;\n"
- "#define A \\\n"
- " int i; \\\n"
- " int j;\n"
- " int k;\n" // Format this line.
- " }",
- 67, 0));
- Style.ColumnLimit = 11;
- EXPECT_EQ(" int a;\n"
- " void\n"
- " ffffff() {\n"
- " }",
- format(" int a;\n"
- "void ffffff() {}",
- 11, 0));
- }
- TEST_F(FormatTestSelective, UnderstandsTabs) {
- Style.IndentWidth = 8;
- Style.UseTab = FormatStyle::UT_Always;
- Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
- EXPECT_EQ("void f() {\n"
- "\tf();\n"
- "\tg();\n"
- "}",
- format("void f() {\n"
- "\tf();\n"
- "\tg();\n"
- "}",
- 0, 0));
- EXPECT_EQ("void f() {\n"
- "\tf();\n"
- "\tg();\n"
- "}",
- format("void f() {\n"
- "\tf();\n"
- "\tg();\n"
- "}",
- 16, 0));
- EXPECT_EQ("void f() {\n"
- " \tf();\n"
- "\tg();\n"
- "}",
- format("void f() {\n"
- " \tf();\n"
- " \tg();\n"
- "}",
- 21, 0));
- }
- TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
- EXPECT_EQ(
- "void f() {\n"
- " if (a) {\n"
- " g();\n"
- " h();\n"
- " }\n"
- "\n"
- "void g() {\n"
- "}",
- format("void f() {\n"
- " if (a) {\n" // Assume this was added without the closing brace.
- " g();\n"
- " h();\n"
- "}\n"
- "\n"
- "void g() {\n" // Make sure not to format this.
- "}",
- 15, 0));
- }
- TEST_F(FormatTestSelective, SelectivelyRequoteJavaScript) {
- Style = getGoogleStyle(FormatStyle::LK_JavaScript);
- EXPECT_EQ(
- "var x = \"a\";\n"
- "var x = 'a';\n"
- "var x = \"a\";",
- format("var x = \"a\";\n"
- "var x = \"a\";\n"
- "var x = \"a\";",
- 20, 0));
- }
- TEST_F(FormatTestSelective, KeepsIndentAfterCommentSectionImport) {
- std::string Code = "#include <a> // line 1\n" // 23 chars long
- " // line 2\n" // 23 chars long
- "\n" // this newline is char 47
- "int i;"; // this line is not indented
- EXPECT_EQ(Code, format(Code, 47, 1));
- }
- } // end namespace
- } // end namespace format
- } // end namespace clang
|