blob: e21367bb315db3e264491ec9c877a6a93a74513e [file] [log] [blame]
Daniel Jasperbac016b2012-12-03 18:12:45 +00001//===- 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
Chandler Carruth1050e8b2012-12-04 09:45:34 +000010#include "clang/Format/Format.h"
Daniel Jasperbac016b2012-12-03 18:12:45 +000011#include "../Tooling/RewriterTestContext.h"
12#include "clang/Lex/Lexer.h"
Daniel Jasperbac016b2012-12-03 18:12:45 +000013#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
Alexander Kornienkoa166e732012-12-04 14:46:19 +0000247TEST_F(FormatTest, Enum) {
248 verifyFormat("enum {\n"
249 " Zero,\n"
250 " One = 1,\n"
251 " Two = One + 1,\n"
252 " Three = (One + Two),\n"
253 " Four = (Zero && (One ^ Two)) | (One << Two),\n"
254 " Five = (One, Two, Three, Four, 5)\n"
255 "};");
256 verifyFormat("enum Enum {\n"
257 "};");
258 verifyFormat("enum {\n"
259 "};");
260}
261
Daniel Jasperbac016b2012-12-03 18:12:45 +0000262TEST_F(FormatTest, BreaksDesireably) {
263 verifyFormat("if (aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
264 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa) ||\n"
265 " aaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaa)) {\n};");
266
267 verifyFormat(
268 "aaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,\n"
269 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n}");
270
271 verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
272 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
273 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa));");
Daniel Jaspera88bb452012-12-04 10:50:12 +0000274
275 verifyFormat(
276 "aaaaaaaa(aaaaaaaaaaaaa, aaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
277 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)),\n"
278 " aaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(\n"
279 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)));");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000280}
281
282TEST_F(FormatTest, AlignsStringLiterals) {
283 verifyFormat("loooooooooooooooooooooooooongFunction(\"short literal \"\n"
284 " \"short literal\");");
285 verifyFormat(
286 "looooooooooooooooooooooooongFunction(\n"
287 " \"short literal\"\n"
288 " \"looooooooooooooooooooooooooooooooooooooooooooooooong literal\");");
289}
290
291TEST_F(FormatTest, UnderstandsEquals) {
292 verifyFormat(
293 "aaaaaaaaaaaaaaaaa =\n"
294 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;");
295 verifyFormat(
296 "if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
297 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
298 "}");
299 verifyFormat(
300 "if (a) {\n"
301 "} else if (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
302 " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa) {\n"
303 "}");
304
305 verifyFormat("if (int aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
306 " 100000000 + 100000000) {\n}");
307}
308
309TEST_F(FormatTest, UnderstandsTemplateParameters) {
310 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;");
Daniel Jasper8822d3a2012-12-04 13:02:32 +0000333 verifyFormat("f(-1, -2, -3);");
334 verifyFormat("a[-1] = 5;");
335 verifyFormat("int a = 5 + -2;");
Daniel Jasperbac016b2012-12-03 18:12:45 +0000336}
337
338TEST_F(FormatTest, UndestandsOverloadedOperators) {
339 verifyFormat("bool operator<() {\n}");
340}
341
342TEST_F(FormatTest, UnderstandsUsesOfStar) {
343 verifyFormat("int *f(int *a) {\n}");
344 verifyFormat("f(a, *a);");
345 verifyFormat("f(*a);");
346 verifyFormat("int a = b * 10;");
347 verifyFormat("int a = 10 * b;");
348 // verifyFormat("int a = b * c;");
349 verifyFormat("int a = *b;");
350 // verifyFormat("int a = *b * c;");
351 // verifyFormat("int a = b * *c;");
352}
353
Daniel Jasper8822d3a2012-12-04 13:02:32 +0000354TEST_F(FormatTest, HandlesIncludeDirectives) {
355 EXPECT_EQ("#include <string>\n", format("#include <string>\n"));
356 EXPECT_EQ("#include \"a/b/string\"\n", format("#include \"a/b/string\"\n"));
357 EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
358 EXPECT_EQ("#include \"string.h\"\n", format("#include \"string.h\"\n"));
359}
360
Daniel Jasperbac016b2012-12-03 18:12:45 +0000361//TEST_F(FormatTest, IncorrectDerivedClass) {
362// verifyFormat("public B {\n"
363// "};");
364//}
365
366} // end namespace tooling
367} // end namespace clang