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