FormatTest.cpp revision bac016bd3f67ca2f4db1ddc619e611759352b84d
1//===- unittest/Format/FormatTest.cpp - Formatting unit tests -------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#include "../Tooling/RewriterTestContext.h" 11#include "clang/Lex/Lexer.h" 12#include "clang/Format/Format.h" 13#include "gtest/gtest.h" 14 15namespace clang { 16namespace format { 17 18class FormatTest : public ::testing::Test { 19protected: 20 std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length, 21 const FormatStyle &Style) { 22 RewriterTestContext Context; 23 FileID ID = Context.createInMemoryFile("input.cc", Code); 24 SourceLocation Start = 25 Context.Sources.getLocForStartOfFile(ID).getLocWithOffset(Offset); 26 std::vector<CharSourceRange> Ranges( 27 1, 28 CharSourceRange::getCharRange(Start, Start.getLocWithOffset(Length))); 29 LangOptions LangOpts; 30 LangOpts.CPlusPlus = 1; 31 Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, LangOpts); 32 tooling::Replacements Replace = 33 reformat(Style, Lex, Context.Sources, Ranges); 34 EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite)); 35 return Context.getRewrittenText(ID); 36 } 37 38 std::string format(llvm::StringRef Code, 39 const FormatStyle &Style = getLLVMStyle()) { 40 return format(Code, 0, Code.size(), Style); 41 } 42 43 void verifyFormat(llvm::StringRef Code) { 44 std::string WithoutFormat(Code.str()); 45 for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) { 46 if (WithoutFormat[i] == '\n') 47 WithoutFormat[i] = ' '; 48 } 49 EXPECT_EQ(Code.str(), format(WithoutFormat)); 50 } 51 52 void verifyGoogleFormat(llvm::StringRef Code) { 53 std::string WithoutFormat(Code.str()); 54 for (unsigned i = 0, e = WithoutFormat.size(); i != e; ++i) { 55 if (WithoutFormat[i] == '\n') 56 WithoutFormat[i] = ' '; 57 } 58 EXPECT_EQ(Code.str(), format(WithoutFormat, getGoogleStyle())); 59 } 60}; 61 62TEST_F(FormatTest, DoesNotChangeCorrectlyFormatedCode) { 63 EXPECT_EQ(";", format(";")); 64} 65 66TEST_F(FormatTest, FormatsGlobalStatementsAt0) { 67 EXPECT_EQ("int i;", format(" int i;")); 68 EXPECT_EQ("\nint i;", format(" \n\t \r int i;")); 69 EXPECT_EQ("int i;\nint j;", format(" int i; int j;")); 70 EXPECT_EQ("int i;\nint j;", format(" int i;\n int j;")); 71} 72 73TEST_F(FormatTest, FormatsUnwrappedLinesAtFirstFormat) { 74 EXPECT_EQ("int i;", format("int\ni;")); 75} 76 77TEST_F(FormatTest, FormatsNestedBlockStatements) { 78 EXPECT_EQ("{\n {\n {\n }\n }\n}", format("{{{}}}")); 79} 80 81TEST_F(FormatTest, FormatsForLoop) { 82 verifyFormat( 83 "for (int VeryVeryLongLoopVariable = 0; VeryVeryLongLoopVariable < 10;\n" 84 " ++VeryVeryLongLoopVariable);"); 85} 86 87TEST_F(FormatTest, FormatsWhileLoop) { 88 verifyFormat("while (true) {\n}"); 89} 90 91TEST_F(FormatTest, FormatsNestedCall) { 92 verifyFormat("Method(f1, f2(f3));"); 93 verifyFormat("Method(f1(f2, f3()));"); 94} 95 96TEST_F(FormatTest, FormatsAwesomeMethodCall) { 97 verifyFormat( 98 "SomeLongMethodName(SomeReallyLongMethod(CallOtherReallyLongMethod(\n" 99 " parameter, parameter, parameter)), SecondLongCall(parameter));"); 100} 101 102TEST_F(FormatTest, FormatsFunctionDefinition) { 103 verifyFormat("void f(int a, int b, int c, int d, int e, int f, int g," 104 " int h, int j, int f,\n" 105 " int c, int ddddddddddddd) {\n" 106 "}"); 107} 108 109TEST_F(FormatTest, FormatIfWithoutCompountStatement) { 110 verifyFormat("if (true)\n f();\ng();"); 111 verifyFormat("if (a)\n if (b)\n if (c)\n g();\nh();"); 112 verifyFormat("if (a)\n if (b) {\n f();\n }\ng();"); 113} 114 115TEST_F(FormatTest, ParseIfThenElse) { 116 verifyFormat("if (true)\n" 117 " if (true)\n" 118 " if (true)\n" 119 " f();\n" 120 " else\n" 121 " g();\n" 122 " else\n" 123 " h();\n" 124 "else\n" 125 " i();"); 126 verifyFormat("if (true)\n" 127 " if (true)\n" 128 " if (true) {\n" 129 " if (true)\n" 130 " f();\n" 131 " } else {\n" 132 " g();\n" 133 " }\n" 134 " else\n" 135 " h();\n" 136 "else {\n" 137 " i();\n" 138 "}"); 139} 140 141TEST_F(FormatTest, UnderstandsSingleLineComments) { 142 EXPECT_EQ("// line 1\n// line 2\nvoid f() {\n}\n", 143 format("// line 1\n// line 2\nvoid f() {}\n")); 144 145 EXPECT_EQ("void f() {\n // Doesn't do anything\n}", 146 format("void f() {\n// Doesn't do anything\n}")); 147 148 EXPECT_EQ("int i // This is a fancy variable\n = 5;", 149 format("int i // This is a fancy variable\n= 5;")); 150 151 verifyFormat("f(/*test=*/ true);"); 152} 153 154TEST_F(FormatTest, DoesNotBreakSemiAfterClassDecl) { 155 verifyFormat("class A {\n};"); 156} 157 158TEST_F(FormatTest, BreaksAsHighAsPossible) { 159 verifyFormat( 160 "if ((aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaaaaaaaaaaaaa) ||\n" 161 " (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb && bbbbbbbbbbbbbbbbbbbbbbbbbb))\n" 162 " f();"); 163} 164 165TEST_F(FormatTest, ElseIf) { 166 verifyFormat("if (a) {\n" 167 "} else if (b) {\n" 168 "}"); 169 verifyFormat("if (a)\n" 170 " f();\n" 171 "else if (b)\n" 172 " g();\n" 173 "else\n" 174 " h();"); 175} 176 177TEST_F(FormatTest, UnderstandsAccessSpecifiers) { 178 verifyFormat("class A {\n" 179 "public:\n" 180 "protected:\n" 181 "private:\n" 182 " void f() {\n" 183 " }\n" 184 "};"); 185 verifyGoogleFormat("class A {\n" 186 " public:\n" 187 " protected:\n" 188 " private:\n" 189 " void f() {\n" 190 " }\n" 191 "};"); 192} 193 194TEST_F(FormatTest, SwitchStatement) { 195 verifyFormat("switch (x) {\n" 196 "case 1:\n" 197 " f();\n" 198 " break;\n" 199 "case kFoo:\n" 200 "case ns::kBar:\n" 201 "case kBaz:\n" 202 " break;\n" 203 "default:\n" 204 " g();\n" 205 " break;\n" 206 "}"); 207 verifyFormat("switch (x) {\n" 208 "case 1: {\n" 209 " f();\n" 210 " break;\n" 211 "}\n" 212 "}"); 213 verifyFormat("switch (test)\n" 214 " ;"); 215} 216 217TEST_F(FormatTest, Labels) { 218 verifyFormat("void f() {\n" 219 " some_code();\n" 220 "test_label:\n" 221 " some_other_code();\n" 222 " {\n" 223 " some_more_code();\n" 224 " another_label:\n" 225 " some_more_code();\n" 226 " }\n" 227 "}"); 228 verifyFormat("some_code();\n" 229 "test_label:\n" 230 "some_other_code();"); 231} 232 233TEST_F(FormatTest, DerivedClass) { 234 verifyFormat("class A : public B {\n" 235 "};"); 236} 237 238TEST_F(FormatTest, DoWhile) { 239 verifyFormat("do {\n" 240 " do_something();\n" 241 "} while (something());"); 242 verifyFormat("do\n" 243 " do_something();\n" 244 "while (something());"); 245} 246 247TEST_F(FormatTest, BreaksDesireably) { 248 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 249 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n" 250 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n};"); 251 252 verifyFormat( 253 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n" 254 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}"); 255 256 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 257 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n" 258 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));"); 259} 260 261TEST_F(FormatTest, AlignsStringLiterals) { 262 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n" 263 " \"short literal\");"); 264 verifyFormat( 265 "looooooooooooooooooooooooongFunction(\n" 266 " \"short literal\"\n" 267 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");"); 268} 269 270TEST_F(FormatTest, UnderstandsEquals) { 271 verifyFormat( 272 "aaaaaaaaaaaaaaaaa =\n" 273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;"); 274 verifyFormat( 275 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 276 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 277 "}"); 278 verifyFormat( 279 "if (a) {\n" 280 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 281 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n" 282 "}"); 283 284 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 285 " 100000000 + 100000000) {\n}"); 286} 287 288TEST_F(FormatTest, UnderstandsTemplateParameters) { 289 verifyFormat("A<int> a;"); 290 verifyFormat("A<A<A<int> > > a;"); 291 verifyFormat("A<A<A<int, 2>, 3>, 4> a;"); 292 verifyFormat("bool x = a < 1 || 2 > a;"); 293 verifyFormat("bool x = 5 < f<int>();"); 294 verifyFormat("bool x = f<int>() > 5;"); 295 verifyFormat("bool x = 5 < a<int>::x;"); 296 verifyFormat("bool x = a < 4 ? a > 2 : false;"); 297 verifyFormat("bool x = f() ? a < 2 : a > 2;"); 298 299 verifyGoogleFormat("A<A<int>> a;"); 300 verifyGoogleFormat("A<A<A<int>>> a;"); 301 verifyGoogleFormat("A<A<A<A<int>>>> a;"); 302 303 verifyFormat("test >> a >> b;"); 304 verifyFormat("test << a >> b;"); 305 306 verifyFormat("f<int>();"); 307 verifyFormat("template <typename T> void f() {\n}"); 308} 309 310TEST_F(FormatTest, UndestandsUnaryOperators) { 311 verifyFormat("int a = -2;"); 312} 313 314TEST_F(FormatTest, UndestandsOverloadedOperators) { 315 verifyFormat("bool operator<() {\n}"); 316} 317 318TEST_F(FormatTest, UnderstandsUsesOfStar) { 319 verifyFormat("int *f(int *a) {\n}"); 320 verifyFormat("f(a, *a);"); 321 verifyFormat("f(*a);"); 322 verifyFormat("int a = b * 10;"); 323 verifyFormat("int a = 10 * b;"); 324 // verifyFormat("int a = b * c;"); 325 verifyFormat("int a = *b;"); 326 // verifyFormat("int a = *b * c;"); 327 // verifyFormat("int a = b * *c;"); 328} 329 330//TEST_F(FormatTest, IncorrectDerivedClass) { 331// verifyFormat("public B {\n" 332// "};"); 333//} 334 335} // end namespace tooling 336} // end namespace clang 337