1d246a5acSDaniel Jasper //===- unittest/Format/FormatTestSelective.cpp - Formatting unit tests ----===//
2d246a5acSDaniel Jasper //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6d246a5acSDaniel Jasper //
7d246a5acSDaniel Jasper //===----------------------------------------------------------------------===//
8d246a5acSDaniel Jasper
9d246a5acSDaniel Jasper #include "FormatTestUtils.h"
10d246a5acSDaniel Jasper #include "clang/Format/Format.h"
11d246a5acSDaniel Jasper #include "llvm/Support/Debug.h"
12d246a5acSDaniel Jasper #include "gtest/gtest.h"
13d246a5acSDaniel Jasper
14d246a5acSDaniel Jasper #define DEBUG_TYPE "format-test"
15d246a5acSDaniel Jasper
16d246a5acSDaniel Jasper namespace clang {
17d246a5acSDaniel Jasper namespace format {
18d246a5acSDaniel Jasper namespace {
19d246a5acSDaniel Jasper
20d246a5acSDaniel Jasper class FormatTestSelective : public ::testing::Test {
21d246a5acSDaniel Jasper protected:
format(llvm::StringRef Code,unsigned Offset,unsigned Length)22d246a5acSDaniel Jasper std::string format(llvm::StringRef Code, unsigned Offset, unsigned Length) {
233538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << "---\n");
243538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << Code << "\n\n");
25d246a5acSDaniel Jasper std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
26bcda54b6SKrasimir Georgiev FormattingAttemptStatus Status;
27d246a5acSDaniel Jasper tooling::Replacements Replaces =
28bcda54b6SKrasimir Georgiev reformat(Style, Code, Ranges, "<stdin>", &Status);
29bcda54b6SKrasimir Georgiev EXPECT_TRUE(Status.FormatComplete) << Code << "\n\n";
304f8d9943SEric Liu auto Result = applyAllReplacements(Code, Replaces);
314f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result));
323538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
334f8d9943SEric Liu return *Result;
34d246a5acSDaniel Jasper }
35d246a5acSDaniel Jasper
36d246a5acSDaniel Jasper FormatStyle Style = getLLVMStyle();
37d246a5acSDaniel Jasper };
38d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,RemovesTrailingWhitespaceOfFormattedLine)39d246a5acSDaniel Jasper TEST_F(FormatTestSelective, RemovesTrailingWhitespaceOfFormattedLine) {
40d246a5acSDaniel Jasper EXPECT_EQ("int a;\nint b;", format("int a; \nint b;", 0, 0));
41d246a5acSDaniel Jasper EXPECT_EQ("int a;", format("int a; ", 0, 0));
42d246a5acSDaniel Jasper EXPECT_EQ("int a;\n", format("int a; \n \n \n ", 0, 0));
43d246a5acSDaniel Jasper EXPECT_EQ("int a;\nint b; ", format("int a; \nint b; ", 0, 0));
44d246a5acSDaniel Jasper }
45d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,FormatsCorrectRegionForLeadingWhitespace)46d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatsCorrectRegionForLeadingWhitespace) {
47a1036e5dSDaniel Jasper EXPECT_EQ("{int b;\n"
48a1036e5dSDaniel Jasper " int a;\n"
49a1036e5dSDaniel Jasper "}",
50a1036e5dSDaniel Jasper format("{int b;\n int a;}", 8, 0));
51a1036e5dSDaniel Jasper EXPECT_EQ("{\n"
52a1036e5dSDaniel Jasper " int b;\n"
53a1036e5dSDaniel Jasper " int a;}",
54a1036e5dSDaniel Jasper format("{int b;\n int a;}", 7, 0));
55d246a5acSDaniel Jasper
56d246a5acSDaniel Jasper Style.ColumnLimit = 12;
57d246a5acSDaniel Jasper EXPECT_EQ("#define A \\\n"
58d246a5acSDaniel Jasper " int a; \\\n"
59d246a5acSDaniel Jasper " int b;",
60d246a5acSDaniel Jasper format("#define A \\\n"
61d246a5acSDaniel Jasper " int a; \\\n"
62d246a5acSDaniel Jasper " int b;",
63d246a5acSDaniel Jasper 26, 0));
64d246a5acSDaniel Jasper EXPECT_EQ("#define A \\\n"
65d246a5acSDaniel Jasper " int a; \\\n"
66d246a5acSDaniel Jasper " int b;",
67d246a5acSDaniel Jasper format("#define A \\\n"
68d246a5acSDaniel Jasper " int a; \\\n"
69d246a5acSDaniel Jasper " int b;",
70d246a5acSDaniel Jasper 25, 0));
71d246a5acSDaniel Jasper }
72d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,FormatLineWhenInvokedOnTrailingNewline)73d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatLineWhenInvokedOnTrailingNewline) {
74d246a5acSDaniel Jasper EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 8, 0));
75d246a5acSDaniel Jasper EXPECT_EQ("int b;\n\nint a;", format("int b;\n\nint a;", 7, 0));
76d246a5acSDaniel Jasper
77d246a5acSDaniel Jasper // This might not strictly be correct, but is likely good in all practical
78d246a5acSDaniel Jasper // cases.
79d246a5acSDaniel Jasper EXPECT_EQ("int b;\nint a;", format("int b;int a;", 7, 0));
80d246a5acSDaniel Jasper }
81d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,RemovesWhitespaceWhenTriggeredOnEmptyLine)82d246a5acSDaniel Jasper TEST_F(FormatTestSelective, RemovesWhitespaceWhenTriggeredOnEmptyLine) {
83d246a5acSDaniel Jasper EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 8, 0));
84d246a5acSDaniel Jasper EXPECT_EQ("int a;\n\n int b;", format("int a;\n \n\n int b;", 9, 0));
85d246a5acSDaniel Jasper }
86d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,ReformatsMovedLines)87d246a5acSDaniel Jasper TEST_F(FormatTestSelective, ReformatsMovedLines) {
88d246a5acSDaniel Jasper EXPECT_EQ(
89d246a5acSDaniel Jasper "template <typename T> T *getFETokenInfo() const {\n"
90d246a5acSDaniel Jasper " return static_cast<T *>(FETokenInfo);\n"
91d246a5acSDaniel Jasper "}\n"
92d246a5acSDaniel Jasper "int a; // <- Should not be formatted",
93d246a5acSDaniel Jasper format(
94d246a5acSDaniel Jasper "template<typename T>\n"
95d246a5acSDaniel Jasper "T *getFETokenInfo() const { return static_cast<T*>(FETokenInfo); }\n"
96d246a5acSDaniel Jasper "int a; // <- Should not be formatted",
97d246a5acSDaniel Jasper 9, 5));
98d246a5acSDaniel Jasper }
99d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,FormatsIfWithoutCompoundStatement)100d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatsIfWithoutCompoundStatement) {
10115000a12SPaul Hoad Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_WithoutElse;
102d246a5acSDaniel Jasper EXPECT_EQ("if (a) return;", format("if(a)\nreturn;", 7, 1));
103d246a5acSDaniel Jasper EXPECT_EQ("if (a) return; // comment",
104d246a5acSDaniel Jasper format("if(a)\nreturn; // comment", 20, 1));
105d246a5acSDaniel Jasper }
106d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,FormatsCommentsLocally)107d246a5acSDaniel Jasper TEST_F(FormatTestSelective, FormatsCommentsLocally) {
108d246a5acSDaniel Jasper EXPECT_EQ("int a; // comment\n"
109d246a5acSDaniel Jasper "int b; // comment",
110d246a5acSDaniel Jasper format("int a; // comment\n"
111d246a5acSDaniel Jasper "int b; // comment",
112d246a5acSDaniel Jasper 0, 0));
113d246a5acSDaniel Jasper EXPECT_EQ("int a; // comment\n"
114d246a5acSDaniel Jasper " // line 2\n"
115d246a5acSDaniel Jasper "int b;",
116d246a5acSDaniel Jasper format("int a; // comment\n"
117d246a5acSDaniel Jasper " // line 2\n"
118d246a5acSDaniel Jasper "int b;",
119d246a5acSDaniel Jasper 28, 0));
12091834227SKrasimir Georgiev EXPECT_EQ("int a; // comment\n"
12191834227SKrasimir Georgiev "// comment 2\n"
12291834227SKrasimir Georgiev "int b;",
12391834227SKrasimir Georgiev format("int a; // comment\n"
12491834227SKrasimir Georgiev "// comment 2\n"
125ece7e95fSmydeveloperday "int b;",
126ece7e95fSmydeveloperday 28, 0));
127d246a5acSDaniel Jasper EXPECT_EQ("int aaaaaa; // comment\n"
128d246a5acSDaniel Jasper "int b;\n"
129d246a5acSDaniel Jasper "int c; // unrelated comment",
130d246a5acSDaniel Jasper format("int aaaaaa; // comment\n"
131d246a5acSDaniel Jasper "int b;\n"
132d246a5acSDaniel Jasper "int c; // unrelated comment",
133d246a5acSDaniel Jasper 31, 0));
134d246a5acSDaniel Jasper
135d246a5acSDaniel Jasper EXPECT_EQ("int a; // This\n"
136d246a5acSDaniel Jasper " // is\n"
137d246a5acSDaniel Jasper " // a",
138d246a5acSDaniel Jasper format("int a; // This\n"
139d246a5acSDaniel Jasper " // is\n"
140d246a5acSDaniel Jasper " // a",
141d246a5acSDaniel Jasper 0, 0));
142d246a5acSDaniel Jasper EXPECT_EQ("int a; // This\n"
143d246a5acSDaniel Jasper " // is\n"
144d246a5acSDaniel Jasper " // a\n"
145d246a5acSDaniel Jasper "// This is b\n"
146d246a5acSDaniel Jasper "int b;",
147d246a5acSDaniel Jasper format("int a; // This\n"
148d246a5acSDaniel Jasper " // is\n"
149d246a5acSDaniel Jasper " // a\n"
150d246a5acSDaniel Jasper "// This is b\n"
151d246a5acSDaniel Jasper "int b;",
152d246a5acSDaniel Jasper 0, 0));
153d246a5acSDaniel Jasper EXPECT_EQ("int a; // This\n"
154d246a5acSDaniel Jasper " // is\n"
155d246a5acSDaniel Jasper " // a\n"
156d246a5acSDaniel Jasper "\n"
157d246a5acSDaniel Jasper "//This is unrelated",
158d246a5acSDaniel Jasper format("int a; // This\n"
159d246a5acSDaniel Jasper " // is\n"
160d246a5acSDaniel Jasper " // a\n"
161d246a5acSDaniel Jasper "\n"
162d246a5acSDaniel Jasper "//This is unrelated",
163d246a5acSDaniel Jasper 0, 0));
164d246a5acSDaniel Jasper EXPECT_EQ("int a;\n"
165d246a5acSDaniel Jasper "// This is\n"
166d246a5acSDaniel Jasper "// not formatted. ",
167d246a5acSDaniel Jasper format("int a;\n"
168d246a5acSDaniel Jasper "// This is\n"
169d246a5acSDaniel Jasper "// not formatted. ",
170d246a5acSDaniel Jasper 0, 0));
171417fc815SDaniel Jasper EXPECT_EQ("int x; // Format this line.\n"
172417fc815SDaniel Jasper "int xx; //\n"
173417fc815SDaniel Jasper "int xxxxx; //",
174417fc815SDaniel Jasper format("int x; // Format this line.\n"
175417fc815SDaniel Jasper "int xx; //\n"
176417fc815SDaniel Jasper "int xxxxx; //",
177417fc815SDaniel Jasper 0, 0));
178d246a5acSDaniel Jasper }
179d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,ContinueReindenting)1800dddcf78SManuel Klimek TEST_F(FormatTestSelective, ContinueReindenting) {
1810dddcf78SManuel Klimek // When we change an indent, we continue formatting as long as following
1820dddcf78SManuel Klimek // lines are not indented correctly.
1830dddcf78SManuel Klimek EXPECT_EQ("int i;\n"
1840dddcf78SManuel Klimek "int b;\n"
1850dddcf78SManuel Klimek "int c;\n"
1860dddcf78SManuel Klimek "int d;\n"
1870dddcf78SManuel Klimek "int e;\n"
1880dddcf78SManuel Klimek " int f;\n",
1890dddcf78SManuel Klimek format("int i;\n"
1900dddcf78SManuel Klimek " int b;\n"
1910dddcf78SManuel Klimek " int c;\n"
1920dddcf78SManuel Klimek " int d;\n"
1930dddcf78SManuel Klimek "int e;\n"
1940dddcf78SManuel Klimek " int f;\n",
1950dddcf78SManuel Klimek 11, 0));
1960dddcf78SManuel Klimek }
1970dddcf78SManuel Klimek
TEST_F(FormatTestSelective,ReindentClosingBrace)1980dddcf78SManuel Klimek TEST_F(FormatTestSelective, ReindentClosingBrace) {
1990dddcf78SManuel Klimek EXPECT_EQ("int i;\n"
2000dddcf78SManuel Klimek "int f() {\n"
2010dddcf78SManuel Klimek " int a;\n"
2020dddcf78SManuel Klimek " int b;\n"
2030dddcf78SManuel Klimek "}\n"
2040dddcf78SManuel Klimek " int c;\n",
2050dddcf78SManuel Klimek format("int i;\n"
2060dddcf78SManuel Klimek " int f(){\n"
2070dddcf78SManuel Klimek "int a;\n"
2080dddcf78SManuel Klimek "int b;\n"
2090dddcf78SManuel Klimek " }\n"
2100dddcf78SManuel Klimek " int c;\n",
2110dddcf78SManuel Klimek 11, 0));
2120dddcf78SManuel Klimek EXPECT_EQ("void f() {\n"
2130dddcf78SManuel Klimek " if (foo) {\n"
2140dddcf78SManuel Klimek " b();\n"
2150dddcf78SManuel Klimek " } else {\n"
2160dddcf78SManuel Klimek " c();\n"
2170dddcf78SManuel Klimek " }\n"
2180dddcf78SManuel Klimek "int d;\n"
2190dddcf78SManuel Klimek "}\n",
2200dddcf78SManuel Klimek format("void f() {\n"
2210dddcf78SManuel Klimek " if (foo) {\n"
2220dddcf78SManuel Klimek "b();\n"
2230dddcf78SManuel Klimek "}else{\n"
2240dddcf78SManuel Klimek "c();\n"
2250dddcf78SManuel Klimek "}\n"
2260dddcf78SManuel Klimek "int d;\n"
2270dddcf78SManuel Klimek "}\n",
2280dddcf78SManuel Klimek 13, 0));
2290dddcf78SManuel Klimek EXPECT_EQ("int i = []() {\n"
2300dddcf78SManuel Klimek " class C {\n"
2310dddcf78SManuel Klimek " int a;\n"
2320dddcf78SManuel Klimek " int b;\n"
2330dddcf78SManuel Klimek " };\n"
2340dddcf78SManuel Klimek " int c;\n"
2350dddcf78SManuel Klimek "};\n",
2360dddcf78SManuel Klimek format("int i = []() {\n"
2370dddcf78SManuel Klimek " class C{\n"
2380dddcf78SManuel Klimek "int a;\n"
2390dddcf78SManuel Klimek "int b;\n"
2400dddcf78SManuel Klimek "};\n"
2410dddcf78SManuel Klimek "int c;\n"
2420dddcf78SManuel Klimek " };\n",
2430dddcf78SManuel Klimek 17, 0));
2440dddcf78SManuel Klimek }
2450dddcf78SManuel Klimek
TEST_F(FormatTestSelective,IndividualStatementsOfNestedBlocks)246d246a5acSDaniel Jasper TEST_F(FormatTestSelective, IndividualStatementsOfNestedBlocks) {
247d246a5acSDaniel Jasper EXPECT_EQ("DEBUG({\n"
248d246a5acSDaniel Jasper " int i;\n"
249d246a5acSDaniel Jasper " int j;\n"
250d246a5acSDaniel Jasper "});",
251d246a5acSDaniel Jasper format("DEBUG( {\n"
252d246a5acSDaniel Jasper " int i;\n"
253d246a5acSDaniel Jasper " int j;\n"
254d246a5acSDaniel Jasper "} ) ;",
255d246a5acSDaniel Jasper 20, 1));
256d246a5acSDaniel Jasper EXPECT_EQ("DEBUG( {\n"
257d246a5acSDaniel Jasper " int i;\n"
258d246a5acSDaniel Jasper " int j;\n"
259d246a5acSDaniel Jasper "} ) ;",
260d246a5acSDaniel Jasper format("DEBUG( {\n"
261d246a5acSDaniel Jasper " int i;\n"
262d246a5acSDaniel Jasper " int j;\n"
263d246a5acSDaniel Jasper "} ) ;",
264d246a5acSDaniel Jasper 41, 1));
265d246a5acSDaniel Jasper EXPECT_EQ("DEBUG( {\n"
266d246a5acSDaniel Jasper " int i;\n"
267d246a5acSDaniel Jasper " int j;\n"
268d246a5acSDaniel Jasper "} ) ;",
269d246a5acSDaniel Jasper format("DEBUG( {\n"
270d246a5acSDaniel Jasper " int i;\n"
271d246a5acSDaniel Jasper " int j;\n"
272d246a5acSDaniel Jasper "} ) ;",
273d246a5acSDaniel Jasper 41, 1));
274d246a5acSDaniel Jasper EXPECT_EQ("DEBUG({\n"
275d246a5acSDaniel Jasper " int i;\n"
276d246a5acSDaniel Jasper " int j;\n"
277d246a5acSDaniel Jasper "});",
278d246a5acSDaniel Jasper format("DEBUG( {\n"
279d246a5acSDaniel Jasper " int i;\n"
280d246a5acSDaniel Jasper " int j;\n"
281d246a5acSDaniel Jasper "} ) ;",
282d246a5acSDaniel Jasper 20, 1));
283d246a5acSDaniel Jasper
284d246a5acSDaniel Jasper EXPECT_EQ("Debug({\n"
285d246a5acSDaniel Jasper " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
286d246a5acSDaniel Jasper " return;\n"
287d246a5acSDaniel Jasper " },\n"
288d246a5acSDaniel Jasper " a);",
289d246a5acSDaniel Jasper format("Debug({\n"
290d246a5acSDaniel Jasper " if (aaaaaaaaaaaaaaaaaaaaaaaa)\n"
291d246a5acSDaniel Jasper " return;\n"
292d246a5acSDaniel Jasper " },\n"
293d246a5acSDaniel Jasper " a);",
294d246a5acSDaniel Jasper 50, 1));
295d246a5acSDaniel Jasper EXPECT_EQ("DEBUG({\n"
296d246a5acSDaniel Jasper " DEBUG({\n"
297d246a5acSDaniel Jasper " int a;\n"
298d246a5acSDaniel Jasper " int b;\n"
299d246a5acSDaniel Jasper " }) ;\n"
300d246a5acSDaniel Jasper "});",
301d246a5acSDaniel Jasper format("DEBUG({\n"
302d246a5acSDaniel Jasper " DEBUG({\n"
303d246a5acSDaniel Jasper " int a;\n"
304d246a5acSDaniel Jasper " int b;\n" // Format this line only.
305d246a5acSDaniel Jasper " }) ;\n" // Don't touch this line.
306d246a5acSDaniel Jasper "});",
307d246a5acSDaniel Jasper 35, 0));
308d246a5acSDaniel Jasper EXPECT_EQ("DEBUG({\n"
309d246a5acSDaniel Jasper " int a; //\n"
310d246a5acSDaniel Jasper "});",
311d246a5acSDaniel Jasper format("DEBUG({\n"
312d246a5acSDaniel Jasper " int a; //\n"
313d246a5acSDaniel Jasper "});",
314d246a5acSDaniel Jasper 0, 0));
315d246a5acSDaniel Jasper EXPECT_EQ("someFunction(\n"
316d246a5acSDaniel Jasper " [] {\n"
317d246a5acSDaniel Jasper " // Only with this comment.\n"
318d246a5acSDaniel Jasper " int i; // invoke formatting here.\n"
319d246a5acSDaniel Jasper " }, // force line break\n"
320d246a5acSDaniel Jasper " aaa);",
321d246a5acSDaniel Jasper format("someFunction(\n"
322d246a5acSDaniel Jasper " [] {\n"
323d246a5acSDaniel Jasper " // Only with this comment.\n"
324d246a5acSDaniel Jasper " int i; // invoke formatting here.\n"
325d246a5acSDaniel Jasper " }, // force line break\n"
326d246a5acSDaniel Jasper " aaa);",
327d246a5acSDaniel Jasper 63, 1));
328d246a5acSDaniel Jasper
329d246a5acSDaniel Jasper EXPECT_EQ("int longlongname; // comment\n"
330d246a5acSDaniel Jasper "int x = f({\n"
331d246a5acSDaniel Jasper " int x; // comment\n"
332d246a5acSDaniel Jasper " int y; // comment\n"
333d246a5acSDaniel Jasper "});",
334d246a5acSDaniel Jasper format("int longlongname; // comment\n"
335d246a5acSDaniel Jasper "int x = f({\n"
336d246a5acSDaniel Jasper " int x; // comment\n"
337d246a5acSDaniel Jasper " int y; // comment\n"
338d246a5acSDaniel Jasper "});",
339d246a5acSDaniel Jasper 65, 0));
340d246a5acSDaniel Jasper EXPECT_EQ("int s = f({\n"
341d246a5acSDaniel Jasper " class X {\n"
342d246a5acSDaniel Jasper " public:\n"
343d246a5acSDaniel Jasper " void f();\n"
344d246a5acSDaniel Jasper " };\n"
345d246a5acSDaniel Jasper "});",
346d246a5acSDaniel Jasper format("int s = f({\n"
347d246a5acSDaniel Jasper " class X {\n"
348d246a5acSDaniel Jasper " public:\n"
349d246a5acSDaniel Jasper " void f();\n"
350d246a5acSDaniel Jasper " };\n"
351d246a5acSDaniel Jasper "});",
352d246a5acSDaniel Jasper 0, 0));
35335ca66deSDaniel Jasper EXPECT_EQ("SomeFunction(\n"
35435ca66deSDaniel Jasper " [] {\n"
35535ca66deSDaniel Jasper " int i;\n"
35635ca66deSDaniel Jasper " return i;\n" // Format this line.
35735ca66deSDaniel Jasper " },\n"
35835ca66deSDaniel Jasper " [] {\n"
35935ca66deSDaniel Jasper " return 2;\n" // Don't fix this.
36035ca66deSDaniel Jasper " });",
36135ca66deSDaniel Jasper format("SomeFunction(\n"
36235ca66deSDaniel Jasper " [] {\n"
36335ca66deSDaniel Jasper " int i;\n"
36435ca66deSDaniel Jasper " return i;\n" // Format this line.
36535ca66deSDaniel Jasper " },\n"
36635ca66deSDaniel Jasper " [] {\n"
36735ca66deSDaniel Jasper " return 2;\n" // Don't fix this.
36835ca66deSDaniel Jasper " });",
36935ca66deSDaniel Jasper 40, 0));
370d246a5acSDaniel Jasper }
371d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,WrongIndent)372f83834feSDaniel Jasper TEST_F(FormatTestSelective, WrongIndent) {
373f83834feSDaniel Jasper EXPECT_EQ("namespace {\n"
374f83834feSDaniel Jasper "int i;\n"
375f83834feSDaniel Jasper "int j;\n"
376f83834feSDaniel Jasper "}",
377f83834feSDaniel Jasper format("namespace {\n"
378f83834feSDaniel Jasper " int i;\n" // Format here.
379f83834feSDaniel Jasper " int j;\n"
380f83834feSDaniel Jasper "}",
381f83834feSDaniel Jasper 15, 0));
382f83834feSDaniel Jasper EXPECT_EQ("namespace {\n"
383f83834feSDaniel Jasper " int i;\n"
384f83834feSDaniel Jasper " int j;\n"
385f83834feSDaniel Jasper "}",
386f83834feSDaniel Jasper format("namespace {\n"
387f83834feSDaniel Jasper " int i;\n"
388f83834feSDaniel Jasper " int j;\n" // Format here.
389f83834feSDaniel Jasper "}",
390f83834feSDaniel Jasper 24, 0));
391f83834feSDaniel Jasper }
392f83834feSDaniel Jasper
TEST_F(FormatTestSelective,AlwaysFormatsEntireMacroDefinitions)393d246a5acSDaniel Jasper TEST_F(FormatTestSelective, AlwaysFormatsEntireMacroDefinitions) {
3947fdbb3feSDaniel Jasper Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
395d246a5acSDaniel Jasper EXPECT_EQ("int i;\n"
396d246a5acSDaniel Jasper "#define A \\\n"
397d246a5acSDaniel Jasper " int i; \\\n"
398d246a5acSDaniel Jasper " int j\n"
399d246a5acSDaniel Jasper "int k;",
400d246a5acSDaniel Jasper format("int i;\n"
401d246a5acSDaniel Jasper "#define A \\\n"
402d246a5acSDaniel Jasper " int i ; \\\n"
403d246a5acSDaniel Jasper " int j\n"
404d246a5acSDaniel Jasper "int k;",
405d246a5acSDaniel Jasper 8, 0)); // 8: position of "#define".
406d246a5acSDaniel Jasper EXPECT_EQ("int i;\n"
407d246a5acSDaniel Jasper "#define A \\\n"
408d246a5acSDaniel Jasper " int i; \\\n"
409d246a5acSDaniel Jasper " int j\n"
410d246a5acSDaniel Jasper "int k;",
411d246a5acSDaniel Jasper format("int i;\n"
412d246a5acSDaniel Jasper "#define A \\\n"
413d246a5acSDaniel Jasper " int i ; \\\n"
414d246a5acSDaniel Jasper " int j\n"
415d246a5acSDaniel Jasper "int k;",
416d246a5acSDaniel Jasper 45, 0)); // 45: position of "j".
417d246a5acSDaniel Jasper }
418d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,ReformatRegionAdjustsIndent)419d246a5acSDaniel Jasper TEST_F(FormatTestSelective, ReformatRegionAdjustsIndent) {
420d246a5acSDaniel Jasper EXPECT_EQ("{\n"
421d246a5acSDaniel Jasper "{\n"
422d246a5acSDaniel Jasper "a;\n"
423d246a5acSDaniel Jasper "b;\n"
424d246a5acSDaniel Jasper "}\n"
425d246a5acSDaniel Jasper "}",
426d246a5acSDaniel Jasper format("{\n"
427d246a5acSDaniel Jasper "{\n"
428d246a5acSDaniel Jasper "a;\n"
429d246a5acSDaniel Jasper " b;\n"
430d246a5acSDaniel Jasper "}\n"
431d246a5acSDaniel Jasper "}",
432d246a5acSDaniel Jasper 13, 2));
433d246a5acSDaniel Jasper EXPECT_EQ("{\n"
434d246a5acSDaniel Jasper "{\n"
435d246a5acSDaniel Jasper " a;\n"
436d246a5acSDaniel Jasper " b;\n"
437a1036e5dSDaniel Jasper " c;\n"
438a1036e5dSDaniel Jasper " d;\n"
439d246a5acSDaniel Jasper "}\n"
440d246a5acSDaniel Jasper "}",
441d246a5acSDaniel Jasper format("{\n"
442d246a5acSDaniel Jasper "{\n"
443d246a5acSDaniel Jasper " a;\n"
444d246a5acSDaniel Jasper " b;\n"
445a1036e5dSDaniel Jasper " c;\n"
446a1036e5dSDaniel Jasper " d;\n"
447d246a5acSDaniel Jasper "}\n"
448d246a5acSDaniel Jasper "}",
449d246a5acSDaniel Jasper 9, 2));
450d246a5acSDaniel Jasper EXPECT_EQ("{\n"
451d246a5acSDaniel Jasper "{\n"
452d246a5acSDaniel Jasper "public:\n"
453d246a5acSDaniel Jasper " b;\n"
454d246a5acSDaniel Jasper "}\n"
455d246a5acSDaniel Jasper "}",
456d246a5acSDaniel Jasper format("{\n"
457d246a5acSDaniel Jasper "{\n"
458d246a5acSDaniel Jasper "public:\n"
459d246a5acSDaniel Jasper " b;\n"
460d246a5acSDaniel Jasper "}\n"
461d246a5acSDaniel Jasper "}",
462d246a5acSDaniel Jasper 17, 2));
463d246a5acSDaniel Jasper EXPECT_EQ("{\n"
464d246a5acSDaniel Jasper "{\n"
465d246a5acSDaniel Jasper "a;\n"
466d246a5acSDaniel Jasper "}\n"
467d246a5acSDaniel Jasper "{\n"
468d246a5acSDaniel Jasper " b; //\n"
469d246a5acSDaniel Jasper "}\n"
470d246a5acSDaniel Jasper "}",
471d246a5acSDaniel Jasper format("{\n"
472d246a5acSDaniel Jasper "{\n"
473d246a5acSDaniel Jasper "a;\n"
474d246a5acSDaniel Jasper "}\n"
475d246a5acSDaniel Jasper "{\n"
476d246a5acSDaniel Jasper " b; //\n"
477d246a5acSDaniel Jasper "}\n"
478d246a5acSDaniel Jasper "}",
479d246a5acSDaniel Jasper 22, 2));
480d246a5acSDaniel Jasper EXPECT_EQ(" {\n"
481d246a5acSDaniel Jasper " a; //\n"
482d246a5acSDaniel Jasper " }",
483d246a5acSDaniel Jasper format(" {\n"
484d246a5acSDaniel Jasper "a; //\n"
485d246a5acSDaniel Jasper " }",
486d246a5acSDaniel Jasper 4, 2));
487d246a5acSDaniel Jasper EXPECT_EQ("void f() {}\n"
488d246a5acSDaniel Jasper "void g() {}",
489d246a5acSDaniel Jasper format("void f() {}\n"
490d246a5acSDaniel Jasper "void g() {}",
491d246a5acSDaniel Jasper 13, 0));
492d246a5acSDaniel Jasper EXPECT_EQ("int a; // comment\n"
493d246a5acSDaniel Jasper " // line 2\n"
494d246a5acSDaniel Jasper "int b;",
495d246a5acSDaniel Jasper format("int a; // comment\n"
496d246a5acSDaniel Jasper " // line 2\n"
497d246a5acSDaniel Jasper " int b;",
498d246a5acSDaniel Jasper 35, 0));
499d246a5acSDaniel Jasper
500d246a5acSDaniel Jasper EXPECT_EQ(" void f() {\n"
501d246a5acSDaniel Jasper "#define A 1\n"
502d246a5acSDaniel Jasper " }",
503d246a5acSDaniel Jasper format(" void f() {\n"
504d246a5acSDaniel Jasper " #define A 1\n" // Format this line.
505d246a5acSDaniel Jasper " }",
506d246a5acSDaniel Jasper 20, 0));
507d246a5acSDaniel Jasper EXPECT_EQ(" void f() {\n"
508d246a5acSDaniel Jasper " int i;\n"
509d246a5acSDaniel Jasper "#define A \\\n"
510d246a5acSDaniel Jasper " int i; \\\n"
511d246a5acSDaniel Jasper " int j;\n"
512d246a5acSDaniel Jasper " int k;\n"
513d246a5acSDaniel Jasper " }",
514d246a5acSDaniel Jasper format(" void f() {\n"
515d246a5acSDaniel Jasper " int i;\n"
516d246a5acSDaniel Jasper "#define A \\\n"
517d246a5acSDaniel Jasper " int i; \\\n"
518d246a5acSDaniel Jasper " int j;\n"
519d246a5acSDaniel Jasper " int k;\n" // Format this line.
520d246a5acSDaniel Jasper " }",
521d246a5acSDaniel Jasper 67, 0));
522d246a5acSDaniel Jasper
523d246a5acSDaniel Jasper Style.ColumnLimit = 11;
524d246a5acSDaniel Jasper EXPECT_EQ(" int a;\n"
525d246a5acSDaniel Jasper " void\n"
526d246a5acSDaniel Jasper " ffffff() {\n"
527d246a5acSDaniel Jasper " }",
528d246a5acSDaniel Jasper format(" int a;\n"
529d246a5acSDaniel Jasper "void ffffff() {}",
530d246a5acSDaniel Jasper 11, 0));
531d246a5acSDaniel Jasper }
532d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,UnderstandsTabs)533d246a5acSDaniel Jasper TEST_F(FormatTestSelective, UnderstandsTabs) {
534d246a5acSDaniel Jasper Style.IndentWidth = 8;
535d246a5acSDaniel Jasper Style.UseTab = FormatStyle::UT_Always;
5367fdbb3feSDaniel Jasper Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
537d246a5acSDaniel Jasper EXPECT_EQ("void f() {\n"
538d246a5acSDaniel Jasper "\tf();\n"
539d246a5acSDaniel Jasper "\tg();\n"
540d246a5acSDaniel Jasper "}",
541d246a5acSDaniel Jasper format("void f() {\n"
542d246a5acSDaniel Jasper "\tf();\n"
543d246a5acSDaniel Jasper "\tg();\n"
544d246a5acSDaniel Jasper "}",
545d246a5acSDaniel Jasper 0, 0));
546d246a5acSDaniel Jasper EXPECT_EQ("void f() {\n"
547d246a5acSDaniel Jasper "\tf();\n"
548d246a5acSDaniel Jasper "\tg();\n"
549d246a5acSDaniel Jasper "}",
550d246a5acSDaniel Jasper format("void f() {\n"
551d246a5acSDaniel Jasper "\tf();\n"
552d246a5acSDaniel Jasper "\tg();\n"
553d246a5acSDaniel Jasper "}",
554d246a5acSDaniel Jasper 16, 0));
555d246a5acSDaniel Jasper EXPECT_EQ("void f() {\n"
556d246a5acSDaniel Jasper " \tf();\n"
557d246a5acSDaniel Jasper "\tg();\n"
558d246a5acSDaniel Jasper "}",
559d246a5acSDaniel Jasper format("void f() {\n"
560d246a5acSDaniel Jasper " \tf();\n"
561d246a5acSDaniel Jasper " \tg();\n"
562d246a5acSDaniel Jasper "}",
563d246a5acSDaniel Jasper 21, 0));
564d246a5acSDaniel Jasper }
565d246a5acSDaniel Jasper
TEST_F(FormatTestSelective,StopFormattingWhenLeavingScope)566f67c3246SDaniel Jasper TEST_F(FormatTestSelective, StopFormattingWhenLeavingScope) {
567f67c3246SDaniel Jasper EXPECT_EQ(
568f67c3246SDaniel Jasper "void f() {\n"
569f67c3246SDaniel Jasper " if (a) {\n"
570f67c3246SDaniel Jasper " g();\n"
571f67c3246SDaniel Jasper " h();\n"
572f67c3246SDaniel Jasper " }\n"
573f67c3246SDaniel Jasper "\n"
574f67c3246SDaniel Jasper "void g() {\n"
575f67c3246SDaniel Jasper "}",
576f67c3246SDaniel Jasper format("void f() {\n"
577f67c3246SDaniel Jasper " if (a) {\n" // Assume this was added without the closing brace.
578f67c3246SDaniel Jasper " g();\n"
579f67c3246SDaniel Jasper " h();\n"
580f67c3246SDaniel Jasper "}\n"
581f67c3246SDaniel Jasper "\n"
582f67c3246SDaniel Jasper "void g() {\n" // Make sure not to format this.
583f67c3246SDaniel Jasper "}",
584f67c3246SDaniel Jasper 15, 0));
585f67c3246SDaniel Jasper }
586f67c3246SDaniel Jasper
TEST_F(FormatTestSelective,SelectivelyRequoteJavaScript)58797439926SDaniel Jasper TEST_F(FormatTestSelective, SelectivelyRequoteJavaScript) {
58897439926SDaniel Jasper Style = getGoogleStyle(FormatStyle::LK_JavaScript);
589ece7e95fSmydeveloperday EXPECT_EQ("var x = \"a\";\n"
59097439926SDaniel Jasper "var x = 'a';\n"
59197439926SDaniel Jasper "var x = \"a\";",
59297439926SDaniel Jasper format("var x = \"a\";\n"
59397439926SDaniel Jasper "var x = \"a\";\n"
59497439926SDaniel Jasper "var x = \"a\";",
59597439926SDaniel Jasper 20, 0));
59697439926SDaniel Jasper }
59797439926SDaniel Jasper
TEST_F(FormatTestSelective,KeepsIndentAfterCommentSectionImport)598a1c30937SKrasimir Georgiev TEST_F(FormatTestSelective, KeepsIndentAfterCommentSectionImport) {
599a1c30937SKrasimir Georgiev std::string Code = "#include <a> // line 1\n" // 23 chars long
600a1c30937SKrasimir Georgiev " // line 2\n" // 23 chars long
601a1c30937SKrasimir Georgiev "\n" // this newline is char 47
602a1c30937SKrasimir Georgiev "int i;"; // this line is not indented
603a1c30937SKrasimir Georgiev EXPECT_EQ(Code, format(Code, 47, 1));
604a1c30937SKrasimir Georgiev }
605a1c30937SKrasimir Georgiev
TEST_F(FormatTestSelective,DontAssert)6060ae2464fSMarek Kurdej TEST_F(FormatTestSelective, DontAssert) {
6070ae2464fSMarek Kurdej // https://llvm.org/PR53880
6080ae2464fSMarek Kurdej std::string Code = "void f() {\n"
6090ae2464fSMarek Kurdej " return a == 8 ? 32 : 16;\n"
6100ae2464fSMarek Kurdej "}\n";
6110ae2464fSMarek Kurdej EXPECT_EQ(Code, format(Code, 40, 0));
612*14c30c70SMarek Kurdej
613*14c30c70SMarek Kurdej // https://llvm.org/PR56352
614*14c30c70SMarek Kurdej Style.CompactNamespaces = true;
615*14c30c70SMarek Kurdej Style.NamespaceIndentation = FormatStyle::NI_All;
616*14c30c70SMarek Kurdej Code = "\n"
617*14c30c70SMarek Kurdej "namespace ns1 { namespace ns2 {\n"
618*14c30c70SMarek Kurdej "}}";
619*14c30c70SMarek Kurdej EXPECT_EQ(Code, format(Code, 0, 0));
6200ae2464fSMarek Kurdej }
6210ae2464fSMarek Kurdej
622d246a5acSDaniel Jasper } // end namespace
623d246a5acSDaniel Jasper } // end namespace format
624d246a5acSDaniel Jasper } // end namespace clang
625