xref: /llvm-project/clang/unittests/Format/ConfigParseTest.cpp (revision b28e879a8323189ee05733a0ef3779a6768a9ea3)
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 
18527e7328SOwen Pan void dropDiagnosticHandler(const llvm::SMDiagnostic &, void *) {}
19617277e7SBjörn Schäpers FormatStyle getGoogleStyle() { return getGoogleStyle(FormatStyle::LK_Cpp); }
20617277e7SBjörn Schäpers 
21617277e7SBjörn Schäpers #define EXPECT_ALL_STYLES_EQUAL(Styles)                                        \
22617277e7SBjörn Schäpers   for (size_t i = 1; i < Styles.size(); ++i)                                   \
23617277e7SBjörn Schäpers   EXPECT_EQ(Styles[0], Styles[i])                                              \
24617277e7SBjörn Schäpers       << "Style #" << i << " of " << Styles.size() << " differs from Style #0"
25617277e7SBjörn Schäpers 
26617277e7SBjörn Schäpers TEST(ConfigParseTest, GetsPredefinedStyleByName) {
27617277e7SBjörn Schäpers   SmallVector<FormatStyle, 3> Styles;
28617277e7SBjörn Schäpers   Styles.resize(3);
29617277e7SBjörn Schäpers 
30617277e7SBjörn Schäpers   Styles[0] = getLLVMStyle();
31617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("LLVM", FormatStyle::LK_Cpp, &Styles[1]));
32617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("lLvM", FormatStyle::LK_Cpp, &Styles[2]));
33617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
34617277e7SBjörn Schäpers 
35617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle();
36617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("Google", FormatStyle::LK_Cpp, &Styles[1]));
37617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("gOOgle", FormatStyle::LK_Cpp, &Styles[2]));
38617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
39617277e7SBjörn Schäpers 
40617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
41617277e7SBjörn Schäpers   EXPECT_TRUE(
42617277e7SBjörn Schäpers       getPredefinedStyle("Google", FormatStyle::LK_JavaScript, &Styles[1]));
43617277e7SBjörn Schäpers   EXPECT_TRUE(
44617277e7SBjörn Schäpers       getPredefinedStyle("gOOgle", FormatStyle::LK_JavaScript, &Styles[2]));
45617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
46617277e7SBjörn Schäpers 
47617277e7SBjörn Schäpers   Styles[0] = getChromiumStyle(FormatStyle::LK_Cpp);
48617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("Chromium", FormatStyle::LK_Cpp, &Styles[1]));
49617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("cHRoMiUM", FormatStyle::LK_Cpp, &Styles[2]));
50617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
51617277e7SBjörn Schäpers 
52617277e7SBjörn Schäpers   Styles[0] = getMozillaStyle();
53617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("Mozilla", FormatStyle::LK_Cpp, &Styles[1]));
54617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("moZILla", FormatStyle::LK_Cpp, &Styles[2]));
55617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
56617277e7SBjörn Schäpers 
57617277e7SBjörn Schäpers   Styles[0] = getWebKitStyle();
58617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("WebKit", FormatStyle::LK_Cpp, &Styles[1]));
59617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("wEbKit", FormatStyle::LK_Cpp, &Styles[2]));
60617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
61617277e7SBjörn Schäpers 
62617277e7SBjörn Schäpers   Styles[0] = getGNUStyle();
63617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("GNU", FormatStyle::LK_Cpp, &Styles[1]));
64617277e7SBjörn Schäpers   EXPECT_TRUE(getPredefinedStyle("gnU", FormatStyle::LK_Cpp, &Styles[2]));
65617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
66617277e7SBjörn Schäpers 
670374bbbaSOwen Pan   Styles[0] = getClangFormatStyle();
680374bbbaSOwen Pan   EXPECT_TRUE(
690374bbbaSOwen Pan       getPredefinedStyle("clang-format", FormatStyle::LK_Cpp, &Styles[1]));
700374bbbaSOwen Pan   EXPECT_TRUE(
710374bbbaSOwen Pan       getPredefinedStyle("Clang-format", FormatStyle::LK_Cpp, &Styles[2]));
720374bbbaSOwen Pan   EXPECT_ALL_STYLES_EQUAL(Styles);
730374bbbaSOwen Pan 
74617277e7SBjörn Schäpers   EXPECT_FALSE(getPredefinedStyle("qwerty", FormatStyle::LK_Cpp, &Styles[0]));
75617277e7SBjörn Schäpers }
76617277e7SBjörn Schäpers 
77617277e7SBjörn Schäpers TEST(ConfigParseTest, GetsCorrectBasedOnStyle) {
78617277e7SBjörn Schäpers   SmallVector<FormatStyle, 8> Styles;
79617277e7SBjörn Schäpers   Styles.resize(2);
80617277e7SBjörn Schäpers 
81617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle();
82617277e7SBjörn Schäpers   Styles[1] = getLLVMStyle();
83617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
84617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
85617277e7SBjörn Schäpers 
86617277e7SBjörn Schäpers   Styles.resize(5);
87617277e7SBjörn Schäpers   Styles[0] = getGoogleStyle(FormatStyle::LK_JavaScript);
88617277e7SBjörn Schäpers   Styles[1] = getLLVMStyle();
89617277e7SBjörn Schäpers   Styles[1].Language = FormatStyle::LK_JavaScript;
90617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Styles[1]).value());
91617277e7SBjörn Schäpers 
92617277e7SBjörn Schäpers   Styles[2] = getLLVMStyle();
93617277e7SBjörn Schäpers   Styles[2].Language = FormatStyle::LK_JavaScript;
94617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("Language: JavaScript\n"
95617277e7SBjörn Schäpers                                   "BasedOnStyle: Google",
96617277e7SBjörn Schäpers                                   &Styles[2])
97617277e7SBjörn Schäpers                    .value());
98617277e7SBjörn Schäpers 
99617277e7SBjörn Schäpers   Styles[3] = getLLVMStyle();
100617277e7SBjörn Schäpers   Styles[3].Language = FormatStyle::LK_JavaScript;
101617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google\n"
102617277e7SBjörn Schäpers                                   "Language: JavaScript",
103617277e7SBjörn Schäpers                                   &Styles[3])
104617277e7SBjörn Schäpers                    .value());
105617277e7SBjörn Schäpers 
106617277e7SBjörn Schäpers   Styles[4] = getLLVMStyle();
107617277e7SBjörn Schäpers   Styles[4].Language = FormatStyle::LK_JavaScript;
108617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("---\n"
109617277e7SBjörn Schäpers                                   "BasedOnStyle: LLVM\n"
110617277e7SBjörn Schäpers                                   "IndentWidth: 123\n"
111617277e7SBjörn Schäpers                                   "---\n"
112617277e7SBjörn Schäpers                                   "BasedOnStyle: Google\n"
113617277e7SBjörn Schäpers                                   "Language: JavaScript",
114617277e7SBjörn Schäpers                                   &Styles[4])
115617277e7SBjörn Schäpers                    .value());
116617277e7SBjörn Schäpers   EXPECT_ALL_STYLES_EQUAL(Styles);
117617277e7SBjörn Schäpers }
118617277e7SBjörn Schäpers 
119617277e7SBjörn Schäpers #define CHECK_PARSE_BOOL_FIELD(FIELD, CONFIG_NAME)                             \
120617277e7SBjörn Schäpers   Style.FIELD = false;                                                         \
121617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": true", &Style).value());      \
122617277e7SBjörn Schäpers   EXPECT_TRUE(Style.FIELD);                                                    \
123617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(CONFIG_NAME ": false", &Style).value());     \
124617277e7SBjörn Schäpers   EXPECT_FALSE(Style.FIELD)
125617277e7SBjörn Schäpers 
126617277e7SBjörn Schäpers #define CHECK_PARSE_BOOL(FIELD) CHECK_PARSE_BOOL_FIELD(FIELD, #FIELD)
127617277e7SBjörn Schäpers 
128617277e7SBjörn Schäpers #define CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, CONFIG_NAME)              \
129617277e7SBjörn Schäpers   Style.STRUCT.FIELD = false;                                                  \
130617277e7SBjörn Schäpers   EXPECT_EQ(0,                                                                 \
131617277e7SBjörn Schäpers             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": true", &Style)   \
132617277e7SBjörn Schäpers                 .value());                                                     \
133617277e7SBjörn Schäpers   EXPECT_TRUE(Style.STRUCT.FIELD);                                             \
134617277e7SBjörn Schäpers   EXPECT_EQ(0,                                                                 \
135617277e7SBjörn Schäpers             parseConfiguration(#STRUCT ":\n  " CONFIG_NAME ": false", &Style)  \
136617277e7SBjörn Schäpers                 .value());                                                     \
137617277e7SBjörn Schäpers   EXPECT_FALSE(Style.STRUCT.FIELD)
138617277e7SBjörn Schäpers 
139617277e7SBjörn Schäpers #define CHECK_PARSE_NESTED_BOOL(STRUCT, FIELD)                                 \
140617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL_FIELD(STRUCT, FIELD, #FIELD)
141617277e7SBjörn Schäpers 
142617277e7SBjörn Schäpers #define CHECK_PARSE(TEXT, FIELD, VALUE)                                        \
143617277e7SBjörn Schäpers   EXPECT_NE(VALUE, Style.FIELD) << "Initial value already the same!";          \
144617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(TEXT, &Style).value());                      \
145617277e7SBjörn Schäpers   EXPECT_EQ(VALUE, Style.FIELD) << "Unexpected value after parsing!"
146617277e7SBjörn Schäpers 
147*b28e879aSOwen Pan #define CHECK_PARSE_INT(FIELD) CHECK_PARSE(#FIELD ": -1234", FIELD, -1234)
148*b28e879aSOwen Pan 
149*b28e879aSOwen Pan #define CHECK_PARSE_UNSIGNED(FIELD) CHECK_PARSE(#FIELD ": 1234", FIELD, 1234u)
150*b28e879aSOwen Pan 
15166f16e68SOwen Pan #define CHECK_PARSE_LIST(FIELD)                                                \
15266f16e68SOwen Pan   CHECK_PARSE(#FIELD ": [foo]", FIELD, std::vector<std::string>{"foo"})
15366f16e68SOwen Pan 
154617277e7SBjörn Schäpers #define CHECK_PARSE_NESTED_VALUE(TEXT, STRUCT, FIELD, VALUE)                   \
155617277e7SBjörn Schäpers   EXPECT_NE(VALUE, Style.STRUCT.FIELD) << "Initial value already the same!";   \
156617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(#STRUCT ":\n  " TEXT, &Style).value());      \
157617277e7SBjörn Schäpers   EXPECT_EQ(VALUE, Style.STRUCT.FIELD) << "Unexpected value after parsing!"
158617277e7SBjörn Schäpers 
159617277e7SBjörn Schäpers TEST(ConfigParseTest, ParsesConfigurationBools) {
160617277e7SBjörn Schäpers   FormatStyle Style = {};
161617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
162617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowAllArgumentsOnNextLine);
163617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowAllParametersOfDeclarationOnNextLine);
164236b3e1aSOwen Pan   CHECK_PARSE_BOOL(AllowShortCaseExpressionOnASingleLine);
165617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowShortCaseLabelsOnASingleLine);
16669209e30SBackl1ght   CHECK_PARSE_BOOL(AllowShortCompoundRequirementOnASingleLine);
167617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowShortEnumsOnASingleLine);
168617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(AllowShortLoopsOnASingleLine);
169486ec4bdSGalen Elias   CHECK_PARSE_BOOL(AllowShortNamespacesOnASingleLine);
170617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BinPackArguments);
17139faf13dSOwen Pan   CHECK_PARSE_BOOL(BreakAdjacentStringLiterals);
172617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BreakAfterJavaFieldAnnotations);
173617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BreakBeforeTernaryOperators);
174617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(BreakStringLiterals);
175617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(CompactNamespaces);
176786db636SOwen Pan   CHECK_PARSE_BOOL(Cpp11BracedListStyle);
177617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(DerivePointerAlignment);
178617277e7SBjörn Schäpers   CHECK_PARSE_BOOL_FIELD(DerivePointerAlignment, "DerivePointerBinding");
179617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(DisableFormat);
180617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentAccessModifiers);
181617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentCaseBlocks);
182786db636SOwen Pan   CHECK_PARSE_BOOL(IndentCaseLabels);
18333656932SSirraide   CHECK_PARSE_BOOL(IndentExportBlock);
184617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentGotoLabels);
185617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentRequiresClause);
186786db636SOwen Pan   CHECK_PARSE_BOOL_FIELD(IndentRequiresClause, "IndentRequires");
187617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(IndentWrappedFunctionNames);
188617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(InsertBraces);
1892c6ecc9dSOwen Pan   CHECK_PARSE_BOOL(InsertNewlineAtEOF);
1902853a838Ssstwcw   CHECK_PARSE_BOOL_FIELD(KeepEmptyLines.AtEndOfFile, "KeepEmptyLinesAtEOF");
1912853a838Ssstwcw   CHECK_PARSE_BOOL_FIELD(KeepEmptyLines.AtStartOfBlock,
1922853a838Ssstwcw                          "KeepEmptyLinesAtTheStartOfBlocks");
193786db636SOwen Pan   CHECK_PARSE_BOOL(KeepFormFeed);
194617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(ObjCSpaceAfterProperty);
195617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(ObjCSpaceBeforeProtocolList);
196617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(RemoveBracesLLVM);
197d989c241SOwen Pan   CHECK_PARSE_BOOL(RemoveEmptyLinesInUnwrappedLines);
198617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(RemoveSemicolon);
199a7d7da6eSOwen Pan   CHECK_PARSE_BOOL(SkipMacroDefinitionBody);
200617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpacesInSquareBrackets);
201617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceInEmptyBlock);
202617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpacesInContainerLiterals);
203617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceAfterCStyleCast);
204617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceAfterTemplateKeyword);
205617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceAfterLogicalNot);
206617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeAssignmentOperators);
207617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeCaseColon);
208617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeCpp11BracedList);
209617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeCtorInitializerColon);
210617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeInheritanceColon);
211af98f3b1Smydeveloperday   CHECK_PARSE_BOOL(SpaceBeforeJsonColon);
212617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeRangeBasedForLoopColon);
213617277e7SBjörn Schäpers   CHECK_PARSE_BOOL(SpaceBeforeSquareBrackets);
21474cc4389Ssstwcw   CHECK_PARSE_BOOL(VerilogBreakBetweenInstancePorts);
215617277e7SBjörn Schäpers 
21674720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, Enabled);
21774720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements,
21874720d1bSGalen Elias                           AcrossEmptyLines);
21974720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AcrossComments);
220236b3e1aSOwen Pan   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AlignCaseArrows);
22174720d1bSGalen Elias   CHECK_PARSE_NESTED_BOOL(AlignConsecutiveShortCaseStatements, AlignCaseColons);
222617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterCaseLabel);
223617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterClass);
224617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterEnum);
225617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterFunction);
226617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterNamespace);
227617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterObjCDeclaration);
228617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterStruct);
229617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterUnion);
230617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, AfterExternBlock);
231617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
232617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
233617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeLambdaBody);
234617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeWhile);
235617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
236617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
237617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
238617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
2392853a838Ssstwcw   CHECK_PARSE_NESTED_BOOL(KeepEmptyLines, AtEndOfFile);
2402853a838Ssstwcw   CHECK_PARSE_NESTED_BOOL(KeepEmptyLines, AtStartOfBlock);
2412853a838Ssstwcw   CHECK_PARSE_NESTED_BOOL(KeepEmptyLines, AtStartOfFile);
242617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterControlStatements);
243617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterForeachMacros);
244617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions,
245617277e7SBjörn Schäpers                           AfterFunctionDeclarationName);
246617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions,
247617277e7SBjörn Schäpers                           AfterFunctionDefinitionName);
248617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterIfMacros);
249617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterOverloadedOperator);
250908fd09aSOwen Pan   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, AfterPlacementOperator);
251617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_BOOL(SpaceBeforeParensOptions, BeforeNonEmptyParentheses);
25254f040ffSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, ExceptDoubleParentheses);
253c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InCStyleCasts);
254c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InConditionalStatements);
255c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, InEmptyParentheses);
256c669541cSGedare Bloom   CHECK_PARSE_NESTED_BOOL(SpacesInParensOptions, Other);
257617277e7SBjörn Schäpers }
258617277e7SBjörn Schäpers 
259617277e7SBjörn Schäpers #undef CHECK_PARSE_BOOL
260617277e7SBjörn Schäpers 
261*b28e879aSOwen Pan TEST(ConfigParseTest, ParsesConfigurationIntegers) {
262*b28e879aSOwen Pan   FormatStyle Style = {};
263*b28e879aSOwen Pan   Style.Language = FormatStyle::LK_Cpp;
264*b28e879aSOwen Pan 
265*b28e879aSOwen Pan   CHECK_PARSE_INT(AccessModifierOffset);
266*b28e879aSOwen Pan   CHECK_PARSE_INT(PPIndentWidth);
267*b28e879aSOwen Pan 
268*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(BracedInitializerIndentWidth);
269*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(ColumnLimit);
270*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(ConstructorInitializerIndentWidth);
271*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(ContinuationIndentWidth);
272*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(IndentWidth);
273*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(MaxEmptyLinesToKeep);
274*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(ObjCBlockIndentWidth);
275*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakAssignment);
276*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakBeforeFirstCallParameter);
277*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakBeforeMemberAccess);
278*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakComment);
279*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakFirstLessLess);
280*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakOpenParenthesis);
281*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakScopeResolution);
282*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakString);
283*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyBreakTemplateDeclaration);
284*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyExcessCharacter);
285*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyIndentedWhitespace);
286*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(PenaltyReturnTypeOnItsOwnLine);
287*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(ShortNamespaceLines);
288*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(SpacesBeforeTrailingComments);
289*b28e879aSOwen Pan   CHECK_PARSE_UNSIGNED(TabWidth);
290*b28e879aSOwen Pan }
291*b28e879aSOwen Pan 
292617277e7SBjörn Schäpers TEST(ConfigParseTest, ParsesConfiguration) {
293617277e7SBjörn Schäpers   FormatStyle Style = {};
294617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
295617277e7SBjörn Schäpers   CHECK_PARSE("CommentPragmas: '// abc$'", CommentPragmas, "// abc$");
296617277e7SBjörn Schäpers 
297617277e7SBjörn Schäpers   Style.QualifierAlignment = FormatStyle::QAS_Right;
298617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Leave", QualifierAlignment,
299617277e7SBjörn Schäpers               FormatStyle::QAS_Leave);
300617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Right", QualifierAlignment,
301617277e7SBjörn Schäpers               FormatStyle::QAS_Right);
302617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Left", QualifierAlignment,
303617277e7SBjörn Schäpers               FormatStyle::QAS_Left);
304617277e7SBjörn Schäpers   CHECK_PARSE("QualifierAlignment: Custom", QualifierAlignment,
305617277e7SBjörn Schäpers               FormatStyle::QAS_Custom);
306617277e7SBjörn Schäpers 
307617277e7SBjörn Schäpers   Style.QualifierOrder.clear();
308617277e7SBjörn Schäpers   CHECK_PARSE("QualifierOrder: [ const, volatile, type ]", QualifierOrder,
309617277e7SBjörn Schäpers               std::vector<std::string>({"const", "volatile", "type"}));
310617277e7SBjörn Schäpers   Style.QualifierOrder.clear();
311617277e7SBjörn Schäpers   CHECK_PARSE("QualifierOrder: [const, type]", QualifierOrder,
312617277e7SBjörn Schäpers               std::vector<std::string>({"const", "type"}));
313617277e7SBjörn Schäpers   Style.QualifierOrder.clear();
314617277e7SBjörn Schäpers   CHECK_PARSE("QualifierOrder: [volatile, type]", QualifierOrder,
315617277e7SBjörn Schäpers               std::vector<std::string>({"volatile", "type"}));
316617277e7SBjörn Schäpers 
317617277e7SBjörn Schäpers #define CHECK_ALIGN_CONSECUTIVE(FIELD)                                         \
318617277e7SBjörn Schäpers   do {                                                                         \
319617277e7SBjörn Schäpers     Style.FIELD.Enabled = true;                                                \
320f0bd62d8SBrad House     CHECK_PARSE(#FIELD ": None", FIELD,                                        \
321f0bd62d8SBrad House                 FormatStyle::AlignConsecutiveStyle({}));                       \
322b2c0c6f3SGedare Bloom     CHECK_PARSE(                                                               \
323b2c0c6f3SGedare Bloom         #FIELD ": Consecutive", FIELD,                                         \
324617277e7SBjörn Schäpers         FormatStyle::AlignConsecutiveStyle(                                    \
325617277e7SBjörn Schäpers             {/*Enabled=*/true, /*AcrossEmptyLines=*/false,                     \
326617277e7SBjörn Schäpers              /*AcrossComments=*/false, /*AlignCompound=*/false,                \
327f0bd62d8SBrad House              /*AlignFunctionDeclarations=*/true,                               \
328b2c0c6f3SGedare Bloom              /*AlignFunctionPointers=*/false, /*PadOperators=*/true}));        \
329b2c0c6f3SGedare Bloom     CHECK_PARSE(                                                               \
330b2c0c6f3SGedare Bloom         #FIELD ": AcrossEmptyLines", FIELD,                                    \
331617277e7SBjörn Schäpers         FormatStyle::AlignConsecutiveStyle(                                    \
332617277e7SBjörn Schäpers             {/*Enabled=*/true, /*AcrossEmptyLines=*/true,                      \
333617277e7SBjörn Schäpers              /*AcrossComments=*/false, /*AlignCompound=*/false,                \
334f0bd62d8SBrad House              /*AlignFunctionDeclarations=*/true,                               \
335b2c0c6f3SGedare Bloom              /*AlignFunctionPointers=*/false, /*PadOperators=*/true}));        \
336b2c0c6f3SGedare Bloom     CHECK_PARSE(                                                               \
33765688274SOwen Pan         #FIELD ": AcrossComments", FIELD,                                      \
33865688274SOwen Pan         FormatStyle::AlignConsecutiveStyle(                                    \
33965688274SOwen Pan             {/*Enabled=*/true, /*AcrossEmptyLines=*/false,                     \
34065688274SOwen Pan              /*AcrossComments=*/true, /*AlignCompound=*/false,                 \
34165688274SOwen Pan              /*AlignFunctionDeclarations=*/true,                               \
34265688274SOwen Pan              /*AlignFunctionPointers=*/false, /*PadOperators=*/true}));        \
34365688274SOwen Pan     CHECK_PARSE(                                                               \
344b2c0c6f3SGedare Bloom         #FIELD ": AcrossEmptyLinesAndComments", FIELD,                         \
345617277e7SBjörn Schäpers         FormatStyle::AlignConsecutiveStyle(                                    \
346617277e7SBjörn Schäpers             {/*Enabled=*/true, /*AcrossEmptyLines=*/true,                      \
347617277e7SBjörn Schäpers              /*AcrossComments=*/true, /*AlignCompound=*/false,                 \
348f0bd62d8SBrad House              /*AlignFunctionDeclarations=*/true,                               \
349b2c0c6f3SGedare Bloom              /*AlignFunctionPointers=*/false, /*PadOperators=*/true}));        \
350617277e7SBjörn Schäpers     /* For backwards compability, false / true should still parse */           \
351f0bd62d8SBrad House     CHECK_PARSE(#FIELD ": false", FIELD,                                       \
352f0bd62d8SBrad House                 FormatStyle::AlignConsecutiveStyle({}));                       \
353b2c0c6f3SGedare Bloom     CHECK_PARSE(                                                               \
354b2c0c6f3SGedare Bloom         #FIELD ": true", FIELD,                                                \
355617277e7SBjörn Schäpers         FormatStyle::AlignConsecutiveStyle(                                    \
356617277e7SBjörn Schäpers             {/*Enabled=*/true, /*AcrossEmptyLines=*/false,                     \
357617277e7SBjörn Schäpers              /*AcrossComments=*/false, /*AlignCompound=*/false,                \
358f0bd62d8SBrad House              /*AlignFunctionDeclarations=*/true,                               \
359b2c0c6f3SGedare Bloom              /*AlignFunctionPointers=*/false, /*PadOperators=*/true}));        \
360617277e7SBjörn Schäpers                                                                                \
361617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, Enabled);                                   \
362617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, AcrossEmptyLines);                          \
363617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, AcrossComments);                            \
364617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, AlignCompound);                             \
365f0bd62d8SBrad House     CHECK_PARSE_NESTED_BOOL(FIELD, AlignFunctionDeclarations);                 \
36665688274SOwen Pan     CHECK_PARSE_NESTED_BOOL(FIELD, AlignFunctionPointers);                     \
367617277e7SBjörn Schäpers     CHECK_PARSE_NESTED_BOOL(FIELD, PadOperators);                              \
368617277e7SBjörn Schäpers   } while (false)
369617277e7SBjörn Schäpers 
370617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveAssignments);
371617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveBitFields);
372617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveMacros);
373617277e7SBjörn Schäpers   CHECK_ALIGN_CONSECUTIVE(AlignConsecutiveDeclarations);
374617277e7SBjörn Schäpers 
375617277e7SBjörn Schäpers #undef CHECK_ALIGN_CONSECUTIVE
376617277e7SBjörn Schäpers 
377617277e7SBjörn Schäpers   Style.PointerAlignment = FormatStyle::PAS_Middle;
378617277e7SBjörn Schäpers   CHECK_PARSE("PointerAlignment: Left", PointerAlignment,
379617277e7SBjörn Schäpers               FormatStyle::PAS_Left);
380617277e7SBjörn Schäpers   CHECK_PARSE("PointerAlignment: Right", PointerAlignment,
381617277e7SBjörn Schäpers               FormatStyle::PAS_Right);
382617277e7SBjörn Schäpers   CHECK_PARSE("PointerAlignment: Middle", PointerAlignment,
383617277e7SBjörn Schäpers               FormatStyle::PAS_Middle);
384617277e7SBjörn Schäpers   Style.ReferenceAlignment = FormatStyle::RAS_Middle;
385617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Pointer", ReferenceAlignment,
386617277e7SBjörn Schäpers               FormatStyle::RAS_Pointer);
387617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Left", ReferenceAlignment,
388617277e7SBjörn Schäpers               FormatStyle::RAS_Left);
389617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Right", ReferenceAlignment,
390617277e7SBjörn Schäpers               FormatStyle::RAS_Right);
391617277e7SBjörn Schäpers   CHECK_PARSE("ReferenceAlignment: Middle", ReferenceAlignment,
392617277e7SBjörn Schäpers               FormatStyle::RAS_Middle);
393617277e7SBjörn Schäpers   // For backward compatibility:
394617277e7SBjörn Schäpers   CHECK_PARSE("PointerBindsToType: Left", PointerAlignment,
395617277e7SBjörn Schäpers               FormatStyle::PAS_Left);
396617277e7SBjörn Schäpers   CHECK_PARSE("PointerBindsToType: Right", PointerAlignment,
397617277e7SBjörn Schäpers               FormatStyle::PAS_Right);
398617277e7SBjörn Schäpers   CHECK_PARSE("PointerBindsToType: Middle", PointerAlignment,
399617277e7SBjörn Schäpers               FormatStyle::PAS_Middle);
400617277e7SBjörn Schäpers 
4010fba8381SIuri Chaer   Style.ReflowComments = FormatStyle::RCS_Always;
4020fba8381SIuri Chaer   CHECK_PARSE("ReflowComments: Never", ReflowComments, FormatStyle::RCS_Never);
4030fba8381SIuri Chaer   CHECK_PARSE("ReflowComments: IndentOnly", ReflowComments,
4040fba8381SIuri Chaer               FormatStyle::RCS_IndentOnly);
4050fba8381SIuri Chaer   CHECK_PARSE("ReflowComments: Always", ReflowComments,
4060fba8381SIuri Chaer               FormatStyle::RCS_Always);
4070fba8381SIuri Chaer   // For backward compatibility:
4080fba8381SIuri Chaer   CHECK_PARSE("ReflowComments: false", ReflowComments, FormatStyle::RCS_Never);
4090fba8381SIuri Chaer   CHECK_PARSE("ReflowComments: true", ReflowComments, FormatStyle::RCS_Always);
4100fba8381SIuri Chaer 
411617277e7SBjörn Schäpers   Style.Standard = FormatStyle::LS_Auto;
412617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++03", Standard, FormatStyle::LS_Cpp03);
413617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++11", Standard, FormatStyle::LS_Cpp11);
414617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++14", Standard, FormatStyle::LS_Cpp14);
415617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++17", Standard, FormatStyle::LS_Cpp17);
416617277e7SBjörn Schäpers   CHECK_PARSE("Standard: c++20", Standard, FormatStyle::LS_Cpp20);
417617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Auto", Standard, FormatStyle::LS_Auto);
418617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Latest", Standard, FormatStyle::LS_Latest);
419617277e7SBjörn Schäpers   // Legacy aliases:
420617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Cpp03", Standard, FormatStyle::LS_Cpp03);
421617277e7SBjörn Schäpers   CHECK_PARSE("Standard: Cpp11", Standard, FormatStyle::LS_Latest);
422617277e7SBjörn Schäpers   CHECK_PARSE("Standard: C++03", Standard, FormatStyle::LS_Cpp03);
423617277e7SBjörn Schäpers   CHECK_PARSE("Standard: C++11", Standard, FormatStyle::LS_Cpp11);
424617277e7SBjörn Schäpers 
425617277e7SBjörn Schäpers   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_All;
426617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: NonAssignment",
427617277e7SBjörn Schäpers               BreakBeforeBinaryOperators, FormatStyle::BOS_NonAssignment);
428617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: None", BreakBeforeBinaryOperators,
429617277e7SBjörn Schäpers               FormatStyle::BOS_None);
430617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: All", BreakBeforeBinaryOperators,
431617277e7SBjörn Schäpers               FormatStyle::BOS_All);
432617277e7SBjörn Schäpers   // For backward compatibility:
433617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: false", BreakBeforeBinaryOperators,
434617277e7SBjörn Schäpers               FormatStyle::BOS_None);
435617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBinaryOperators: true", BreakBeforeBinaryOperators,
436617277e7SBjörn Schäpers               FormatStyle::BOS_All);
437617277e7SBjörn Schäpers 
438c5a4291fSAmeer J   Style.BreakBinaryOperations = FormatStyle::BBO_Never;
439c5a4291fSAmeer J   CHECK_PARSE("BreakBinaryOperations: OnePerLine", BreakBinaryOperations,
440c5a4291fSAmeer J               FormatStyle::BBO_OnePerLine);
441c5a4291fSAmeer J   CHECK_PARSE("BreakBinaryOperations: RespectPrecedence", BreakBinaryOperations,
442c5a4291fSAmeer J               FormatStyle::BBO_RespectPrecedence);
443c5a4291fSAmeer J   CHECK_PARSE("BreakBinaryOperations: Never", BreakBinaryOperations,
444c5a4291fSAmeer J               FormatStyle::BBO_Never);
445c5a4291fSAmeer J 
446617277e7SBjörn Schäpers   Style.BreakConstructorInitializers = FormatStyle::BCIS_BeforeColon;
447617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializers: BeforeComma",
448617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
449617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializers: AfterColon",
450617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_AfterColon);
451617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializers: BeforeColon",
452617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_BeforeColon);
453617277e7SBjörn Schäpers   // For backward compatibility:
454617277e7SBjörn Schäpers   CHECK_PARSE("BreakConstructorInitializersBeforeComma: true",
455617277e7SBjörn Schäpers               BreakConstructorInitializers, FormatStyle::BCIS_BeforeComma);
456617277e7SBjörn Schäpers 
457617277e7SBjörn Schäpers   Style.BreakInheritanceList = FormatStyle::BILS_BeforeColon;
458617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: AfterComma", BreakInheritanceList,
459617277e7SBjörn Schäpers               FormatStyle::BILS_AfterComma);
460617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: BeforeComma", BreakInheritanceList,
461617277e7SBjörn Schäpers               FormatStyle::BILS_BeforeComma);
462617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: AfterColon", BreakInheritanceList,
463617277e7SBjörn Schäpers               FormatStyle::BILS_AfterColon);
464617277e7SBjörn Schäpers   CHECK_PARSE("BreakInheritanceList: BeforeColon", BreakInheritanceList,
465617277e7SBjörn Schäpers               FormatStyle::BILS_BeforeColon);
466617277e7SBjörn Schäpers   // For backward compatibility:
467617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeInheritanceComma: true", BreakInheritanceList,
468617277e7SBjörn Schäpers               FormatStyle::BILS_BeforeComma);
469617277e7SBjörn Schäpers 
4707c3237d7STom   Style.BinPackParameters = FormatStyle::BPPS_OnePerLine;
4717c3237d7STom   CHECK_PARSE("BinPackParameters: BinPack", BinPackParameters,
4727c3237d7STom               FormatStyle::BPPS_BinPack);
4737c3237d7STom   CHECK_PARSE("BinPackParameters: OnePerLine", BinPackParameters,
4747c3237d7STom               FormatStyle::BPPS_OnePerLine);
4757c3237d7STom   CHECK_PARSE("BinPackParameters: AlwaysOnePerLine", BinPackParameters,
4767c3237d7STom               FormatStyle::BPPS_AlwaysOnePerLine);
4777c3237d7STom   // For backward compatibility.
4787c3237d7STom   CHECK_PARSE("BinPackParameters: true", BinPackParameters,
4797c3237d7STom               FormatStyle::BPPS_BinPack);
4807c3237d7STom   CHECK_PARSE("BinPackParameters: false", BinPackParameters,
4817c3237d7STom               FormatStyle::BPPS_OnePerLine);
4827c3237d7STom 
483617277e7SBjörn Schäpers   Style.PackConstructorInitializers = FormatStyle::PCIS_BinPack;
484617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: Never", PackConstructorInitializers,
485617277e7SBjörn Schäpers               FormatStyle::PCIS_Never);
486617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: BinPack",
487617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_BinPack);
488617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: CurrentLine",
489617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
490617277e7SBjörn Schäpers   CHECK_PARSE("PackConstructorInitializers: NextLine",
491617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_NextLine);
492c24cdd58SBackl1ght   CHECK_PARSE("PackConstructorInitializers: NextLineOnly",
493c24cdd58SBackl1ght               PackConstructorInitializers, FormatStyle::PCIS_NextLineOnly);
494617277e7SBjörn Schäpers   // For backward compatibility:
495617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: Google\n"
496617277e7SBjörn Schäpers               "ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
497617277e7SBjörn Schäpers               "AllowAllConstructorInitializersOnNextLine: false",
498617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
499617277e7SBjörn Schäpers   Style.PackConstructorInitializers = FormatStyle::PCIS_NextLine;
500617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: Google\n"
501617277e7SBjörn Schäpers               "ConstructorInitializerAllOnOneLineOrOnePerLine: false",
502617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_BinPack);
503617277e7SBjörn Schäpers   CHECK_PARSE("ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
504617277e7SBjörn Schäpers               "AllowAllConstructorInitializersOnNextLine: true",
505617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_NextLine);
506617277e7SBjörn Schäpers   Style.PackConstructorInitializers = FormatStyle::PCIS_BinPack;
507617277e7SBjörn Schäpers   CHECK_PARSE("ConstructorInitializerAllOnOneLineOrOnePerLine: true\n"
508617277e7SBjörn Schäpers               "AllowAllConstructorInitializersOnNextLine: false",
509617277e7SBjörn Schäpers               PackConstructorInitializers, FormatStyle::PCIS_CurrentLine);
510617277e7SBjörn Schäpers 
511617277e7SBjörn Schäpers   Style.EmptyLineBeforeAccessModifier = FormatStyle::ELBAMS_LogicalBlock;
512617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: Never",
513617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_Never);
514617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: Leave",
515617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_Leave);
516617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: LogicalBlock",
517617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_LogicalBlock);
518617277e7SBjörn Schäpers   CHECK_PARSE("EmptyLineBeforeAccessModifier: Always",
519617277e7SBjörn Schäpers               EmptyLineBeforeAccessModifier, FormatStyle::ELBAMS_Always);
520617277e7SBjörn Schäpers 
521617277e7SBjörn Schäpers   Style.AlignAfterOpenBracket = FormatStyle::BAS_AlwaysBreak;
522617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: Align", AlignAfterOpenBracket,
523617277e7SBjörn Schäpers               FormatStyle::BAS_Align);
524617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: DontAlign", AlignAfterOpenBracket,
525617277e7SBjörn Schäpers               FormatStyle::BAS_DontAlign);
526617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: AlwaysBreak", AlignAfterOpenBracket,
527617277e7SBjörn Schäpers               FormatStyle::BAS_AlwaysBreak);
528617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: BlockIndent", AlignAfterOpenBracket,
529617277e7SBjörn Schäpers               FormatStyle::BAS_BlockIndent);
530617277e7SBjörn Schäpers   // For backward compatibility:
531617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: false", AlignAfterOpenBracket,
532617277e7SBjörn Schäpers               FormatStyle::BAS_DontAlign);
533617277e7SBjörn Schäpers   CHECK_PARSE("AlignAfterOpenBracket: true", AlignAfterOpenBracket,
534617277e7SBjörn Schäpers               FormatStyle::BAS_Align);
535617277e7SBjörn Schäpers 
536617277e7SBjörn Schäpers   Style.AlignEscapedNewlines = FormatStyle::ENAS_Left;
537617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlines: DontAlign", AlignEscapedNewlines,
538617277e7SBjörn Schäpers               FormatStyle::ENAS_DontAlign);
539617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlines: Left", AlignEscapedNewlines,
540617277e7SBjörn Schäpers               FormatStyle::ENAS_Left);
541dba2aa26SOwen Pan   CHECK_PARSE("AlignEscapedNewlines: LeftWithLastLine", AlignEscapedNewlines,
542dba2aa26SOwen Pan               FormatStyle::ENAS_LeftWithLastLine);
543617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlines: Right", AlignEscapedNewlines,
544617277e7SBjörn Schäpers               FormatStyle::ENAS_Right);
545617277e7SBjörn Schäpers   // For backward compatibility:
546617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlinesLeft: true", AlignEscapedNewlines,
547617277e7SBjörn Schäpers               FormatStyle::ENAS_Left);
548617277e7SBjörn Schäpers   CHECK_PARSE("AlignEscapedNewlinesLeft: false", AlignEscapedNewlines,
549617277e7SBjörn Schäpers               FormatStyle::ENAS_Right);
550617277e7SBjörn Schäpers 
551617277e7SBjörn Schäpers   Style.AlignOperands = FormatStyle::OAS_Align;
552617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: DontAlign", AlignOperands,
553617277e7SBjörn Schäpers               FormatStyle::OAS_DontAlign);
554617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: Align", AlignOperands, FormatStyle::OAS_Align);
555617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: AlignAfterOperator", AlignOperands,
556617277e7SBjörn Schäpers               FormatStyle::OAS_AlignAfterOperator);
557617277e7SBjörn Schäpers   // For backward compatibility:
558617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: false", AlignOperands,
559617277e7SBjörn Schäpers               FormatStyle::OAS_DontAlign);
560617277e7SBjörn Schäpers   CHECK_PARSE("AlignOperands: true", AlignOperands, FormatStyle::OAS_Align);
561617277e7SBjörn Schäpers 
562617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: Leave", AlignTrailingComments,
563617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5642bcfff67SOwen Pan                   {FormatStyle::TCAS_Leave, 0}));
565617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: Always", AlignTrailingComments,
566617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5672bcfff67SOwen Pan                   {FormatStyle::TCAS_Always, 0}));
568617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: Never", AlignTrailingComments,
569617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5702bcfff67SOwen Pan                   {FormatStyle::TCAS_Never, 0}));
571617277e7SBjörn Schäpers   // For backwards compatibility
572617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: true", AlignTrailingComments,
573617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5742bcfff67SOwen Pan                   {FormatStyle::TCAS_Always, 0}));
575617277e7SBjörn Schäpers   CHECK_PARSE("AlignTrailingComments: false", AlignTrailingComments,
576617277e7SBjörn Schäpers               FormatStyle::TrailingCommentsAlignmentStyle(
5772bcfff67SOwen Pan                   {FormatStyle::TCAS_Never, 0}));
578617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("Kind: Always", AlignTrailingComments, Kind,
579617277e7SBjörn Schäpers                            FormatStyle::TCAS_Always);
580617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("Kind: Never", AlignTrailingComments, Kind,
581617277e7SBjörn Schäpers                            FormatStyle::TCAS_Never);
582617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("Kind: Leave", AlignTrailingComments, Kind,
583617277e7SBjörn Schäpers                            FormatStyle::TCAS_Leave);
584617277e7SBjörn Schäpers   CHECK_PARSE_NESTED_VALUE("OverEmptyLines: 1234", AlignTrailingComments,
585617277e7SBjörn Schäpers                            OverEmptyLines, 1234u);
586617277e7SBjörn Schäpers 
587617277e7SBjörn Schäpers   Style.UseTab = FormatStyle::UT_ForIndentation;
588617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: Never", UseTab, FormatStyle::UT_Never);
589617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: ForIndentation", UseTab, FormatStyle::UT_ForIndentation);
590617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: Always", UseTab, FormatStyle::UT_Always);
591617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: ForContinuationAndIndentation", UseTab,
592617277e7SBjörn Schäpers               FormatStyle::UT_ForContinuationAndIndentation);
593617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: AlignWithSpaces", UseTab,
594617277e7SBjörn Schäpers               FormatStyle::UT_AlignWithSpaces);
595617277e7SBjörn Schäpers   // For backward compatibility:
596617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: false", UseTab, FormatStyle::UT_Never);
597617277e7SBjörn Schäpers   CHECK_PARSE("UseTab: true", UseTab, FormatStyle::UT_Always);
598617277e7SBjörn Schäpers 
599617277e7SBjörn Schäpers   Style.AllowShortBlocksOnASingleLine = FormatStyle::SBS_Empty;
600617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: Never",
601617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
602617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: Empty",
603617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Empty);
604617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: Always",
605617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
606617277e7SBjörn Schäpers   // For backward compatibility:
607617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: false",
608617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Never);
609617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortBlocksOnASingleLine: true",
610617277e7SBjörn Schäpers               AllowShortBlocksOnASingleLine, FormatStyle::SBS_Always);
611617277e7SBjörn Schäpers 
612617277e7SBjörn Schäpers   Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
613617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: None",
614617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
615617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Inline",
616617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Inline);
617617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: Empty",
618617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_Empty);
619617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: All",
620617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
621617277e7SBjörn Schäpers   // For backward compatibility:
622617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: false",
623617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_None);
624617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortFunctionsOnASingleLine: true",
625617277e7SBjörn Schäpers               AllowShortFunctionsOnASingleLine, FormatStyle::SFS_All);
626617277e7SBjörn Schäpers 
62795c1a174SBackl1ght   Style.AllowShortLambdasOnASingleLine = FormatStyle::SLS_All;
62895c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: None",
62995c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_None);
63095c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: Empty",
63195c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_Empty);
63295c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: Inline",
63395c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_Inline);
63495c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: All",
63595c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_All);
63695c1a174SBackl1ght   // For backward compatibility:
63795c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: false",
63895c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_None);
63995c1a174SBackl1ght   CHECK_PARSE("AllowShortLambdasOnASingleLine: true",
64095c1a174SBackl1ght               AllowShortLambdasOnASingleLine, FormatStyle::SLS_All);
64195c1a174SBackl1ght 
642617277e7SBjörn Schäpers   Style.SpaceAroundPointerQualifiers = FormatStyle::SAPQ_Both;
643617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: Default",
644617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Default);
645617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: Before",
646617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Before);
647617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: After",
648617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_After);
649617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAroundPointerQualifiers: Both",
650617277e7SBjörn Schäpers               SpaceAroundPointerQualifiers, FormatStyle::SAPQ_Both);
651617277e7SBjörn Schäpers 
652617277e7SBjörn Schäpers   Style.SpaceBeforeParens = FormatStyle::SBPO_Always;
653617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: Never", SpaceBeforeParens,
654617277e7SBjörn Schäpers               FormatStyle::SBPO_Never);
655617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: Always", SpaceBeforeParens,
656617277e7SBjörn Schäpers               FormatStyle::SBPO_Always);
657617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: ControlStatements", SpaceBeforeParens,
658617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatements);
659617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: ControlStatementsExceptControlMacros",
660617277e7SBjörn Schäpers               SpaceBeforeParens,
661617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatementsExceptControlMacros);
662617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: NonEmptyParentheses", SpaceBeforeParens,
663617277e7SBjörn Schäpers               FormatStyle::SBPO_NonEmptyParentheses);
664617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: Custom", SpaceBeforeParens,
665617277e7SBjörn Schäpers               FormatStyle::SBPO_Custom);
666617277e7SBjörn Schäpers   // For backward compatibility:
667617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAfterControlStatementKeyword: false", SpaceBeforeParens,
668617277e7SBjörn Schäpers               FormatStyle::SBPO_Never);
669617277e7SBjörn Schäpers   CHECK_PARSE("SpaceAfterControlStatementKeyword: true", SpaceBeforeParens,
670617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatements);
671617277e7SBjörn Schäpers   CHECK_PARSE("SpaceBeforeParens: ControlStatementsExceptForEachMacros",
672617277e7SBjörn Schäpers               SpaceBeforeParens,
673617277e7SBjörn Schäpers               FormatStyle::SBPO_ControlStatementsExceptControlMacros);
674617277e7SBjörn Schäpers 
675c669541cSGedare Bloom   // For backward compatibility:
676c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
677c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
678c669541cSGedare Bloom   CHECK_PARSE("SpacesInParentheses: true", SpacesInParens,
679c669541cSGedare Bloom               FormatStyle::SIPO_Custom);
680c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
681c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
68254f040ffSGedare Bloom   CHECK_PARSE(
68354f040ffSGedare Bloom       "SpacesInParentheses: true", SpacesInParensOptions,
68454f040ffSGedare Bloom       FormatStyle::SpacesInParensCustom(false, true, false, false, true));
685c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
686c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
68754f040ffSGedare Bloom   CHECK_PARSE(
68854f040ffSGedare Bloom       "SpacesInConditionalStatement: true", SpacesInParensOptions,
68954f040ffSGedare Bloom       FormatStyle::SpacesInParensCustom(false, true, false, false, false));
690c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
691c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
69254f040ffSGedare Bloom   CHECK_PARSE(
69354f040ffSGedare Bloom       "SpacesInCStyleCastParentheses: true", SpacesInParensOptions,
69454f040ffSGedare Bloom       FormatStyle::SpacesInParensCustom(false, false, true, false, false));
695c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
696c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
69754f040ffSGedare Bloom   CHECK_PARSE(
69854f040ffSGedare Bloom       "SpaceInEmptyParentheses: true", SpacesInParensOptions,
69954f040ffSGedare Bloom       FormatStyle::SpacesInParensCustom(false, false, false, true, false));
700c669541cSGedare Bloom   Style.SpacesInParens = FormatStyle::SIPO_Never;
701c669541cSGedare Bloom   Style.SpacesInParensOptions = {};
702c669541cSGedare Bloom 
703617277e7SBjörn Schäpers   Style.ColumnLimit = 123;
704617277e7SBjörn Schäpers   FormatStyle BaseStyle = getLLVMStyle();
705617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM", ColumnLimit, BaseStyle.ColumnLimit);
706617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM\nColumnLimit: 1234", ColumnLimit, 1234u);
707617277e7SBjörn Schäpers 
708617277e7SBjörn Schäpers   Style.BreakBeforeBraces = FormatStyle::BS_Stroustrup;
709617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Attach", BreakBeforeBraces,
710617277e7SBjörn Schäpers               FormatStyle::BS_Attach);
711617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Linux", BreakBeforeBraces,
712617277e7SBjörn Schäpers               FormatStyle::BS_Linux);
713617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Mozilla", BreakBeforeBraces,
714617277e7SBjörn Schäpers               FormatStyle::BS_Mozilla);
715617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Stroustrup", BreakBeforeBraces,
716617277e7SBjörn Schäpers               FormatStyle::BS_Stroustrup);
717617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Allman", BreakBeforeBraces,
718617277e7SBjörn Schäpers               FormatStyle::BS_Allman);
719617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Whitesmiths", BreakBeforeBraces,
720617277e7SBjörn Schäpers               FormatStyle::BS_Whitesmiths);
721617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: GNU", BreakBeforeBraces, FormatStyle::BS_GNU);
722617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: WebKit", BreakBeforeBraces,
723617277e7SBjörn Schäpers               FormatStyle::BS_WebKit);
724617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeBraces: Custom", BreakBeforeBraces,
725617277e7SBjörn Schäpers               FormatStyle::BS_Custom);
726617277e7SBjörn Schäpers 
727617277e7SBjörn Schäpers   Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
728617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
729617277e7SBjörn Schäpers               "  AfterControlStatement: MultiLine",
730617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement,
731617277e7SBjörn Schäpers               FormatStyle::BWACS_MultiLine);
732617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
733617277e7SBjörn Schäpers               "  AfterControlStatement: Always",
734617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
735617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
736617277e7SBjörn Schäpers               "  AfterControlStatement: Never",
737617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
738617277e7SBjörn Schäpers   // For backward compatibility:
739617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
740617277e7SBjörn Schäpers               "  AfterControlStatement: true",
741617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Always);
742617277e7SBjörn Schäpers   CHECK_PARSE("BraceWrapping:\n"
743617277e7SBjörn Schäpers               "  AfterControlStatement: false",
744617277e7SBjörn Schäpers               BraceWrapping.AfterControlStatement, FormatStyle::BWACS_Never);
745617277e7SBjörn Schäpers 
746d821650eSrmarker   Style.BreakAfterReturnType = FormatStyle::RTBS_All;
747d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: None", BreakAfterReturnType,
74891dcf53aSrmarker               FormatStyle::RTBS_None);
749d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: Automatic", BreakAfterReturnType,
75091dcf53aSrmarker               FormatStyle::RTBS_Automatic);
751d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: ExceptShortType", BreakAfterReturnType,
752d821650eSrmarker               FormatStyle::RTBS_ExceptShortType);
753d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: All", BreakAfterReturnType,
75491dcf53aSrmarker               FormatStyle::RTBS_All);
755d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: TopLevel", BreakAfterReturnType,
75691dcf53aSrmarker               FormatStyle::RTBS_TopLevel);
757d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: AllDefinitions", BreakAfterReturnType,
758d821650eSrmarker               FormatStyle::RTBS_AllDefinitions);
759d821650eSrmarker   CHECK_PARSE("BreakAfterReturnType: TopLevelDefinitions", BreakAfterReturnType,
76091dcf53aSrmarker               FormatStyle::RTBS_TopLevelDefinitions);
76191dcf53aSrmarker   // For backward compatibility:
762d821650eSrmarker   CHECK_PARSE("AlwaysBreakAfterReturnType: None", BreakAfterReturnType,
763617277e7SBjörn Schäpers               FormatStyle::RTBS_None);
764d821650eSrmarker   CHECK_PARSE("AlwaysBreakAfterReturnType: Automatic", BreakAfterReturnType,
765d821650eSrmarker               FormatStyle::RTBS_Automatic);
76625620073Srmarker   CHECK_PARSE("AlwaysBreakAfterReturnType: ExceptShortType",
767d821650eSrmarker               BreakAfterReturnType, FormatStyle::RTBS_ExceptShortType);
768d821650eSrmarker   CHECK_PARSE("AlwaysBreakAfterReturnType: All", BreakAfterReturnType,
769617277e7SBjörn Schäpers               FormatStyle::RTBS_All);
770d821650eSrmarker   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevel", BreakAfterReturnType,
771d821650eSrmarker               FormatStyle::RTBS_TopLevel);
772617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: AllDefinitions",
773d821650eSrmarker               BreakAfterReturnType, FormatStyle::RTBS_AllDefinitions);
774617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterReturnType: TopLevelDefinitions",
775d821650eSrmarker               BreakAfterReturnType, FormatStyle::RTBS_TopLevelDefinitions);
776617277e7SBjörn Schäpers 
7777664ddf8SOwen Pan   Style.BreakTemplateDeclarations = FormatStyle::BTDS_Yes;
7787664ddf8SOwen Pan   CHECK_PARSE("BreakTemplateDeclarations: Leave", BreakTemplateDeclarations,
7797664ddf8SOwen Pan               FormatStyle::BTDS_Leave);
7807664ddf8SOwen Pan   CHECK_PARSE("BreakTemplateDeclarations: No", BreakTemplateDeclarations,
781c5cbfc56SOwen Pan               FormatStyle::BTDS_No);
7827664ddf8SOwen Pan   CHECK_PARSE("BreakTemplateDeclarations: MultiLine", BreakTemplateDeclarations,
7837664ddf8SOwen Pan               FormatStyle::BTDS_MultiLine);
7847664ddf8SOwen Pan   CHECK_PARSE("BreakTemplateDeclarations: Yes", BreakTemplateDeclarations,
785c5cbfc56SOwen Pan               FormatStyle::BTDS_Yes);
7867664ddf8SOwen Pan   CHECK_PARSE("BreakTemplateDeclarations: false", BreakTemplateDeclarations,
7877664ddf8SOwen Pan               FormatStyle::BTDS_MultiLine);
7887664ddf8SOwen Pan   CHECK_PARSE("BreakTemplateDeclarations: true", BreakTemplateDeclarations,
7897664ddf8SOwen Pan               FormatStyle::BTDS_Yes);
790c5cbfc56SOwen Pan   // For backward compatibility:
791d0337990SOwen Pan   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Leave",
7927664ddf8SOwen Pan               BreakTemplateDeclarations, FormatStyle::BTDS_Leave);
7937664ddf8SOwen Pan   CHECK_PARSE("AlwaysBreakTemplateDeclarations: No", BreakTemplateDeclarations,
7947664ddf8SOwen Pan               FormatStyle::BTDS_No);
795617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: MultiLine",
7967664ddf8SOwen Pan               BreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
7977664ddf8SOwen Pan   CHECK_PARSE("AlwaysBreakTemplateDeclarations: Yes", BreakTemplateDeclarations,
7987664ddf8SOwen Pan               FormatStyle::BTDS_Yes);
799617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: false",
8007664ddf8SOwen Pan               BreakTemplateDeclarations, FormatStyle::BTDS_MultiLine);
801617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakTemplateDeclarations: true",
8027664ddf8SOwen Pan               BreakTemplateDeclarations, FormatStyle::BTDS_Yes);
803617277e7SBjörn Schäpers 
804617277e7SBjörn Schäpers   Style.AlwaysBreakAfterDefinitionReturnType = FormatStyle::DRTBS_All;
805617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: None",
806617277e7SBjörn Schäpers               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_None);
807617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: All",
808617277e7SBjörn Schäpers               AlwaysBreakAfterDefinitionReturnType, FormatStyle::DRTBS_All);
809617277e7SBjörn Schäpers   CHECK_PARSE("AlwaysBreakAfterDefinitionReturnType: TopLevel",
810617277e7SBjörn Schäpers               AlwaysBreakAfterDefinitionReturnType,
811617277e7SBjörn Schäpers               FormatStyle::DRTBS_TopLevel);
812617277e7SBjörn Schäpers 
813617277e7SBjörn Schäpers   Style.NamespaceIndentation = FormatStyle::NI_All;
814617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceIndentation: None", NamespaceIndentation,
815617277e7SBjörn Schäpers               FormatStyle::NI_None);
816617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceIndentation: Inner", NamespaceIndentation,
817617277e7SBjörn Schäpers               FormatStyle::NI_Inner);
818617277e7SBjörn Schäpers   CHECK_PARSE("NamespaceIndentation: All", NamespaceIndentation,
819617277e7SBjörn Schäpers               FormatStyle::NI_All);
820617277e7SBjörn Schäpers 
821617277e7SBjörn Schäpers   Style.AllowShortIfStatementsOnASingleLine = FormatStyle::SIS_OnlyFirstIf;
822617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Never",
823617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
824617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: WithoutElse",
825617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
826617277e7SBjörn Schäpers               FormatStyle::SIS_WithoutElse);
827617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: OnlyFirstIf",
828617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
829617277e7SBjörn Schäpers               FormatStyle::SIS_OnlyFirstIf);
830617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: AllIfsAndElse",
831617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
832617277e7SBjörn Schäpers               FormatStyle::SIS_AllIfsAndElse);
833617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: Always",
834617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
835617277e7SBjörn Schäpers               FormatStyle::SIS_OnlyFirstIf);
836617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: false",
837617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine, FormatStyle::SIS_Never);
838617277e7SBjörn Schäpers   CHECK_PARSE("AllowShortIfStatementsOnASingleLine: true",
839617277e7SBjörn Schäpers               AllowShortIfStatementsOnASingleLine,
840617277e7SBjörn Schäpers               FormatStyle::SIS_WithoutElse);
841617277e7SBjörn Schäpers 
842617277e7SBjörn Schäpers   Style.IndentExternBlock = FormatStyle::IEBS_NoIndent;
843617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: AfterExternBlock", IndentExternBlock,
844617277e7SBjörn Schäpers               FormatStyle::IEBS_AfterExternBlock);
845617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: Indent", IndentExternBlock,
846617277e7SBjörn Schäpers               FormatStyle::IEBS_Indent);
847617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: NoIndent", IndentExternBlock,
848617277e7SBjörn Schäpers               FormatStyle::IEBS_NoIndent);
849617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: true", IndentExternBlock,
850617277e7SBjörn Schäpers               FormatStyle::IEBS_Indent);
851617277e7SBjörn Schäpers   CHECK_PARSE("IndentExternBlock: false", IndentExternBlock,
852617277e7SBjörn Schäpers               FormatStyle::IEBS_NoIndent);
853617277e7SBjörn Schäpers 
854617277e7SBjörn Schäpers   Style.BitFieldColonSpacing = FormatStyle::BFCS_None;
855617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: Both", BitFieldColonSpacing,
856617277e7SBjörn Schäpers               FormatStyle::BFCS_Both);
857617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: None", BitFieldColonSpacing,
858617277e7SBjörn Schäpers               FormatStyle::BFCS_None);
859617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: Before", BitFieldColonSpacing,
860617277e7SBjörn Schäpers               FormatStyle::BFCS_Before);
861617277e7SBjörn Schäpers   CHECK_PARSE("BitFieldColonSpacing: After", BitFieldColonSpacing,
862617277e7SBjörn Schäpers               FormatStyle::BFCS_After);
863617277e7SBjörn Schäpers 
864617277e7SBjörn Schäpers   Style.SortJavaStaticImport = FormatStyle::SJSIO_Before;
865617277e7SBjörn Schäpers   CHECK_PARSE("SortJavaStaticImport: After", SortJavaStaticImport,
866617277e7SBjörn Schäpers               FormatStyle::SJSIO_After);
867617277e7SBjörn Schäpers   CHECK_PARSE("SortJavaStaticImport: Before", SortJavaStaticImport,
868617277e7SBjörn Schäpers               FormatStyle::SJSIO_Before);
869617277e7SBjörn Schäpers 
87058751f94SBackl1ght   Style.SortUsingDeclarations = FormatStyle::SUD_LexicographicNumeric;
87158751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: Never", SortUsingDeclarations,
87258751f94SBackl1ght               FormatStyle::SUD_Never);
87358751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: Lexicographic", SortUsingDeclarations,
87458751f94SBackl1ght               FormatStyle::SUD_Lexicographic);
87558751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: LexicographicNumeric",
87658751f94SBackl1ght               SortUsingDeclarations, FormatStyle::SUD_LexicographicNumeric);
87758751f94SBackl1ght   // For backward compatibility:
87858751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: false", SortUsingDeclarations,
87958751f94SBackl1ght               FormatStyle::SUD_Never);
88058751f94SBackl1ght   CHECK_PARSE("SortUsingDeclarations: true", SortUsingDeclarations,
88158751f94SBackl1ght               FormatStyle::SUD_LexicographicNumeric);
88258751f94SBackl1ght 
8831c997fefSdmasloff   CHECK_PARSE("WrapNamespaceBodyWithEmptyLines: Never",
8841c997fefSdmasloff               WrapNamespaceBodyWithEmptyLines, FormatStyle::WNBWELS_Never);
8851c997fefSdmasloff   CHECK_PARSE("WrapNamespaceBodyWithEmptyLines: Always",
8861c997fefSdmasloff               WrapNamespaceBodyWithEmptyLines, FormatStyle::WNBWELS_Always);
8871c997fefSdmasloff   CHECK_PARSE("WrapNamespaceBodyWithEmptyLines: Leave",
8881c997fefSdmasloff               WrapNamespaceBodyWithEmptyLines, FormatStyle::WNBWELS_Leave);
8891c997fefSdmasloff 
890617277e7SBjörn Schäpers   // FIXME: This is required because parsing a configuration simply overwrites
891617277e7SBjörn Schäpers   // the first N elements of the list instead of resetting it.
892617277e7SBjörn Schäpers   Style.ForEachMacros.clear();
893617277e7SBjörn Schäpers   std::vector<std::string> BoostForeach;
894617277e7SBjörn Schäpers   BoostForeach.push_back("BOOST_FOREACH");
895617277e7SBjörn Schäpers   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH]", ForEachMacros, BoostForeach);
896617277e7SBjörn Schäpers   std::vector<std::string> BoostAndQForeach;
897617277e7SBjörn Schäpers   BoostAndQForeach.push_back("BOOST_FOREACH");
898617277e7SBjörn Schäpers   BoostAndQForeach.push_back("Q_FOREACH");
899617277e7SBjörn Schäpers   CHECK_PARSE("ForEachMacros: [BOOST_FOREACH, Q_FOREACH]", ForEachMacros,
900617277e7SBjörn Schäpers               BoostAndQForeach);
901617277e7SBjörn Schäpers 
902617277e7SBjörn Schäpers   Style.IfMacros.clear();
903617277e7SBjörn Schäpers   std::vector<std::string> CustomIfs;
904617277e7SBjörn Schäpers   CustomIfs.push_back("MYIF");
905617277e7SBjörn Schäpers   CHECK_PARSE("IfMacros: [MYIF]", IfMacros, CustomIfs);
906617277e7SBjörn Schäpers 
907617277e7SBjörn Schäpers   Style.AttributeMacros.clear();
908617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM", AttributeMacros,
909617277e7SBjörn Schäpers               std::vector<std::string>{"__capability"});
910617277e7SBjörn Schäpers   CHECK_PARSE("AttributeMacros: [attr1, attr2]", AttributeMacros,
911617277e7SBjörn Schäpers               std::vector<std::string>({"attr1", "attr2"}));
912617277e7SBjörn Schäpers 
913617277e7SBjörn Schäpers   Style.StatementAttributeLikeMacros.clear();
914617277e7SBjörn Schäpers   CHECK_PARSE("StatementAttributeLikeMacros: [emit,Q_EMIT]",
915617277e7SBjörn Schäpers               StatementAttributeLikeMacros,
916617277e7SBjörn Schäpers               std::vector<std::string>({"emit", "Q_EMIT"}));
917617277e7SBjörn Schäpers 
918617277e7SBjörn Schäpers   Style.StatementMacros.clear();
919617277e7SBjörn Schäpers   CHECK_PARSE("StatementMacros: [QUNUSED]", StatementMacros,
920617277e7SBjörn Schäpers               std::vector<std::string>{"QUNUSED"});
921617277e7SBjörn Schäpers   CHECK_PARSE("StatementMacros: [QUNUSED, QT_REQUIRE_VERSION]", StatementMacros,
922617277e7SBjörn Schäpers               std::vector<std::string>({"QUNUSED", "QT_REQUIRE_VERSION"}));
923617277e7SBjörn Schäpers 
92466f16e68SOwen Pan   CHECK_PARSE_LIST(JavaImportGroups);
92566f16e68SOwen Pan   CHECK_PARSE_LIST(Macros);
92666f16e68SOwen Pan   CHECK_PARSE_LIST(NamespaceMacros);
92766f16e68SOwen Pan   CHECK_PARSE_LIST(ObjCPropertyAttributeOrder);
92866f16e68SOwen Pan   CHECK_PARSE_LIST(TableGenBreakingDAGArgOperators);
92966f16e68SOwen Pan   CHECK_PARSE_LIST(TemplateNames);
93066f16e68SOwen Pan   CHECK_PARSE_LIST(TypeNames);
93166f16e68SOwen Pan   CHECK_PARSE_LIST(TypenameMacros);
93266f16e68SOwen Pan   CHECK_PARSE_LIST(VariableTemplates);
933617277e7SBjörn Schäpers 
934617277e7SBjörn Schäpers   Style.WhitespaceSensitiveMacros.clear();
935617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE]",
936617277e7SBjörn Schäpers               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
937617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: [STRINGIZE, ASSERT]",
938617277e7SBjörn Schäpers               WhitespaceSensitiveMacros,
939617277e7SBjörn Schäpers               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
940617277e7SBjörn Schäpers   Style.WhitespaceSensitiveMacros.clear();
941617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE']",
942617277e7SBjörn Schäpers               WhitespaceSensitiveMacros, std::vector<std::string>{"STRINGIZE"});
943617277e7SBjörn Schäpers   CHECK_PARSE("WhitespaceSensitiveMacros: ['STRINGIZE', 'ASSERT']",
944617277e7SBjörn Schäpers               WhitespaceSensitiveMacros,
945617277e7SBjörn Schäpers               std::vector<std::string>({"STRINGIZE", "ASSERT"}));
946617277e7SBjörn Schäpers 
947617277e7SBjörn Schäpers   Style.IncludeStyle.IncludeCategories.clear();
948617277e7SBjörn Schäpers   std::vector<tooling::IncludeStyle::IncludeCategory> ExpectedCategories = {
949617277e7SBjörn Schäpers       {"abc/.*", 2, 0, false}, {".*", 1, 0, true}};
950617277e7SBjörn Schäpers   CHECK_PARSE("IncludeCategories:\n"
951617277e7SBjörn Schäpers               "  - Regex: abc/.*\n"
952617277e7SBjörn Schäpers               "    Priority: 2\n"
953617277e7SBjörn Schäpers               "  - Regex: .*\n"
954617277e7SBjörn Schäpers               "    Priority: 1\n"
95588934a82SOwen Pan               "    CaseSensitive: true",
956617277e7SBjörn Schäpers               IncludeStyle.IncludeCategories, ExpectedCategories);
957617277e7SBjörn Schäpers   CHECK_PARSE("IncludeIsMainRegex: 'abc$'", IncludeStyle.IncludeIsMainRegex,
958617277e7SBjörn Schäpers               "abc$");
959617277e7SBjörn Schäpers   CHECK_PARSE("IncludeIsMainSourceRegex: 'abc$'",
960617277e7SBjörn Schäpers               IncludeStyle.IncludeIsMainSourceRegex, "abc$");
961617277e7SBjörn Schäpers 
962617277e7SBjörn Schäpers   Style.SortIncludes = FormatStyle::SI_Never;
963617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: true", SortIncludes,
964617277e7SBjörn Schäpers               FormatStyle::SI_CaseSensitive);
965617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: false", SortIncludes, FormatStyle::SI_Never);
966617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: CaseInsensitive", SortIncludes,
967617277e7SBjörn Schäpers               FormatStyle::SI_CaseInsensitive);
968617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: CaseSensitive", SortIncludes,
969617277e7SBjörn Schäpers               FormatStyle::SI_CaseSensitive);
970617277e7SBjörn Schäpers   CHECK_PARSE("SortIncludes: Never", SortIncludes, FormatStyle::SI_Never);
971617277e7SBjörn Schäpers 
972617277e7SBjörn Schäpers   Style.RawStringFormats.clear();
973617277e7SBjörn Schäpers   std::vector<FormatStyle::RawStringFormat> ExpectedRawStringFormats = {
974617277e7SBjörn Schäpers       {
975617277e7SBjörn Schäpers           FormatStyle::LK_TextProto,
976617277e7SBjörn Schäpers           {"pb", "proto"},
977617277e7SBjörn Schäpers           {"PARSE_TEXT_PROTO"},
978617277e7SBjörn Schäpers           /*CanonicalDelimiter=*/"",
979617277e7SBjörn Schäpers           "llvm",
980617277e7SBjörn Schäpers       },
981617277e7SBjörn Schäpers       {
982617277e7SBjörn Schäpers           FormatStyle::LK_Cpp,
983617277e7SBjörn Schäpers           {"cc", "cpp"},
984617277e7SBjörn Schäpers           {"C_CODEBLOCK", "CPPEVAL"},
985617277e7SBjörn Schäpers           /*CanonicalDelimiter=*/"cc",
986617277e7SBjörn Schäpers           /*BasedOnStyle=*/"",
987617277e7SBjörn Schäpers       },
988617277e7SBjörn Schäpers   };
989617277e7SBjörn Schäpers 
990617277e7SBjörn Schäpers   CHECK_PARSE("RawStringFormats:\n"
991617277e7SBjörn Schäpers               "  - Language: TextProto\n"
992617277e7SBjörn Schäpers               "    Delimiters:\n"
993617277e7SBjörn Schäpers               "      - 'pb'\n"
994617277e7SBjörn Schäpers               "      - 'proto'\n"
995617277e7SBjörn Schäpers               "    EnclosingFunctions:\n"
996617277e7SBjörn Schäpers               "      - 'PARSE_TEXT_PROTO'\n"
997617277e7SBjörn Schäpers               "    BasedOnStyle: llvm\n"
998617277e7SBjörn Schäpers               "  - Language: Cpp\n"
999617277e7SBjörn Schäpers               "    Delimiters:\n"
1000617277e7SBjörn Schäpers               "      - 'cc'\n"
1001617277e7SBjörn Schäpers               "      - 'cpp'\n"
1002617277e7SBjörn Schäpers               "    EnclosingFunctions:\n"
1003617277e7SBjörn Schäpers               "      - 'C_CODEBLOCK'\n"
1004617277e7SBjörn Schäpers               "      - 'CPPEVAL'\n"
1005617277e7SBjörn Schäpers               "    CanonicalDelimiter: 'cc'",
1006617277e7SBjörn Schäpers               RawStringFormats, ExpectedRawStringFormats);
1007617277e7SBjörn Schäpers 
1008617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
1009617277e7SBjörn Schäpers               "  Minimum: 0\n"
1010617277e7SBjörn Schäpers               "  Maximum: 0",
1011617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Minimum, 0u);
1012617277e7SBjörn Schäpers   EXPECT_EQ(Style.SpacesInLineCommentPrefix.Maximum, 0u);
1013617277e7SBjörn Schäpers   Style.SpacesInLineCommentPrefix.Minimum = 1;
1014617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
1015617277e7SBjörn Schäpers               "  Minimum: 2",
1016617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Minimum, 0u);
1017617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
1018617277e7SBjörn Schäpers               "  Maximum: -1",
1019617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Maximum, -1u);
1020617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
1021617277e7SBjörn Schäpers               "  Minimum: 2",
1022617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Minimum, 2u);
1023617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInLineCommentPrefix:\n"
1024617277e7SBjörn Schäpers               "  Maximum: 1",
1025617277e7SBjörn Schäpers               SpacesInLineCommentPrefix.Maximum, 1u);
1026617277e7SBjörn Schäpers   EXPECT_EQ(Style.SpacesInLineCommentPrefix.Minimum, 1u);
1027617277e7SBjörn Schäpers 
1028617277e7SBjörn Schäpers   Style.SpacesInAngles = FormatStyle::SIAS_Always;
1029617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: Never", SpacesInAngles, FormatStyle::SIAS_Never);
1030617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: Always", SpacesInAngles,
1031617277e7SBjörn Schäpers               FormatStyle::SIAS_Always);
1032617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: Leave", SpacesInAngles, FormatStyle::SIAS_Leave);
1033617277e7SBjörn Schäpers   // For backward compatibility:
1034617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: false", SpacesInAngles, FormatStyle::SIAS_Never);
1035617277e7SBjörn Schäpers   CHECK_PARSE("SpacesInAngles: true", SpacesInAngles, FormatStyle::SIAS_Always);
1036617277e7SBjörn Schäpers 
1037617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: WithPreceding", RequiresClausePosition,
1038617277e7SBjörn Schäpers               FormatStyle::RCPS_WithPreceding);
1039617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: WithFollowing", RequiresClausePosition,
1040617277e7SBjörn Schäpers               FormatStyle::RCPS_WithFollowing);
1041617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: SingleLine", RequiresClausePosition,
1042617277e7SBjörn Schäpers               FormatStyle::RCPS_SingleLine);
1043617277e7SBjörn Schäpers   CHECK_PARSE("RequiresClausePosition: OwnLine", RequiresClausePosition,
1044617277e7SBjörn Schäpers               FormatStyle::RCPS_OwnLine);
1045617277e7SBjörn Schäpers 
1046617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: Never",
1047617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Never);
1048617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: Always",
1049617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Always);
1050617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: Allowed",
1051617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Allowed);
1052617277e7SBjörn Schäpers   // For backward compatibility:
1053617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: true",
1054617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Always);
1055617277e7SBjörn Schäpers   CHECK_PARSE("BreakBeforeConceptDeclarations: false",
1056617277e7SBjörn Schäpers               BreakBeforeConceptDeclarations, FormatStyle::BBCDS_Allowed);
1057922c8891SKrasimir Georgiev 
1058922c8891SKrasimir Georgiev   CHECK_PARSE("BreakAfterAttributes: Always", BreakAfterAttributes,
1059922c8891SKrasimir Georgiev               FormatStyle::ABS_Always);
1060922c8891SKrasimir Georgiev   CHECK_PARSE("BreakAfterAttributes: Leave", BreakAfterAttributes,
1061922c8891SKrasimir Georgiev               FormatStyle::ABS_Leave);
1062922c8891SKrasimir Georgiev   CHECK_PARSE("BreakAfterAttributes: Never", BreakAfterAttributes,
1063922c8891SKrasimir Georgiev               FormatStyle::ABS_Never);
1064e3eca335SOwen Pan 
1065e3eca335SOwen Pan   const auto DefaultLineEnding = FormatStyle::LE_DeriveLF;
1066e3eca335SOwen Pan   CHECK_PARSE("LineEnding: LF", LineEnding, FormatStyle::LE_LF);
1067e3eca335SOwen Pan   CHECK_PARSE("LineEnding: CRLF", LineEnding, FormatStyle::LE_CRLF);
1068e3eca335SOwen Pan   CHECK_PARSE("LineEnding: DeriveCRLF", LineEnding, FormatStyle::LE_DeriveCRLF);
1069e3eca335SOwen Pan   CHECK_PARSE("LineEnding: DeriveLF", LineEnding, DefaultLineEnding);
1070e3eca335SOwen Pan   // For backward compatibility:
1071e3eca335SOwen Pan   CHECK_PARSE("DeriveLineEnding: false", LineEnding, FormatStyle::LE_LF);
1072e3eca335SOwen Pan   Style.LineEnding = DefaultLineEnding;
1073e3eca335SOwen Pan   CHECK_PARSE("DeriveLineEnding: false\n"
1074e3eca335SOwen Pan               "UseCRLF: true",
1075e3eca335SOwen Pan               LineEnding, FormatStyle::LE_CRLF);
1076e3eca335SOwen Pan   Style.LineEnding = DefaultLineEnding;
1077e3eca335SOwen Pan   CHECK_PARSE("UseCRLF: true", LineEnding, FormatStyle::LE_DeriveCRLF);
10783a6a0702SOwen Pan 
10793a6a0702SOwen Pan   CHECK_PARSE("RemoveParentheses: MultipleParentheses", RemoveParentheses,
10803a6a0702SOwen Pan               FormatStyle::RPS_MultipleParentheses);
10813a6a0702SOwen Pan   CHECK_PARSE("RemoveParentheses: ReturnStatement", RemoveParentheses,
10823a6a0702SOwen Pan               FormatStyle::RPS_ReturnStatement);
10833a6a0702SOwen Pan   CHECK_PARSE("RemoveParentheses: Leave", RemoveParentheses,
10843a6a0702SOwen Pan               FormatStyle::RPS_Leave);
108584e3fdfcSBjörn Schäpers 
108684e3fdfcSBjörn Schäpers   CHECK_PARSE("AllowBreakBeforeNoexceptSpecifier: Always",
108784e3fdfcSBjörn Schäpers               AllowBreakBeforeNoexceptSpecifier, FormatStyle::BBNSS_Always);
108884e3fdfcSBjörn Schäpers   CHECK_PARSE("AllowBreakBeforeNoexceptSpecifier: OnlyWithParen",
108984e3fdfcSBjörn Schäpers               AllowBreakBeforeNoexceptSpecifier,
109084e3fdfcSBjörn Schäpers               FormatStyle::BBNSS_OnlyWithParen);
109184e3fdfcSBjörn Schäpers   CHECK_PARSE("AllowBreakBeforeNoexceptSpecifier: Never",
109284e3fdfcSBjörn Schäpers               AllowBreakBeforeNoexceptSpecifier, FormatStyle::BBNSS_Never);
109359a26531Sserbanu 
109459a26531Sserbanu   Style.SeparateDefinitionBlocks = FormatStyle::SDS_Never;
109559a26531Sserbanu   CHECK_PARSE("SeparateDefinitionBlocks: Always", SeparateDefinitionBlocks,
109659a26531Sserbanu               FormatStyle::SDS_Always);
109759a26531Sserbanu   CHECK_PARSE("SeparateDefinitionBlocks: Leave", SeparateDefinitionBlocks,
109859a26531Sserbanu               FormatStyle::SDS_Leave);
109959a26531Sserbanu   CHECK_PARSE("SeparateDefinitionBlocks: Never", SeparateDefinitionBlocks,
110059a26531Sserbanu               FormatStyle::SDS_Never);
1101617277e7SBjörn Schäpers }
1102617277e7SBjörn Schäpers 
1103617277e7SBjörn Schäpers TEST(ConfigParseTest, ParsesConfigurationWithLanguages) {
1104617277e7SBjörn Schäpers   FormatStyle Style = {};
1105617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
1106617277e7SBjörn Schäpers   CHECK_PARSE("Language: Cpp\n"
1107617277e7SBjörn Schäpers               "IndentWidth: 12",
1108617277e7SBjörn Schäpers               IndentWidth, 12u);
1109617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("Language: JavaScript\n"
1110617277e7SBjörn Schäpers                                "IndentWidth: 34",
1111617277e7SBjörn Schäpers                                &Style),
1112617277e7SBjörn Schäpers             ParseError::Unsuitable);
1113617277e7SBjörn Schäpers   FormatStyle BinPackedTCS = {};
1114617277e7SBjörn Schäpers   BinPackedTCS.Language = FormatStyle::LK_JavaScript;
1115617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("BinPackArguments: true\n"
1116617277e7SBjörn Schäpers                                "InsertTrailingCommas: Wrapped",
1117617277e7SBjörn Schäpers                                &BinPackedTCS),
1118617277e7SBjörn Schäpers             ParseError::BinPackTrailingCommaConflict);
1119617277e7SBjörn Schäpers   EXPECT_EQ(12u, Style.IndentWidth);
1120617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
1121617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
1122617277e7SBjörn Schäpers 
1123617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_JavaScript;
1124617277e7SBjörn Schäpers   CHECK_PARSE("Language: JavaScript\n"
1125617277e7SBjörn Schäpers               "IndentWidth: 12",
1126617277e7SBjörn Schäpers               IndentWidth, 12u);
1127617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 23", IndentWidth, 23u);
1128617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("Language: Cpp\n"
1129617277e7SBjörn Schäpers                                "IndentWidth: 34",
1130617277e7SBjörn Schäpers                                &Style),
1131617277e7SBjörn Schäpers             ParseError::Unsuitable);
1132617277e7SBjörn Schäpers   EXPECT_EQ(23u, Style.IndentWidth);
1133617277e7SBjörn Schäpers   CHECK_PARSE("IndentWidth: 56", IndentWidth, 56u);
1134617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
1135617277e7SBjörn Schäpers 
1136617277e7SBjörn Schäpers   CHECK_PARSE("BasedOnStyle: LLVM\n"
1137617277e7SBjörn Schäpers               "IndentWidth: 67",
1138617277e7SBjörn Schäpers               IndentWidth, 67u);
1139617277e7SBjörn Schäpers 
1140617277e7SBjörn Schäpers   CHECK_PARSE("---\n"
1141617277e7SBjörn Schäpers               "Language: JavaScript\n"
1142617277e7SBjörn Schäpers               "IndentWidth: 12\n"
1143617277e7SBjörn Schäpers               "---\n"
1144617277e7SBjörn Schäpers               "Language: Cpp\n"
1145617277e7SBjörn Schäpers               "IndentWidth: 34\n"
1146617277e7SBjörn Schäpers               "...\n",
1147617277e7SBjörn Schäpers               IndentWidth, 12u);
1148617277e7SBjörn Schäpers 
1149617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_Cpp;
1150617277e7SBjörn Schäpers   CHECK_PARSE("---\n"
1151617277e7SBjörn Schäpers               "Language: JavaScript\n"
1152617277e7SBjörn Schäpers               "IndentWidth: 12\n"
1153617277e7SBjörn Schäpers               "---\n"
1154617277e7SBjörn Schäpers               "Language: Cpp\n"
1155617277e7SBjörn Schäpers               "IndentWidth: 34\n"
1156617277e7SBjörn Schäpers               "...\n",
1157617277e7SBjörn Schäpers               IndentWidth, 34u);
1158617277e7SBjörn Schäpers   CHECK_PARSE("---\n"
1159617277e7SBjörn Schäpers               "IndentWidth: 78\n"
1160617277e7SBjörn Schäpers               "---\n"
1161617277e7SBjörn Schäpers               "Language: JavaScript\n"
1162617277e7SBjörn Schäpers               "IndentWidth: 56\n"
1163617277e7SBjörn Schäpers               "...\n",
1164617277e7SBjörn Schäpers               IndentWidth, 78u);
1165617277e7SBjörn Schäpers 
1166617277e7SBjörn Schäpers   Style.ColumnLimit = 123;
1167617277e7SBjörn Schäpers   Style.IndentWidth = 234;
1168617277e7SBjörn Schäpers   Style.BreakBeforeBraces = FormatStyle::BS_Linux;
1169617277e7SBjörn Schäpers   Style.TabWidth = 345;
1170617277e7SBjörn Schäpers   EXPECT_FALSE(parseConfiguration("---\n"
1171617277e7SBjörn Schäpers                                   "IndentWidth: 456\n"
1172617277e7SBjörn Schäpers                                   "BreakBeforeBraces: Allman\n"
1173617277e7SBjörn Schäpers                                   "---\n"
1174617277e7SBjörn Schäpers                                   "Language: JavaScript\n"
1175617277e7SBjörn Schäpers                                   "IndentWidth: 111\n"
1176617277e7SBjörn Schäpers                                   "TabWidth: 111\n"
1177617277e7SBjörn Schäpers                                   "---\n"
1178617277e7SBjörn Schäpers                                   "Language: Cpp\n"
1179617277e7SBjörn Schäpers                                   "BreakBeforeBraces: Stroustrup\n"
1180617277e7SBjörn Schäpers                                   "TabWidth: 789\n"
1181617277e7SBjörn Schäpers                                   "...\n",
1182617277e7SBjörn Schäpers                                   &Style));
1183617277e7SBjörn Schäpers   EXPECT_EQ(123u, Style.ColumnLimit);
1184617277e7SBjörn Schäpers   EXPECT_EQ(456u, Style.IndentWidth);
1185617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::BS_Stroustrup, Style.BreakBeforeBraces);
1186617277e7SBjörn Schäpers   EXPECT_EQ(789u, Style.TabWidth);
1187617277e7SBjörn Schäpers 
1188617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("---\n"
1189617277e7SBjörn Schäpers                                "Language: JavaScript\n"
1190617277e7SBjörn Schäpers                                "IndentWidth: 56\n"
1191617277e7SBjörn Schäpers                                "---\n"
1192617277e7SBjörn Schäpers                                "IndentWidth: 78\n"
1193617277e7SBjörn Schäpers                                "...\n",
1194617277e7SBjörn Schäpers                                &Style),
1195617277e7SBjörn Schäpers             ParseError::Error);
1196617277e7SBjörn Schäpers   EXPECT_EQ(parseConfiguration("---\n"
1197617277e7SBjörn Schäpers                                "Language: JavaScript\n"
1198617277e7SBjörn Schäpers                                "IndentWidth: 56\n"
1199617277e7SBjörn Schäpers                                "---\n"
1200617277e7SBjörn Schäpers                                "Language: JavaScript\n"
1201617277e7SBjörn Schäpers                                "IndentWidth: 78\n"
1202617277e7SBjörn Schäpers                                "...\n",
1203617277e7SBjörn Schäpers                                &Style),
1204617277e7SBjörn Schäpers             ParseError::Error);
1205617277e7SBjörn Schäpers 
1206617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_Cpp, Style.Language);
120724231df9Ssstwcw 
120824231df9Ssstwcw   Style.Language = FormatStyle::LK_Verilog;
120924231df9Ssstwcw   CHECK_PARSE("---\n"
121024231df9Ssstwcw               "Language: Verilog\n"
121124231df9Ssstwcw               "IndentWidth: 12\n"
121224231df9Ssstwcw               "---\n"
121324231df9Ssstwcw               "Language: Cpp\n"
121424231df9Ssstwcw               "IndentWidth: 34\n"
121524231df9Ssstwcw               "...\n",
121624231df9Ssstwcw               IndentWidth, 12u);
121724231df9Ssstwcw   CHECK_PARSE("---\n"
121824231df9Ssstwcw               "IndentWidth: 78\n"
121924231df9Ssstwcw               "---\n"
122024231df9Ssstwcw               "Language: Verilog\n"
122124231df9Ssstwcw               "IndentWidth: 56\n"
122224231df9Ssstwcw               "...\n",
122324231df9Ssstwcw               IndentWidth, 56u);
1224617277e7SBjörn Schäpers }
1225617277e7SBjörn Schäpers 
1226617277e7SBjörn Schäpers TEST(ConfigParseTest, UsesLanguageForBasedOnStyle) {
1227617277e7SBjörn Schäpers   FormatStyle Style = {};
1228617277e7SBjörn Schäpers   Style.Language = FormatStyle::LK_JavaScript;
1229617277e7SBjörn Schäpers   Style.BreakBeforeTernaryOperators = true;
1230617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("BasedOnStyle: Google", &Style).value());
1231617277e7SBjörn Schäpers   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
1232617277e7SBjörn Schäpers 
1233617277e7SBjörn Schäpers   Style.BreakBeforeTernaryOperators = true;
1234617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration("---\n"
1235617277e7SBjörn Schäpers                                   "BasedOnStyle: Google\n"
1236617277e7SBjörn Schäpers                                   "---\n"
1237617277e7SBjörn Schäpers                                   "Language: JavaScript\n"
1238617277e7SBjörn Schäpers                                   "IndentWidth: 76\n"
1239617277e7SBjörn Schäpers                                   "...\n",
1240617277e7SBjörn Schäpers                                   &Style)
1241617277e7SBjörn Schäpers                    .value());
1242617277e7SBjörn Schäpers   EXPECT_FALSE(Style.BreakBeforeTernaryOperators);
1243617277e7SBjörn Schäpers   EXPECT_EQ(76u, Style.IndentWidth);
1244617277e7SBjörn Schäpers   EXPECT_EQ(FormatStyle::LK_JavaScript, Style.Language);
1245617277e7SBjörn Schäpers }
1246617277e7SBjörn Schäpers 
1247617277e7SBjörn Schäpers TEST(ConfigParseTest, ConfigurationRoundTripTest) {
1248617277e7SBjörn Schäpers   FormatStyle Style = getLLVMStyle();
1249617277e7SBjörn Schäpers   std::string YAML = configurationAsText(Style);
1250617277e7SBjörn Schäpers   FormatStyle ParsedStyle = {};
1251617277e7SBjörn Schäpers   ParsedStyle.Language = FormatStyle::LK_Cpp;
1252617277e7SBjörn Schäpers   EXPECT_EQ(0, parseConfiguration(YAML, &ParsedStyle).value());
1253617277e7SBjörn Schäpers   EXPECT_EQ(Style, ParsedStyle);
1254617277e7SBjörn Schäpers }
1255617277e7SBjörn Schäpers 
1256617277e7SBjörn Schäpers TEST(ConfigParseTest, GetStyleWithEmptyFileName) {
1257617277e7SBjörn Schäpers   llvm::vfs::InMemoryFileSystem FS;
1258617277e7SBjörn Schäpers   auto Style1 = getStyle("file", "", "Google", "", &FS);
1259617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style1);
1260617277e7SBjörn Schäpers   ASSERT_EQ(*Style1, getGoogleStyle());
1261617277e7SBjörn Schäpers }
1262617277e7SBjörn Schäpers 
1263617277e7SBjörn Schäpers TEST(ConfigParseTest, GetStyleOfFile) {
1264617277e7SBjörn Schäpers   llvm::vfs::InMemoryFileSystem FS;
1265617277e7SBjörn Schäpers   // Test 1: format file in the same directory.
1266617277e7SBjörn Schäpers   ASSERT_TRUE(
1267617277e7SBjörn Schäpers       FS.addFile("/a/.clang-format", 0,
1268617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
1269617277e7SBjörn Schäpers   ASSERT_TRUE(
1270617277e7SBjörn Schäpers       FS.addFile("/a/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
1271617277e7SBjörn Schäpers   auto Style1 = getStyle("file", "/a/.clang-format", "Google", "", &FS);
1272617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style1);
1273617277e7SBjörn Schäpers   ASSERT_EQ(*Style1, getLLVMStyle());
1274617277e7SBjörn Schäpers 
1275617277e7SBjörn Schäpers   // Test 2.1: fallback to default.
1276617277e7SBjörn Schäpers   ASSERT_TRUE(
1277617277e7SBjörn Schäpers       FS.addFile("/b/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
1278617277e7SBjörn Schäpers   auto Style2 = getStyle("file", "/b/test.cpp", "Mozilla", "", &FS);
1279617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1280617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getMozillaStyle());
1281617277e7SBjörn Schäpers 
1282617277e7SBjörn Schäpers   // Test 2.2: no format on 'none' fallback style.
1283617277e7SBjörn Schäpers   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
1284617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1285617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getNoStyle());
1286617277e7SBjörn Schäpers 
1287617277e7SBjörn Schäpers   // Test 2.3: format if config is found with no based style while fallback is
1288617277e7SBjörn Schäpers   // 'none'.
1289617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/b/.clang-format", 0,
1290617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("IndentWidth: 2")));
1291617277e7SBjörn Schäpers   Style2 = getStyle("file", "/b/test.cpp", "none", "", &FS);
1292617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1293617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getLLVMStyle());
1294617277e7SBjörn Schäpers 
1295617277e7SBjörn Schäpers   // Test 2.4: format if yaml with no based style, while fallback is 'none'.
1296617277e7SBjörn Schäpers   Style2 = getStyle("{}", "a.h", "none", "", &FS);
1297617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style2);
1298617277e7SBjörn Schäpers   ASSERT_EQ(*Style2, getLLVMStyle());
1299617277e7SBjörn Schäpers 
1300617277e7SBjörn Schäpers   // Test 3: format file in parent directory.
1301617277e7SBjörn Schäpers   ASSERT_TRUE(
1302617277e7SBjörn Schäpers       FS.addFile("/c/.clang-format", 0,
1303617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
1304617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/c/sub/sub/sub/test.cpp", 0,
1305617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1306617277e7SBjörn Schäpers   auto Style3 = getStyle("file", "/c/sub/sub/sub/test.cpp", "LLVM", "", &FS);
1307617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style3);
1308617277e7SBjörn Schäpers   ASSERT_EQ(*Style3, getGoogleStyle());
1309617277e7SBjörn Schäpers 
1310617277e7SBjörn Schäpers   // Test 4: error on invalid fallback style
1311617277e7SBjörn Schäpers   auto Style4 = getStyle("file", "a.h", "KungFu", "", &FS);
1312617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style4);
1313617277e7SBjörn Schäpers   llvm::consumeError(Style4.takeError());
1314617277e7SBjörn Schäpers 
1315617277e7SBjörn Schäpers   // Test 5: error on invalid yaml on command line
1316527e7328SOwen Pan   auto Style5 = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS,
1317527e7328SOwen Pan                          /*AllowUnknownOptions=*/false, dropDiagnosticHandler);
1318617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style5);
1319617277e7SBjörn Schäpers   llvm::consumeError(Style5.takeError());
1320617277e7SBjörn Schäpers 
1321617277e7SBjörn Schäpers   // Test 6: error on invalid style
1322617277e7SBjörn Schäpers   auto Style6 = getStyle("KungFu", "a.h", "LLVM", "", &FS);
1323617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style6);
1324617277e7SBjörn Schäpers   llvm::consumeError(Style6.takeError());
1325617277e7SBjörn Schäpers 
1326617277e7SBjörn Schäpers   // Test 7: found config file, error on parsing it
1327617277e7SBjörn Schäpers   ASSERT_TRUE(
1328617277e7SBjörn Schäpers       FS.addFile("/d/.clang-format", 0,
1329617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM\n"
1330617277e7SBjörn Schäpers                                                   "InvalidKey: InvalidValue")));
1331617277e7SBjörn Schäpers   ASSERT_TRUE(
1332617277e7SBjörn Schäpers       FS.addFile("/d/test.cpp", 0, llvm::MemoryBuffer::getMemBuffer("int i;")));
1333527e7328SOwen Pan   auto Style7a = getStyle("file", "/d/.clang-format", "LLVM", "", &FS,
1334527e7328SOwen Pan                           /*AllowUnknownOptions=*/false, dropDiagnosticHandler);
1335617277e7SBjörn Schäpers   ASSERT_FALSE((bool)Style7a);
1336617277e7SBjörn Schäpers   llvm::consumeError(Style7a.takeError());
1337617277e7SBjörn Schäpers 
1338527e7328SOwen Pan   auto Style7b = getStyle("file", "/d/.clang-format", "LLVM", "", &FS,
1339527e7328SOwen Pan                           /*AllowUnknownOptions=*/true, dropDiagnosticHandler);
1340617277e7SBjörn Schäpers   ASSERT_TRUE((bool)Style7b);
1341617277e7SBjörn Schäpers 
1342617277e7SBjörn Schäpers   // Test 8: inferred per-language defaults apply.
1343617277e7SBjörn Schäpers   auto StyleTd = getStyle("file", "x.td", "llvm", "", &FS);
1344617277e7SBjörn Schäpers   ASSERT_TRUE((bool)StyleTd);
1345617277e7SBjörn Schäpers   ASSERT_EQ(*StyleTd, getLLVMStyle(FormatStyle::LK_TableGen));
1346617277e7SBjörn Schäpers 
1347617277e7SBjörn Schäpers   // Test 9.1.1: overwriting a file style, when no parent file exists with no
1348617277e7SBjörn Schäpers   // fallback style.
1349617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile(
1350617277e7SBjörn Schäpers       "/e/sub/.clang-format", 0,
1351617277e7SBjörn Schäpers       llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: InheritParentConfig\n"
1352617277e7SBjörn Schäpers                                        "ColumnLimit: 20")));
1353617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/code.cpp", 0,
1354617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1355617277e7SBjörn Schäpers   auto Style9 = getStyle("file", "/e/sub/code.cpp", "none", "", &FS);
1356617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1357617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1358617277e7SBjörn Schäpers     auto Style = getNoStyle();
1359617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1360617277e7SBjörn Schäpers     return Style;
1361617277e7SBjörn Schäpers   }());
1362617277e7SBjörn Schäpers 
1363617277e7SBjörn Schäpers   // Test 9.1.2: propagate more than one level with no parent file.
1364617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/sub/code.cpp", 0,
1365617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1366617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/sub/.clang-format", 0,
1367617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer(
1368617277e7SBjörn Schäpers                              "BasedOnStyle: InheritParentConfig\n"
1369617277e7SBjörn Schäpers                              "WhitespaceSensitiveMacros: ['FOO', 'BAR']")));
1370617277e7SBjörn Schäpers   std::vector<std::string> NonDefaultWhiteSpaceMacros =
1371617277e7SBjörn Schäpers       Style9->WhitespaceSensitiveMacros;
1372617277e7SBjörn Schäpers   NonDefaultWhiteSpaceMacros[0] = "FOO";
1373617277e7SBjörn Schäpers   NonDefaultWhiteSpaceMacros[1] = "BAR";
1374617277e7SBjörn Schäpers 
1375617277e7SBjörn Schäpers   ASSERT_NE(Style9->WhitespaceSensitiveMacros, NonDefaultWhiteSpaceMacros);
1376617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/sub/code.cpp", "none", "", &FS);
1377617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1378617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [&NonDefaultWhiteSpaceMacros] {
1379617277e7SBjörn Schäpers     auto Style = getNoStyle();
1380617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1381617277e7SBjörn Schäpers     Style.WhitespaceSensitiveMacros = NonDefaultWhiteSpaceMacros;
1382617277e7SBjörn Schäpers     return Style;
1383617277e7SBjörn Schäpers   }());
1384617277e7SBjörn Schäpers 
1385617277e7SBjörn Schäpers   // Test 9.2: with LLVM fallback style
1386617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/code.cpp", "LLVM", "", &FS);
1387617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1388617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1389617277e7SBjörn Schäpers     auto Style = getLLVMStyle();
1390617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1391617277e7SBjörn Schäpers     return Style;
1392617277e7SBjörn Schäpers   }());
1393617277e7SBjörn Schäpers 
1394617277e7SBjörn Schäpers   // Test 9.3: with a parent file
1395617277e7SBjörn Schäpers   ASSERT_TRUE(
1396617277e7SBjörn Schäpers       FS.addFile("/e/.clang-format", 0,
1397617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google\n"
1398617277e7SBjörn Schäpers                                                   "UseTab: Always")));
1399617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/code.cpp", "none", "", &FS);
1400617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1401617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1402617277e7SBjörn Schäpers     auto Style = getGoogleStyle();
1403617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1404617277e7SBjörn Schäpers     Style.UseTab = FormatStyle::UT_Always;
1405617277e7SBjörn Schäpers     return Style;
1406617277e7SBjörn Schäpers   }());
1407617277e7SBjörn Schäpers 
1408617277e7SBjörn Schäpers   // Test 9.4: propagate more than one level with a parent file.
1409617277e7SBjörn Schäpers   const auto SubSubStyle = [&NonDefaultWhiteSpaceMacros] {
1410617277e7SBjörn Schäpers     auto Style = getGoogleStyle();
1411617277e7SBjörn Schäpers     Style.ColumnLimit = 20;
1412617277e7SBjörn Schäpers     Style.UseTab = FormatStyle::UT_Always;
1413617277e7SBjörn Schäpers     Style.WhitespaceSensitiveMacros = NonDefaultWhiteSpaceMacros;
1414617277e7SBjörn Schäpers     return Style;
1415617277e7SBjörn Schäpers   }();
1416617277e7SBjörn Schäpers 
1417617277e7SBjörn Schäpers   ASSERT_NE(Style9->WhitespaceSensitiveMacros, NonDefaultWhiteSpaceMacros);
1418617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/sub/sub/code.cpp", "none", "", &FS);
1419617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1420617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1421617277e7SBjörn Schäpers 
1422617277e7SBjörn Schäpers   // Test 9.5: use InheritParentConfig as style name
1423617277e7SBjörn Schäpers   Style9 =
1424617277e7SBjörn Schäpers       getStyle("inheritparentconfig", "/e/sub/sub/code.cpp", "none", "", &FS);
1425617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1426617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1427617277e7SBjörn Schäpers 
1428617277e7SBjörn Schäpers   // Test 9.6: use command line style with inheritance
1429617277e7SBjörn Schäpers   Style9 = getStyle("{BasedOnStyle: InheritParentConfig}",
1430617277e7SBjörn Schäpers                     "/e/sub/sub/code.cpp", "none", "", &FS);
1431617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1432617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1433617277e7SBjörn Schäpers 
1434617277e7SBjörn Schäpers   // Test 9.7: use command line style with inheritance and own config
1435617277e7SBjörn Schäpers   Style9 = getStyle("{BasedOnStyle: InheritParentConfig, "
1436617277e7SBjörn Schäpers                     "WhitespaceSensitiveMacros: ['FOO', 'BAR']}",
1437617277e7SBjörn Schäpers                     "/e/sub/code.cpp", "none", "", &FS);
1438617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1439617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1440617277e7SBjörn Schäpers 
1441617277e7SBjörn Schäpers   // Test 9.8: use inheritance from a file without BasedOnStyle
1442617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/withoutbase/.clang-format", 0,
1443617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("ColumnLimit: 123")));
1444617277e7SBjörn Schäpers   ASSERT_TRUE(
1445617277e7SBjörn Schäpers       FS.addFile("/e/withoutbase/sub/.clang-format", 0,
1446617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer(
1447617277e7SBjörn Schäpers                      "BasedOnStyle: InheritParentConfig\nIndentWidth: 7")));
1448617277e7SBjörn Schäpers   // Make sure we do not use the fallback style
1449617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/withoutbase/code.cpp", "google", "", &FS);
1450617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1451617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1452617277e7SBjörn Schäpers     auto Style = getLLVMStyle();
1453617277e7SBjörn Schäpers     Style.ColumnLimit = 123;
1454617277e7SBjörn Schäpers     return Style;
1455617277e7SBjörn Schäpers   }());
1456617277e7SBjörn Schäpers 
1457617277e7SBjörn Schäpers   Style9 = getStyle("file", "/e/withoutbase/sub/code.cpp", "google", "", &FS);
1458617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1459617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, [] {
1460617277e7SBjörn Schäpers     auto Style = getLLVMStyle();
1461617277e7SBjörn Schäpers     Style.ColumnLimit = 123;
1462617277e7SBjörn Schäpers     Style.IndentWidth = 7;
1463617277e7SBjörn Schäpers     return Style;
1464617277e7SBjörn Schäpers   }());
1465617277e7SBjörn Schäpers 
1466617277e7SBjörn Schäpers   // Test 9.9: use inheritance from a specific config file.
1467617277e7SBjörn Schäpers   Style9 = getStyle("file:/e/sub/sub/.clang-format", "/e/sub/sub/code.cpp",
1468617277e7SBjörn Schäpers                     "none", "", &FS);
1469617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style9));
1470617277e7SBjörn Schäpers   ASSERT_EQ(*Style9, SubSubStyle);
1471617277e7SBjörn Schäpers }
1472617277e7SBjörn Schäpers 
1473617277e7SBjörn Schäpers TEST(ConfigParseTest, GetStyleOfSpecificFile) {
1474617277e7SBjörn Schäpers   llvm::vfs::InMemoryFileSystem FS;
1475617277e7SBjörn Schäpers   // Specify absolute path to a format file in a parent directory.
1476617277e7SBjörn Schäpers   ASSERT_TRUE(
1477617277e7SBjörn Schäpers       FS.addFile("/e/.clang-format", 0,
1478617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: LLVM")));
1479617277e7SBjörn Schäpers   ASSERT_TRUE(
1480617277e7SBjörn Schäpers       FS.addFile("/e/explicit.clang-format", 0,
1481617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
1482617277e7SBjörn Schäpers   ASSERT_TRUE(FS.addFile("/e/sub/sub/sub/test.cpp", 0,
1483617277e7SBjörn Schäpers                          llvm::MemoryBuffer::getMemBuffer("int i;")));
1484617277e7SBjörn Schäpers   auto Style = getStyle("file:/e/explicit.clang-format",
1485617277e7SBjörn Schäpers                         "/e/sub/sub/sub/test.cpp", "LLVM", "", &FS);
1486617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style));
1487617277e7SBjörn Schäpers   ASSERT_EQ(*Style, getGoogleStyle());
1488617277e7SBjörn Schäpers 
1489617277e7SBjörn Schäpers   // Specify relative path to a format file.
1490617277e7SBjörn Schäpers   ASSERT_TRUE(
1491617277e7SBjörn Schäpers       FS.addFile("../../e/explicit.clang-format", 0,
1492617277e7SBjörn Schäpers                  llvm::MemoryBuffer::getMemBuffer("BasedOnStyle: Google")));
1493617277e7SBjörn Schäpers   Style = getStyle("file:../../e/explicit.clang-format",
1494617277e7SBjörn Schäpers                    "/e/sub/sub/sub/test.cpp", "LLVM", "", &FS);
1495617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style));
1496617277e7SBjörn Schäpers   ASSERT_EQ(*Style, getGoogleStyle());
1497617277e7SBjörn Schäpers 
1498617277e7SBjörn Schäpers   // Specify path to a format file that does not exist.
1499617277e7SBjörn Schäpers   Style = getStyle("file:/e/missing.clang-format", "/e/sub/sub/sub/test.cpp",
1500617277e7SBjörn Schäpers                    "LLVM", "", &FS);
1501617277e7SBjörn Schäpers   ASSERT_FALSE(static_cast<bool>(Style));
1502617277e7SBjörn Schäpers   llvm::consumeError(Style.takeError());
1503617277e7SBjörn Schäpers 
1504617277e7SBjörn Schäpers   // Specify path to a file on the filesystem.
1505617277e7SBjörn Schäpers   SmallString<128> FormatFilePath;
1506617277e7SBjörn Schäpers   std::error_code ECF = llvm::sys::fs::createTemporaryFile(
1507617277e7SBjörn Schäpers       "FormatFileTest", "tpl", FormatFilePath);
1508617277e7SBjörn Schäpers   EXPECT_FALSE((bool)ECF);
1509617277e7SBjörn Schäpers   llvm::raw_fd_ostream FormatFileTest(FormatFilePath, ECF);
1510617277e7SBjörn Schäpers   EXPECT_FALSE((bool)ECF);
1511617277e7SBjörn Schäpers   FormatFileTest << "BasedOnStyle: Google\n";
1512617277e7SBjörn Schäpers   FormatFileTest.close();
1513617277e7SBjörn Schäpers 
1514617277e7SBjörn Schäpers   SmallString<128> TestFilePath;
1515617277e7SBjörn Schäpers   std::error_code ECT =
1516617277e7SBjörn Schäpers       llvm::sys::fs::createTemporaryFile("CodeFileTest", "cc", TestFilePath);
1517617277e7SBjörn Schäpers   EXPECT_FALSE((bool)ECT);
1518617277e7SBjörn Schäpers   llvm::raw_fd_ostream CodeFileTest(TestFilePath, ECT);
1519617277e7SBjörn Schäpers   CodeFileTest << "int i;\n";
1520617277e7SBjörn Schäpers   CodeFileTest.close();
1521617277e7SBjörn Schäpers 
1522617277e7SBjörn Schäpers   std::string format_file_arg = std::string("file:") + FormatFilePath.c_str();
1523617277e7SBjörn Schäpers   Style = getStyle(format_file_arg, TestFilePath, "LLVM", "", nullptr);
1524617277e7SBjörn Schäpers 
1525617277e7SBjörn Schäpers   llvm::sys::fs::remove(FormatFilePath.c_str());
1526617277e7SBjörn Schäpers   llvm::sys::fs::remove(TestFilePath.c_str());
1527617277e7SBjörn Schäpers   ASSERT_TRUE(static_cast<bool>(Style));
1528617277e7SBjörn Schäpers   ASSERT_EQ(*Style, getGoogleStyle());
1529617277e7SBjörn Schäpers }
1530617277e7SBjörn Schäpers 
1531fe9aef05Spointhex TEST(ConfigParseTest, GetStyleOutput) {
1532fe9aef05Spointhex   llvm::vfs::InMemoryFileSystem FS;
1533fe9aef05Spointhex 
1534fe9aef05Spointhex   // Don't suppress output.
1535fe9aef05Spointhex   testing::internal::CaptureStderr();
1536fe9aef05Spointhex   auto Style = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS,
1537fe9aef05Spointhex                         /*AllowUnknownOptions=*/true);
1538fe9aef05Spointhex   auto Output = testing::internal::GetCapturedStderr();
1539fe9aef05Spointhex   ASSERT_TRUE((bool)Style);
1540fe9aef05Spointhex   ASSERT_FALSE(Output.empty());
1541fe9aef05Spointhex 
1542fe9aef05Spointhex   // Suppress stderr.
1543fe9aef05Spointhex   testing::internal::CaptureStderr();
1544fe9aef05Spointhex   Style = getStyle("{invalid_key=invalid_value}", "a.h", "LLVM", "", &FS,
1545527e7328SOwen Pan                    /*AllowUnknownOptions=*/true, dropDiagnosticHandler);
1546fe9aef05Spointhex   Output = testing::internal::GetCapturedStderr();
1547fe9aef05Spointhex   ASSERT_TRUE((bool)Style);
1548fe9aef05Spointhex   ASSERT_TRUE(Output.empty());
1549fe9aef05Spointhex }
1550fe9aef05Spointhex 
1551617277e7SBjörn Schäpers } // namespace
1552617277e7SBjörn Schäpers } // namespace format
1553617277e7SBjörn Schäpers } // namespace clang
1554