FormatTest.cpp revision 112fb27ab48ae3256173806a073ba7b88aa6531a
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Format/Format.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "../Tooling/RewriterTestContext.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/Lex/Lexer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace clang { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace format { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FormatTest : public ::testing::Test { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected: 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length, 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormatStyle &Style) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RewriterTestContext Context; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FileID ID = Context.createInMemoryFile("input.cc", Code); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceLocation Start = 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Context.Sources.getLocForStartOfFile(ID).getLocWithOffset(Offset); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<CharSourceRange> Ranges( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length))); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LangOptions LangOpts; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LangOpts.CPlusPlus = 1; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tooling::Replacements Replace = 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reformat(Style, Lex, Context.Sources, Ranges); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite)); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return Context.getRewrittenText(ID); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string format(llvm::StringRef Code, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormatStyle &Style = getLLVMStyle()) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return format(Code, 0, Code.size(), Style); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void verifyFormat(llvm::StringRef Code) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string WithoutFormat(Code.str()); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WithoutFormat[i] == '\n') 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WithoutFormat[i] = ' '; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(Code.str(), format(WithoutFormat)); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void verifyGoogleFormat(llvm::StringRef Code) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string WithoutFormat(Code.str()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (WithoutFormat[i] == '\n') 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WithoutFormat[i] = ' '; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(Code.str(), format(WithoutFormat, getGoogleStyle())); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DoesNotChangeCorrectlyFormatedCode) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(";", format(";")); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("int i;", format(" int i;")); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("\nint i;", format(" \n\t \r int i;")); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("int i;", format("int\ni;")); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsNestedBlockStatements) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("{\n {\n {\n }\n }\n}", format("{{{}}}")); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsForLoop) { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ++VeryVeryLongLoopVariable);"); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsWhileLoop) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("while (true) {\n}"); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsNestedCall) { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("Method(f1, f2(f3));"); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("Method(f1(f2, f3()));"); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsAwesomeMethodCall) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) " parameter, parameter, parameter)), SecondLongCall(parameter));"); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, FormatsFunctionDefinition) { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("void f(int a, int b, int c, int d, int e, int f, int g," 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int h, int j, int f,\n" 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int c, int ddddddddddddd) {\n" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(FormatTest, FormatIfWithoutCompountStatement) { 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verifyFormat("if (true)\n f();\ng();"); 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(FormatTest, ParseIfThenElse) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("if (true)\n" 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (true)\n" 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (true)\n" 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " f();\n" 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " else\n" 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " g();\n" 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " else\n" 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " h();\n" 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "else\n" 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " i();"); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("if (true)\n" 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (true)\n" 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (true) {\n" 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (true)\n" 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " f();\n" 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " g();\n" 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " else\n" 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " h();\n" 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "else {\n" 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " i();\n" 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsSingleLineComments) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("// line 1\n// line 2\nvoid f() {\n}\n", 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format("// line 1\n// line 2\nvoid f() {}\n")); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("void f() {\n // Doesn't do anything\n}", 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format("void f() {\n// Doesn't do anything\n}")); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("int i // This is a fancy variable\n = 5;", 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) format("int i // This is a fancy variable\n= 5;")); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("f(/*test=*/ true);"); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("class A {\n};"); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, BreaksAsHighAsPossible) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " f();"); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, ElseIf) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("if (a) {\n" 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} else if (b) {\n" 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("if (a)\n" 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " f();\n" 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "else if (b)\n" 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " g();\n" 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "else\n" 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " h();"); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("class A {\n" 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "public:\n" 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "protected:\n" 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private:\n" 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " void f() {\n" 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyGoogleFormat("class A {\n" 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " public:\n" 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " protected:\n" 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " private:\n" 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " void f() {\n" 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, SwitchStatement) { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("switch (x) {\n" 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "case 1:\n" 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " f();\n" 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " break;\n" 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "case kFoo:\n" 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "case ns::kBar:\n" 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "case kBaz:\n" 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " break;\n" 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "default:\n" 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " g();\n" 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " break;\n" 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("switch (x) {\n" 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "case 1: {\n" 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " f();\n" 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " break;\n" 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("switch (test)\n" 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ;"); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, Labels) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("void f() {\n" 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " some_code();\n" 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test_label:\n" 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " some_other_code();\n" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " {\n" 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " some_more_code();\n" 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " another_label:\n" 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " some_more_code();\n" 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "}"); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("some_code();\n" 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "test_label:\n" 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "some_other_code();"); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DerivedClass) { 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("class A : public B {\n" 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, DoWhile) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("do {\n" 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " do_something();\n" 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} while (something());"); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("do\n" 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " do_something();\n" 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "while (something());"); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, Enum) { 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("enum {\n" 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Zero,\n" 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " One = 1,\n" 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Two = One + 1,\n" 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Three = (One + Two),\n" 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Four = (Zero && (One ^ Two)) | (One << Two),\n" 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " Five = (One, Two, Three, Four, 5)\n" 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("enum Enum {\n" 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("enum {\n" 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "};"); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, BreaksDesireably) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n};"); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n" 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));"); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, AlignsStringLiterals) { 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"short literal\");"); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "looooooooooooooooooooooooongFunction(\n" 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"short literal\"\n" 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsEquals) { 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "aaaaaaaaaaaaaaaaa =\n" 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (a) {\n" 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}"); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " 100000000 + 100000000) {\n}"); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FormatTest, UnderstandsTemplateParameters) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) verifyFormat("A<int> a;"); 311 verifyFormat("A<A<A<int> > > a;"); 312 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 313 verifyFormat("bool x = a < 1 || 2 > a;"); 314 verifyFormat("bool x = 5 < f<int>();"); 315 verifyFormat("bool x = f<int>() > 5;"); 316 verifyFormat("bool x = 5 < a<int>::x;"); 317 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 318 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 319 320 verifyGoogleFormat("A<A<int>> a;"); 321 verifyGoogleFormat("A<A<A<int>>> a;"); 322 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 323 324 verifyFormat("test >> a >> b;"); 325 verifyFormat("test << a >> b;"); 326 327 verifyFormat("f<int>();"); 328 verifyFormat("template <typename T> void f() {\n}"); 329} 330 331TEST_F(FormatTest, UndestandsUnaryOperators) { 332 verifyFormat("int a = -2;"); 333 verifyFormat("f(-1, -2, -3);"); 334 verifyFormat("a[-1] = 5;"); 335 verifyFormat("int a = 5 + -2;"); 336 verifyFormat("if (i == -1) {\n}"); 337 verifyFormat("if (i != -1) {\n}"); 338 verifyFormat("if (i > -1) {\n}"); 339 verifyFormat("if (i < -1) {\n}"); 340} 341 342TEST_F(FormatTest, UndestandsOverloadedOperators) { 343 verifyFormat("bool operator<() {\n}"); 344} 345 346TEST_F(FormatTest, UnderstandsUsesOfStar) { 347 verifyFormat("int *f(int *a) {\n}"); 348 verifyFormat("f(a, *a);"); 349 verifyFormat("f(*a);"); 350 verifyFormat("int a = b * 10;"); 351 verifyFormat("int a = 10 * b;"); 352 verifyFormat("int a = b * c;"); 353 verifyFormat("int a = *b;"); 354 verifyFormat("int a = *b * c;"); 355 verifyFormat("int a = b * *c;"); 356} 357 358TEST_F(FormatTest, HandlesIncludeDirectives) { 359 EXPECT_EQ("#include <string>\n", format("#include <string>\n")); 360 EXPECT_EQ("#include \"a/b/string\"\n", format("#include \"a/b/string\"\n")); 361 EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n")); 362 EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n")); 363} 364 365//TEST_F(FormatTest, IncorrectDerivedClass) { 366// verifyFormat("public B {\n" 367// "};"); 368//} 369 370TEST_F(FormatTest, IncorrectCodeUnbalancedBraces) { 371 verifyFormat("{"); 372} 373 374TEST_F(FormatTest, IncorrectCodeDoNoWhile) { 375 verifyFormat("do {\n" 376 "};"); 377 verifyFormat("do {\n" 378 "};\n" 379 "f();"); 380 verifyFormat("do {\n" 381 "}\n" 382 "wheeee(fun);"); 383 verifyFormat("do {\n" 384 " f();\n" 385 "};"); 386} 387 388TEST_F(FormatTest, IncorrectCodeErrorDetection) { 389 EXPECT_EQ("{\n{\n}\n", format("{\n{\n}\n")); 390 EXPECT_EQ("{\n {\n}\n", format("{\n {\n}\n")); 391 EXPECT_EQ("{\n {\n }\n", format("{\n {\n }\n")); 392 393 FormatStyle Style = getLLVMStyle(); 394 Style.ColumnLimit = 10; 395 EXPECT_EQ("{\n" 396 " {\n" 397 " breakme(\n" 398 " qwe);\n" 399 "}\n", format("{\n" 400 " {\n" 401 " breakme(qwe);\n" 402 "}\n", Style)); 403 404} 405 406} // end namespace tooling 407} // end namespace clang 408