xref: /llvm-project/clang/unittests/Format/ConfigParseTest.cpp (revision 88934a82dced0116227e4ad9af8896d8fa0943b8)
1617277e7SBjörn Schäpers //===- unittest/Format/ConfigParseTest.cpp - Config parsing unit tests ----===//
2617277e7SBjörn Schäpers //
3617277e7SBjörn Schäpers // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4617277e7SBjörn Schäpers // See https://llvm.org/LICENSE.txt for license information.
5617277e7SBjörn Schäpers // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6617277e7SBjörn Schäpers //
7617277e7SBjörn Schäpers //===----------------------------------------------------------------------===//
8617277e7SBjörn Schäpers 
9617277e7SBjörn Schäpers #include "clang/Format/Format.h"
10617277e7SBjörn Schäpers 
11617277e7SBjörn Schäpers #include "llvm/Support/VirtualFileSystem.h"
12617277e7SBjörn Schäpers #include "gtest/gtest.h"
13617277e7SBjörn Schäpers 
14617277e7SBjörn Schäpers namespace clang {
15617277e7SBjörn Schäpers namespace format {
16617277e7SBjörn Schäpers namespace {
17617277e7SBjörn Schäpers 
18617277e7SBjörn Schäpers FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
19617277e7SBjörn Schäpers 
20617277e7SBjörn Schäpers #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
21617277e7SBjörn Schäpers   for (size_t i = 1; i < Styles.size(); ++i)                                   \
22617277e7SBjörn Schäpers   EXPECT_EQ(Styles[0], Styles[i])                                              \
23617277e7SBjörn Schäpers       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
24617277e7SBjörn Schäpers 
25617277e7SBjörn Schäpers TEST(ConfigParseTest, GetsPredefinedStyleByName) {
26617277e7SBjörn Schäpers   SmallVector<FormatStyle, 3> Styles;
27617277e7SBjörn Schäpers   Styles.resize(3);
28617277e7SBjörn Schäpers 
29617277e7SBjörn Schäpers   Styles[0] = getLLVMStyle();
30617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
31617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
32617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
33617277e7SBjörn Schäpers 
34617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle();
35617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
36617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
37617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
38617277e7SBjörn Schäpers 
39617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
40617277e7SBjörn Schäpers   EXPECT_TRUE(
41617277e7SBjörn Schäpers       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
42617277e7SBjörn Schäpers   EXPECT_TRUE(
43617277e7SBjörn Schäpers       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
44617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
45617277e7SBjörn Schäpers 
46617277e7SBjörn Schäpers   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
47617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
48617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
49617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
50617277e7SBjörn Schäpers 
51617277e7SBjörn Schäpers   Styles[0] = getMozillaStyle();
52617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
53617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
54617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
55617277e7SBjörn Schäpers 
56617277e7SBjörn Schäpers   Styles[0] = getWebKitStyle();
57617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
58617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
59617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
60617277e7SBjörn Schäpers 
61617277e7SBjörn Schäpers   Styles[0] = getGNUStyle();
62617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
63617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
64617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
65617277e7SBjörn Schäpers 
660374bbbaSOwen Pan   Styles[0] = getClangFormatStyle();
670374bbbaSOwen Pan   EXPECT_TRUE(
680374bbbaSOwen Pan       getPredefinedStyle("clang-format", FormatStyle::LK_Cpp, &Styles[1]));
690374bbbaSOwen Pan   EXPECT_TRUE(
700374bbbaSOwen Pan       getPredefinedStyle("Clang-format", FormatStyle::LK_Cpp, &Styles[2]));
710374bbbaSOwen Pan   EXPECT_ALL_STYLES_EQUAL(Styles);
720374bbbaSOwen Pan 
73617277e7SBjörn Schäpers   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
74617277e7SBjörn Schäpers }
75617277e7SBjörn Schäpers 
76617277e7SBjörn Schäpers TEST(ConfigParseTest, GetsCorrectBasedOnStyle) {
77617277e7SBjörn Schäpers   SmallVector<FormatStyle, 8> Styles;
78617277e7SBjörn Schäpers   Styles.resize(2);
79617277e7SBjörn Schäpers 
80617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle();
81617277e7SBjörn Schäpers   Styles[1] = getLLVMStyle();
82617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
83617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
84617277e7SBjörn Schäpers 
85617277e7SBjörn Schäpers   Styles.resize(5);
86617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
87617277e7SBjörn Schäpers   Styles[1] = getLLVMStyle();
88617277e7SBjörn Schäpers   Styles[1].Language = FormatStyle::LK_JavaScript;
89617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
90617277e7SBjörn Schäpers 
91617277e7SBjörn Schäpers   Styles[2] = getLLVMStyle();
92617277e7SBjörn Schäpers   Styles[2].Language = FormatStyle::LK_JavaScript;
93617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
94617277e7SBjörn Schäpers                                   "BasedOnStyle: Google",
95617277e7SBjörn Schäpers                                   &Styles[2])
96617277e7SBjörn Schäpers                    .value());
97617277e7SBjörn Schäpers 
98617277e7SBjörn Schäpers   Styles[3] = getLLVMStyle();
99617277e7SBjörn Schäpers   Styles[3].Language = FormatStyle::LK_JavaScript;
100617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
101617277e7SBjörn Schäpers                                   "Language: JavaScript",
102617277e7SBjörn Schäpers                                   &Styles[3])
103617277e7SBjörn Schäpers                    .value());
104617277e7SBjörn Schäpers 
105617277e7SBjörn Schäpers   Styles[4] = getLLVMStyle();
106617277e7SBjörn Schäpers   Styles[4].Language = FormatStyle::LK_JavaScript;
107617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("---\n"
108617277e7SBjörn Schäpers                                   "BasedOnStyle: LLVM\n"
109617277e7SBjörn Schäpers                                   "IndentWidth: 123\n"
110617277e7SBjörn Schäpers                                   "---\n"
111617277e7SBjörn Schäpers                                   "BasedOnStyle: Google\n"
112617277e7SBjörn Schäpers                                   "Language: JavaScript",
113617277e7SBjörn Schäpers                                   &Styles[4])
114617277e7SBjörn Schäpers                    .value());
115617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
116617277e7SBjörn Schäpers }
117617277e7SBjörn Schäpers 
118617277e7SBjörn Schäpers #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
119617277e7SBjörn Schäpers   Style.FIELD = false;                                                         \
120617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
121617277e7SBjörn Schäpers   EXPECT_TRUE(Style.FIELD);                                                    \
122617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
123617277e7SBjörn Schäpers   EXPECT_FALSE(Style.FIELD)
124617277e7SBjörn Schäpers 
125617277e7SBjörn Schäpers #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
126617277e7SBjörn Schäpers 
127617277e7SBjörn Schäpers #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
128617277e7SBjörn Schäpers   Style.STRUCT.FIELD = false;                                                  \
129617277e7SBjörn Schäpers   EXPECT_EQ(0,                                                                 \
130617277e7SBjörn Schäpers             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
131617277e7SBjörn Schäpers                 .value());                                                     \
132617277e7SBjörn Schäpers   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
133617277e7SBjörn Schäpers   EXPECT_EQ(0,                                                                 \
134617277e7SBjörn Schäpers             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
135617277e7SBjörn Schäpers                 .value());                                                     \
136617277e7SBjörn Schäpers   EXPECT_FALSE(Style.STRUCT.FIELD)
137617277e7SBjörn Schäpers 
138617277e7SBjörn Schäpers #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
139617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
140617277e7SBjörn Schäpers 
141617277e7SBjörn Schäpers #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
142617277e7SBjörn Schäpers   EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!";          \
143617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
144617277e7SBjörn Schäpers   EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!"
145617277e7SBjörn Schäpers 
146617277e7SBjörn Schäpers #define CHECK_PARSE_NESTED_VALUE(TEXT, STRUCT, FIELD, VALUE)                   \
147617277e7SBjörn Schäpers   EXPECT_NE(VALUE, Style.STRUCT.FIELD) << "Initial value already the same!";   \
148617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(#STRUCT ":\n  " TEXT, &Style).value());      \
149617277e7SBjörn Schäpers   EXPECT_EQ(VALUE, Style.STRUCT.FIELD) << "Unexpected value after parsing!"
150617277e7SBjörn Schäpers 
151617277e7SBjörn Schäpers TEST(ConfigParseTest, ParsesConfigurationBools) {
152617277e7SBjörn Schäpers   FormatStyle Style = {};
153617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
154617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
155617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
156617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
15769209e30SBackl1ght   CHECK_PARSE_BOOL(AllowShortCompoundRequirementOnASingleLine);
158617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
159617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
160617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BinPackArguments);
161617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BinPackParameters);
162617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
163617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
164617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BreakStringLiterals);
165617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(CompactNamespaces);
166617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(DerivePointerAlignment);
167617277e7SBjörn Schäpers   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
168617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(DisableFormat);
169617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentAccessModifiers);
170617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentCaseLabels);
171617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentCaseBlocks);
172617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentGotoLabels);
173617277e7SBjörn Schäpers   CHECK_PARSE_BOOL_FIELD(IndentRequiresClause, "IndentRequires");
174617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentRequiresClause);
175617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
176617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(InsertBraces);
1772c6ecc9dSOwen Pan   CHECK_PARSE_BOOL(InsertNewlineAtEOF);
178829ed96bSOwen Pan   CHECK_PARSE_BOOL(KeepEmptyLinesAtEOF);
179617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(KeepEmptyLinesAtTheStartOfBlocks);
180617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
181617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
182617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
183617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(ReflowComments);
184617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(RemoveBracesLLVM);
185617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(RemoveSemicolon);
186617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
187617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
188617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
189617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
190617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
191617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
192617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
193617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeCaseColon);
194617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
195617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
196617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
197af98f3b1Smydeveloperday   CHECK_PARSE_BOOL(SpaceBeforeJsonColon);
198617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
199617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
20074cc4389Ssstwcw   CHECK_PARSE_BOOL(VerilogBreakBetweenInstancePorts);
201617277e7SBjörn Schäpers 
20274720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, Enabled);
20374720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements,
20474720d1bSGalen Elias                           AcrossEmptyLines);
20574720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AcrossComments);
20674720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AlignCaseColons);
207617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
208617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
209617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
210617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
211617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
212617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
213617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
214617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
215617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
216617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
217617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
218617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
219617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile);
220617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
221617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
222617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
223617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
224617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterControlStatements);
225617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterForeachMacros);
226617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions,
227617277e7SBjörn Schäpers                           AfterFunctionDeclarationName);
228617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions,
229617277e7SBjörn Schäpers                           AfterFunctionDefinitionName);
230617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterIfMacros);
231617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterOverloadedOperator);
232617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, BeforeNonEmptyParentheses);
233c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InCStyleCasts);
234c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InConditionalStatements);
235c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InEmptyParentheses);
236c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, Other);
237617277e7SBjörn Schäpers }
238617277e7SBjörn Schäpers 
239617277e7SBjörn Schäpers #undef CHECK_PARSE_BOOL
240617277e7SBjörn Schäpers 
241617277e7SBjörn Schäpers TEST(ConfigParseTest, ParsesConfiguration) {
242617277e7SBjörn Schäpers   FormatStyle Style = {};
243617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
244617277e7SBjörn Schäpers   CHECK_PARSE("AccessModifierOffset: -1234", AccessModifierOffset, -1234);
245617277e7SBjörn Schäpers   CHECK_PARSE("ConstructorInitializerIndentWidth: 1234",
246617277e7SBjörn Schäpers               ConstructorInitializerIndentWidth, 1234u);
247617277e7SBjörn Schäpers   CHECK_PARSE("ObjCBlockIndentWidth: 1234", ObjCBlockIndentWidth, 1234u);
248617277e7SBjörn Schäpers   CHECK_PARSE("ColumnLimit: 1234", ColumnLimit, 1234u);
249617277e7SBjörn Schäpers   CHECK_PARSE("MaxEmptyLinesToKeep: 1234", MaxEmptyLinesToKeep, 1234u);
250617277e7SBjörn Schäpers   CHECK_PARSE("PenaltyBreakAssignment: 1234", PenaltyBreakAssignment, 1234u);
251617277e7SBjörn Schäpers   CHECK_PARSE("PenaltyBreakBeforeFirstCallParameter: 1234",
252617277e7SBjörn Schäpers               PenaltyBreakBeforeFirstCallParameter, 1234u);
253617277e7SBjörn Schäpers   CHECK_PARSE("PenaltyBreakTemplateDeclaration: 1234",
254617277e7SBjörn Schäpers               PenaltyBreakTemplateDeclaration, 1234u);
255617277e7SBjörn Schäpers   CHECK_PARSE("PenaltyBreakOpenParenthesis: 1234", PenaltyBreakOpenParenthesis,
256617277e7SBjörn Schäpers               1234u);
257617277e7SBjörn Schäpers   CHECK_PARSE("PenaltyExcessCharacter: 1234", PenaltyExcessCharacter, 1234u);
258617277e7SBjörn Schäpers   CHECK_PARSE("PenaltyReturnTypeOnItsOwnLine: 1234",
259617277e7SBjörn Schäpers               PenaltyReturnTypeOnItsOwnLine, 1234u);
260617277e7SBjörn Schäpers   CHECK_PARSE("SpacesBeforeTrailingComments: 1234",
261617277e7SBjörn Schäpers               SpacesBeforeTrailingComments, 1234u);
262617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 32", IndentWidth, 32u);
263617277e7SBjörn Schäpers   CHECK_PARSE("ContinuationIndentWidth: 11", ContinuationIndentWidth, 11u);
264c12aa69aSJon Phillips   CHECK_PARSE("BracedInitializerIndentWidth: 34", BracedInitializerIndentWidth,
265c12aa69aSJon Phillips               34);
266617277e7SBjörn Schäpers   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
267617277e7SBjörn Schäpers 
268617277e7SBjörn Schäpers   Style.QualifierAlignment = FormatStyle::QAS_Right;
269617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Leave", QualifierAlignment,
270617277e7SBjörn Schäpers               FormatStyle::QAS_Leave);
271617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Right", QualifierAlignment,
272617277e7SBjörn Schäpers               FormatStyle::QAS_Right);
273617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Left", QualifierAlignment,
274617277e7SBjörn Schäpers               FormatStyle::QAS_Left);
275617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Custom", QualifierAlignment,
276617277e7SBjörn Schäpers               FormatStyle::QAS_Custom);
277617277e7SBjörn Schäpers 
278617277e7SBjörn Schäpers   Style.QualifierOrder.clear();
279617277e7SBjörn Schäpers   CHECK_PARSE("QualifierOrder: [ const, volatile, type ]", QualifierOrder,
280617277e7SBjörn Schäpers               std::vector<std::string>({"const", "volatile", "type"}));
281617277e7SBjörn Schäpers   Style.QualifierOrder.clear();
282617277e7SBjörn Schäpers   CHECK_PARSE("QualifierOrder: [const, type]", QualifierOrder,
283617277e7SBjörn Schäpers               std::vector<std::string>({"const", "type"}));
284617277e7SBjörn Schäpers   Style.QualifierOrder.clear();
285617277e7SBjörn Schäpers   CHECK_PARSE("QualifierOrder: [volatile, type]", QualifierOrder,
286617277e7SBjörn Schäpers               std::vector<std::string>({"volatile", "type"}));
287617277e7SBjörn Schäpers 
288617277e7SBjörn Schäpers #define CHECK_ALIGN_CONSECUTIVE(FIELD)                                         \
289617277e7SBjörn Schäpers   do {                                                                         \
290617277e7SBjörn Schäpers     Style.FIELD.Enabled = true;                                                \
291617277e7SBjörn Schäpers     CHECK_PARSE(#FIELD ": None", FIELD,                                        \
292617277e7SBjörn Schäpers                 FormatStyle::AlignConsecutiveStyle(                            \
293617277e7SBjörn Schäpers                     {/*Enabled=*/false, /*AcrossEmptyLines=*/false,            \
294617277e7SBjörn Schäpers                      /*AcrossComments=*/false, /*AlignCompound=*/false,        \
295617277e7SBjörn Schäpers                      /*PadOperators=*/true}));                                 \
296617277e7SBjörn Schäpers     CHECK_PARSE(#FIELD ": Consecutive", FIELD,                                 \
297617277e7SBjörn Schäpers                 FormatStyle::AlignConsecutiveStyle(                            \
298617277e7SBjörn Schäpers                     {/*Enabled=*/true, /*AcrossEmptyLines=*/false,             \
299617277e7SBjörn Schäpers                      /*AcrossComments=*/false, /*AlignCompound=*/false,        \
300617277e7SBjörn Schäpers                      /*PadOperators=*/true}));                                 \
301617277e7SBjörn Schäpers     CHECK_PARSE(#FIELD ": AcrossEmptyLines", FIELD,                            \
302617277e7SBjörn Schäpers                 FormatStyle::AlignConsecutiveStyle(                            \
303617277e7SBjörn Schäpers                     {/*Enabled=*/true, /*AcrossEmptyLines=*/true,              \
304617277e7SBjörn Schäpers                      /*AcrossComments=*/false, /*AlignCompound=*/false,        \
305617277e7SBjörn Schäpers                      /*PadOperators=*/true}));                                 \
306617277e7SBjörn Schäpers     CHECK_PARSE(#FIELD ": AcrossEmptyLinesAndComments", FIELD,                 \
307617277e7SBjörn Schäpers                 FormatStyle::AlignConsecutiveStyle(                            \
308617277e7SBjörn Schäpers                     {/*Enabled=*/true, /*AcrossEmptyLines=*/true,              \
309617277e7SBjörn Schäpers                      /*AcrossComments=*/true, /*AlignCompound=*/false,         \
310617277e7SBjörn Schäpers                      /*PadOperators=*/true}));                                 \
311617277e7SBjörn Schäpers     /* For backwards compability, false / true should still parse */           \
312617277e7SBjörn Schäpers     CHECK_PARSE(#FIELD ": false", FIELD,                                       \
313617277e7SBjörn Schäpers                 FormatStyle::AlignConsecutiveStyle(                            \
314617277e7SBjörn Schäpers                     {/*Enabled=*/false, /*AcrossEmptyLines=*/false,            \
315617277e7SBjörn Schäpers                      /*AcrossComments=*/false, /*AlignCompound=*/false,        \
316617277e7SBjörn Schäpers                      /*PadOperators=*/true}));                                 \
317617277e7SBjörn Schäpers     CHECK_PARSE(#FIELD ": true", FIELD,                                        \
318617277e7SBjörn Schäpers                 FormatStyle::AlignConsecutiveStyle(                            \
319617277e7SBjörn Schäpers                     {/*Enabled=*/true, /*AcrossEmptyLines=*/false,             \
320617277e7SBjörn Schäpers                      /*AcrossComments=*/false, /*AlignCompound=*/false,        \
321617277e7SBjörn Schäpers                      /*PadOperators=*/true}));                                 \
322617277e7SBjörn Schäpers                                                                                \
323617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, Enabled);                                   \
324617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, AcrossEmptyLines);                          \
325617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, AcrossComments);                            \
326617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, AlignCompound);                             \
327617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, PadOperators);                              \
328617277e7SBjörn Schäpers   } while (false)
329617277e7SBjörn Schäpers 
330617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveAssignments);
331617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveBitFields);
332617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveMacros);
333617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveDeclarations);
334617277e7SBjörn Schäpers 
335617277e7SBjörn Schäpers #undef CHECK_ALIGN_CONSECUTIVE
336617277e7SBjörn Schäpers 
337617277e7SBjörn Schäpers   Style.PointerAlignment = FormatStyle::PAS_Middle;
338617277e7SBjörn Schäpers   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
339617277e7SBjörn Schäpers               FormatStyle::PAS_Left);
340617277e7SBjörn Schäpers   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
341617277e7SBjörn Schäpers               FormatStyle::PAS_Right);
342617277e7SBjörn Schäpers   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
343617277e7SBjörn Schäpers               FormatStyle::PAS_Middle);
344617277e7SBjörn Schäpers   Style.ReferenceAlignment = FormatStyle::RAS_Middle;
345617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Pointer", ReferenceAlignment,
346617277e7SBjörn Schäpers               FormatStyle::RAS_Pointer);
347617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Left", ReferenceAlignment,
348617277e7SBjörn Schäpers               FormatStyle::RAS_Left);
349617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Right", ReferenceAlignment,
350617277e7SBjörn Schäpers               FormatStyle::RAS_Right);
351617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Middle", ReferenceAlignment,
352617277e7SBjörn Schäpers               FormatStyle::RAS_Middle);
353617277e7SBjörn Schäpers   // For backward compatibility:
354617277e7SBjörn Schäpers   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
355617277e7SBjörn Schäpers               FormatStyle::PAS_Left);
356617277e7SBjörn Schäpers   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
357617277e7SBjörn Schäpers               FormatStyle::PAS_Right);
358617277e7SBjörn Schäpers   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
359617277e7SBjörn Schäpers               FormatStyle::PAS_Middle);
360617277e7SBjörn Schäpers 
361617277e7SBjörn Schäpers   Style.Standard = FormatStyle::LS_Auto;
362617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
363617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
364617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
365617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
366617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
367617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
368617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
369617277e7SBjörn Schäpers   // Legacy aliases:
370617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
371617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
372617277e7SBjörn Schäpers   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
373617277e7SBjörn Schäpers   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
374617277e7SBjörn Schäpers 
375617277e7SBjörn Schäpers   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
376617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
377617277e7SBjörn Schäpers               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
378617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
379617277e7SBjörn Schäpers               FormatStyle::BOS_None);
380617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
381617277e7SBjörn Schäpers               FormatStyle::BOS_All);
382617277e7SBjörn Schäpers   // For backward compatibility:
383617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
384617277e7SBjörn Schäpers               FormatStyle::BOS_None);
385617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
386617277e7SBjörn Schäpers               FormatStyle::BOS_All);
387617277e7SBjörn Schäpers 
388617277e7SBjörn Schäpers   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
389617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
390617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
391617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
392617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
393617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
394617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
395617277e7SBjörn Schäpers   // For backward compatibility:
396617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
397617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
398617277e7SBjörn Schäpers 
399617277e7SBjörn Schäpers   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
400617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: AfterComma", BreakInheritanceList,
401617277e7SBjörn Schäpers               FormatStyle::BILS_AfterComma);
402617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
403617277e7SBjörn Schäpers               FormatStyle::BILS_BeforeComma);
404617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
405617277e7SBjörn Schäpers               FormatStyle::BILS_AfterColon);
406617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
407617277e7SBjörn Schäpers               FormatStyle::BILS_BeforeColon);
408617277e7SBjörn Schäpers   // For backward compatibility:
409617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
410617277e7SBjörn Schäpers               FormatStyle::BILS_BeforeComma);
411617277e7SBjörn Schäpers 
412617277e7SBjörn Schäpers   Style.PackConstructorInitializers = FormatStyle::PCIS_BinPack;
413617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: Never", PackConstructorInitializers,
414617277e7SBjörn Schäpers               FormatStyle::PCIS_Never);
415617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: BinPack",
416617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_BinPack);
417617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: CurrentLine",
418617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
419617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: NextLine",
420617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_NextLine);
421c24cdd58SBackl1ght   CHECK_PARSE("PackConstructorInitializers: NextLineOnly",
422c24cdd58SBackl1ght               PackConstructorInitializers, FormatStyle::PCIS_NextLineOnly);
423617277e7SBjörn Schäpers   // For backward compatibility:
424617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: Google\n"
425617277e7SBjörn Schäpers               "ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
426617277e7SBjörn Schäpers               "AllowAllConstructorInitializersOnNextLine: false",
427617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
428617277e7SBjörn Schäpers   Style.PackConstructorInitializers = FormatStyle::PCIS_NextLine;
429617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: Google\n"
430617277e7SBjörn Schäpers               "ConstructorInitializerAllOnOneLineOrOnePerLine: false",
431617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_BinPack);
432617277e7SBjörn Schäpers   CHECK_PARSE("ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
433617277e7SBjörn Schäpers               "AllowAllConstructorInitializersOnNextLine: true",
434617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_NextLine);
435617277e7SBjörn Schäpers   Style.PackConstructorInitializers = FormatStyle::PCIS_BinPack;
436617277e7SBjörn Schäpers   CHECK_PARSE("ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
437617277e7SBjörn Schäpers               "AllowAllConstructorInitializersOnNextLine: false",
438617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
439617277e7SBjörn Schäpers 
440617277e7SBjörn Schäpers   Style.EmptyLineBeforeAccessModifier = FormatStyle::ELBAMS_LogicalBlock;
441617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: Never",
442617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_Never);
443617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: Leave",
444617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_Leave);
445617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: LogicalBlock",
446617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_LogicalBlock);
447617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: Always",
448617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_Always);
449617277e7SBjörn Schäpers 
450617277e7SBjörn Schäpers   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
451617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
452617277e7SBjörn Schäpers               FormatStyle::BAS_Align);
453617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
454617277e7SBjörn Schäpers               FormatStyle::BAS_DontAlign);
455617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
456617277e7SBjörn Schäpers               FormatStyle::BAS_AlwaysBreak);
457617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: BlockIndent", AlignAfterOpenBracket,
458617277e7SBjörn Schäpers               FormatStyle::BAS_BlockIndent);
459617277e7SBjörn Schäpers   // For backward compatibility:
460617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
461617277e7SBjörn Schäpers               FormatStyle::BAS_DontAlign);
462617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
463617277e7SBjörn Schäpers               FormatStyle::BAS_Align);
464617277e7SBjörn Schäpers 
465617277e7SBjörn Schäpers   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
466617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
467617277e7SBjörn Schäpers               FormatStyle::ENAS_DontAlign);
468617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
469617277e7SBjörn Schäpers               FormatStyle::ENAS_Left);
470617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
471617277e7SBjörn Schäpers               FormatStyle::ENAS_Right);
472617277e7SBjörn Schäpers   // For backward compatibility:
473617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
474617277e7SBjörn Schäpers               FormatStyle::ENAS_Left);
475617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
476617277e7SBjörn Schäpers               FormatStyle::ENAS_Right);
477617277e7SBjörn Schäpers 
478617277e7SBjörn Schäpers   Style.AlignOperands = FormatStyle::OAS_Align;
479617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: DontAlign", AlignOperands,
480617277e7SBjörn Schäpers               FormatStyle::OAS_DontAlign);
481617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align);
482617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands,
483617277e7SBjörn Schäpers               FormatStyle::OAS_AlignAfterOperator);
484617277e7SBjörn Schäpers   // For backward compatibility:
485617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: false", AlignOperands,
486617277e7SBjörn Schäpers               FormatStyle::OAS_DontAlign);
487617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align);
488617277e7SBjörn Schäpers 
489617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: Leave", AlignTrailingComments,
490617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
4912bcfff67SOwen Pan                   {FormatStyle::TCAS_Leave, 0}));
492617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: Always", AlignTrailingComments,
493617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
4942bcfff67SOwen Pan                   {FormatStyle::TCAS_Always, 0}));
495617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: Never", AlignTrailingComments,
496617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
4972bcfff67SOwen Pan                   {FormatStyle::TCAS_Never, 0}));
498617277e7SBjörn Schäpers   // For backwards compatibility
499617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: true", AlignTrailingComments,
500617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5012bcfff67SOwen Pan                   {FormatStyle::TCAS_Always, 0}));
502617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: false", AlignTrailingComments,
503617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5042bcfff67SOwen Pan                   {FormatStyle::TCAS_Never, 0}));
505617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("Kind: Always", AlignTrailingComments, Kind,
506617277e7SBjörn Schäpers                            FormatStyle::TCAS_Always);
507617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("Kind: Never", AlignTrailingComments, Kind,
508617277e7SBjörn Schäpers                            FormatStyle::TCAS_Never);
509617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("Kind: Leave", AlignTrailingComments, Kind,
510617277e7SBjörn Schäpers                            FormatStyle::TCAS_Leave);
511617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("OverEmptyLines: 1234", AlignTrailingComments,
512617277e7SBjörn Schäpers                            OverEmptyLines, 1234u);
513617277e7SBjörn Schäpers 
514617277e7SBjörn Schäpers   Style.UseTab = FormatStyle::UT_ForIndentation;
515617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
516617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
517617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
518617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
519617277e7SBjörn Schäpers               FormatStyle::UT_ForContinuationAndIndentation);
520617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
521617277e7SBjörn Schäpers               FormatStyle::UT_AlignWithSpaces);
522617277e7SBjörn Schäpers   // For backward compatibility:
523617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
524617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
525617277e7SBjörn Schäpers 
526617277e7SBjörn Schäpers   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
527617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
528617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
529617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
530617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
531617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
532617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
533617277e7SBjörn Schäpers   // For backward compatibility:
534617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
535617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
536617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
537617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
538617277e7SBjörn Schäpers 
539617277e7SBjörn Schäpers   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
540617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
541617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
542617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
543617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
544617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
545617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
546617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
547617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
548617277e7SBjörn Schäpers   // For backward compatibility:
549617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
550617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
551617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
552617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
553617277e7SBjörn Schäpers 
55495c1a174SBackl1ght   Style.AllowShortLambdasOnASingleLine = FormatStyle::SLS_All;
55595c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: None",
55695c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_None);
55795c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: Empty",
55895c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_Empty);
55995c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: Inline",
56095c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_Inline);
56195c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: All",
56295c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_All);
56395c1a174SBackl1ght   // For backward compatibility:
56495c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: false",
56595c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_None);
56695c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: true",
56795c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_All);
56895c1a174SBackl1ght 
569617277e7SBjörn Schäpers   Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both;
570617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: Default",
571617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default);
572617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: Before",
573617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before);
574617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: After",
575617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After);
576617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: Both",
577617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both);
578617277e7SBjörn Schäpers 
579617277e7SBjörn Schäpers   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
580617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
581617277e7SBjörn Schäpers               FormatStyle::SBPO_Never);
582617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
583617277e7SBjörn Schäpers               FormatStyle::SBPO_Always);
584617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
585617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatements);
586617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: ControlStatementsExceptControlMacros",
587617277e7SBjörn Schäpers               SpaceBeforeParens,
588617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatementsExceptControlMacros);
589617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
590617277e7SBjörn Schäpers               FormatStyle::SBPO_NonEmptyParentheses);
591617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: Custom", SpaceBeforeParens,
592617277e7SBjörn Schäpers               FormatStyle::SBPO_Custom);
593617277e7SBjörn Schäpers   // For backward compatibility:
594617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
595617277e7SBjörn Schäpers               FormatStyle::SBPO_Never);
596617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
597617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatements);
598617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: ControlStatementsExceptForEachMacros",
599617277e7SBjörn Schäpers               SpaceBeforeParens,
600617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatementsExceptControlMacros);
601617277e7SBjörn Schäpers 
6027c15dd60SOmar Ahmed   Style.SpaceBeforeParens = FormatStyle::SBPO_Custom;
6037c15dd60SOmar Ahmed   Style.SpaceBeforeParensOptions.AfterPlacementOperator =
6047c15dd60SOmar Ahmed       FormatStyle::SpaceBeforeParensCustom::APO_Always;
6057c15dd60SOmar Ahmed   CHECK_PARSE("SpaceBeforeParensOptions:\n"
6067c15dd60SOmar Ahmed               "  AfterPlacementOperator: Never",
6077c15dd60SOmar Ahmed               SpaceBeforeParensOptions.AfterPlacementOperator,
6087c15dd60SOmar Ahmed               FormatStyle::SpaceBeforeParensCustom::APO_Never);
6097c15dd60SOmar Ahmed 
6107c15dd60SOmar Ahmed   CHECK_PARSE("SpaceBeforeParensOptions:\n"
6117c15dd60SOmar Ahmed               "  AfterPlacementOperator: Always",
6127c15dd60SOmar Ahmed               SpaceBeforeParensOptions.AfterPlacementOperator,
6137c15dd60SOmar Ahmed               FormatStyle::SpaceBeforeParensCustom::APO_Always);
6147c15dd60SOmar Ahmed 
6157c15dd60SOmar Ahmed   CHECK_PARSE("SpaceBeforeParensOptions:\n"
6167c15dd60SOmar Ahmed               "  AfterPlacementOperator: Leave",
6177c15dd60SOmar Ahmed               SpaceBeforeParensOptions.AfterPlacementOperator,
6187c15dd60SOmar Ahmed               FormatStyle::SpaceBeforeParensCustom::APO_Leave);
6197c15dd60SOmar Ahmed 
620c669541cSGedare Bloom   // For backward compatibility:
621c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
622c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
623c669541cSGedare Bloom   CHECK_PARSE("SpacesInParentheses: true", SpacesInParens,
624c669541cSGedare Bloom               FormatStyle::SIPO_Custom);
625c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
626c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
627c669541cSGedare Bloom   CHECK_PARSE("SpacesInParentheses: true", SpacesInParensOptions,
628c669541cSGedare Bloom               FormatStyle::SpacesInParensCustom(true, false, false, true));
629c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
630c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
631c669541cSGedare Bloom   CHECK_PARSE("SpacesInConditionalStatement: true", SpacesInParensOptions,
632c669541cSGedare Bloom               FormatStyle::SpacesInParensCustom(true, false, false, false));
633c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
634c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
635c669541cSGedare Bloom   CHECK_PARSE("SpacesInCStyleCastParentheses: true", SpacesInParensOptions,
636c669541cSGedare Bloom               FormatStyle::SpacesInParensCustom(false, true, false, false));
637c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
638c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
639c669541cSGedare Bloom   CHECK_PARSE("SpaceInEmptyParentheses: true", SpacesInParensOptions,
640c669541cSGedare Bloom               FormatStyle::SpacesInParensCustom(false, false, true, false));
641c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
642c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
643c669541cSGedare Bloom 
644617277e7SBjörn Schäpers   Style.ColumnLimit = 123;
645617277e7SBjörn Schäpers   FormatStyle BaseStyle = getLLVMStyle();
646617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
647617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
648617277e7SBjörn Schäpers 
649617277e7SBjörn Schäpers   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
650617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
651617277e7SBjörn Schäpers               FormatStyle::BS_Attach);
652617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
653617277e7SBjörn Schäpers               FormatStyle::BS_Linux);
654617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
655617277e7SBjörn Schäpers               FormatStyle::BS_Mozilla);
656617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
657617277e7SBjörn Schäpers               FormatStyle::BS_Stroustrup);
658617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
659617277e7SBjörn Schäpers               FormatStyle::BS_Allman);
660617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
661617277e7SBjörn Schäpers               FormatStyle::BS_Whitesmiths);
662617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
663617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
664617277e7SBjörn Schäpers               FormatStyle::BS_WebKit);
665617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
666617277e7SBjörn Schäpers               FormatStyle::BS_Custom);
667617277e7SBjörn Schäpers 
668617277e7SBjörn Schäpers   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
669617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
670617277e7SBjörn Schäpers               "  AfterControlStatement: MultiLine",
671617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement,
672617277e7SBjörn Schäpers               FormatStyle::BWACS_MultiLine);
673617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
674617277e7SBjörn Schäpers               "  AfterControlStatement: Always",
675617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
676617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
677617277e7SBjörn Schäpers               "  AfterControlStatement: Never",
678617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
679617277e7SBjörn Schäpers   // For backward compatibility:
680617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
681617277e7SBjörn Schäpers               "  AfterControlStatement: true",
682617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
683617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
684617277e7SBjörn Schäpers               "  AfterControlStatement: false",
685617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
686617277e7SBjörn Schäpers 
687617277e7SBjörn Schäpers   Style.AlwaysBreakAfterReturnType = FormatStyle::RTBS_All;
688617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: None", AlwaysBreakAfterReturnType,
689617277e7SBjörn Schäpers               FormatStyle::RTBS_None);
690617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: All", AlwaysBreakAfterReturnType,
691617277e7SBjörn Schäpers               FormatStyle::RTBS_All);
692617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel",
693617277e7SBjörn Schäpers               AlwaysBreakAfterReturnType, FormatStyle::RTBS_TopLevel);
694617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
695617277e7SBjörn Schäpers               AlwaysBreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
696617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
697617277e7SBjörn Schäpers               AlwaysBreakAfterReturnType,
698617277e7SBjörn Schäpers               FormatStyle::RTBS_TopLevelDefinitions);
699617277e7SBjörn Schäpers 
700617277e7SBjörn Schäpers   Style.AlwaysBreakTemplateDeclarations = FormatStyle::BTDS_Yes;
701617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No",
702617277e7SBjörn Schäpers               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_No);
703617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
704617277e7SBjörn Schäpers               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
705617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes",
706617277e7SBjörn Schäpers               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
707617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
708617277e7SBjörn Schäpers               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
709617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
710617277e7SBjörn Schäpers               AlwaysBreakTemplateDeclarations, FormatStyle::BTDS_Yes);
711617277e7SBjörn Schäpers 
712617277e7SBjörn Schäpers   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
713617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
714617277e7SBjörn Schäpers               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
715617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
716617277e7SBjörn Schäpers               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
717617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
718617277e7SBjörn Schäpers               AlwaysBreakAfterDefinitionReturnType,
719617277e7SBjörn Schäpers               FormatStyle::DRTBS_TopLevel);
720617277e7SBjörn Schäpers 
721617277e7SBjörn Schäpers   Style.NamespaceIndentation = FormatStyle::NI_All;
722617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
723617277e7SBjörn Schäpers               FormatStyle::NI_None);
724617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
725617277e7SBjörn Schäpers               FormatStyle::NI_Inner);
726617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
727617277e7SBjörn Schäpers               FormatStyle::NI_All);
728617277e7SBjörn Schäpers 
729617277e7SBjörn Schäpers   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_OnlyFirstIf;
730617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
731617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
732617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
733617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
734617277e7SBjörn Schäpers               FormatStyle::SIS_WithoutElse);
735617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: OnlyFirstIf",
736617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
737617277e7SBjörn Schäpers               FormatStyle::SIS_OnlyFirstIf);
738617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: AllIfsAndElse",
739617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
740617277e7SBjörn Schäpers               FormatStyle::SIS_AllIfsAndElse);
741617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
742617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
743617277e7SBjörn Schäpers               FormatStyle::SIS_OnlyFirstIf);
744617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
745617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
746617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
747617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
748617277e7SBjörn Schäpers               FormatStyle::SIS_WithoutElse);
749617277e7SBjörn Schäpers 
750617277e7SBjörn Schäpers   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
751617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock,
752617277e7SBjörn Schäpers               FormatStyle::IEBS_AfterExternBlock);
753617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock,
754617277e7SBjörn Schäpers               FormatStyle::IEBS_Indent);
755617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock,
756617277e7SBjörn Schäpers               FormatStyle::IEBS_NoIndent);
757617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: true", IndentExternBlock,
758617277e7SBjörn Schäpers               FormatStyle::IEBS_Indent);
759617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: false", IndentExternBlock,
760617277e7SBjörn Schäpers               FormatStyle::IEBS_NoIndent);
761617277e7SBjörn Schäpers 
762617277e7SBjörn Schäpers   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
763617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing,
764617277e7SBjörn Schäpers               FormatStyle::BFCS_Both);
765617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing,
766617277e7SBjörn Schäpers               FormatStyle::BFCS_None);
767617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing,
768617277e7SBjörn Schäpers               FormatStyle::BFCS_Before);
769617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing,
770617277e7SBjörn Schäpers               FormatStyle::BFCS_After);
771617277e7SBjörn Schäpers 
772617277e7SBjörn Schäpers   Style.SortJavaStaticImport = FormatStyle::SJSIO_Before;
773617277e7SBjörn Schäpers   CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport,
774617277e7SBjörn Schäpers               FormatStyle::SJSIO_After);
775617277e7SBjörn Schäpers   CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport,
776617277e7SBjörn Schäpers               FormatStyle::SJSIO_Before);
777617277e7SBjörn Schäpers 
77858751f94SBackl1ght   Style.SortUsingDeclarations = FormatStyle::SUD_LexicographicNumeric;
77958751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: Never", SortUsingDeclarations,
78058751f94SBackl1ght               FormatStyle::SUD_Never);
78158751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: Lexicographic", SortUsingDeclarations,
78258751f94SBackl1ght               FormatStyle::SUD_Lexicographic);
78358751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: LexicographicNumeric",
78458751f94SBackl1ght               SortUsingDeclarations, FormatStyle::SUD_LexicographicNumeric);
78558751f94SBackl1ght   // For backward compatibility:
78658751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: false", SortUsingDeclarations,
78758751f94SBackl1ght               FormatStyle::SUD_Never);
78858751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: true", SortUsingDeclarations,
78958751f94SBackl1ght               FormatStyle::SUD_LexicographicNumeric);
79058751f94SBackl1ght 
791617277e7SBjörn Schäpers   // FIXME: This is required because parsing a configuration simply overwrites
792617277e7SBjörn Schäpers   // the first N elements of the list instead of resetting it.
793617277e7SBjörn Schäpers   Style.ForEachMacros.clear();
794617277e7SBjörn Schäpers   std::vector<std::string> BoostForeach;
795617277e7SBjörn Schäpers   BoostForeach.push_back("BOOST_FOREACH");
796617277e7SBjörn Schäpers   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
797617277e7SBjörn Schäpers   std::vector<std::string> BoostAndQForeach;
798617277e7SBjörn Schäpers   BoostAndQForeach.push_back("BOOST_FOREACH");
799617277e7SBjörn Schäpers   BoostAndQForeach.push_back("Q_FOREACH");
800617277e7SBjörn Schäpers   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
801617277e7SBjörn Schäpers               BoostAndQForeach);
802617277e7SBjörn Schäpers 
803617277e7SBjörn Schäpers   Style.IfMacros.clear();
804617277e7SBjörn Schäpers   std::vector<std::string> CustomIfs;
805617277e7SBjörn Schäpers   CustomIfs.push_back("MYIF");
806617277e7SBjörn Schäpers   CHECK_PARSE("IfMacros: [MYIF]", IfMacros, CustomIfs);
807617277e7SBjörn Schäpers 
808617277e7SBjörn Schäpers   Style.AttributeMacros.clear();
809617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros,
810617277e7SBjörn Schäpers               std::vector<std::string>{"__capability"});
811617277e7SBjörn Schäpers   CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros,
812617277e7SBjörn Schäpers               std::vector<std::string>({"attr1", "attr2"}));
813617277e7SBjörn Schäpers 
814617277e7SBjörn Schäpers   Style.StatementAttributeLikeMacros.clear();
815617277e7SBjörn Schäpers   CHECK_PARSE("StatementAttributeLikeMacros: [emit,Q_EMIT]",
816617277e7SBjörn Schäpers               StatementAttributeLikeMacros,
817617277e7SBjörn Schäpers               std::vector<std::string>({"emit", "Q_EMIT"}));
818617277e7SBjörn Schäpers 
819617277e7SBjörn Schäpers   Style.StatementMacros.clear();
820617277e7SBjörn Schäpers   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
821617277e7SBjörn Schäpers               std::vector<std::string>{"QUNUSED"});
822617277e7SBjörn Schäpers   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
823617277e7SBjörn Schäpers               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
824617277e7SBjörn Schäpers 
825617277e7SBjörn Schäpers   Style.NamespaceMacros.clear();
826617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceMacros: [TESTSUITE]", NamespaceMacros,
827617277e7SBjörn Schäpers               std::vector<std::string>{"TESTSUITE"});
828617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceMacros: [TESTSUITE, SUITE]", NamespaceMacros,
829617277e7SBjörn Schäpers               std::vector<std::string>({"TESTSUITE", "SUITE"}));
830617277e7SBjörn Schäpers 
831617277e7SBjörn Schäpers   Style.WhitespaceSensitiveMacros.clear();
832617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]",
833617277e7SBjörn Schäpers               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
834617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]",
835617277e7SBjörn Schäpers               WhitespaceSensitiveMacros,
836617277e7SBjörn Schäpers               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
837617277e7SBjörn Schäpers   Style.WhitespaceSensitiveMacros.clear();
838617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']",
839617277e7SBjörn Schäpers               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
840617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']",
841617277e7SBjörn Schäpers               WhitespaceSensitiveMacros,
842617277e7SBjörn Schäpers               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
843617277e7SBjörn Schäpers 
844617277e7SBjörn Schäpers   Style.IncludeStyle.IncludeCategories.clear();
845617277e7SBjörn Schäpers   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
846617277e7SBjörn Schäpers       {"abc/.*", 2, 0, false}, {".*", 1, 0, true}};
847617277e7SBjörn Schäpers   CHECK_PARSE("IncludeCategories:\n"
848617277e7SBjörn Schäpers               "  - Regex: abc/.*\n"
849617277e7SBjörn Schäpers               "    Priority: 2\n"
850617277e7SBjörn Schäpers               "  - Regex: .*\n"
851617277e7SBjörn Schäpers               "    Priority: 1\n"
852*88934a82SOwen Pan               "    CaseSensitive: true",
853617277e7SBjörn Schäpers               IncludeStyle.IncludeCategories, ExpectedCategories);
854617277e7SBjörn Schäpers   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
855617277e7SBjörn Schäpers               "abc$");
856617277e7SBjörn Schäpers   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
857617277e7SBjörn Schäpers               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
858617277e7SBjörn Schäpers 
859617277e7SBjörn Schäpers   Style.SortIncludes = FormatStyle::SI_Never;
860617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: true", SortIncludes,
861617277e7SBjörn Schäpers               FormatStyle::SI_CaseSensitive);
862617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: false", SortIncludes, FormatStyle::SI_Never);
863617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: CaseInsensitive", SortIncludes,
864617277e7SBjörn Schäpers               FormatStyle::SI_CaseInsensitive);
865617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: CaseSensitive", SortIncludes,
866617277e7SBjörn Schäpers               FormatStyle::SI_CaseSensitive);
867617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: Never", SortIncludes, FormatStyle::SI_Never);
868617277e7SBjörn Schäpers 
869617277e7SBjörn Schäpers   Style.RawStringFormats.clear();
870617277e7SBjörn Schäpers   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
871617277e7SBjörn Schäpers       {
872617277e7SBjörn Schäpers           FormatStyle::LK_TextProto,
873617277e7SBjörn Schäpers           {"pb", "proto"},
874617277e7SBjörn Schäpers           {"PARSE_TEXT_PROTO"},
875617277e7SBjörn Schäpers           /*CanonicalDelimiter=*/"",
876617277e7SBjörn Schäpers           "llvm",
877617277e7SBjörn Schäpers       },
878617277e7SBjörn Schäpers       {
879617277e7SBjörn Schäpers           FormatStyle::LK_Cpp,
880617277e7SBjörn Schäpers           {"cc", "cpp"},
881617277e7SBjörn Schäpers           {"C_CODEBLOCK", "CPPEVAL"},
882617277e7SBjörn Schäpers           /*CanonicalDelimiter=*/"cc",
883617277e7SBjörn Schäpers           /*BasedOnStyle=*/"",
884617277e7SBjörn Schäpers       },
885617277e7SBjörn Schäpers   };
886617277e7SBjörn Schäpers 
887617277e7SBjörn Schäpers   CHECK_PARSE("RawStringFormats:\n"
888617277e7SBjörn Schäpers               "  - Language: TextProto\n"
889617277e7SBjörn Schäpers               "    Delimiters:\n"
890617277e7SBjörn Schäpers               "      - 'pb'\n"
891617277e7SBjörn Schäpers               "      - 'proto'\n"
892617277e7SBjörn Schäpers               "    EnclosingFunctions:\n"
893617277e7SBjörn Schäpers               "      - 'PARSE_TEXT_PROTO'\n"
894617277e7SBjörn Schäpers               "    BasedOnStyle: llvm\n"
895617277e7SBjörn Schäpers               "  - Language: Cpp\n"
896617277e7SBjörn Schäpers               "    Delimiters:\n"
897617277e7SBjörn Schäpers               "      - 'cc'\n"
898617277e7SBjörn Schäpers               "      - 'cpp'\n"
899617277e7SBjörn Schäpers               "    EnclosingFunctions:\n"
900617277e7SBjörn Schäpers               "      - 'C_CODEBLOCK'\n"
901617277e7SBjörn Schäpers               "      - 'CPPEVAL'\n"
902617277e7SBjörn Schäpers               "    CanonicalDelimiter: 'cc'",
903617277e7SBjörn Schäpers               RawStringFormats, ExpectedRawStringFormats);
904617277e7SBjörn Schäpers 
905617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
906617277e7SBjörn Schäpers               "  Minimum: 0\n"
907617277e7SBjörn Schäpers               "  Maximum: 0",
908617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Minimum, 0u);
909617277e7SBjörn Schäpers   EXPECT_EQ(Style.SpacesInLineCommentPrefix.Maximum, 0u);
910617277e7SBjörn Schäpers   Style.SpacesInLineCommentPrefix.Minimum = 1;
911617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
912617277e7SBjörn Schäpers               "  Minimum: 2",
913617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Minimum, 0u);
914617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
915617277e7SBjörn Schäpers               "  Maximum: -1",
916617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Maximum, -1u);
917617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
918617277e7SBjörn Schäpers               "  Minimum: 2",
919617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Minimum, 2u);
920617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
921617277e7SBjörn Schäpers               "  Maximum: 1",
922617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Maximum, 1u);
923617277e7SBjörn Schäpers   EXPECT_EQ(Style.SpacesInLineCommentPrefix.Minimum, 1u);
924617277e7SBjörn Schäpers 
925617277e7SBjörn Schäpers   Style.SpacesInAngles = FormatStyle::SIAS_Always;
926617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: Never", SpacesInAngles, FormatStyle::SIAS_Never);
927617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: Always", SpacesInAngles,
928617277e7SBjörn Schäpers               FormatStyle::SIAS_Always);
929617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: Leave", SpacesInAngles, FormatStyle::SIAS_Leave);
930617277e7SBjörn Schäpers   // For backward compatibility:
931617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: false", SpacesInAngles, FormatStyle::SIAS_Never);
932617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: true", SpacesInAngles, FormatStyle::SIAS_Always);
933617277e7SBjörn Schäpers 
934617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: WithPreceding", RequiresClausePosition,
935617277e7SBjörn Schäpers               FormatStyle::RCPS_WithPreceding);
936617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: WithFollowing", RequiresClausePosition,
937617277e7SBjörn Schäpers               FormatStyle::RCPS_WithFollowing);
938617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: SingleLine", RequiresClausePosition,
939617277e7SBjörn Schäpers               FormatStyle::RCPS_SingleLine);
940617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: OwnLine", RequiresClausePosition,
941617277e7SBjörn Schäpers               FormatStyle::RCPS_OwnLine);
942617277e7SBjörn Schäpers 
943617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: Never",
944617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Never);
945617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: Always",
946617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Always);
947617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: Allowed",
948617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Allowed);
949617277e7SBjörn Schäpers   // For backward compatibility:
950617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: true",
951617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Always);
952617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: false",
953617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Allowed);
954922c8891SKrasimir Georgiev 
955922c8891SKrasimir Georgiev   CHECK_PARSE("BreakAfterAttributes: Always", BreakAfterAttributes,
956922c8891SKrasimir Georgiev               FormatStyle::ABS_Always);
957922c8891SKrasimir Georgiev   CHECK_PARSE("BreakAfterAttributes: Leave", BreakAfterAttributes,
958922c8891SKrasimir Georgiev               FormatStyle::ABS_Leave);
959922c8891SKrasimir Georgiev   CHECK_PARSE("BreakAfterAttributes: Never", BreakAfterAttributes,
960922c8891SKrasimir Georgiev               FormatStyle::ABS_Never);
961e3eca335SOwen Pan 
962e3eca335SOwen Pan   const auto DefaultLineEnding = FormatStyle::LE_DeriveLF;
963e3eca335SOwen Pan   CHECK_PARSE("LineEnding: LF", LineEnding, FormatStyle::LE_LF);
964e3eca335SOwen Pan   CHECK_PARSE("LineEnding: CRLF", LineEnding, FormatStyle::LE_CRLF);
965e3eca335SOwen Pan   CHECK_PARSE("LineEnding: DeriveCRLF", LineEnding, FormatStyle::LE_DeriveCRLF);
966e3eca335SOwen Pan   CHECK_PARSE("LineEnding: DeriveLF", LineEnding, DefaultLineEnding);
967e3eca335SOwen Pan   // For backward compatibility:
968e3eca335SOwen Pan   CHECK_PARSE("DeriveLineEnding: false", LineEnding, FormatStyle::LE_LF);
969e3eca335SOwen Pan   Style.LineEnding = DefaultLineEnding;
970e3eca335SOwen Pan   CHECK_PARSE("DeriveLineEnding: false\n"
971e3eca335SOwen Pan               "UseCRLF: true",
972e3eca335SOwen Pan               LineEnding, FormatStyle::LE_CRLF);
973e3eca335SOwen Pan   Style.LineEnding = DefaultLineEnding;
974e3eca335SOwen Pan   CHECK_PARSE("UseCRLF: true", LineEnding, FormatStyle::LE_DeriveCRLF);
9753a6a0702SOwen Pan 
9763a6a0702SOwen Pan   CHECK_PARSE("RemoveParentheses: MultipleParentheses", RemoveParentheses,
9773a6a0702SOwen Pan               FormatStyle::RPS_MultipleParentheses);
9783a6a0702SOwen Pan   CHECK_PARSE("RemoveParentheses: ReturnStatement", RemoveParentheses,
9793a6a0702SOwen Pan               FormatStyle::RPS_ReturnStatement);
9803a6a0702SOwen Pan   CHECK_PARSE("RemoveParentheses: Leave", RemoveParentheses,
9813a6a0702SOwen Pan               FormatStyle::RPS_Leave);
98284e3fdfcSBjörn Schäpers 
98384e3fdfcSBjörn Schäpers   CHECK_PARSE("AllowBreakBeforeNoexceptSpecifier: Always",
98484e3fdfcSBjörn Schäpers               AllowBreakBeforeNoexceptSpecifier, FormatStyle::BBNSS_Always);
98584e3fdfcSBjörn Schäpers   CHECK_PARSE("AllowBreakBeforeNoexceptSpecifier: OnlyWithParen",
98684e3fdfcSBjörn Schäpers               AllowBreakBeforeNoexceptSpecifier,
98784e3fdfcSBjörn Schäpers               FormatStyle::BBNSS_OnlyWithParen);
98884e3fdfcSBjörn Schäpers   CHECK_PARSE("AllowBreakBeforeNoexceptSpecifier: Never",
98984e3fdfcSBjörn Schäpers               AllowBreakBeforeNoexceptSpecifier, FormatStyle::BBNSS_Never);
990617277e7SBjörn Schäpers }
991617277e7SBjörn Schäpers 
992617277e7SBjörn Schäpers TEST(ConfigParseTest, ParsesConfigurationWithLanguages) {
993617277e7SBjörn Schäpers   FormatStyle Style = {};
994617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
995617277e7SBjörn Schäpers   CHECK_PARSE("Language: Cpp\n"
996617277e7SBjörn Schäpers               "IndentWidth: 12",
997617277e7SBjörn Schäpers               IndentWidth, 12u);
998617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
999617277e7SBjörn Schäpers                                "IndentWidth: 34",
1000617277e7SBjörn Schäpers                                &Style),
1001617277e7SBjörn Schäpers             ParseError::Unsuitable);
1002617277e7SBjörn Schäpers   FormatStyle BinPackedTCS = {};
1003617277e7SBjörn Schäpers   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
1004617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
1005617277e7SBjörn Schäpers                                "InsertTrailingCommas: Wrapped",
1006617277e7SBjörn Schäpers                                &BinPackedTCS),
1007617277e7SBjörn Schäpers             ParseError::BinPackTrailingCommaConflict);
1008617277e7SBjörn Schäpers   EXPECT_EQ(12u, Style.IndentWidth);
1009617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
1010617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
1011617277e7SBjörn Schäpers 
1012617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_JavaScript;
1013617277e7SBjörn Schäpers   CHECK_PARSE("Language: JavaScript\n"
1014617277e7SBjörn Schäpers               "IndentWidth: 12",
1015617277e7SBjörn Schäpers               IndentWidth, 12u);
1016617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
1017617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
1018617277e7SBjörn Schäpers                                "IndentWidth: 34",
1019617277e7SBjörn Schäpers                                &Style),
1020617277e7SBjörn Schäpers             ParseError::Unsuitable);
1021617277e7SBjörn Schäpers   EXPECT_EQ(23u, Style.IndentWidth);
1022617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
1023617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
1024617277e7SBjörn Schäpers 
1025617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM\n"
1026617277e7SBjörn Schäpers               "IndentWidth: 67",
1027617277e7SBjörn Schäpers               IndentWidth, 67u);
1028617277e7SBjörn Schäpers 
1029617277e7SBjörn Schäpers   CHECK_PARSE("---\n"
1030617277e7SBjörn Schäpers               "Language: JavaScript\n"
1031617277e7SBjörn Schäpers               "IndentWidth: 12\n"
1032617277e7SBjörn Schäpers               "---\n"
1033617277e7SBjörn Schäpers               "Language: Cpp\n"
1034617277e7SBjörn Schäpers               "IndentWidth: 34\n"
1035617277e7SBjörn Schäpers               "...\n",
1036617277e7SBjörn Schäpers               IndentWidth, 12u);
1037617277e7SBjörn Schäpers 
1038617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
1039617277e7SBjörn Schäpers   CHECK_PARSE("---\n"
1040617277e7SBjörn Schäpers               "Language: JavaScript\n"
1041617277e7SBjörn Schäpers               "IndentWidth: 12\n"
1042617277e7SBjörn Schäpers               "---\n"
1043617277e7SBjörn Schäpers               "Language: Cpp\n"
1044617277e7SBjörn Schäpers               "IndentWidth: 34\n"
1045617277e7SBjörn Schäpers               "...\n",
1046617277e7SBjörn Schäpers               IndentWidth, 34u);
1047617277e7SBjörn Schäpers   CHECK_PARSE("---\n"
1048617277e7SBjörn Schäpers               "IndentWidth: 78\n"
1049617277e7SBjörn Schäpers               "---\n"
1050617277e7SBjörn Schäpers               "Language: JavaScript\n"
1051617277e7SBjörn Schäpers               "IndentWidth: 56\n"
1052617277e7SBjörn Schäpers               "...\n",
1053617277e7SBjörn Schäpers               IndentWidth, 78u);
1054617277e7SBjörn Schäpers 
1055617277e7SBjörn Schäpers   Style.ColumnLimit = 123;
1056617277e7SBjörn Schäpers   Style.IndentWidth = 234;
1057617277e7SBjörn Schäpers   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
1058617277e7SBjörn Schäpers   Style.TabWidth = 345;
1059617277e7SBjörn Schäpers   EXPECT_FALSE(parseConfiguration("---\n"
1060617277e7SBjörn Schäpers                                   "IndentWidth: 456\n"
1061617277e7SBjörn Schäpers                                   "BreakBeforeBraces: Allman\n"
1062617277e7SBjörn Schäpers                                   "---\n"
1063617277e7SBjörn Schäpers                                   "Language: JavaScript\n"
1064617277e7SBjörn Schäpers                                   "IndentWidth: 111\n"
1065617277e7SBjörn Schäpers                                   "TabWidth: 111\n"
1066617277e7SBjörn Schäpers                                   "---\n"
1067617277e7SBjörn Schäpers                                   "Language: Cpp\n"
1068617277e7SBjörn Schäpers                                   "BreakBeforeBraces: Stroustrup\n"
1069617277e7SBjörn Schäpers                                   "TabWidth: 789\n"
1070617277e7SBjörn Schäpers                                   "...\n",
1071617277e7SBjörn Schäpers                                   &Style));
1072617277e7SBjörn Schäpers   EXPECT_EQ(123u, Style.ColumnLimit);
1073617277e7SBjörn Schäpers   EXPECT_EQ(456u, Style.IndentWidth);
1074617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
1075617277e7SBjörn Schäpers   EXPECT_EQ(789u, Style.TabWidth);
1076617277e7SBjörn Schäpers 
1077617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("---\n"
1078617277e7SBjörn Schäpers                                "Language: JavaScript\n"
1079617277e7SBjörn Schäpers                                "IndentWidth: 56\n"
1080617277e7SBjörn Schäpers                                "---\n"
1081617277e7SBjörn Schäpers                                "IndentWidth: 78\n"
1082617277e7SBjörn Schäpers                                "...\n",
1083617277e7SBjörn Schäpers                                &Style),
1084617277e7SBjörn Schäpers             ParseError::Error);
1085617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("---\n"
1086617277e7SBjörn Schäpers                                "Language: JavaScript\n"
1087617277e7SBjörn Schäpers                                "IndentWidth: 56\n"
1088617277e7SBjörn Schäpers                                "---\n"
1089617277e7SBjörn Schäpers                                "Language: JavaScript\n"
1090617277e7SBjörn Schäpers                                "IndentWidth: 78\n"
1091617277e7SBjörn Schäpers                                "...\n",
1092617277e7SBjörn Schäpers                                &Style),
1093617277e7SBjörn Schäpers             ParseError::Error);
1094617277e7SBjörn Schäpers 
1095617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
109624231df9Ssstwcw 
109724231df9Ssstwcw   Style.Language = FormatStyle::LK_Verilog;
109824231df9Ssstwcw   CHECK_PARSE("---\n"
109924231df9Ssstwcw               "Language: Verilog\n"
110024231df9Ssstwcw               "IndentWidth: 12\n"
110124231df9Ssstwcw               "---\n"
110224231df9Ssstwcw               "Language: Cpp\n"
110324231df9Ssstwcw               "IndentWidth: 34\n"
110424231df9Ssstwcw               "...\n",
110524231df9Ssstwcw               IndentWidth, 12u);
110624231df9Ssstwcw   CHECK_PARSE("---\n"
110724231df9Ssstwcw               "IndentWidth: 78\n"
110824231df9Ssstwcw               "---\n"
110924231df9Ssstwcw               "Language: Verilog\n"
111024231df9Ssstwcw               "IndentWidth: 56\n"
111124231df9Ssstwcw               "...\n",
111224231df9Ssstwcw               IndentWidth, 56u);
1113617277e7SBjörn Schäpers }
1114617277e7SBjörn Schäpers 
1115617277e7SBjörn Schäpers TEST(ConfigParseTest, UsesLanguageForBasedOnStyle) {
1116617277e7SBjörn Schäpers   FormatStyle Style = {};
1117617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_JavaScript;
1118617277e7SBjörn Schäpers   Style.BreakBeforeTernaryOperators = true;
1119617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
1120617277e7SBjörn Schäpers   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
1121617277e7SBjörn Schäpers 
1122617277e7SBjörn Schäpers   Style.BreakBeforeTernaryOperators = true;
1123617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("---\n"
1124617277e7SBjörn Schäpers                                   "BasedOnStyle: Google\n"
1125617277e7SBjörn Schäpers                                   "---\n"
1126617277e7SBjörn Schäpers                                   "Language: JavaScript\n"
1127617277e7SBjörn Schäpers                                   "IndentWidth: 76\n"
1128617277e7SBjörn Schäpers                                   "...\n",
1129617277e7SBjörn Schäpers                                   &Style)
1130617277e7SBjörn Schäpers                    .value());
1131617277e7SBjörn Schäpers   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
1132617277e7SBjörn Schäpers   EXPECT_EQ(76u, Style.IndentWidth);
1133617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
1134617277e7SBjörn Schäpers }
1135617277e7SBjörn Schäpers 
1136617277e7SBjörn Schäpers TEST(ConfigParseTest, ConfigurationRoundTripTest) {
1137617277e7SBjörn Schäpers   FormatStyle Style = getLLVMStyle();
1138617277e7SBjörn Schäpers   std::string YAML = configurationAsText(Style);
1139617277e7SBjörn Schäpers   FormatStyle ParsedStyle = {};
1140617277e7SBjörn Schäpers   ParsedStyle.Language = FormatStyle::LK_Cpp;
1141617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
1142617277e7SBjörn Schäpers   EXPECT_EQ(Style, ParsedStyle);
1143617277e7SBjörn Schäpers }
1144617277e7SBjörn Schäpers 
1145617277e7SBjörn Schäpers TEST(ConfigParseTest, GetStyleWithEmptyFileName) {
1146617277e7SBjörn Schäpers   llvm::vfs::InMemoryFileSystem FS;
1147617277e7SBjörn Schäpers   auto Style1 = getStyle("file", "", "Google", "", &FS);
1148617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style1);
1149617277e7SBjörn Schäpers   ASSERT_EQ(*Style1, getGoogleStyle());
1150617277e7SBjörn Schäpers }
1151617277e7SBjörn Schäpers 
1152617277e7SBjörn Schäpers TEST(ConfigParseTest, GetStyleOfFile) {
1153617277e7SBjörn Schäpers   llvm::vfs::InMemoryFileSystem FS;
1154617277e7SBjörn Schäpers   // Test 1: format file in the same directory.
1155617277e7SBjörn Schäpers   ASSERT_TRUE(
1156617277e7SBjörn Schäpers       FS.addFile("/a/.clang-format", 0,
1157617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
1158617277e7SBjörn Schäpers   ASSERT_TRUE(
1159617277e7SBjörn Schäpers       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
1160617277e7SBjörn Schäpers   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
1161617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style1);
1162617277e7SBjörn Schäpers   ASSERT_EQ(*Style1, getLLVMStyle());
1163617277e7SBjörn Schäpers 
1164617277e7SBjörn Schäpers   // Test 2.1: fallback to default.
1165617277e7SBjörn Schäpers   ASSERT_TRUE(
1166617277e7SBjörn Schäpers       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
1167617277e7SBjörn Schäpers   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
1168617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1169617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getMozillaStyle());
1170617277e7SBjörn Schäpers 
1171617277e7SBjörn Schäpers   // Test 2.2: no format on 'none' fallback style.
1172617277e7SBjörn Schäpers   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
1173617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1174617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getNoStyle());
1175617277e7SBjörn Schäpers 
1176617277e7SBjörn Schäpers   // Test 2.3: format if config is found with no based style while fallback is
1177617277e7SBjörn Schäpers   // 'none'.
1178617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
1179617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
1180617277e7SBjörn Schäpers   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
1181617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1182617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getLLVMStyle());
1183617277e7SBjörn Schäpers 
1184617277e7SBjörn Schäpers   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
1185617277e7SBjörn Schäpers   Style2 = getStyle("{}", "a.h", "none", "", &FS);
1186617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1187617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getLLVMStyle());
1188617277e7SBjörn Schäpers 
1189617277e7SBjörn Schäpers   // Test 3: format file in parent directory.
1190617277e7SBjörn Schäpers   ASSERT_TRUE(
1191617277e7SBjörn Schäpers       FS.addFile("/c/.clang-format", 0,
1192617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
1193617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
1194617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1195617277e7SBjörn Schäpers   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
1196617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style3);
1197617277e7SBjörn Schäpers   ASSERT_EQ(*Style3, getGoogleStyle());
1198617277e7SBjörn Schäpers 
1199617277e7SBjörn Schäpers   // Test 4: error on invalid fallback style
1200617277e7SBjörn Schäpers   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
1201617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style4);
1202617277e7SBjörn Schäpers   llvm::consumeError(Style4.takeError());
1203617277e7SBjörn Schäpers 
1204617277e7SBjörn Schäpers   // Test 5: error on invalid yaml on command line
1205617277e7SBjörn Schäpers   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS);
1206617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style5);
1207617277e7SBjörn Schäpers   llvm::consumeError(Style5.takeError());
1208617277e7SBjörn Schäpers 
1209617277e7SBjörn Schäpers   // Test 6: error on invalid style
1210617277e7SBjörn Schäpers   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
1211617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style6);
1212617277e7SBjörn Schäpers   llvm::consumeError(Style6.takeError());
1213617277e7SBjörn Schäpers 
1214617277e7SBjörn Schäpers   // Test 7: found config file, error on parsing it
1215617277e7SBjörn Schäpers   ASSERT_TRUE(
1216617277e7SBjörn Schäpers       FS.addFile("/d/.clang-format", 0,
1217617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
1218617277e7SBjörn Schäpers                                                   "InvalidKey: InvalidValue")));
1219617277e7SBjörn Schäpers   ASSERT_TRUE(
1220617277e7SBjörn Schäpers       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
1221617277e7SBjörn Schäpers   auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS);
1222617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style7a);
1223617277e7SBjörn Schäpers   llvm::consumeError(Style7a.takeError());
1224617277e7SBjörn Schäpers 
1225617277e7SBjörn Schäpers   auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS, true);
1226617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style7b);
1227617277e7SBjörn Schäpers 
1228617277e7SBjörn Schäpers   // Test 8: inferred per-language defaults apply.
1229617277e7SBjörn Schäpers   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
1230617277e7SBjörn Schäpers   ASSERT_TRUE((bool)StyleTd);
1231617277e7SBjörn Schäpers   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
1232617277e7SBjörn Schäpers 
1233617277e7SBjörn Schäpers   // Test 9.1.1: overwriting a file style, when no parent file exists with no
1234617277e7SBjörn Schäpers   // fallback style.
1235617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile(
1236617277e7SBjörn Schäpers       "/e/sub/.clang-format", 0,
1237617277e7SBjörn Schäpers       llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: InheritParentConfig\n"
1238617277e7SBjörn Schäpers                                        "ColumnLimit: 20")));
1239617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/code.cpp", 0,
1240617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1241617277e7SBjörn Schäpers   auto Style9 = getStyle("file", "/e/sub/code.cpp", "none", "", &FS);
1242617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1243617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1244617277e7SBjörn Schäpers     auto Style = getNoStyle();
1245617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1246617277e7SBjörn Schäpers     return Style;
1247617277e7SBjörn Schäpers   }());
1248617277e7SBjörn Schäpers 
1249617277e7SBjörn Schäpers   // Test 9.1.2: propagate more than one level with no parent file.
1250617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/sub/code.cpp", 0,
1251617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1252617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/sub/.clang-format", 0,
1253617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer(
1254617277e7SBjörn Schäpers                              "BasedOnStyle: InheritParentConfig\n"
1255617277e7SBjörn Schäpers                              "WhitespaceSensitiveMacros: ['FOO', 'BAR']")));
1256617277e7SBjörn Schäpers   std::vector<std::string> NonDefaultWhiteSpaceMacros =
1257617277e7SBjörn Schäpers       Style9->WhitespaceSensitiveMacros;
1258617277e7SBjörn Schäpers   NonDefaultWhiteSpaceMacros[0] = "FOO";
1259617277e7SBjörn Schäpers   NonDefaultWhiteSpaceMacros[1] = "BAR";
1260617277e7SBjörn Schäpers 
1261617277e7SBjörn Schäpers   ASSERT_NE(Style9->WhitespaceSensitiveMacros, NonDefaultWhiteSpaceMacros);
1262617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/sub/code.cpp", "none", "", &FS);
1263617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1264617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [&NonDefaultWhiteSpaceMacros] {
1265617277e7SBjörn Schäpers     auto Style = getNoStyle();
1266617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1267617277e7SBjörn Schäpers     Style.WhitespaceSensitiveMacros = NonDefaultWhiteSpaceMacros;
1268617277e7SBjörn Schäpers     return Style;
1269617277e7SBjörn Schäpers   }());
1270617277e7SBjörn Schäpers 
1271617277e7SBjörn Schäpers   // Test 9.2: with LLVM fallback style
1272617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/code.cpp", "LLVM", "", &FS);
1273617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1274617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1275617277e7SBjörn Schäpers     auto Style = getLLVMStyle();
1276617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1277617277e7SBjörn Schäpers     return Style;
1278617277e7SBjörn Schäpers   }());
1279617277e7SBjörn Schäpers 
1280617277e7SBjörn Schäpers   // Test 9.3: with a parent file
1281617277e7SBjörn Schäpers   ASSERT_TRUE(
1282617277e7SBjörn Schäpers       FS.addFile("/e/.clang-format", 0,
1283617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google\n"
1284617277e7SBjörn Schäpers                                                   "UseTab: Always")));
1285617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/code.cpp", "none", "", &FS);
1286617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1287617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1288617277e7SBjörn Schäpers     auto Style = getGoogleStyle();
1289617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1290617277e7SBjörn Schäpers     Style.UseTab = FormatStyle::UT_Always;
1291617277e7SBjörn Schäpers     return Style;
1292617277e7SBjörn Schäpers   }());
1293617277e7SBjörn Schäpers 
1294617277e7SBjörn Schäpers   // Test 9.4: propagate more than one level with a parent file.
1295617277e7SBjörn Schäpers   const auto SubSubStyle = [&NonDefaultWhiteSpaceMacros] {
1296617277e7SBjörn Schäpers     auto Style = getGoogleStyle();
1297617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1298617277e7SBjörn Schäpers     Style.UseTab = FormatStyle::UT_Always;
1299617277e7SBjörn Schäpers     Style.WhitespaceSensitiveMacros = NonDefaultWhiteSpaceMacros;
1300617277e7SBjörn Schäpers     return Style;
1301617277e7SBjörn Schäpers   }();
1302617277e7SBjörn Schäpers 
1303617277e7SBjörn Schäpers   ASSERT_NE(Style9->WhitespaceSensitiveMacros, NonDefaultWhiteSpaceMacros);
1304617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/sub/code.cpp", "none", "", &FS);
1305617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1306617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1307617277e7SBjörn Schäpers 
1308617277e7SBjörn Schäpers   // Test 9.5: use InheritParentConfig as style name
1309617277e7SBjörn Schäpers   Style9 =
1310617277e7SBjörn Schäpers       getStyle("inheritparentconfig", "/e/sub/sub/code.cpp", "none", "", &FS);
1311617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1312617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1313617277e7SBjörn Schäpers 
1314617277e7SBjörn Schäpers   // Test 9.6: use command line style with inheritance
1315617277e7SBjörn Schäpers   Style9 = getStyle("{BasedOnStyle: InheritParentConfig}",
1316617277e7SBjörn Schäpers                     "/e/sub/sub/code.cpp", "none", "", &FS);
1317617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1318617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1319617277e7SBjörn Schäpers 
1320617277e7SBjörn Schäpers   // Test 9.7: use command line style with inheritance and own config
1321617277e7SBjörn Schäpers   Style9 = getStyle("{BasedOnStyle: InheritParentConfig, "
1322617277e7SBjörn Schäpers                     "WhitespaceSensitiveMacros: ['FOO', 'BAR']}",
1323617277e7SBjörn Schäpers                     "/e/sub/code.cpp", "none", "", &FS);
1324617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1325617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1326617277e7SBjörn Schäpers 
1327617277e7SBjörn Schäpers   // Test 9.8: use inheritance from a file without BasedOnStyle
1328617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/withoutbase/.clang-format", 0,
1329617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("ColumnLimit: 123")));
1330617277e7SBjörn Schäpers   ASSERT_TRUE(
1331617277e7SBjörn Schäpers       FS.addFile("/e/withoutbase/sub/.clang-format", 0,
1332617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer(
1333617277e7SBjörn Schäpers                      "BasedOnStyle: InheritParentConfig\nIndentWidth: 7")));
1334617277e7SBjörn Schäpers   // Make sure we do not use the fallback style
1335617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/withoutbase/code.cpp", "google", "", &FS);
1336617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1337617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1338617277e7SBjörn Schäpers     auto Style = getLLVMStyle();
1339617277e7SBjörn Schäpers     Style.ColumnLimit = 123;
1340617277e7SBjörn Schäpers     return Style;
1341617277e7SBjörn Schäpers   }());
1342617277e7SBjörn Schäpers 
1343617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/withoutbase/sub/code.cpp", "google", "", &FS);
1344617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1345617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1346617277e7SBjörn Schäpers     auto Style = getLLVMStyle();
1347617277e7SBjörn Schäpers     Style.ColumnLimit = 123;
1348617277e7SBjörn Schäpers     Style.IndentWidth = 7;
1349617277e7SBjörn Schäpers     return Style;
1350617277e7SBjörn Schäpers   }());
1351617277e7SBjörn Schäpers 
1352617277e7SBjörn Schäpers   // Test 9.9: use inheritance from a specific config file.
1353617277e7SBjörn Schäpers   Style9 = getStyle("file:/e/sub/sub/.clang-format", "/e/sub/sub/code.cpp",
1354617277e7SBjörn Schäpers                     "none", "", &FS);
1355617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1356617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1357617277e7SBjörn Schäpers }
1358617277e7SBjörn Schäpers 
1359617277e7SBjörn Schäpers TEST(ConfigParseTest, GetStyleOfSpecificFile) {
1360617277e7SBjörn Schäpers   llvm::vfs::InMemoryFileSystem FS;
1361617277e7SBjörn Schäpers   // Specify absolute path to a format file in a parent directory.
1362617277e7SBjörn Schäpers   ASSERT_TRUE(
1363617277e7SBjörn Schäpers       FS.addFile("/e/.clang-format", 0,
1364617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
1365617277e7SBjörn Schäpers   ASSERT_TRUE(
1366617277e7SBjörn Schäpers       FS.addFile("/e/explicit.clang-format", 0,
1367617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
1368617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/sub/sub/test.cpp", 0,
1369617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1370617277e7SBjörn Schäpers   auto Style = getStyle("file:/e/explicit.clang-format",
1371617277e7SBjörn Schäpers                         "/e/sub/sub/sub/test.cpp", "LLVM", "", &FS);
1372617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style));
1373617277e7SBjörn Schäpers   ASSERT_EQ(*Style, getGoogleStyle());
1374617277e7SBjörn Schäpers 
1375617277e7SBjörn Schäpers   // Specify relative path to a format file.
1376617277e7SBjörn Schäpers   ASSERT_TRUE(
1377617277e7SBjörn Schäpers       FS.addFile("../../e/explicit.clang-format", 0,
1378617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
1379617277e7SBjörn Schäpers   Style = getStyle("file:../../e/explicit.clang-format",
1380617277e7SBjörn Schäpers                    "/e/sub/sub/sub/test.cpp", "LLVM", "", &FS);
1381617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style));
1382617277e7SBjörn Schäpers   ASSERT_EQ(*Style, getGoogleStyle());
1383617277e7SBjörn Schäpers 
1384617277e7SBjörn Schäpers   // Specify path to a format file that does not exist.
1385617277e7SBjörn Schäpers   Style = getStyle("file:/e/missing.clang-format", "/e/sub/sub/sub/test.cpp",
1386617277e7SBjörn Schäpers                    "LLVM", "", &FS);
1387617277e7SBjörn Schäpers   ASSERT_FALSE(static_cast<bool>(Style));
1388617277e7SBjörn Schäpers   llvm::consumeError(Style.takeError());
1389617277e7SBjörn Schäpers 
1390617277e7SBjörn Schäpers   // Specify path to a file on the filesystem.
1391617277e7SBjörn Schäpers   SmallString<128> FormatFilePath;
1392617277e7SBjörn Schäpers   std::error_code ECF = llvm::sys::fs::createTemporaryFile(
1393617277e7SBjörn Schäpers       "FormatFileTest", "tpl", FormatFilePath);
1394617277e7SBjörn Schäpers   EXPECT_FALSE((bool)ECF);
1395617277e7SBjörn Schäpers   llvm::raw_fd_ostream FormatFileTest(FormatFilePath, ECF);
1396617277e7SBjörn Schäpers   EXPECT_FALSE((bool)ECF);
1397617277e7SBjörn Schäpers   FormatFileTest << "BasedOnStyle: Google\n";
1398617277e7SBjörn Schäpers   FormatFileTest.close();
1399617277e7SBjörn Schäpers 
1400617277e7SBjörn Schäpers   SmallString<128> TestFilePath;
1401617277e7SBjörn Schäpers   std::error_code ECT =
1402617277e7SBjörn Schäpers       llvm::sys::fs::createTemporaryFile("CodeFileTest", "cc", TestFilePath);
1403617277e7SBjörn Schäpers   EXPECT_FALSE((bool)ECT);
1404617277e7SBjörn Schäpers   llvm::raw_fd_ostream CodeFileTest(TestFilePath, ECT);
1405617277e7SBjörn Schäpers   CodeFileTest << "int i;\n";
1406617277e7SBjörn Schäpers   CodeFileTest.close();
1407617277e7SBjörn Schäpers 
1408617277e7SBjörn Schäpers   std::string format_file_arg = std::string("file:") + FormatFilePath.c_str();
1409617277e7SBjörn Schäpers   Style = getStyle(format_file_arg, TestFilePath, "LLVM", "", nullptr);
1410617277e7SBjörn Schäpers 
1411617277e7SBjörn Schäpers   llvm::sys::fs::remove(FormatFilePath.c_str());
1412617277e7SBjörn Schäpers   llvm::sys::fs::remove(TestFilePath.c_str());
1413617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style));
1414617277e7SBjörn Schäpers   ASSERT_EQ(*Style, getGoogleStyle());
1415617277e7SBjörn Schäpers }
1416617277e7SBjörn Schäpers 
1417617277e7SBjörn Schäpers } // namespace
1418617277e7SBjörn Schäpers } // namespace format
1419617277e7SBjörn Schäpers } // namespace clang
1420