diff options
Diffstat (limited to 'unittests/Format/FormatTest.cpp')
-rw-r--r-- | unittests/Format/FormatTest.cpp | 1116 |
1 files changed, 899 insertions, 217 deletions
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 21bc86275461..8e770c2e9cd5 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -111,6 +111,7 @@ TEST_F(FormatTest, NestedNameSpecifiers) { verifyFormat("vector<::Type> v;"); verifyFormat("::ns::SomeFunction(::ns::SomeOtherFunction())"); verifyFormat("static constexpr bool Bar = decltype(bar())::value;"); + verifyFormat("bool a = 2 < ::SomeFunction();"); } TEST_F(FormatTest, OnlyGeneratesNecessaryReplacements) { @@ -158,9 +159,21 @@ TEST_F(FormatTest, FormatsCorrectRegionForLeadingWhitespace) { 25, 0, getLLVMStyleWithColumns(12))); } +TEST_F(FormatTest, FormatLineWhenInvokedOnTrailingNewline) { + EXPECT_EQ("int b;\n\nint a;", + format("int b;\n\nint a;", 8, 0, getLLVMStyle())); + EXPECT_EQ("int b;\n\nint a;", + format("int b;\n\nint a;", 7, 0, getLLVMStyle())); + + // 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, getLLVMStyle())); +} + TEST_F(FormatTest, RemovesWhitespaceWhenTriggeredOnEmptyLine) { EXPECT_EQ("int a;\n\n int b;", - format("int a;\n \n\n int b;", 7, 0, getLLVMStyle())); + format("int a;\n \n\n int b;", 8, 0, getLLVMStyle())); EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 9, 0, getLLVMStyle())); } @@ -174,7 +187,7 @@ TEST_F(FormatTest, RemovesEmptyLines) { "\n" "};")); - // Don't remove empty lines at the start of namespaces. + // Don't remove empty lines at the start of namespaces or extern "C" blocks. EXPECT_EQ("namespace N {\n" "\n" "int i;\n" @@ -184,6 +197,29 @@ TEST_F(FormatTest, RemovesEmptyLines) { "int i;\n" "}", getGoogleStyle())); + EXPECT_EQ("extern /**/ \"C\" /**/ {\n" + "\n" + "int i;\n" + "}", + format("extern /**/ \"C\" /**/ {\n" + "\n" + "int i;\n" + "}", + getGoogleStyle())); + + // ...but do keep inlining and removing empty lines for non-block extern "C" + // functions. + verifyFormat("extern \"C\" int f() { return 42; }", getGoogleStyle()); + EXPECT_EQ("extern \"C\" int f() {\n" + " int i = 42;\n" + " return i;\n" + "}", + format("extern \"C\" int f() {\n" + "\n" + " int i = 42;\n" + " return i;\n" + "}", + getGoogleStyle())); // Remove empty lines at the beginning and end of blocks. EXPECT_EQ("void f() {\n" @@ -700,6 +736,58 @@ TEST_F(FormatTest, CaseRanges) { "}"); } +TEST_F(FormatTest, ShortCaseLabels) { + FormatStyle Style = getLLVMStyle(); + Style.AllowShortCaseLabelsOnASingleLine = true; + verifyFormat("switch (a) {\n" + "case 1: x = 1; break;\n" + "case 2: return;\n" + "case 3:\n" + "case 4:\n" + "case 5: return;\n" + "case 6: // comment\n" + " return;\n" + "case 7:\n" + " // comment\n" + " return;\n" + "default: y = 1; break;\n" + "}", + Style); + verifyFormat("switch (a) {\n" + "#if FOO\n" + "case 0: return 0;\n" + "#endif\n" + "}", + Style); + verifyFormat("switch (a) {\n" + "case 1: {\n" + "}\n" + "case 2: {\n" + " return;\n" + "}\n" + "case 3: {\n" + " x = 1;\n" + " return;\n" + "}\n" + "case 4:\n" + " if (x)\n" + " return;\n" + "}", + Style); + Style.ColumnLimit = 21; + verifyFormat("switch (a) {\n" + "case 1: x = 1; break;\n" + "case 2: return;\n" + "case 3:\n" + "case 4:\n" + "case 5: return;\n" + "default:\n" + " y = 1;\n" + " break;\n" + "}", + Style); +} + TEST_F(FormatTest, FormatsLabels) { verifyFormat("void f() {\n" " some_code();\n" @@ -791,6 +879,12 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) { verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" " // Comment inside a statement.\n" " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;"); + verifyFormat("SomeFunction(a,\n" + " // comment\n" + " b + x);"); + verifyFormat("SomeFunction(a, a,\n" + " // comment\n" + " b + x);"); verifyFormat( "bool aaaaaaaaaaaaa = // comment\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa || aaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" @@ -904,6 +998,14 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) { " // first\n" "// at start\n" "otherLine();")); + EXPECT_EQ("void f() {\n" + " lineWith(); // comment\n" + " // at start\n" + "}", + format("void f() {\n" + " lineWith(); // comment\n" + " // at start\n" + "}")); verifyFormat( "#define A \\\n" @@ -1159,8 +1261,8 @@ TEST_F(FormatTest, CorrectlyHandlesLengthOfBlockComments) { } TEST_F(FormatTest, DontBreakNonTrailingBlockComments) { - EXPECT_EQ("void\n" - "ffffffffff(int aaaaa /* test */);", + EXPECT_EQ("void ffffffffff(\n" + " int aaaaa /* test */);", format("void ffffffffff(int aaaaa /* test */);", getLLVMStyleWithColumns(35))); } @@ -1210,11 +1312,11 @@ TEST_F(FormatTest, SplitsLongCxxComments) { format("// A comment before a macro definition\n" "#define a b", getLLVMStyleWithColumns(20))); - EXPECT_EQ("void\n" - "ffffff(int aaaaaaaaa, // wwww\n" - " int bbbbbbbbbb, // xxxxxxx\n" - " // yyyyyyyyyy\n" - " int c, int d, int e) {}", + EXPECT_EQ("void ffffff(\n" + " int aaaaaaaaa, // wwww\n" + " int bbbbbbbbbb, // xxxxxxx\n" + " // yyyyyyyyyy\n" + " int c, int d, int e) {}", format("void ffffff(\n" " int aaaaaaaaa, // wwww\n" " int bbbbbbbbbb, // xxxxxxx yyyyyyyyyy\n" @@ -1846,6 +1948,7 @@ TEST_F(FormatTest, FormatsClasses) { verifyFormat("template <class R, class C>\n" "struct Aaaaaaaaaaaaaaaaa<R (C::*)(int) const>\n" " : Aaaaaaaaaaaaaaaaa<R (C::*)(int)> {};"); + verifyFormat("class ::A::B {};"); } TEST_F(FormatTest, FormatsVariableDeclarationsAfterStructOrClass) { @@ -1903,7 +2006,8 @@ TEST_F(FormatTest, FormatsEnum) { verifyFormat("enum E { // comment\n" " ONE,\n" " TWO\n" - "};"); + "};\n" + "int i;"); } TEST_F(FormatTest, FormatsEnumsWithErrors) { @@ -1973,6 +2077,21 @@ TEST_F(FormatTest, FormatsNSEnums) { " // Information about aThirdDecentlyLongValue.\n" " aThirdDecentlyLongValue\n" "};"); + verifyGoogleFormat("typedef NS_OPTIONS(NSInteger, MyType) {\n" + " a = 1,\n" + " b = 2,\n" + " c = 3,\n" + "};"); + verifyGoogleFormat("typedef CF_ENUM(NSInteger, MyType) {\n" + " a = 1,\n" + " b = 2,\n" + " c = 3,\n" + "};"); + verifyGoogleFormat("typedef CF_OPTIONS(NSInteger, MyType) {\n" + " a = 1,\n" + " b = 2,\n" + " c = 3,\n" + "};"); } TEST_F(FormatTest, FormatsBitfields) { @@ -2063,12 +2182,32 @@ TEST_F(FormatTest, FormatsExternC) { verifyFormat("extern \"C\" {\nint a;"); } TEST_F(FormatTest, FormatsInlineASM) { verifyFormat("asm(\"xyz\" : \"=a\"(a), \"=d\"(b) : \"a\"(data));"); + verifyFormat("asm(\"nop\" ::: \"memory\");"); verifyFormat( "asm(\"movq\\t%%rbx, %%rsi\\n\\t\"\n" " \"cpuid\\n\\t\"\n" " \"xchgq\\t%%rbx, %%rsi\\n\\t\"\n" " : \"=a\"(*rEAX), \"=S\"(*rEBX), \"=c\"(*rECX), \"=d\"(*rEDX)\n" " : \"a\"(value));"); + EXPECT_EQ( + "void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" + " __asm {\n" + " mov edx,[that] // vtable in edx\n" + " mov eax,methodIndex\n" + " call [edx][eax*4] // stdcall\n" + " }\n" + "}", + format("void NS_InvokeByIndex(void *that, unsigned int methodIndex) {\n" + " __asm {\n" + " mov edx,[that] // vtable in edx\n" + " mov eax,methodIndex\n" + " call [edx][eax*4] // stdcall\n" + " }\n" + "}")); + verifyFormat("void function() {\n" + " // comment\n" + " asm(\"\");\n" + "}"); } TEST_F(FormatTest, FormatTryCatch) { @@ -2247,6 +2386,16 @@ TEST_F(FormatTest, NestedStaticInitializers) { " {kOsWin, \"Windows\"},\n" " {kOsLinux, \"Linux\"},\n" " {kOsCrOS, \"Chrome OS\"}};"); + verifyFormat( + "struct {\n" + " unsigned bit;\n" + " const char *const name;\n" + "} kBitsToOs[] = {\n" + " {kOsMac, \"Mac\"},\n" + " {kOsWin, \"Windows\"},\n" + " {kOsLinux, \"Linux\"},\n" + " {kOsCrOS, \"Chrome OS\"},\n" + "};"); } TEST_F(FormatTest, FormatsSmallMacroDefinitionsInSingleLine) { @@ -2482,6 +2631,14 @@ TEST_F(FormatTest, MacrosWithoutTrailingSemicolon) { " Q_Object\n" " A() {\n}\n" "} ;")); + + // Only if the next line can actually start an unwrapped line. + EXPECT_EQ("SOME_WEIRD_LOG_MACRO << SomeThing;", + format("SOME_WEIRD_LOG_MACRO\n" + "<< SomeThing;")); + + verifyFormat("VISIT_GL_CALL(GenBuffers, void, (GLsizei n, GLuint* buffers), " + "(n, buffers))\n", getChromiumStyle(FormatStyle::LK_Cpp)); } TEST_F(FormatTest, MacroCallsWithoutTrailingSemicolon) { @@ -2659,6 +2816,17 @@ TEST_F(FormatTest, NoEscapedNewlineHandlingInBlockComments) { EXPECT_EQ("/* \\ \\ \\\n*/", format("\\\n/* \\ \\ \\\n*/")); } +TEST_F(FormatTest, DontCrashOnBlockComments) { + EXPECT_EQ( + "int xxxxxxxxx; /* " + "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy\n" + "zzzzzz\n" + "0*/", + format("int xxxxxxxxx; /* " + "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy zzzzzz\n" + "0*/")); +} + TEST_F(FormatTest, CalculateSpaceOnConsecutiveLinesInMacro) { verifyFormat("#define A \\\n" " int v( \\\n" @@ -2779,11 +2947,19 @@ TEST_F(FormatTest, LayoutBlockInsideParens) { "});", format(" functionCall ( {int i;int j;} );")); EXPECT_EQ("functionCall({\n" - " int i;\n" - " int j;\n" - " },\n" - " aaaa, bbbb, cccc);", + " int i;\n" + " int j;\n" + "}, aaaa, bbbb, cccc);", format(" functionCall ( {int i;int j;}, aaaa, bbbb, cccc);")); + EXPECT_EQ("functionCall(\n" + " {\n" + " int i;\n" + " int j;\n" + " },\n" + " aaaa, bbbb, // comment\n" + " cccc);", + format(" functionCall ( {int i;int j;}, aaaa, bbbb, // comment\n" + "cccc);")); EXPECT_EQ("functionCall(aaaa, bbbb, { int i; });", format(" functionCall (aaaa, bbbb, {int i;});")); EXPECT_EQ("functionCall(aaaa, bbbb, {\n" @@ -2794,7 +2970,8 @@ TEST_F(FormatTest, LayoutBlockInsideParens) { EXPECT_EQ("functionCall(aaaa, bbbb, { int i; });", format(" functionCall (aaaa, bbbb, {int i;});")); verifyFormat( - "Aaa({\n" + "Aaa(\n" // FIXME: There shouldn't be a linebreak here. + " {\n" " int i; // break\n" " },\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb,\n" @@ -2876,10 +3053,9 @@ TEST_F(FormatTest, LayoutNestedBlocks) { FormatStyle Style = getGoogleStyle(); Style.ColumnLimit = 45; verifyFormat("Debug(aaaaa, {\n" - " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n" - " return;\n" - " },\n" - " a);", Style); + " if (aaaaaaaaaaaaaaaaaaaaaaaa) return;\n" + "}, a);", + Style); } TEST_F(FormatTest, IndividualStatementsOfNestedBlocks) { @@ -3025,6 +3201,9 @@ TEST_F(FormatTest, LineBreakingInBinaryExpressions) { verifyFormat("if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ||\n" " bbbbbbbbbbbbbbbbbb) && // aaaaaaaaaaaaaaaa\n" " cccccc) {\n}"); + verifyFormat("b = a &&\n" + " // Comment\n" + " b.c && d;"); // If the LHS of a comparison is not a binary expression itself, the // additional linebreak confuses many people. @@ -3114,39 +3293,47 @@ TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { // everything until something with the same indent as the operator is found. // FIXME: Is this a good system? FormatStyle Style = getLLVMStyle(); - Style.BreakBeforeBinaryOperators = true; + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; verifyFormat( "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" - " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " > ccccccccccccccccccccccccccccccccccccccccc;", + " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " > ccccccccccccccccccccccccccccccccccccccccc;", Style); verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", Style); verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " == bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", Style); verifyFormat("if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" - " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", + " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb) {\n}", Style); verifyFormat("if () {\n" "} else if (aaaaa\n" " && bbbbb // break\n" - " > ccccc) {\n" + " > ccccc) {\n" "}", Style); + verifyFormat("return (a)\n" + " // comment\n" + " + b;", + Style); + verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " + cc;", + Style); // Forced by comments. verifyFormat( @@ -3167,6 +3354,48 @@ TEST_F(FormatTest, ExpressionIndentationBreakingBeforeOperators) { Style); } +TEST_F(FormatTest, NoOperandAlignment) { + FormatStyle Style = getLLVMStyle(); + Style.AlignOperands = false; + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; + verifyFormat( + "bool value = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " == aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " && aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " > ccccccccccccccccccccccccccccccccccccccccc;", + Style); + + verifyFormat("int aaaaaa = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " * bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " + cc;", + Style); + verifyFormat("int a = aa\n" + " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n" + " * cccccccccccccccccccccccccccccccccccc;", + Style); + + Style.AlignAfterOpenBracket = false; + verifyFormat("return (a > b\n" + " // comment1\n" + " // comment2\n" + " || c);", + Style); +} + +TEST_F(FormatTest, BreakingBeforeNonAssigmentOperators) { + FormatStyle Style = getLLVMStyle(); + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_NonAssignment; + verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " + bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", + Style); +} + TEST_F(FormatTest, ConstructorInitializers) { verifyFormat("Constructor() : Initializer(FitsOnTheLine) {}"); verifyFormat("Constructor() : Inttializer(FitsOnTheLine) {}", @@ -3409,6 +3638,10 @@ TEST_F(FormatTest, BreaksFunctionDeclarations) { " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " bbbb bbbb);"); + verifyFormat("void SomeLoooooooooooongFunction(\n" + " std::unique_ptr<aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa>\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " int bbbbbbbbbbbbb);"); // Treat overloaded operators like other functions. verifyFormat("SomeLoooooooooooooooooooooooooogType\n" @@ -3427,6 +3660,10 @@ TEST_F(FormatTest, BreaksFunctionDeclarations) { " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = 1);"); verifyFormat("aaaaaaaaaaaaaaaaaaaaaa\n" "aaaaaaaaaaaaaaaaaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaa = 1);"); + verifyGoogleFormat( + "typename aaaaaaaaaa<aaaaaa>::aaaaaaaaaaa\n" + "aaaaaaaaaa<aaaaaa>::aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " bool *aaaaaaaaaaaaaaaaaa, bool *aa) {}"); } TEST_F(FormatTest, TrailingReturnType) { @@ -3437,6 +3674,9 @@ TEST_F(FormatTest, TrailingReturnType) { verifyFormat("template <size_t Order, typename T>\n" "auto load_img(const std::string &filename)\n" " -> alias::tensor<Order, T, mem::tag::cpu> {}"); + verifyFormat("auto SomeFunction(A aaaaaaaaaaaaaaaaaaaaa) const\n" + " -> decltype(f(aaaaaaaaaaaaaaaaaaaaa)) {}"); + verifyFormat("auto doSomething(Aaaaaa *aaaaaa) -> decltype(aaaaaa->f()) {}"); // Not trailing return types. verifyFormat("void f() { auto a = b->c(); }"); @@ -3447,8 +3687,8 @@ TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { // they are not function-like. FormatStyle Style = getGoogleStyle(); Style.ColumnLimit = 47; - verifyFormat("void\n" - "someLongFunction(int someLongParameter) const {\n}", + verifyFormat("void someLongFunction(\n" + " int someLoooooooooooooongParameter) const {\n}", getLLVMStyleWithColumns(47)); verifyFormat("LoooooongReturnType\n" "someLoooooooongFunction() const {}", @@ -3513,6 +3753,7 @@ TEST_F(FormatTest, BreaksFunctionDeclarationsWithTrailingTokens) { " LOCKS_EXCLUDED(aaaaaaaaaaaaa) {}"); verifyGoogleFormat("void aaaaaaaaaaaaaa(aaaaaaaa aaa) override\n" " AAAAAAAAAAAAAAAAAAAAAAAA(aaaaaaaaaaaaaaa);"); + verifyFormat("SomeFunction([](int i) LOCKS_EXCLUDED(a) {});"); verifyFormat( "void aaaaaaaaaaaaaaaaaa()\n" @@ -3607,9 +3848,25 @@ TEST_F(FormatTest, BreaksDesireably) { " NSTrackingActiveAlways;"); } +TEST_F(FormatTest, FormatsDeclarationsOnePerLine) { + FormatStyle NoBinPacking = getGoogleStyle(); + NoBinPacking.BinPackParameters = false; + NoBinPacking.BinPackArguments = true; + verifyFormat("void f() {\n" + " f(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);\n" + "}", + NoBinPacking); + verifyFormat("void f(int aaaaaaaaaaaaaaaaaaaa,\n" + " int aaaaaaaaaaaaaaaaaaaa,\n" + " int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", + NoBinPacking); +} + TEST_F(FormatTest, FormatsOneParameterPerLineIfNecessary) { FormatStyle NoBinPacking = getGoogleStyle(); NoBinPacking.BinPackParameters = false; + NoBinPacking.BinPackArguments = false; verifyFormat("f(aaaaaaaaaaaaaaaaaaaa,\n" " aaaaaaaaaaaaaaaaaaaa,\n" " aaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaa);", @@ -3866,6 +4123,66 @@ TEST_F(FormatTest, AlignsAfterReturn) { " code == a || code == b;"); } +TEST_F(FormatTest, AlignsAfterOpenBracket) { + verifyFormat( + "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" + " aaaaaaaaa aaaaaaa) {}"); + verifyFormat( + "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" + " aaaaaaaaaaa aaaaaaaaa);"); + verifyFormat( + "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaa));"); + FormatStyle Style = getLLVMStyle(); + Style.AlignAfterOpenBracket = false; + verifyFormat( + "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " aaaaaaaaaaa aaaaaaaa, aaaaaaaaa aaaaaaa) {}", + Style); + verifyFormat( + "SomeLongVariableName->someVeryLongFunctionName(\n" + " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaa aaaaaaaaa);", + Style); + verifyFormat( + "SomeLongVariableName->someFunction(\n" + " foooooooo(aaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaa));", + Style); + verifyFormat( + "void aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaa aaaaaaaa,\n" + " aaaaaaaaa aaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {}", + Style); + verifyFormat( + "SomeLongVariableName->someVeryLongFunctionName(aaaaaaaaaaa aaaaaaaaa,\n" + " aaaaaaaaaaa aaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);", + Style); + verifyFormat( + "SomeLongVariableName->someFunction(foooooooo(aaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));", + Style); +} + +TEST_F(FormatTest, ParenthesesAndOperandAlignment) { + FormatStyle Style = getLLVMStyleWithColumns(40); + verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" + " bbbbbbbbbbbbbbbbbbbbbb);", + Style); + Style.AlignAfterOpenBracket = true; + Style.AlignOperands = false; + verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" + " bbbbbbbbbbbbbbbbbbbbbb);", + Style); + Style.AlignAfterOpenBracket = false; + Style.AlignOperands = true; + verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" + " bbbbbbbbbbbbbbbbbbbbbb);", + Style); + Style.AlignAfterOpenBracket = false; + Style.AlignOperands = false; + verifyFormat("int a = f(aaaaaaaaaaaaaaaaaaaaaa &&\n" + " bbbbbbbbbbbbbbbbbbbbbb);", + Style); +} + TEST_F(FormatTest, BreaksConditionalExpressions) { verifyFormat( "aaaa(aaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaaaaaaaa\n" @@ -3918,6 +4235,10 @@ TEST_F(FormatTest, BreaksConditionalExpressions) { " aaaaaaaaa\n" " ? b\n" " : c);"); + verifyFormat("return aaaa == bbbb\n" + " // comment\n" + " ? aaaa\n" + " : bbbb;"); verifyFormat( "unsigned Indent =\n" " format(TheLine.First, IndentForLevel[TheLine.Level] >= 0\n" @@ -3948,7 +4269,7 @@ TEST_F(FormatTest, BreaksConditionalExpressions) { " : aaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); FormatStyle NoBinPacking = getLLVMStyle(); - NoBinPacking.BinPackParameters = false; + NoBinPacking.BinPackArguments = false; verifyFormat( "void f() {\n" " g(aaa,\n" @@ -3966,6 +4287,32 @@ TEST_F(FormatTest, BreaksConditionalExpressions) { " ?: aaaaaaaaaaaaaaa);\n" "}", NoBinPacking); + + verifyFormat("SomeFunction(aaaaaaaaaaaaaaaaa,\n" + " // comment.\n" + " ccccccccccccccccccccccccccccccccccccccc\n" + " ? aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" + " : bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);"); + + // Assignments in conditional expressions. Apparently not uncommon :-(. + verifyFormat("return a != b\n" + " // comment\n" + " ? a = b\n" + " : a = b;"); + verifyFormat("return a != b\n" + " // comment\n" + " ? a = a != b\n" + " // comment\n" + " ? a = b\n" + " : a\n" + " : a;\n"); + verifyFormat("return a != b\n" + " // comment\n" + " ? a\n" + " : a = a != b\n" + " // comment\n" + " ? a = b\n" + " : a;"); } TEST_F(FormatTest, BreaksConditionalExpressionsAfterOperator) { @@ -4079,13 +4426,13 @@ TEST_F(FormatTest, DeclarationsOfMultipleVariables) { // line. Also fix indent for breaking after the type, this looks bad. verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa = aaaaaaaaaaaaaaaaaaa,\n" - " *b = bbbbbbbbbbbbbbbbbbb;", + " * b = bbbbbbbbbbbbbbbbbbb;", getGoogleStyle()); // Not ideal, but pointer-with-type does not allow much here. verifyGoogleFormat( - "aaaaaaaaa* a = aaaaaaaaaaaaaaaaaaa, *b = bbbbbbbbbbbbbbbbbbb,\n" - " *b = bbbbbbbbbbbbbbbbbbb, *d = ddddddddddddddddddd;"); + "aaaaaaaaa* a = aaaaaaaaaaaaaaaaaaa, * b = bbbbbbbbbbbbbbbbbbb,\n" + " * b = bbbbbbbbbbbbbbbbbbb, * d = ddddddddddddddddddd;"); } TEST_F(FormatTest, ConditionalExpressionsInBrackets) { @@ -4145,6 +4492,40 @@ TEST_F(FormatTest, AlignsStringLiterals) { getLLVMStyleWithColumns(25)); } +TEST_F(FormatTest, AlwaysBreakAfterDefinitionReturnType) { + FormatStyle AfterType = getLLVMStyle(); + AfterType.AlwaysBreakAfterDefinitionReturnType = true; + verifyFormat("const char *\n" + "f(void) {\n" // Break here. + " return \"\";\n" + "}\n" + "const char *bar(void);\n", // No break here. + AfterType); + verifyFormat("template <class T>\n" + "T *\n" + "f(T &c) {\n" // Break here. + " return NULL;\n" + "}\n" + "template <class T> T *f(T &c);\n", // No break here. + AfterType); + AfterType.BreakBeforeBraces = FormatStyle::BS_Stroustrup; + verifyFormat("const char *\n" + "f(void)\n" // Break here. + "{\n" + " return \"\";\n" + "}\n" + "const char *bar(void);\n", // No break here. + AfterType); + verifyFormat("template <class T>\n" + "T *\n" // Problem here: no line break + "f(T &c)\n" // Break here. + "{\n" + " return NULL;\n" + "}\n" + "template <class T> T *f(T &c);\n", // No break here. + AfterType); +} + TEST_F(FormatTest, AlwaysBreakBeforeMultilineStrings) { FormatStyle NoBreak = getLLVMStyle(); NoBreak.AlwaysBreakBeforeMultilineStrings = false; @@ -4308,6 +4689,10 @@ TEST_F(FormatTest, AlignsPipes) { " CHECK_EQ(aaaa, (*bbbbbbbbb)->cccccc)\n" " << \"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\";\n" "}"); + + // Handle 'endl'. + verifyFormat("llvm::errs() << aaaa << endl\n" + " << bbbb << endl;"); } TEST_F(FormatTest, UnderstandsEquals) { @@ -4353,6 +4738,11 @@ TEST_F(FormatTest, WrapsAtFunctionCallsIfNecessary) { verifyFormat("EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" " .WillRepeatedly(Return(SomeValue));"); + verifyFormat("void f() {\n" + " EXPECT_CALL(SomeObject, SomeFunction(Parameter))\n" + " .Times(2)\n" + " .WillRepeatedly(Return(SomeValue));\n" + "}"); verifyFormat("SomeMap[std::pair(aaaaaaaaaaaa, bbbbbbbbbbbbbbb)].insert(\n" " ccccccccccccccccccccccc);"); verifyFormat("aaaaa(aaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" @@ -4480,6 +4870,8 @@ TEST_F(FormatTest, WrapsTemplateDeclarations) { " B>*>(\n" "\n" " );")); + verifyFormat("int aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" + " const typename aaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaa);"); FormatStyle AlwaysBreak = getLLVMStyle(); AlwaysBreak.AlwaysBreakTemplateDeclarations = true; @@ -4559,11 +4951,14 @@ TEST_F(FormatTest, UnderstandsTemplateParameters) { EXPECT_EQ("A<::A<int>> a;", format("A< ::A<int>> a;", getGoogleStyle())); EXPECT_EQ("A<::A<int>> a;", format("A<::A<int> > a;", getGoogleStyle())); + verifyFormat("A<A>> a;", getChromiumStyle(FormatStyle::LK_Cpp)); + verifyFormat("test >> a >> b;"); verifyFormat("test << a >> b;"); verifyFormat("f<int>();"); verifyFormat("template <typename T> void f() {}"); + verifyFormat("struct A<std::enable_if<sizeof(T2) < sizeof(int32)>::type>;"); // Not template parameters. verifyFormat("return a < b && c > d;"); @@ -4577,6 +4972,8 @@ TEST_F(FormatTest, UnderstandsTemplateParameters) { verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa >> aaaaa);", getLLVMStyleWithColumns(60)); + verifyFormat("static_assert(is_convertible<A &&, B>::value, \"AAA\");"); + verifyFormat("Constructor(A... a) : a_(X<A>{std::forward<A>(a)}...) {}"); } TEST_F(FormatTest, UnderstandsBinaryOperators) { @@ -4687,6 +5084,7 @@ TEST_F(FormatTest, UnderstandsOverloadedOperators) { " return left.group < right.group;\n" "}"); verifyFormat("SomeType &operator=(const SomeType &S);"); + verifyFormat("f.template operator()<int>();"); verifyGoogleFormat("operator void*();"); verifyGoogleFormat("operator SomeType<SomeType<int>>();"); @@ -4712,6 +5110,12 @@ TEST_F(FormatTest, UnderstandsNewAndDelete) { " delete a;\n" " delete (A *)a;\n" "}"); + verifyFormat("new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" + " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); + verifyFormat("auto aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" + " new (aaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa))\n" + " typename aaaaaaaaaaaaaaaaaaaaaaaa();"); + verifyFormat("delete[] h->p;"); } TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { @@ -4765,6 +5169,10 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyIndependentOfContext("typedef void (*f)(int *a);"); verifyIndependentOfContext("int i{a * b};"); verifyIndependentOfContext("aaa && aaa->f();"); + verifyIndependentOfContext("int x = ~*p;"); + verifyFormat("Constructor() : a(a), area(width * height) {}"); + verifyFormat("Constructor() : a(a), area(a, width * height) {}"); + verifyFormat("void f() { f(a, c * d); }"); verifyIndependentOfContext("InvalidRegions[*R] = 0;"); @@ -4784,6 +5192,7 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaa, *aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); + verifyGoogleFormat("**outparam = 1;"); verifyGoogleFormat("int main(int argc, char** argv) {}"); verifyGoogleFormat("A<int*> a;"); verifyGoogleFormat("A<int**> a;"); @@ -4798,6 +5207,14 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyGoogleFormat("Type* t = x++ * y;"); verifyGoogleFormat( "const char* const p = reinterpret_cast<const char* const>(q);"); + verifyGoogleFormat("void f(int i = 0, SomeType** temps = NULL);"); + verifyGoogleFormat("void f(Bar* a = nullptr, Bar* b);"); + verifyGoogleFormat("template <typename T>\n" + "void f(int i = 0, SomeType** temps = NULL);"); + + FormatStyle Left = getLLVMStyle(); + Left.PointerAlignment = FormatStyle::PAS_Left; + verifyFormat("x = *a(x) = *a(y);", Left); verifyIndependentOfContext("a = *(x + y);"); verifyIndependentOfContext("a = &(x + y);"); @@ -4858,6 +5275,19 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { verifyFormat("vector<a * b> v;"); verifyFormat("foo<b && false>();"); verifyFormat("foo<b & 1>();"); + verifyFormat("decltype(*::std::declval<const T &>()) void F();"); + verifyFormat( + "template <class T, class = typename std::enable_if<\n" + " std::is_integral<T>::value &&\n" + " (sizeof(T) > 1 || sizeof(T) < 8)>::type>\n" + "void F();", + getLLVMStyleWithColumns(76)); + verifyFormat( + "template <class T,\n" + " class = typename ::std::enable_if<\n" + " ::std::is_array<T>{} && ::std::is_array<T>{}>::type>\n" + "void F();", + getGoogleStyleWithColumns(68)); verifyIndependentOfContext("MACRO(int *i);"); verifyIndependentOfContext("MACRO(auto *a);"); @@ -4880,7 +5310,7 @@ TEST_F(FormatTest, UnderstandsUsesOfStarAndAmp) { // FIXME: We cannot handle this case yet; we might be able to figure out that // foo<x> d > v; doesn't make sense. - verifyFormat("foo<a < b && c> d > v;"); + verifyFormat("foo<a<b && c> d> v;"); FormatStyle PointerMiddle = getLLVMStyle(); PointerMiddle.PointerAlignment = FormatStyle::PAS_Middle; @@ -4987,6 +5417,7 @@ TEST_F(FormatTest, FormatsCasts) { verifyFormat("my_int a = (my_int)sizeof(int);"); verifyFormat("return (my_int)aaa;"); verifyFormat("#define x ((int)-1)"); + verifyFormat("#define LENGTH(x, y) (x) - (y) + 1"); verifyFormat("#define p(q) ((int *)&q)"); verifyFormat("fn(a)(b) + 1;"); @@ -4994,11 +5425,12 @@ TEST_F(FormatTest, FormatsCasts) { verifyFormat("void f() { return P ? (my_int)*P : (my_int)0; }"); verifyFormat("my_int a = (my_int)~0;"); verifyFormat("my_int a = (my_int)++a;"); - verifyFormat("my_int a = (my_int)+2;"); + verifyFormat("my_int a = (my_int)-2;"); verifyFormat("my_int a = (my_int)1;"); verifyFormat("my_int a = (my_int *)1;"); verifyFormat("my_int a = (const my_int)-1;"); verifyFormat("my_int a = (const my_int *)-1;"); + verifyFormat("my_int a = (my_int)(my_int)-1;"); // FIXME: single value wrapped with paren will be treated as cast. verifyFormat("void f(int i = (kValue)*kMask) {}"); @@ -5095,6 +5527,8 @@ TEST_F(FormatTest, BreaksLongDeclarations) { "LoooooooooooooooooooooooooooooooongFunctionDeclaration();"); verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType\n" "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); + verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType MACRO\n" + "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); verifyFormat("LoooooooooooooooooooooooooooooooooooooooongReturnType const\n" "LooooooooooooooooooooooooooooooooooongFunctionDefinition() {}"); verifyFormat("decltype(LoooooooooooooooooooooooooooooooooooooooongName)\n" @@ -5156,6 +5590,10 @@ TEST_F(FormatTest, BreaksLongDeclarations) { "aaaaaaaaaaaaaaaaaaaaaaaa<T>::aaaaaaa() {}"); verifyGoogleFormat("A<A<A>> aaaaaaaaaa(int aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " int aaaaaaaaaaaaaaaaaaaaaaa);"); + + verifyFormat("typedef size_t (*aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)(\n" + " const aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa *\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); } TEST_F(FormatTest, FormatsArrays) { @@ -5210,6 +5648,8 @@ TEST_F(FormatTest, HandlesIncludeDirectives) { "#include <strstream>\n" "#endif"); + verifyFormat("#define MY_IMPORT <a/b>"); + // Protocol buffer definition or missing "#". verifyFormat("import \"aaaaaaaaaaaaaaaaa/aaaaaaaaaaaaaaa\";", getLLVMStyleWithColumns(30)); @@ -5218,6 +5658,10 @@ TEST_F(FormatTest, HandlesIncludeDirectives) { Style.AlwaysBreakBeforeMultilineStrings = true; Style.ColumnLimit = 0; verifyFormat("#import \"abc.h\"", Style); + + // But 'import' might also be a regular C++ namespace. + verifyFormat("import::SomeFunction(aaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaaaaaaaaaaaa);"); } //===----------------------------------------------------------------------===// @@ -5385,6 +5829,9 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) { verifyFormat("int foo(int i) { return fo1{}(i); }"); verifyFormat("int foo(int i) { return fo1{}(i); }"); verifyFormat("auto i = decltype(x){};"); + verifyFormat("std::vector<int> v = {1, 0 /* comment */};"); + verifyFormat("Node n{1, Node{1000}, //\n" + " 2};"); // In combination with BinPackParameters = false. FormatStyle NoBinPacking = getLLVMStyle(); @@ -5415,13 +5862,20 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) { " kkkkkk,\n" "};", NoBinPacking); + verifyFormat( + "const Aaaaaa aaaaa = {\n" + " aaaaa, bbbbb, ccccc, ddddd, eeeee, ffffff, ggggg, hhhhhh,\n" + " iiiiii, jjjjjj, kkkkkk, aaaaa, bbbbb, ccccc, ddddd, eeeee,\n" + " ffffff, ggggg, hhhhhh, iiiiii, jjjjjj, kkkkkk,\n" + "};", + NoBinPacking); // FIXME: The alignment of these trailing comments might be bad. Then again, // this might be utterly useless in real code. verifyFormat("Constructor::Constructor()\n" - " : some_value{ //\n" - " aaaaaaa //\n" - " } {}"); + " : some_value{ //\n" + " aaaaaaa, //\n" + " bbbbbbb} {}"); // In braced lists, the first comment is always assumed to belong to the // first element. Thus, it can be moved to the next or previous line as @@ -5445,6 +5899,13 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) { " // Second element:\n" " 2};", getLLVMStyleWithColumns(30))); + // A trailing comma should still lead to an enforced line break. + EXPECT_EQ("vector<int> SomeVector = {\n" + " // aaa\n" + " 1, 2,\n" + "};", + format("vector<int> SomeVector = { // aaa\n" + " 1, 2, };")); FormatStyle ExtraSpaces = getLLVMStyle(); ExtraSpaces.Cpp11BracedListStyle = false; @@ -5473,32 +5934,24 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) { " bbbbbbbbbbbbbbbbbbbb, bbbbb };", ExtraSpaces); verifyFormat("DoSomethingWithVector({} /* No data */);", ExtraSpaces); - verifyFormat("DoSomethingWithVector({\n" - " {} /* No data */\n" - " },\n" - " { { 1, 2 } });", + verifyFormat("DoSomethingWithVector({ {} /* No data */ }, { { 1, 2 } });", ExtraSpaces); verifyFormat( "someFunction(OtherParam,\n" " BracedList{ // comment 1 (Forcing interesting break)\n" " param1, param2,\n" " // comment 2\n" - " param3, param4\n" - " });", + " param3, param4 });", ExtraSpaces); verifyFormat( "std::this_thread::sleep_for(\n" " std::chrono::nanoseconds{ std::chrono::seconds{ 1 } } / 5);", ExtraSpaces); - verifyFormat("std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n" - " aaaaaaa, aaaaaaaaaa,\n" - " aaaaa, aaaaaaaaaaaaaaa,\n" - " aaa, aaaaaaaaaa,\n" - " a, aaaaaaaaaaaaaaaaaaaaa,\n" - " aaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa,\n" - " aaaaaaa, a\n" - "};", - ExtraSpaces); + verifyFormat( + "std::vector<MyValues> aaaaaaaaaaaaaaaaaaa{\n" + " aaaaaaa, aaaaaaaaaa, aaaaa, aaaaaaaaaaaaaaa, aaa, aaaaaaaaaa, a,\n" + " aaaaaaaaaaaaaaaaaaaaa, aaaaaaaaaaaa,\n" + " aaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaa, aaaaaaa, a};"); verifyFormat("vector<int> foo = { ::SomeGlobalFunction() };", ExtraSpaces); } @@ -5546,10 +5999,9 @@ TEST_F(FormatTest, FormatsBracedListsInColumnLayout) { " 1, 1, 1, 1, 1, 1, 1, 1, //\n" "};", getLLVMStyleWithColumns(39)); - verifyFormat("vector<int> x = {\n" - " 1, 1, 1, 1, 1, 1, 1, 1,\n" - " /**/ /**/\n" - "};", + verifyFormat("vector<int> x = {1, 1, 1, 1,\n" + " 1, 1, 1, 1,\n" + " /**/ /**/};", getLLVMStyleWithColumns(39)); verifyFormat("return {{aaaaaaaaaaaaaaaaaaaaa},\n" " {aaaaaaaaaaaaaaaaaaa},\n" @@ -6112,7 +6564,7 @@ TEST_F(FormatTest, FormatObjCInterface) { "+ (id)init;\n" "@end"); - verifyGoogleFormat("@interface Foo (HackStuff)<MyProtocol>\n" + verifyGoogleFormat("@interface Foo (HackStuff) <MyProtocol>\n" "+ (id)init;\n" "@end"); @@ -6154,7 +6606,7 @@ TEST_F(FormatTest, FormatObjCInterface) { FormatStyle OnePerLine = getGoogleStyle(); OnePerLine.BinPackParameters = false; - verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ()<\n" + verifyFormat("@interface aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa () <\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" @@ -6291,11 +6743,16 @@ TEST_F(FormatTest, FormatObjCMethodDeclarations) { " evenLongerKeyword:(float)theInterval\n" " error:(NSError **)theError {\n" "}"); + verifyFormat("- (instancetype)initXxxxxx:(id<x>)x\n" + " y:(id<yyyyyyyyyyyyyyyyyyyy>)y\n" + " NS_DESIGNATED_INITIALIZER;", + getLLVMStyleWithColumns(60)); } TEST_F(FormatTest, FormatObjCMethodExpr) { verifyFormat("[foo bar:baz];"); verifyFormat("return [foo bar:baz];"); + verifyFormat("return (a)[foo bar:baz];"); verifyFormat("f([foo bar:baz]);"); verifyFormat("f(2, [foo bar:baz]);"); verifyFormat("f(2, a ? b : c);"); @@ -6353,8 +6810,10 @@ TEST_F(FormatTest, FormatObjCMethodExpr) { // Whew! verifyFormat("return in[42];"); + verifyFormat("for (auto v : in[1]) {\n}"); verifyFormat("for (id foo in [self getStuffFor:bla]) {\n" "}"); + verifyFormat("[self aaaaa:MACRO(a, b:, c:)];"); verifyFormat("[self stuffWithInt:(4 + 2) float:4.5];"); verifyFormat("[self stuffWithInt:a ? b : c float:4.5];"); @@ -6408,17 +6867,16 @@ TEST_F(FormatTest, FormatObjCMethodExpr) { " der:NO]);\n" "}", getLLVMStyleWithColumns(70)); - verifyFormat("{\n" - " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n" - " initWithContentRect:NSMakeRect(origin_global.x,\n" - " origin_global.y,\n" - " pos.width(),\n" - " pos.height())\n" - " styleMask:NSBorderlessWindowMask\n" - " backing:NSBackingStoreBuffered\n" - " defer:NO]);\n" - "}", - getChromiumStyle(FormatStyle::LK_Cpp)); + verifyFormat( + "void f() {\n" + " popup_window_.reset([[RenderWidgetPopupWindow alloc]\n" + " initWithContentRect:NSMakeRect(origin_global.x, origin_global.y,\n" + " pos.width(), pos.height())\n" + " styleMask:NSBorderlessWindowMask\n" + " backing:NSBackingStoreBuffered\n" + " defer:NO]);\n" + "}", + getChromiumStyle(FormatStyle::LK_Cpp)); verifyFormat("[contentsContainer replaceSubview:[subviews objectAtIndex:0]\n" " with:contentsNativeView];"); @@ -6957,22 +7415,14 @@ TEST_F(FormatTest, BreaksWideAndNSStringLiterals) { format("@\"NSString literal\";", getGoogleStyleWithColumns(19))); } -TEST_F(FormatTest, BreaksRawStringLiterals) { - EXPECT_EQ("R\"x(raw )x\"\n" - "R\"x(literal)x\";", - format("R\"x(raw literal)x\";", getGoogleStyleWithColumns(15))); - EXPECT_EQ("uR\"x(raw )x\"\n" - "uR\"x(literal)x\";", - format("uR\"x(raw literal)x\";", getGoogleStyleWithColumns(16))); - EXPECT_EQ("u8R\"x(raw )x\"\n" - "u8R\"x(literal)x\";", - format("u8R\"x(raw literal)x\";", getGoogleStyleWithColumns(17))); - EXPECT_EQ("LR\"x(raw )x\"\n" - "LR\"x(literal)x\";", - format("LR\"x(raw literal)x\";", getGoogleStyleWithColumns(16))); - EXPECT_EQ("UR\"x(raw )x\"\n" - "UR\"x(literal)x\";", - format("UR\"x(raw literal)x\";", getGoogleStyleWithColumns(16))); +TEST_F(FormatTest, DoesNotBreakRawStringLiterals) { + FormatStyle Style = getGoogleStyleWithColumns(15); + EXPECT_EQ("R\"x(raw literal)x\";", format("R\"x(raw literal)x\";", Style)); + EXPECT_EQ("uR\"x(raw literal)x\";", format("uR\"x(raw literal)x\";", Style)); + EXPECT_EQ("LR\"x(raw literal)x\";", format("LR\"x(raw literal)x\";", Style)); + EXPECT_EQ("UR\"x(raw literal)x\";", format("UR\"x(raw literal)x\";", Style)); + EXPECT_EQ("u8R\"x(raw literal)x\";", + format("u8R\"x(raw literal)x\";", Style)); } TEST_F(FormatTest, BreaksStringLiteralsWithin_TMacro) { @@ -7161,11 +7611,6 @@ TEST_F(FormatTest, DoNotBreakStringLiteralsInEscapeSequence) { "\"00000000\"\n" "\"1\"", format("\"test\\000000000001\"", getLLVMStyleWithColumns(10))); - // FIXME: We probably don't need to care about escape sequences in raw - // literals. - EXPECT_EQ("R\"(\\x)\"\n" - "R\"(\\x00)\"\n", - format("R\"(\\x\\x00)\"\n", getGoogleStyleWithColumns(7))); } TEST_F(FormatTest, DoNotCreateUnreasonableUnwrappedLines) { @@ -7213,7 +7658,7 @@ TEST_F(FormatTest, ConfigurableIndentWidth) { } TEST_F(FormatTest, ConfigurableFunctionDeclarationIndentAfterType) { - verifyFormat("void\n" + verifyFormat("double\n" "f();", getLLVMStyleWithColumns(8)); } @@ -7353,11 +7798,10 @@ TEST_F(FormatTest, ConfigurableUseOfTab) { Tab); verifyFormat("{\n" "\tQ({\n" - "\t\t int a;\n" - "\t\t someFunction(aaaaaaaaaa,\n" - "\t\t bbbbbbbbb);\n" - "\t },\n" - "\t p);\n" + "\t\tint a;\n" + "\t\tsomeFunction(aaaaaaaa,\n" + "\t\t bbbbbbb);\n" + "\t}, p);\n" "}", Tab); EXPECT_EQ("{\n" @@ -7521,6 +7965,14 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { "default:\n" " break;\n" "}", NoSpace); + verifyFormat("auto i = std::make_unique<int>(5);", NoSpace); + verifyFormat("size_t x = sizeof(x);", NoSpace); + verifyFormat("auto f(int x) -> decltype(x);", NoSpace); + verifyFormat("int f(T x) noexcept(x.create());", NoSpace); + verifyFormat("alignas(128) char a[128];", NoSpace); + verifyFormat("size_t x = alignof(MyType);", NoSpace); + verifyFormat("static_assert(sizeof(char) == 1, \"Impossible!\");", NoSpace); + verifyFormat("int f() throw(Deprecated);", NoSpace); FormatStyle Space = getLLVMStyle(); Space.SpaceBeforeParens = FormatStyle::SBPO_Always; @@ -7557,6 +8009,14 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeParens) { verifyFormat("#if defined(x)\n" "#endif", Space); + verifyFormat("auto i = std::make_unique<int> (5);", Space); + verifyFormat("size_t x = sizeof (x);", Space); + verifyFormat("auto f (int x) -> decltype (x);", Space); + verifyFormat("int f (T x) noexcept (x.create ());", Space); + verifyFormat("alignas (128) char a[128];", Space); + verifyFormat("size_t x = alignof (MyType);", Space); + verifyFormat("static_assert (sizeof (char) == 1, \"Impossible!\");", Space); + verifyFormat("int f () throw (Deprecated);", Space); } TEST_F(FormatTest, ConfigurableSpacesInParentheses) { @@ -7618,6 +8078,60 @@ TEST_F(FormatTest, ConfigurableSpacesInParentheses) { "default:\n" " break;\n" "}", Spaces); + + Spaces.SpaceAfterCStyleCast = true; + verifyFormat("call(x, y, z);", Spaces); + verifyFormat("while (( bool ) 1)\n" + " continue;", + Spaces); + verifyFormat("for (;;)\n" + " continue;", + Spaces); + verifyFormat("if (true)\n" + " f( );\n" + "else if (true)\n" + " f( );", + Spaces); + verifyFormat("do {\n" + " do_something(( int ) i);\n" + "} while (something( ));", + Spaces); + verifyFormat("switch (x) {\n" + "default:\n" + " break;\n" + "}", + Spaces); + Spaces.SpacesInCStyleCastParentheses = false; + Spaces.SpaceAfterCStyleCast = true; + verifyFormat("while ((bool) 1)\n" + " continue;", + Spaces); + verifyFormat("do {\n" + " do_something((int) i);\n" + "} while (something( ));", + Spaces); +} + +TEST_F(FormatTest, ConfigurableSpacesInSquareBrackets) { + verifyFormat("int a[5];"); + verifyFormat("a[3] += 42;"); + + FormatStyle Spaces = getLLVMStyle(); + Spaces.SpacesInSquareBrackets = true; + // Lambdas unchanged. + verifyFormat("int c = []() -> int { return 2; }();\n", Spaces); + verifyFormat("return [i, args...] {};", Spaces); + + // Not lambdas. + verifyFormat("int a[ 5 ];", Spaces); + verifyFormat("a[ 3 ] += 42;", Spaces); + verifyFormat("constexpr char hello[]{\"hello\"};", Spaces); + verifyFormat("double &operator[](int i) { return 0; }\n" + "int i;", + Spaces); + verifyFormat("std::unique_ptr<int[]> foo() {}", Spaces); + verifyFormat("int i = a[ a ][ a ]->f();", Spaces); + verifyFormat("int i = (*b)[ a ]->f();", Spaces); } TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { @@ -7633,8 +8147,8 @@ TEST_F(FormatTest, ConfigurableSpaceBeforeAssignmentOperators) { } TEST_F(FormatTest, LinuxBraceBreaking) { - FormatStyle BreakBeforeBrace = getLLVMStyle(); - BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Linux; + FormatStyle LinuxBraceStyle = getLLVMStyle(); + LinuxBraceStyle.BreakBeforeBraces = FormatStyle::BS_Linux; verifyFormat("namespace a\n" "{\n" "class A\n" @@ -7647,14 +8161,33 @@ TEST_F(FormatTest, LinuxBraceBreaking) { " }\n" " }\n" " void g() { return; }\n" - "}\n" - "}", - BreakBeforeBrace); + "};\n" + "struct B {\n" + " int x;\n" + "};\n" + "}\n", + LinuxBraceStyle); + verifyFormat("enum X {\n" + " Y = 0,\n" + "}\n", + LinuxBraceStyle); + verifyFormat("struct S {\n" + " int Type;\n" + " union {\n" + " int x;\n" + " double y;\n" + " } Value;\n" + " class C\n" + " {\n" + " MyFavoriteType Value;\n" + " } Class;\n" + "}\n", + LinuxBraceStyle); } TEST_F(FormatTest, StroustrupBraceBreaking) { - FormatStyle BreakBeforeBrace = getLLVMStyle(); - BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Stroustrup; + FormatStyle StroustrupBraceStyle = getLLVMStyle(); + StroustrupBraceStyle.BreakBeforeBraces = FormatStyle::BS_Stroustrup; verifyFormat("namespace a {\n" "class A {\n" " void f()\n" @@ -7665,9 +8198,23 @@ TEST_F(FormatTest, StroustrupBraceBreaking) { " }\n" " }\n" " void g() { return; }\n" - "}\n" - "}", - BreakBeforeBrace); + "};\n" + "struct B {\n" + " int x;\n" + "};\n" + "}\n", + StroustrupBraceStyle); + + verifyFormat("void foo()\n" + "{\n" + " if (a) {\n" + " a();\n" + " }\n" + " else {\n" + " b();\n" + " }\n" + "}\n", + StroustrupBraceStyle); verifyFormat("#ifdef _DEBUG\n" "int foo(int i = 0)\n" @@ -7677,7 +8224,7 @@ TEST_F(FormatTest, StroustrupBraceBreaking) { "{\n" " return i;\n" "}", - BreakBeforeBrace); + StroustrupBraceStyle); verifyFormat("void foo() {}\n" "void bar()\n" @@ -7689,7 +8236,7 @@ TEST_F(FormatTest, StroustrupBraceBreaking) { "{\n" "}\n" "#endif", - BreakBeforeBrace); + StroustrupBraceStyle); verifyFormat("void foobar() { int i = 5; }\n" "#ifdef _DEBUG\n" @@ -7697,12 +8244,12 @@ TEST_F(FormatTest, StroustrupBraceBreaking) { "#else\n" "void bar() { foobar(); }\n" "#endif", - BreakBeforeBrace); + StroustrupBraceStyle); } TEST_F(FormatTest, AllmanBraceBreaking) { - FormatStyle BreakBeforeBrace = getLLVMStyle(); - BreakBeforeBrace.BreakBeforeBraces = FormatStyle::BS_Allman; + FormatStyle AllmanBraceStyle = getLLVMStyle(); + AllmanBraceStyle.BreakBeforeBraces = FormatStyle::BS_Allman; verifyFormat("namespace a\n" "{\n" "class A\n" @@ -7716,9 +8263,13 @@ TEST_F(FormatTest, AllmanBraceBreaking) { " }\n" " }\n" " void g() { return; }\n" - "}\n" + "};\n" + "struct B\n" + "{\n" + " int x;\n" + "};\n" "}", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("void f()\n" "{\n" @@ -7735,7 +8286,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) { " c();\n" " }\n" "}\n", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("void f()\n" "{\n" @@ -7752,7 +8303,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) { " c();\n" " } while (false)\n" "}\n", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("void f(int a)\n" "{\n" @@ -7772,18 +8323,18 @@ TEST_F(FormatTest, AllmanBraceBreaking) { " break;\n" " }\n" "}\n", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("enum X\n" "{\n" " Y = 0,\n" "}\n", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("enum X\n" "{\n" " Y = 0\n" "}\n", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("@interface BSApplicationController ()\n" "{\n" @@ -7791,7 +8342,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) { " id _extraIvar;\n" "}\n" "@end\n", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("#ifdef _DEBUG\n" "int foo(int i = 0)\n" @@ -7801,7 +8352,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) { "{\n" " return i;\n" "}", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("void foo() {}\n" "void bar()\n" @@ -7813,7 +8364,7 @@ TEST_F(FormatTest, AllmanBraceBreaking) { "{\n" "}\n" "#endif", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("void foobar() { int i = 5; }\n" "#ifdef _DEBUG\n" @@ -7821,37 +8372,42 @@ TEST_F(FormatTest, AllmanBraceBreaking) { "#else\n" "void bar() { foobar(); }\n" "#endif", - BreakBeforeBrace); + AllmanBraceStyle); // This shouldn't affect ObjC blocks.. verifyFormat("[self doSomeThingWithACompletionHandler:^{\n" - " // ...\n" - " int i;\n" + " // ...\n" + " int i;\n" "}];", - BreakBeforeBrace); + AllmanBraceStyle); verifyFormat("void (^block)(void) = ^{\n" - " // ...\n" - " int i;\n" + " // ...\n" + " int i;\n" "};", - BreakBeforeBrace); + AllmanBraceStyle); // .. or dict literals. verifyFormat("void f()\n" "{\n" " [object someMethod:@{ @\"a\" : @\"b\" }];\n" "}", - BreakBeforeBrace); + AllmanBraceStyle); + verifyFormat("int f()\n" + "{ // comment\n" + " return 42;\n" + "}", + AllmanBraceStyle); - BreakBeforeBrace.ColumnLimit = 19; - verifyFormat("void f() { int i; }", BreakBeforeBrace); - BreakBeforeBrace.ColumnLimit = 18; + AllmanBraceStyle.ColumnLimit = 19; + verifyFormat("void f() { int i; }", AllmanBraceStyle); + AllmanBraceStyle.ColumnLimit = 18; verifyFormat("void f()\n" "{\n" " int i;\n" "}", - BreakBeforeBrace); - BreakBeforeBrace.ColumnLimit = 80; + AllmanBraceStyle); + AllmanBraceStyle.ColumnLimit = 80; - FormatStyle BreakBeforeBraceShortIfs = BreakBeforeBrace; + FormatStyle BreakBeforeBraceShortIfs = AllmanBraceStyle; BreakBeforeBraceShortIfs.AllowShortIfStatementsOnASingleLine = true; BreakBeforeBraceShortIfs.AllowShortLoopsOnASingleLine = true; verifyFormat("void f(bool b)\n" @@ -8108,34 +8664,41 @@ TEST_F(FormatTest, GetsCorrectBasedOnStyle) { EXPECT_ALL_STYLES_EQUAL(Styles); } +#define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME) \ + Style.FIELD = false; \ + EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value()); \ + EXPECT_TRUE(Style.FIELD); \ + EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value()); \ + EXPECT_FALSE(Style.FIELD); + +#define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD) + #define CHECK_PARSE(TEXT, FIELD, VALUE) \ EXPECT_NE(VALUE, Style.FIELD); \ EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value()); \ EXPECT_EQ(VALUE, Style.FIELD) -#define CHECK_PARSE_BOOL(FIELD) \ - Style.FIELD = false; \ - EXPECT_EQ(0, parseConfiguration(#FIELD ": true", &Style).value()); \ - EXPECT_TRUE(Style.FIELD); \ - EXPECT_EQ(0, parseConfiguration(#FIELD ": false", &Style).value()); \ - EXPECT_FALSE(Style.FIELD); - -TEST_F(FormatTest, ParsesConfiguration) { +TEST_F(FormatTest, ParsesConfigurationBools) { FormatStyle Style = {}; Style.Language = FormatStyle::LK_Cpp; + CHECK_PARSE_BOOL(AlignAfterOpenBracket); CHECK_PARSE_BOOL(AlignEscapedNewlinesLeft); + CHECK_PARSE_BOOL(AlignOperands); CHECK_PARSE_BOOL(AlignTrailingComments); CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine); CHECK_PARSE_BOOL(AllowShortBlocksOnASingleLine); + CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine); CHECK_PARSE_BOOL(AllowShortIfStatementsOnASingleLine); CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine); + CHECK_PARSE_BOOL(AlwaysBreakAfterDefinitionReturnType); CHECK_PARSE_BOOL(AlwaysBreakTemplateDeclarations); CHECK_PARSE_BOOL(BinPackParameters); - CHECK_PARSE_BOOL(BreakBeforeBinaryOperators); + CHECK_PARSE_BOOL(BinPackArguments); CHECK_PARSE_BOOL(BreakBeforeTernaryOperators); CHECK_PARSE_BOOL(BreakConstructorInitializersBeforeComma); CHECK_PARSE_BOOL(ConstructorInitializerAllOnOneLineOrOnePerLine); CHECK_PARSE_BOOL(DerivePointerAlignment); + CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding"); CHECK_PARSE_BOOL(IndentCaseLabels); CHECK_PARSE_BOOL(IndentWrappedFunctionNames); CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks); @@ -8143,15 +8706,24 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList); CHECK_PARSE_BOOL(Cpp11BracedListStyle); CHECK_PARSE_BOOL(SpacesInParentheses); + CHECK_PARSE_BOOL(SpacesInSquareBrackets); CHECK_PARSE_BOOL(SpacesInAngles); CHECK_PARSE_BOOL(SpaceInEmptyParentheses); CHECK_PARSE_BOOL(SpacesInContainerLiterals); CHECK_PARSE_BOOL(SpacesInCStyleCastParentheses); + CHECK_PARSE_BOOL(SpaceAfterCStyleCast); CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators); +} + +#undef CHECK_PARSE_BOOL +TEST_F(FormatTest, ParsesConfiguration) { + FormatStyle Style = {}; + Style.Language = FormatStyle::LK_Cpp; CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234); CHECK_PARSE("ConstructorInitializerIndentWidth: 1234", ConstructorInitializerIndentWidth, 1234u); + CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u); CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u); CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u); CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234", @@ -8165,9 +8737,19 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u); Style.PointerAlignment = FormatStyle::PAS_Middle; - CHECK_PARSE("PointerAlignment: Left", PointerAlignment, FormatStyle::PAS_Left); - CHECK_PARSE("PointerAlignment: Right", PointerAlignment, FormatStyle::PAS_Right); - CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, FormatStyle::PAS_Middle); + CHECK_PARSE("PointerAlignment: Left", PointerAlignment, + FormatStyle::PAS_Left); + CHECK_PARSE("PointerAlignment: Right", PointerAlignment, + FormatStyle::PAS_Right); + CHECK_PARSE("PointerAlignment: Middle", PointerAlignment, + FormatStyle::PAS_Middle); + // For backward compatibility: + CHECK_PARSE("PointerBindsToType: Left", PointerAlignment, + FormatStyle::PAS_Left); + CHECK_PARSE("PointerBindsToType: Right", PointerAlignment, + FormatStyle::PAS_Right); + CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment, + FormatStyle::PAS_Middle); Style.Standard = FormatStyle::LS_Auto; CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03); @@ -8176,24 +8758,41 @@ TEST_F(FormatTest, ParsesConfiguration) { CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11); CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto); + Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All; + CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment", + BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment); + CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators, + FormatStyle::BOS_None); + CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators, + FormatStyle::BOS_All); + // For backward compatibility: + CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators, + FormatStyle::BOS_None); + CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators, + FormatStyle::BOS_All); + Style.UseTab = FormatStyle::UT_ForIndentation; - CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); - CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never); CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation); CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always); + // For backward compatibility: + CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never); + CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always); Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline; - CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", - AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); - CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", - AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); CHECK_PARSE("AllowShortFunctionsOnASingleLine: None", AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline", AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline); + CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty", + AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty); CHECK_PARSE("AllowShortFunctionsOnASingleLine: All", AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); + // For backward compatibility: + CHECK_PARSE("AllowShortFunctionsOnASingleLine: false", + AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None); + CHECK_PARSE("AllowShortFunctionsOnASingleLine: true", + AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All); Style.SpaceBeforeParens = FormatStyle::SBPO_Always; CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens, @@ -8344,7 +8943,6 @@ TEST_F(FormatTest, ParsesConfigurationWithLanguages) { } #undef CHECK_PARSE -#undef CHECK_PARSE_BOOL TEST_F(FormatTest, UsesLanguageForBasedOnStyle) { FormatStyle Style = {}; @@ -8519,7 +9117,10 @@ TEST_F(FormatTest, ConstructorInitializerIndentWidth) { ": aaaaaaaaaaaaa(aaaaaaaaaaaaaa), aaaaaaaaaaaaa(aaaaaaaaaaaaaa),\n" " aaaaaaaaaaaaa(aaaaaaaaaaaaaa) {}", Style); +} +TEST_F(FormatTest, BreakConstructorInitializersBeforeComma) { + FormatStyle Style = getLLVMStyle(); Style.BreakConstructorInitializersBeforeComma = true; Style.ConstructorInitializerIndentWidth = 4; verifyFormat("SomeClass::Constructor()\n" @@ -8592,6 +9193,11 @@ TEST_F(FormatTest, ConstructorInitializerIndentWidth) { Style); } +TEST_F(FormatTest, Destructors) { + verifyFormat("void F(int &i) { i.~int(); }"); + verifyFormat("void F(int &i) { i->~int(); }"); +} + TEST_F(FormatTest, FormatsWithWebKitStyle) { FormatStyle Style = getWebKitStyle(); @@ -8644,7 +9250,7 @@ TEST_F(FormatTest, FormatsWithWebKitStyle) { verifyFormat("Constructor()\n" " : aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaa)\n" " , aaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaa, // break\n" - " aaaaaaaaaaaaaa)\n" + " aaaaaaaaaaaaaa)\n" " , aaaaaaaaaaaaaaaaaaaaaaa()\n" "{\n" "}", @@ -8685,6 +9291,11 @@ TEST_F(FormatTest, FormatsWithWebKitStyle) { "double b; // align comments.", Style); + // Do not align operands. + EXPECT_EQ("ASSERT(aaaa\n" + " || bbbb);", + format("ASSERT ( aaaa\n||bbbb);", Style)); + // Accept input's line breaks. EXPECT_EQ("if (aaaaaaaaaaaaaaa\n" " || bbbbbbbbbbbbbbb) {\n" @@ -8764,30 +9375,50 @@ TEST_F(FormatTest, FormatsLambdas) { verifyFormat("SomeFunction([]() { // A cool function...\n" " return 43;\n" "});"); + EXPECT_EQ("SomeFunction([]() {\n" + "#define A a\n" + " return 43;\n" + "});", + format("SomeFunction([](){\n" + "#define A a\n" + "return 43;\n" + "});")); verifyFormat("void f() {\n" " SomeFunction([](decltype(x), A *a) {});\n" "}"); verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" " [](const aaaaaaaaaa &a) { return a; });"); + verifyFormat("string abc = SomeFunction(aaaaaaaaaaaaa, aaaaa, []() {\n" + " SomeOtherFunctioooooooooooooooooooooooooon();\n" + "});"); + verifyFormat("Constructor()\n" + " : Field([] { // comment\n" + " int i;\n" + " }) {}"); // Lambdas with return types. verifyFormat("int c = []() -> int { return 2; }();\n"); verifyFormat("int c = []() -> vector<int> { return {2}; }();\n"); verifyFormat("Foo([]() -> std::vector<int> { return {2}; }());"); + verifyGoogleFormat("auto a = [&b, c](D* d) -> D* {};"); + verifyGoogleFormat("auto a = [&b, c](D* d) -> pair<D*, D*> {};"); + verifyGoogleFormat("auto a = [&b, c](D* d) -> D& {};"); + verifyGoogleFormat("auto a = [&b, c](D* d) -> const D* {};"); verifyFormat("auto aaaaaaaa = [](int i, // break for some reason\n" " int j) -> int {\n" " return ffffffffffffffffffffffffffffffffffffffffffff(i * j);\n" "};"); // Multiple lambdas in the same parentheses change indentation rules. - verifyFormat("SomeFunction([]() {\n" - " int i = 42;\n" - " return i;\n" - " },\n" - " []() {\n" - " int j = 43;\n" - " return j;\n" - " });"); + verifyFormat("SomeFunction(\n" + " []() {\n" + " int i = 42;\n" + " return i;\n" + " },\n" + " []() {\n" + " int j = 43;\n" + " return j;\n" + " });"); // More complex introducers. verifyFormat("return [i, args...] {};"); @@ -8810,89 +9441,113 @@ TEST_F(FormatTest, FormatsLambdas) { verifyFormat("void f() {\n" " MACRO((const AA &a) { return 1; });\n" "}"); + + verifyFormat("if (blah_blah(whatever, whatever, [] {\n" + " doo_dah();\n" + " doo_dah();\n" + " })) {\n" + "}"); } TEST_F(FormatTest, FormatsBlocks) { - verifyFormat("int (^Block)(int, int);"); - verifyFormat("int (^Block1)(int, int) = ^(int i, int j)"); - verifyFormat("void (^block)(int) = ^(id test) { int i; };"); - verifyFormat("void (^block)(int) = ^(int test) { int i; };"); - verifyFormat("void (^block)(int) = ^id(int test) { int i; };"); - verifyFormat("void (^block)(int) = ^int(int test) { int i; };"); - - verifyFormat("foo(^{ bar(); });"); - verifyFormat("foo(a, ^{ bar(); });"); - - // FIXME: Make whitespace formatting consistent. Ask a ObjC dev how - // it would ideally look. - verifyFormat("[operation setCompletionBlock:^{ [self onOperationDone]; }];"); - verifyFormat("int i = {[operation setCompletionBlock : ^{ [self " - "onOperationDone]; }]};"); - verifyFormat("[operation setCompletionBlock:^(int *i) { f(); }];"); - verifyFormat("int a = [operation block:^int(int *i) { return 1; }];"); + FormatStyle ShortBlocks = getLLVMStyle(); + ShortBlocks.AllowShortBlocksOnASingleLine = true; + verifyFormat("int (^Block)(int, int);", ShortBlocks); + verifyFormat("int (^Block1)(int, int) = ^(int i, int j)", ShortBlocks); + verifyFormat("void (^block)(int) = ^(id test) { int i; };", ShortBlocks); + verifyFormat("void (^block)(int) = ^(int test) { int i; };", ShortBlocks); + verifyFormat("void (^block)(int) = ^id(int test) { int i; };", ShortBlocks); + verifyFormat("void (^block)(int) = ^int(int test) { int i; };", ShortBlocks); + + verifyFormat("foo(^{ bar(); });", ShortBlocks); + verifyFormat("foo(a, ^{ bar(); });", ShortBlocks); + verifyFormat("{ void (^block)(Object *x); }", ShortBlocks); + + verifyFormat("[operation setCompletionBlock:^{\n" + " [self onOperationDone];\n" + "}];"); + verifyFormat("int i = {[operation setCompletionBlock:^{\n" + " [self onOperationDone];\n" + "}]};"); + verifyFormat("[operation setCompletionBlock:^(int *i) {\n" + " f();\n" + "}];"); + verifyFormat("int a = [operation block:^int(int *i) {\n" + " return 1;\n" + "}];"); verifyFormat("[myObject doSomethingWith:arg1\n" - " aaa:^int(int *a) { return 1; }\n" + " aaa:^int(int *a) {\n" + " return 1;\n" + " }\n" " bbb:f(a * bbbbbbbb)];"); verifyFormat("[operation setCompletionBlock:^{\n" - " [self.delegate newDataAvailable];\n" + " [self.delegate newDataAvailable];\n" "}];", getLLVMStyleWithColumns(60)); verifyFormat("dispatch_async(_fileIOQueue, ^{\n" - " NSString *path = [self sessionFilePath];\n" - " if (path) {\n" - " // ...\n" - " }\n" + " NSString *path = [self sessionFilePath];\n" + " if (path) {\n" + " // ...\n" + " }\n" "});"); verifyFormat("[[SessionService sharedService]\n" " loadWindowWithCompletionBlock:^(SessionWindow *window) {\n" - " if (window) {\n" - " [self windowDidLoad:window];\n" - " } else {\n" - " [self errorLoadingWindow];\n" - " }\n" + " if (window) {\n" + " [self windowDidLoad:window];\n" + " } else {\n" + " [self errorLoadingWindow];\n" + " }\n" " }];"); verifyFormat("void (^largeBlock)(void) = ^{\n" - " // ...\n" + " // ...\n" "};\n", getLLVMStyleWithColumns(40)); verifyFormat("[[SessionService sharedService]\n" " loadWindowWithCompletionBlock: //\n" " ^(SessionWindow *window) {\n" - " if (window) {\n" - " [self windowDidLoad:window];\n" - " } else {\n" - " [self errorLoadingWindow];\n" - " }\n" + " if (window) {\n" + " [self windowDidLoad:window];\n" + " } else {\n" + " [self errorLoadingWindow];\n" + " }\n" " }];", getLLVMStyleWithColumns(60)); verifyFormat("[myObject doSomethingWith:arg1\n" " firstBlock:^(Foo *a) {\n" - " // ...\n" - " int i;\n" + " // ...\n" + " int i;\n" " }\n" " secondBlock:^(Bar *b) {\n" - " // ...\n" - " int i;\n" + " // ...\n" + " int i;\n" " }\n" " thirdBlock:^Foo(Bar *b) {\n" - " // ...\n" - " int i;\n" + " // ...\n" + " int i;\n" " }];"); verifyFormat("[myObject doSomethingWith:arg1\n" " firstBlock:-1\n" " secondBlock:^(Bar *b) {\n" - " // ...\n" - " int i;\n" + " // ...\n" + " int i;\n" " }];"); verifyFormat("f(^{\n" - " @autoreleasepool {\n" - " if (a) {\n" - " g();\n" - " }\n" + " @autoreleasepool {\n" + " if (a) {\n" + " g();\n" " }\n" + " }\n" "});"); + verifyFormat("Block b = ^int *(A *a, B *b) {}"); + + FormatStyle FourIndent = getLLVMStyle(); + FourIndent.ObjCBlockIndentWidth = 4; + verifyFormat("[operation setCompletionBlock:^{\n" + " [self onOperationDone];\n" + "}];", + FourIndent); } TEST_F(FormatTest, SupportsCRLF) { @@ -9097,5 +9752,32 @@ TEST_F(FormatTest, HandleConflictMarkers) { "int i;\n")); } +TEST_F(FormatTest, DisableRegions) { + EXPECT_EQ("int i;\n" + "// clang-format off\n" + " int j;\n" + "// clang-format on\n" + "int k;", + format(" int i;\n" + " // clang-format off\n" + " int j;\n" + " // clang-format on\n" + " int k;")); + EXPECT_EQ("int i;\n" + "/* clang-format off */\n" + " int j;\n" + "/* clang-format on */\n" + "int k;", + format(" int i;\n" + " /* clang-format off */\n" + " int j;\n" + " /* clang-format on */\n" + " int k;")); +} + +TEST_F(FormatTest, DoNotCrashOnInvalidInput) { + format("? ) ="); +} + } // end namespace tooling } // end namespace clang |