1*67e74705SXin Li //===- unittest/Format/FormatTestSelective.cpp - Formatting unit tests ----===//
2*67e74705SXin Li //
3*67e74705SXin Li // The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li
10*67e74705SXin Li #include "FormatTestUtils.h"
11*67e74705SXin Li #include "clang/Format/Format.h"
12*67e74705SXin Li #include "llvm/Support/Debug.h"
13*67e74705SXin Li #include "gtest/gtest.h"
14*67e74705SXin Li
15*67e74705SXin Li #define DEBUG_TYPE "format-test"
16*67e74705SXin Li
17*67e74705SXin Li namespace clang {
18*67e74705SXin Li namespace format {
19*67e74705SXin Li namespace {
20*67e74705SXin Li
21*67e74705SXin Li class FormatTestSelective : public ::testing::Test {
22*67e74705SXin Li protected:
format(llvm::StringRef Code,unsigned Offset,unsigned Length)23*67e74705SXin Li std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length) {
24*67e74705SXin Li DEBUG(llvm::errs() << "---\n");
25*67e74705SXin Li DEBUG(llvm::errs() << Code << "\n\n");
26*67e74705SXin Li std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
27*67e74705SXin Li bool IncompleteFormat = false;
28*67e74705SXin Li tooling::Replacements Replaces =
29*67e74705SXin Li reformat(Style, Code, Ranges, "<stdin>", &IncompleteFormat);
30*67e74705SXin Li EXPECT_FALSE(IncompleteFormat) << Code << "\n\n";
31*67e74705SXin Li auto Result = applyAllReplacements(Code, Replaces);
32*67e74705SXin Li EXPECT_TRUE(static_cast<bool>(Result));
33*67e74705SXin Li DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
34*67e74705SXin Li return *Result;
35*67e74705SXin Li }
36*67e74705SXin Li
37*67e74705SXin Li FormatStyle Style = getLLVMStyle();
38*67e74705SXin Li };
39*67e74705SXin Li
TEST_F(FormatTestSelective,RemovesTrailingWhitespaceOfFormattedLine)40*67e74705SXin Li TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
41*67e74705SXin Li EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0));
42*67e74705SXin Li EXPECT_EQ("int a;", format("int a; ", 0, 0));
43*67e74705SXin Li EXPECT_EQ("int a;\n", format("int a; \n \n \n ", 0, 0));
44*67e74705SXin Li EXPECT_EQ("int a;\nint b; ", format("int a; \nint b; ", 0, 0));
45*67e74705SXin Li }
46*67e74705SXin Li
TEST_F(FormatTestSelective,FormatsCorrectRegionForLeadingWhitespace)47*67e74705SXin Li TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
48*67e74705SXin Li EXPECT_EQ("{int b;\n"
49*67e74705SXin Li " int a;\n"
50*67e74705SXin Li "}",
51*67e74705SXin Li format("{int b;\n int a;}", 8, 0));
52*67e74705SXin Li EXPECT_EQ("{\n"
53*67e74705SXin Li " int b;\n"
54*67e74705SXin Li " int a;}",
55*67e74705SXin Li format("{int b;\n int a;}", 7, 0));
56*67e74705SXin Li
57*67e74705SXin Li Style.ColumnLimit = 12;
58*67e74705SXin Li EXPECT_EQ("#define A \\\n"
59*67e74705SXin Li " int a; \\\n"
60*67e74705SXin Li " int b;",
61*67e74705SXin Li format("#define A \\\n"
62*67e74705SXin Li " int a; \\\n"
63*67e74705SXin Li " int b;",
64*67e74705SXin Li 26, 0));
65*67e74705SXin Li EXPECT_EQ("#define A \\\n"
66*67e74705SXin Li " int a; \\\n"
67*67e74705SXin Li " int b;",
68*67e74705SXin Li format("#define A \\\n"
69*67e74705SXin Li " int a; \\\n"
70*67e74705SXin Li " int b;",
71*67e74705SXin Li 25, 0));
72*67e74705SXin Li }
73*67e74705SXin Li
TEST_F(FormatTestSelective,FormatLineWhenInvokedOnTrailingNewline)74*67e74705SXin Li TEST_F(FormatTestSelective, FormatLineWhenInvokedOnTrailingNewline) {
75*67e74705SXin Li EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 8, 0));
76*67e74705SXin Li EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 7, 0));
77*67e74705SXin Li
78*67e74705SXin Li // This might not strictly be correct, but is likely good in all practical
79*67e74705SXin Li // cases.
80*67e74705SXin Li EXPECT_EQ("int b;\nint a;", format("int b;int a;", 7, 0));
81*67e74705SXin Li }
82*67e74705SXin Li
TEST_F(FormatTestSelective,RemovesWhitespaceWhenTriggeredOnEmptyLine)83*67e74705SXin Li TEST_F(FormatTestSelective, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
84*67e74705SXin Li EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 8, 0));
85*67e74705SXin Li EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 9, 0));
86*67e74705SXin Li }
87*67e74705SXin Li
TEST_F(FormatTestSelective,ReformatsMovedLines)88*67e74705SXin Li TEST_F(FormatTestSelective, ReformatsMovedLines) {
89*67e74705SXin Li EXPECT_EQ(
90*67e74705SXin Li "template <typename T> T *getFETokenInfo() const {\n"
91*67e74705SXin Li " return static_cast<T *>(FETokenInfo);\n"
92*67e74705SXin Li "}\n"
93*67e74705SXin Li "int a; // <- Should not be formatted",
94*67e74705SXin Li format(
95*67e74705SXin Li "template<typename T>\n"
96*67e74705SXin Li "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
97*67e74705SXin Li "int a; // <- Should not be formatted",
98*67e74705SXin Li 9, 5));
99*67e74705SXin Li }
100*67e74705SXin Li
TEST_F(FormatTestSelective,FormatsIfWithoutCompoundStatement)101*67e74705SXin Li TEST_F(FormatTestSelective, FormatsIfWithoutCompoundStatement) {
102*67e74705SXin Li Style.AllowShortIfStatementsOnASingleLine = true;
103*67e74705SXin Li EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1));
104*67e74705SXin Li EXPECT_EQ("if (a) return; // comment",
105*67e74705SXin Li format("if(a)\nreturn; // comment", 20, 1));
106*67e74705SXin Li }
107*67e74705SXin Li
TEST_F(FormatTestSelective,FormatsCommentsLocally)108*67e74705SXin Li TEST_F(FormatTestSelective, FormatsCommentsLocally) {
109*67e74705SXin Li EXPECT_EQ("int a; // comment\n"
110*67e74705SXin Li "int b; // comment",
111*67e74705SXin Li format("int a; // comment\n"
112*67e74705SXin Li "int b; // comment",
113*67e74705SXin Li 0, 0));
114*67e74705SXin Li EXPECT_EQ("int a; // comment\n"
115*67e74705SXin Li " // line 2\n"
116*67e74705SXin Li "int b;",
117*67e74705SXin Li format("int a; // comment\n"
118*67e74705SXin Li " // line 2\n"
119*67e74705SXin Li "int b;",
120*67e74705SXin Li 28, 0));
121*67e74705SXin Li EXPECT_EQ("int aaaaaa; // comment\n"
122*67e74705SXin Li "int b;\n"
123*67e74705SXin Li "int c; // unrelated comment",
124*67e74705SXin Li format("int aaaaaa; // comment\n"
125*67e74705SXin Li "int b;\n"
126*67e74705SXin Li "int c; // unrelated comment",
127*67e74705SXin Li 31, 0));
128*67e74705SXin Li
129*67e74705SXin Li EXPECT_EQ("int a; // This\n"
130*67e74705SXin Li " // is\n"
131*67e74705SXin Li " // a",
132*67e74705SXin Li format("int a; // This\n"
133*67e74705SXin Li " // is\n"
134*67e74705SXin Li " // a",
135*67e74705SXin Li 0, 0));
136*67e74705SXin Li EXPECT_EQ("int a; // This\n"
137*67e74705SXin Li " // is\n"
138*67e74705SXin Li " // a\n"
139*67e74705SXin Li "// This is b\n"
140*67e74705SXin Li "int b;",
141*67e74705SXin Li format("int a; // This\n"
142*67e74705SXin Li " // is\n"
143*67e74705SXin Li " // a\n"
144*67e74705SXin Li "// This is b\n"
145*67e74705SXin Li "int b;",
146*67e74705SXin Li 0, 0));
147*67e74705SXin Li EXPECT_EQ("int a; // This\n"
148*67e74705SXin Li " // is\n"
149*67e74705SXin Li " // a\n"
150*67e74705SXin Li "\n"
151*67e74705SXin Li "//This is unrelated",
152*67e74705SXin Li format("int a; // This\n"
153*67e74705SXin Li " // is\n"
154*67e74705SXin Li " // a\n"
155*67e74705SXin Li "\n"
156*67e74705SXin Li "//This is unrelated",
157*67e74705SXin Li 0, 0));
158*67e74705SXin Li EXPECT_EQ("int a;\n"
159*67e74705SXin Li "// This is\n"
160*67e74705SXin Li "// not formatted. ",
161*67e74705SXin Li format("int a;\n"
162*67e74705SXin Li "// This is\n"
163*67e74705SXin Li "// not formatted. ",
164*67e74705SXin Li 0, 0));
165*67e74705SXin Li EXPECT_EQ("int x; // Format this line.\n"
166*67e74705SXin Li "int xx; //\n"
167*67e74705SXin Li "int xxxxx; //",
168*67e74705SXin Li format("int x; // Format this line.\n"
169*67e74705SXin Li "int xx; //\n"
170*67e74705SXin Li "int xxxxx; //",
171*67e74705SXin Li 0, 0));
172*67e74705SXin Li }
173*67e74705SXin Li
TEST_F(FormatTestSelective,IndividualStatementsOfNestedBlocks)174*67e74705SXin Li TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
175*67e74705SXin Li EXPECT_EQ("DEBUG({\n"
176*67e74705SXin Li " int i;\n"
177*67e74705SXin Li " int j;\n"
178*67e74705SXin Li "});",
179*67e74705SXin Li format("DEBUG( {\n"
180*67e74705SXin Li " int i;\n"
181*67e74705SXin Li " int j;\n"
182*67e74705SXin Li "} ) ;",
183*67e74705SXin Li 20, 1));
184*67e74705SXin Li EXPECT_EQ("DEBUG( {\n"
185*67e74705SXin Li " int i;\n"
186*67e74705SXin Li " int j;\n"
187*67e74705SXin Li "} ) ;",
188*67e74705SXin Li format("DEBUG( {\n"
189*67e74705SXin Li " int i;\n"
190*67e74705SXin Li " int j;\n"
191*67e74705SXin Li "} ) ;",
192*67e74705SXin Li 41, 1));
193*67e74705SXin Li EXPECT_EQ("DEBUG( {\n"
194*67e74705SXin Li " int i;\n"
195*67e74705SXin Li " int j;\n"
196*67e74705SXin Li "} ) ;",
197*67e74705SXin Li format("DEBUG( {\n"
198*67e74705SXin Li " int i;\n"
199*67e74705SXin Li " int j;\n"
200*67e74705SXin Li "} ) ;",
201*67e74705SXin Li 41, 1));
202*67e74705SXin Li EXPECT_EQ("DEBUG({\n"
203*67e74705SXin Li " int i;\n"
204*67e74705SXin Li " int j;\n"
205*67e74705SXin Li "});",
206*67e74705SXin Li format("DEBUG( {\n"
207*67e74705SXin Li " int i;\n"
208*67e74705SXin Li " int j;\n"
209*67e74705SXin Li "} ) ;",
210*67e74705SXin Li 20, 1));
211*67e74705SXin Li
212*67e74705SXin Li EXPECT_EQ("Debug({\n"
213*67e74705SXin Li " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
214*67e74705SXin Li " return;\n"
215*67e74705SXin Li " },\n"
216*67e74705SXin Li " a);",
217*67e74705SXin Li format("Debug({\n"
218*67e74705SXin Li " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
219*67e74705SXin Li " return;\n"
220*67e74705SXin Li " },\n"
221*67e74705SXin Li " a);",
222*67e74705SXin Li 50, 1));
223*67e74705SXin Li EXPECT_EQ("DEBUG({\n"
224*67e74705SXin Li " DEBUG({\n"
225*67e74705SXin Li " int a;\n"
226*67e74705SXin Li " int b;\n"
227*67e74705SXin Li " }) ;\n"
228*67e74705SXin Li "});",
229*67e74705SXin Li format("DEBUG({\n"
230*67e74705SXin Li " DEBUG({\n"
231*67e74705SXin Li " int a;\n"
232*67e74705SXin Li " int b;\n" // Format this line only.
233*67e74705SXin Li " }) ;\n" // Don't touch this line.
234*67e74705SXin Li "});",
235*67e74705SXin Li 35, 0));
236*67e74705SXin Li EXPECT_EQ("DEBUG({\n"
237*67e74705SXin Li " int a; //\n"
238*67e74705SXin Li "});",
239*67e74705SXin Li format("DEBUG({\n"
240*67e74705SXin Li " int a; //\n"
241*67e74705SXin Li "});",
242*67e74705SXin Li 0, 0));
243*67e74705SXin Li EXPECT_EQ("someFunction(\n"
244*67e74705SXin Li " [] {\n"
245*67e74705SXin Li " // Only with this comment.\n"
246*67e74705SXin Li " int i; // invoke formatting here.\n"
247*67e74705SXin Li " }, // force line break\n"
248*67e74705SXin Li " aaa);",
249*67e74705SXin Li format("someFunction(\n"
250*67e74705SXin Li " [] {\n"
251*67e74705SXin Li " // Only with this comment.\n"
252*67e74705SXin Li " int i; // invoke formatting here.\n"
253*67e74705SXin Li " }, // force line break\n"
254*67e74705SXin Li " aaa);",
255*67e74705SXin Li 63, 1));
256*67e74705SXin Li
257*67e74705SXin Li EXPECT_EQ("int longlongname; // comment\n"
258*67e74705SXin Li "int x = f({\n"
259*67e74705SXin Li " int x; // comment\n"
260*67e74705SXin Li " int y; // comment\n"
261*67e74705SXin Li "});",
262*67e74705SXin Li format("int longlongname; // comment\n"
263*67e74705SXin Li "int x = f({\n"
264*67e74705SXin Li " int x; // comment\n"
265*67e74705SXin Li " int y; // comment\n"
266*67e74705SXin Li "});",
267*67e74705SXin Li 65, 0));
268*67e74705SXin Li EXPECT_EQ("int s = f({\n"
269*67e74705SXin Li " class X {\n"
270*67e74705SXin Li " public:\n"
271*67e74705SXin Li " void f();\n"
272*67e74705SXin Li " };\n"
273*67e74705SXin Li "});",
274*67e74705SXin Li format("int s = f({\n"
275*67e74705SXin Li " class X {\n"
276*67e74705SXin Li " public:\n"
277*67e74705SXin Li " void f();\n"
278*67e74705SXin Li " };\n"
279*67e74705SXin Li "});",
280*67e74705SXin Li 0, 0));
281*67e74705SXin Li EXPECT_EQ("SomeFunction(\n"
282*67e74705SXin Li " [] {\n"
283*67e74705SXin Li " int i;\n"
284*67e74705SXin Li " return i;\n" // Format this line.
285*67e74705SXin Li " },\n"
286*67e74705SXin Li " [] {\n"
287*67e74705SXin Li " return 2;\n" // Don't fix this.
288*67e74705SXin Li " });",
289*67e74705SXin Li format("SomeFunction(\n"
290*67e74705SXin Li " [] {\n"
291*67e74705SXin Li " int i;\n"
292*67e74705SXin Li " return i;\n" // Format this line.
293*67e74705SXin Li " },\n"
294*67e74705SXin Li " [] {\n"
295*67e74705SXin Li " return 2;\n" // Don't fix this.
296*67e74705SXin Li " });",
297*67e74705SXin Li 40, 0));
298*67e74705SXin Li }
299*67e74705SXin Li
TEST_F(FormatTestSelective,WrongIndent)300*67e74705SXin Li TEST_F(FormatTestSelective, WrongIndent) {
301*67e74705SXin Li EXPECT_EQ("namespace {\n"
302*67e74705SXin Li "int i;\n"
303*67e74705SXin Li "int j;\n"
304*67e74705SXin Li "}",
305*67e74705SXin Li format("namespace {\n"
306*67e74705SXin Li " int i;\n" // Format here.
307*67e74705SXin Li " int j;\n"
308*67e74705SXin Li "}",
309*67e74705SXin Li 15, 0));
310*67e74705SXin Li EXPECT_EQ("namespace {\n"
311*67e74705SXin Li " int i;\n"
312*67e74705SXin Li " int j;\n"
313*67e74705SXin Li "}",
314*67e74705SXin Li format("namespace {\n"
315*67e74705SXin Li " int i;\n"
316*67e74705SXin Li " int j;\n" // Format here.
317*67e74705SXin Li "}",
318*67e74705SXin Li 24, 0));
319*67e74705SXin Li }
320*67e74705SXin Li
TEST_F(FormatTestSelective,AlwaysFormatsEntireMacroDefinitions)321*67e74705SXin Li TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
322*67e74705SXin Li Style.AlignEscapedNewlinesLeft = true;
323*67e74705SXin Li EXPECT_EQ("int i;\n"
324*67e74705SXin Li "#define A \\\n"
325*67e74705SXin Li " int i; \\\n"
326*67e74705SXin Li " int j\n"
327*67e74705SXin Li "int k;",
328*67e74705SXin Li format("int i;\n"
329*67e74705SXin Li "#define A \\\n"
330*67e74705SXin Li " int i ; \\\n"
331*67e74705SXin Li " int j\n"
332*67e74705SXin Li "int k;",
333*67e74705SXin Li 8, 0)); // 8: position of "#define".
334*67e74705SXin Li EXPECT_EQ("int i;\n"
335*67e74705SXin Li "#define A \\\n"
336*67e74705SXin Li " int i; \\\n"
337*67e74705SXin Li " int j\n"
338*67e74705SXin Li "int k;",
339*67e74705SXin Li format("int i;\n"
340*67e74705SXin Li "#define A \\\n"
341*67e74705SXin Li " int i ; \\\n"
342*67e74705SXin Li " int j\n"
343*67e74705SXin Li "int k;",
344*67e74705SXin Li 45, 0)); // 45: position of "j".
345*67e74705SXin Li }
346*67e74705SXin Li
TEST_F(FormatTestSelective,ReformatRegionAdjustsIndent)347*67e74705SXin Li TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
348*67e74705SXin Li EXPECT_EQ("{\n"
349*67e74705SXin Li "{\n"
350*67e74705SXin Li "a;\n"
351*67e74705SXin Li "b;\n"
352*67e74705SXin Li "}\n"
353*67e74705SXin Li "}",
354*67e74705SXin Li format("{\n"
355*67e74705SXin Li "{\n"
356*67e74705SXin Li "a;\n"
357*67e74705SXin Li " b;\n"
358*67e74705SXin Li "}\n"
359*67e74705SXin Li "}",
360*67e74705SXin Li 13, 2));
361*67e74705SXin Li EXPECT_EQ("{\n"
362*67e74705SXin Li "{\n"
363*67e74705SXin Li " a;\n"
364*67e74705SXin Li " b;\n"
365*67e74705SXin Li " c;\n"
366*67e74705SXin Li " d;\n"
367*67e74705SXin Li "}\n"
368*67e74705SXin Li "}",
369*67e74705SXin Li format("{\n"
370*67e74705SXin Li "{\n"
371*67e74705SXin Li " a;\n"
372*67e74705SXin Li " b;\n"
373*67e74705SXin Li " c;\n"
374*67e74705SXin Li " d;\n"
375*67e74705SXin Li "}\n"
376*67e74705SXin Li "}",
377*67e74705SXin Li 9, 2));
378*67e74705SXin Li EXPECT_EQ("{\n"
379*67e74705SXin Li "{\n"
380*67e74705SXin Li "public:\n"
381*67e74705SXin Li " b;\n"
382*67e74705SXin Li "}\n"
383*67e74705SXin Li "}",
384*67e74705SXin Li format("{\n"
385*67e74705SXin Li "{\n"
386*67e74705SXin Li "public:\n"
387*67e74705SXin Li " b;\n"
388*67e74705SXin Li "}\n"
389*67e74705SXin Li "}",
390*67e74705SXin Li 17, 2));
391*67e74705SXin Li EXPECT_EQ("{\n"
392*67e74705SXin Li "{\n"
393*67e74705SXin Li "a;\n"
394*67e74705SXin Li "}\n"
395*67e74705SXin Li "{\n"
396*67e74705SXin Li " b; //\n"
397*67e74705SXin Li "}\n"
398*67e74705SXin Li "}",
399*67e74705SXin Li format("{\n"
400*67e74705SXin Li "{\n"
401*67e74705SXin Li "a;\n"
402*67e74705SXin Li "}\n"
403*67e74705SXin Li "{\n"
404*67e74705SXin Li " b; //\n"
405*67e74705SXin Li "}\n"
406*67e74705SXin Li "}",
407*67e74705SXin Li 22, 2));
408*67e74705SXin Li EXPECT_EQ(" {\n"
409*67e74705SXin Li " a; //\n"
410*67e74705SXin Li " }",
411*67e74705SXin Li format(" {\n"
412*67e74705SXin Li "a; //\n"
413*67e74705SXin Li " }",
414*67e74705SXin Li 4, 2));
415*67e74705SXin Li EXPECT_EQ("void f() {}\n"
416*67e74705SXin Li "void g() {}",
417*67e74705SXin Li format("void f() {}\n"
418*67e74705SXin Li "void g() {}",
419*67e74705SXin Li 13, 0));
420*67e74705SXin Li EXPECT_EQ("int a; // comment\n"
421*67e74705SXin Li " // line 2\n"
422*67e74705SXin Li "int b;",
423*67e74705SXin Li format("int a; // comment\n"
424*67e74705SXin Li " // line 2\n"
425*67e74705SXin Li " int b;",
426*67e74705SXin Li 35, 0));
427*67e74705SXin Li
428*67e74705SXin Li EXPECT_EQ(" void f() {\n"
429*67e74705SXin Li "#define A 1\n"
430*67e74705SXin Li " }",
431*67e74705SXin Li format(" void f() {\n"
432*67e74705SXin Li " #define A 1\n" // Format this line.
433*67e74705SXin Li " }",
434*67e74705SXin Li 20, 0));
435*67e74705SXin Li EXPECT_EQ(" void f() {\n"
436*67e74705SXin Li " int i;\n"
437*67e74705SXin Li "#define A \\\n"
438*67e74705SXin Li " int i; \\\n"
439*67e74705SXin Li " int j;\n"
440*67e74705SXin Li " int k;\n"
441*67e74705SXin Li " }",
442*67e74705SXin Li format(" void f() {\n"
443*67e74705SXin Li " int i;\n"
444*67e74705SXin Li "#define A \\\n"
445*67e74705SXin Li " int i; \\\n"
446*67e74705SXin Li " int j;\n"
447*67e74705SXin Li " int k;\n" // Format this line.
448*67e74705SXin Li " }",
449*67e74705SXin Li 67, 0));
450*67e74705SXin Li
451*67e74705SXin Li Style.ColumnLimit = 11;
452*67e74705SXin Li EXPECT_EQ(" int a;\n"
453*67e74705SXin Li " void\n"
454*67e74705SXin Li " ffffff() {\n"
455*67e74705SXin Li " }",
456*67e74705SXin Li format(" int a;\n"
457*67e74705SXin Li "void ffffff() {}",
458*67e74705SXin Li 11, 0));
459*67e74705SXin Li }
460*67e74705SXin Li
TEST_F(FormatTestSelective,UnderstandsTabs)461*67e74705SXin Li TEST_F(FormatTestSelective, UnderstandsTabs) {
462*67e74705SXin Li Style.IndentWidth = 8;
463*67e74705SXin Li Style.UseTab = FormatStyle::UT_Always;
464*67e74705SXin Li Style.AlignEscapedNewlinesLeft = true;
465*67e74705SXin Li EXPECT_EQ("void f() {\n"
466*67e74705SXin Li "\tf();\n"
467*67e74705SXin Li "\tg();\n"
468*67e74705SXin Li "}",
469*67e74705SXin Li format("void f() {\n"
470*67e74705SXin Li "\tf();\n"
471*67e74705SXin Li "\tg();\n"
472*67e74705SXin Li "}",
473*67e74705SXin Li 0, 0));
474*67e74705SXin Li EXPECT_EQ("void f() {\n"
475*67e74705SXin Li "\tf();\n"
476*67e74705SXin Li "\tg();\n"
477*67e74705SXin Li "}",
478*67e74705SXin Li format("void f() {\n"
479*67e74705SXin Li "\tf();\n"
480*67e74705SXin Li "\tg();\n"
481*67e74705SXin Li "}",
482*67e74705SXin Li 16, 0));
483*67e74705SXin Li EXPECT_EQ("void f() {\n"
484*67e74705SXin Li " \tf();\n"
485*67e74705SXin Li "\tg();\n"
486*67e74705SXin Li "}",
487*67e74705SXin Li format("void f() {\n"
488*67e74705SXin Li " \tf();\n"
489*67e74705SXin Li " \tg();\n"
490*67e74705SXin Li "}",
491*67e74705SXin Li 21, 0));
492*67e74705SXin Li }
493*67e74705SXin Li
TEST_F(FormatTestSelective,StopFormattingWhenLeavingScope)494*67e74705SXin Li TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
495*67e74705SXin Li EXPECT_EQ(
496*67e74705SXin Li "void f() {\n"
497*67e74705SXin Li " if (a) {\n"
498*67e74705SXin Li " g();\n"
499*67e74705SXin Li " h();\n"
500*67e74705SXin Li "}\n"
501*67e74705SXin Li "\n"
502*67e74705SXin Li "void g() {\n"
503*67e74705SXin Li "}",
504*67e74705SXin Li format("void f() {\n"
505*67e74705SXin Li " if (a) {\n" // Assume this was added without the closing brace.
506*67e74705SXin Li " g();\n"
507*67e74705SXin Li " h();\n"
508*67e74705SXin Li "}\n"
509*67e74705SXin Li "\n"
510*67e74705SXin Li "void g() {\n" // Make sure not to format this.
511*67e74705SXin Li "}",
512*67e74705SXin Li 15, 0));
513*67e74705SXin Li }
514*67e74705SXin Li
TEST_F(FormatTestSelective,SelectivelyRequoteJavaScript)515*67e74705SXin Li TEST_F(FormatTestSelective, SelectivelyRequoteJavaScript) {
516*67e74705SXin Li Style = getGoogleStyle(FormatStyle::LK_JavaScript);
517*67e74705SXin Li EXPECT_EQ(
518*67e74705SXin Li "var x = \"a\";\n"
519*67e74705SXin Li "var x = 'a';\n"
520*67e74705SXin Li "var x = \"a\";",
521*67e74705SXin Li format("var x = \"a\";\n"
522*67e74705SXin Li "var x = \"a\";\n"
523*67e74705SXin Li "var x = \"a\";",
524*67e74705SXin Li 20, 0));
525*67e74705SXin Li }
526*67e74705SXin Li
527*67e74705SXin Li } // end namespace
528*67e74705SXin Li } // end namespace format
529*67e74705SXin Li } // end namespace clang
530