aboutsummaryrefslogtreecommitdiff
path: root/unittests/Format
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/Format')
-rw-r--r--unittests/Format/FormatTest.cpp204
-rw-r--r--unittests/Format/FormatTestJava.cpp5
-rw-r--r--unittests/Format/FormatTestProto.cpp172
-rw-r--r--unittests/Format/SortIncludesTest.cpp23
4 files changed, 396 insertions, 8 deletions
diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp
index 64bb28e0be23..b5f959f9c1f7 100644
--- a/unittests/Format/FormatTest.cpp
+++ b/unittests/Format/FormatTest.cpp
@@ -6004,7 +6004,10 @@ TEST_F(FormatTest, LayoutBraceInitializersInReturnStatement) {
TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
verifyFormat("vector<int> x{1, 2, 3, 4};");
verifyFormat("vector<int> x{\n"
- " 1, 2, 3, 4,\n"
+ " 1,\n"
+ " 2,\n"
+ " 3,\n"
+ " 4,\n"
"};");
verifyFormat("vector<T> x{{}, {}, {}, {}};");
verifyFormat("f({1, 2});");
@@ -6049,6 +6052,17 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
"};");
verifyFormat("#define A {a, a},");
+ // Binpacking only if there is no trailing comma
+ verifyFormat("const Aaaaaa aaaaa = {aaaaaaaaaa, bbbbbbbbbb,\n"
+ " cccccccccc, dddddddddd};",
+ getLLVMStyleWithColumns(50));
+ verifyFormat("const Aaaaaa aaaaa = {\n"
+ " aaaaaaaaaaa,\n"
+ " bbbbbbbbbbb,\n"
+ " ccccccccccc,\n"
+ " ddddddddddd,\n"
+ "};", getLLVMStyleWithColumns(50));
+
// Cases where distinguising braced lists and blocks is hard.
verifyFormat("vector<int> v{12} GUARDED_BY(mutex);");
verifyFormat("void f() {\n"
@@ -6128,10 +6142,12 @@ TEST_F(FormatTest, LayoutCxx11BraceInitializers) {
" // Second element:\n"
" 2};",
getLLVMStyleWithColumns(30)));
- // A trailing comma should still lead to an enforced line break.
+ // A trailing comma should still lead to an enforced line break and no
+ // binpacking.
EXPECT_EQ("vector<int> SomeVector = {\n"
" // aaa\n"
- " 1, 2,\n"
+ " 1,\n"
+ " 2,\n"
"};",
format("vector<int> SomeVector = { // aaa\n"
" 1, 2, };"));
@@ -6297,7 +6313,7 @@ TEST_F(FormatTest, FormatsBracedListsInColumnLayout) {
" aaaaaaaaaaaa, a, aaaaaaaaaa, aaaaaaaaa, aaa}};");
// No column layout should be used here.
- verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
+ verifyFormat("aaaaaaaaaaaaaaa = {aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, 0, 0,\n"
" bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb};");
verifyNoCrash("a<,");
@@ -6555,12 +6571,12 @@ TEST_F(FormatTest, PullInlineOnlyFunctionDefinitionsIntoSingleLine) {
MergeInlineOnly);
}
-TEST_F(FormatTest, SplitEmptyFunctionBody) {
+TEST_F(FormatTest, SplitEmptyFunction) {
FormatStyle Style = getLLVMStyle();
Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_None;
Style.BreakBeforeBraces = FormatStyle::BS_Custom;
Style.BraceWrapping.AfterFunction = true;
- Style.BraceWrapping.SplitEmptyFunctionBody = false;
+ Style.BraceWrapping.SplitEmptyFunction = false;
Style.ColumnLimit = 40;
verifyFormat("int f()\n"
@@ -6623,6 +6639,178 @@ TEST_F(FormatTest, SplitEmptyFunctionBody) {
Style);
}
+TEST_F(FormatTest, SplitEmptyClass) {
+ FormatStyle Style = getLLVMStyle();
+ Style.BreakBeforeBraces = FormatStyle::BS_Custom;
+ Style.BraceWrapping.AfterClass = true;
+ Style.BraceWrapping.SplitEmptyRecord = false;
+
+ verifyFormat("class Foo\n"
+ "{};",
+ Style);
+ verifyFormat("/* something */ class Foo\n"
+ "{};",
+ Style);
+ verifyFormat("template <typename X> class Foo\n"
+ "{};",
+ Style);
+ verifyFormat("class Foo\n"
+ "{\n"
+ " Foo();\n"
+ "};",
+ Style);
+ verifyFormat("typedef class Foo\n"
+ "{\n"
+ "} Foo_t;",
+ Style);
+}
+
+TEST_F(FormatTest, SplitEmptyStruct) {
+ FormatStyle Style = getLLVMStyle();
+ Style.BreakBeforeBraces = FormatStyle::BS_Custom;
+ Style.BraceWrapping.AfterStruct = true;
+ Style.BraceWrapping.SplitEmptyRecord = false;
+
+ verifyFormat("struct Foo\n"
+ "{};",
+ Style);
+ verifyFormat("/* something */ struct Foo\n"
+ "{};",
+ Style);
+ verifyFormat("template <typename X> struct Foo\n"
+ "{};",
+ Style);
+ verifyFormat("struct Foo\n"
+ "{\n"
+ " Foo();\n"
+ "};",
+ Style);
+ verifyFormat("typedef struct Foo\n"
+ "{\n"
+ "} Foo_t;",
+ Style);
+ //typedef struct Bar {} Bar_t;
+}
+
+TEST_F(FormatTest, SplitEmptyUnion) {
+ FormatStyle Style = getLLVMStyle();
+ Style.BreakBeforeBraces = FormatStyle::BS_Custom;
+ Style.BraceWrapping.AfterUnion = true;
+ Style.BraceWrapping.SplitEmptyRecord = false;
+
+ verifyFormat("union Foo\n"
+ "{};",
+ Style);
+ verifyFormat("/* something */ union Foo\n"
+ "{};",
+ Style);
+ verifyFormat("union Foo\n"
+ "{\n"
+ " A,\n"
+ "};",
+ Style);
+ verifyFormat("typedef union Foo\n"
+ "{\n"
+ "} Foo_t;",
+ Style);
+}
+
+TEST_F(FormatTest, SplitEmptyNamespace) {
+ FormatStyle Style = getLLVMStyle();
+ Style.BreakBeforeBraces = FormatStyle::BS_Custom;
+ Style.BraceWrapping.AfterNamespace = true;
+ Style.BraceWrapping.SplitEmptyNamespace = false;
+
+ verifyFormat("namespace Foo\n"
+ "{};",
+ Style);
+ verifyFormat("/* something */ namespace Foo\n"
+ "{};",
+ Style);
+ verifyFormat("inline namespace Foo\n"
+ "{};",
+ Style);
+ verifyFormat("namespace Foo\n"
+ "{\n"
+ "void Bar();\n"
+ "};",
+ Style);
+}
+
+TEST_F(FormatTest, NeverMergeShortRecords) {
+ FormatStyle Style = getLLVMStyle();
+
+ verifyFormat("class Foo {\n"
+ " Foo();\n"
+ "};",
+ Style);
+ verifyFormat("typedef class Foo {\n"
+ " Foo();\n"
+ "} Foo_t;",
+ Style);
+ verifyFormat("struct Foo {\n"
+ " Foo();\n"
+ "};",
+ Style);
+ verifyFormat("typedef struct Foo {\n"
+ " Foo();\n"
+ "} Foo_t;",
+ Style);
+ verifyFormat("union Foo {\n"
+ " A,\n"
+ "};",
+ Style);
+ verifyFormat("typedef union Foo {\n"
+ " A,\n"
+ "} Foo_t;",
+ Style);
+ verifyFormat("namespace Foo {\n"
+ "void Bar();\n"
+ "};",
+ Style);
+
+ Style.BreakBeforeBraces = FormatStyle::BS_Custom;
+ Style.BraceWrapping.AfterClass = true;
+ Style.BraceWrapping.AfterStruct = true;
+ Style.BraceWrapping.AfterUnion = true;
+ Style.BraceWrapping.AfterNamespace = true;
+ verifyFormat("class Foo\n"
+ "{\n"
+ " Foo();\n"
+ "};",
+ Style);
+ verifyFormat("typedef class Foo\n"
+ "{\n"
+ " Foo();\n"
+ "} Foo_t;",
+ Style);
+ verifyFormat("struct Foo\n"
+ "{\n"
+ " Foo();\n"
+ "};",
+ Style);
+ verifyFormat("typedef struct Foo\n"
+ "{\n"
+ " Foo();\n"
+ "} Foo_t;",
+ Style);
+ verifyFormat("union Foo\n"
+ "{\n"
+ " A,\n"
+ "};",
+ Style);
+ verifyFormat("typedef union Foo\n"
+ "{\n"
+ " A,\n"
+ "} Foo_t;",
+ Style);
+ verifyFormat("namespace Foo\n"
+ "{\n"
+ "void Bar();\n"
+ "};",
+ Style);
+}
+
TEST_F(FormatTest, UnderstandContextOfRecordTypeKeywords) {
// Elaborate type variable declarations.
verifyFormat("struct foo a = {bar};\nint n;");
@@ -9355,7 +9543,9 @@ TEST_F(FormatTest, ParsesConfigurationBools) {
CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeCatch);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, BeforeElse);
CHECK_PARSE_NESTED_BOOL(BraceWrapping, IndentBraces);
- CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunctionBody);
+ CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyFunction);
+ CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyRecord);
+ CHECK_PARSE_NESTED_BOOL(BraceWrapping, SplitEmptyNamespace);
}
#undef CHECK_PARSE_BOOL
diff --git a/unittests/Format/FormatTestJava.cpp b/unittests/Format/FormatTestJava.cpp
index 6e685f6703e1..b9cfaffb0181 100644
--- a/unittests/Format/FormatTestJava.cpp
+++ b/unittests/Format/FormatTestJava.cpp
@@ -237,7 +237,10 @@ TEST_F(FormatTestJava, EnumDeclarations) {
TEST_F(FormatTestJava, ArrayInitializers) {
verifyFormat("new int[] {1, 2, 3, 4};");
verifyFormat("new int[] {\n"
- " 1, 2, 3, 4,\n"
+ " 1,\n"
+ " 2,\n"
+ " 3,\n"
+ " 4,\n"
"};");
FormatStyle Style = getStyleWithColumns(65);
diff --git a/unittests/Format/FormatTestProto.cpp b/unittests/Format/FormatTestProto.cpp
index d174c65a1f32..2e3b9311d12c 100644
--- a/unittests/Format/FormatTestProto.cpp
+++ b/unittests/Format/FormatTestProto.cpp
@@ -61,6 +61,29 @@ TEST_F(FormatTestProto, FormatsMessages) {
" really.really.long.qualified.type.aaa.aaaaaaa.aaaaaaaa\n"
" another_fiiiiiiiiiiiiiiiiiiiiield = 2;\n"
"}");
+ verifyFormat("message SomeMessage {\n"
+ " map<string, Project> projects = 1;\n"
+ " optional map<string, int32> size_projects = 2;\n"
+ " map<int, really.really.really.long.qualified.type.nameeee>\n"
+ " projects = 3;\n"
+ " map<int, really.really.really.really.long.qualified.type\n"
+ " .nameeee> projects = 4;\n"
+ " map<int,\n"
+ " reallyreallyreallyreallyreallyreallyreallylongname>\n"
+ " projects = 5;\n"
+ " map<int, Project>\n"
+ " longlonglonglonglonglonglonglonglonglongonglon = 6;\n"
+ " map<releleallyreallyreallyreallyreallyreallyreallylongname,\n"
+ " int> projects = 7;\n"
+ " map<releleallyreallyreallyreallyreallyreallyreallylongname,\n"
+ " releleallyreallyreallyreallyreallyreallyreallylongname>\n"
+ " releleallyreallyreallyreallyreallyreallyreallylongnam =\n"
+ " 8;\n"
+ " map<relele.llyreal.yreallyr.allyreally.eallyreal\n"
+ " .sauenirylongname,\n"
+ " really.really.really.really.long.qualified.type\n"
+ " .nameeee> projects = 9;\n"
+ "}");
}
TEST_F(FormatTestProto, KeywordsInOtherLanguages) {
@@ -178,12 +201,161 @@ TEST_F(FormatTestProto, FormatsOptions) {
" field_c: \"OK\"\n"
" msg_field{field_d: 123}\n"
"};");
+ verifyFormat("option (MyProto.options) = {\n"
+ " field_a: OK\n"
+ " field_b{field_c: OK}\n"
+ " field_d: OKOKOK\n"
+ " field_e: OK\n"
+ "}");
// Support syntax with <> instead of {}.
verifyFormat("option (MyProto.options) = {\n"
" field_c: \"OK\",\n"
" msg_field: <field_d: 123>\n"
"};");
+
+ verifyFormat("option (MyProto.options) = {\n"
+ " field_a: OK\n"
+ " field_b<field_c: OK>\n"
+ " field_d: OKOKOK\n"
+ " field_e: OK\n"
+ "}");
+
+ verifyFormat("option (MyProto.options) = {\n"
+ " msg_field: <>\n"
+ " field_c: \"OK\",\n"
+ " msg_field: <field_d: 123>\n"
+ " field_e: OK\n"
+ " msg_field: <field_d: 12>\n"
+ "};");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: OK\n"
+ " field_b: \"OK\"\n"
+ " field_c: 1\n"
+ " field_d: 12.5\n"
+ " field_e: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: OK,\n"
+ " field_b: \"OK\",\n"
+ " field_c: 1,\n"
+ " field_d: 12.5,\n"
+ " field_e: OK,\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field: {field_b: OK}\n"
+ " field_g: OK\n"
+ " field_g: OK\n"
+ " field_g: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field<\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " >\n"
+ " field_g: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field<\n"
+ " field_b: OK,\n"
+ " field_c: OK,\n"
+ " field_d: OK,\n"
+ " field_e: OK,\n"
+ " field_f: OK\n"
+ " >\n"
+ " field_g: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field: <\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " >\n"
+ " field_g: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field: {\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " }\n"
+ " field_g: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field{\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " }\n"
+ " field_g: OK\n"
+ ">;");
+
+ verifyFormat("option (MyProto.options) = {\n"
+ " field_a: \"OK\"\n"
+ " msg_field<\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " >\n"
+ " field_g: OK\n"
+ "};");
+
+ verifyFormat("option (MyProto.options) = {\n"
+ " field_a: \"OK\"\n"
+ " msg_field: <\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " >\n"
+ " field_g: OK\n"
+ "};");
+
+ verifyFormat("option (MyProto.options) = <\n"
+ " field_a: \"OK\"\n"
+ " msg_field{\n"
+ " field_b: OK\n"
+ " field_c: OK\n"
+ " field_d: OK\n"
+ " msg_field<\n"
+ " field_A: 1\n"
+ " field_B: 2\n"
+ " field_C: 3\n"
+ " field_D: 4\n"
+ " field_E: 5\n"
+ " >\n"
+ " msg_field<field_A: 1 field_B: 2 field_C: 3 field_D: 4>\n"
+ " field_e: OK\n"
+ " field_f: OK\n"
+ " }\n"
+ " field_g: OK\n"
+ ">;");
}
TEST_F(FormatTestProto, FormatsService) {
diff --git a/unittests/Format/SortIncludesTest.cpp b/unittests/Format/SortIncludesTest.cpp
index c3c56a813041..1128ed829ff2 100644
--- a/unittests/Format/SortIncludesTest.cpp
+++ b/unittests/Format/SortIncludesTest.cpp
@@ -266,6 +266,29 @@ TEST_F(SortIncludesTest, LeavesMainHeaderFirst) {
"a.cc"));
}
+TEST_F(SortIncludesTest, SupportCaseInsensitiveMatching) {
+ // Setup an regex for main includes so we can cover those as well.
+ Style.IncludeIsMainRegex = "([-_](test|unittest))?$";
+
+ // Ensure both main header detection and grouping work in a case insensitive
+ // manner.
+ EXPECT_EQ("#include \"llvm/A.h\"\n"
+ "#include \"b.h\"\n"
+ "#include \"c.h\"\n"
+ "#include \"LLVM/z.h\"\n"
+ "#include \"llvm/X.h\"\n"
+ "#include \"GTest/GTest.h\"\n"
+ "#include \"gmock/gmock.h\"\n",
+ sort("#include \"c.h\"\n"
+ "#include \"b.h\"\n"
+ "#include \"GTest/GTest.h\"\n"
+ "#include \"llvm/A.h\"\n"
+ "#include \"gmock/gmock.h\"\n"
+ "#include \"llvm/X.h\"\n"
+ "#include \"LLVM/z.h\"\n",
+ "a_TEST.cc"));
+}
+
TEST_F(SortIncludesTest, NegativePriorities) {
Style.IncludeCategories = {{".*important_os_header.*", -1}, {".*", 1}};
EXPECT_EQ("#include \"important_os_header.h\"\n"