Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 1 | //===- unittest/Format/FormatTestJava.cpp - Formatting tests for Java -----===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "FormatTestUtils.h" |
| 11 | #include "clang/Format/Format.h" |
| 12 | #include "llvm/Support/Debug.h" |
| 13 | #include "gtest/gtest.h" |
| 14 | |
| 15 | #define DEBUG_TYPE "format-test" |
| 16 | |
| 17 | namespace clang { |
| 18 | namespace format { |
| 19 | |
| 20 | class FormatTestJava : public ::testing::Test { |
| 21 | protected: |
| 22 | static std::string format(llvm::StringRef Code, unsigned Offset, |
| 23 | unsigned Length, const FormatStyle &Style) { |
| 24 | DEBUG(llvm::errs() << "---\n"); |
| 25 | DEBUG(llvm::errs() << Code << "\n\n"); |
| 26 | std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length)); |
| 27 | tooling::Replacements Replaces = reformat(Style, Code, Ranges); |
Eric Liu | 4f8d994 | 2016-07-11 13:53:12 +0000 | [diff] [blame] | 28 | auto Result = applyAllReplacements(Code, Replaces); |
| 29 | EXPECT_TRUE(static_cast<bool>(Result)); |
| 30 | DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); |
| 31 | return *Result; |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 32 | } |
| 33 | |
Daniel Jasper | e6fcf7d | 2015-06-17 13:08:06 +0000 | [diff] [blame] | 34 | static std::string |
| 35 | format(llvm::StringRef Code, |
| 36 | const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 37 | return format(Code, 0, Code.size(), Style); |
| 38 | } |
| 39 | |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 40 | static FormatStyle getStyleWithColumns(unsigned ColumnLimit) { |
| 41 | FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java); |
| 42 | Style.ColumnLimit = ColumnLimit; |
| 43 | return Style; |
| 44 | } |
| 45 | |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 46 | static void verifyFormat( |
| 47 | llvm::StringRef Code, |
| 48 | const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { |
| 49 | EXPECT_EQ(Code.str(), format(test::messUp(Code), Style)); |
| 50 | } |
| 51 | }; |
| 52 | |
Daniel Jasper | 30a2406 | 2014-11-14 09:02:28 +0000 | [diff] [blame] | 53 | TEST_F(FormatTestJava, NoAlternativeOperatorNames) { |
| 54 | verifyFormat("someObject.and();"); |
| 55 | } |
| 56 | |
Daniel Jasper | 4f56b0b | 2014-11-26 12:23:10 +0000 | [diff] [blame] | 57 | TEST_F(FormatTestJava, UnderstandsCasts) { |
| 58 | verifyFormat("a[b >> 1] = (byte) (c() << 4);"); |
| 59 | } |
| 60 | |
Daniel Jasper | a98b7b0 | 2014-11-25 10:05:17 +0000 | [diff] [blame] | 61 | TEST_F(FormatTestJava, FormatsInstanceOfLikeOperators) { |
| 62 | FormatStyle Style = getStyleWithColumns(50); |
| 63 | verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" |
| 64 | " instanceof bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", |
| 65 | Style); |
| 66 | Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; |
| 67 | verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa instanceof\n" |
| 68 | " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", |
| 69 | Style); |
Daniel Jasper | 043ac05 | 2015-07-03 10:12:53 +0000 | [diff] [blame] | 70 | verifyFormat("return aaaaaaaaaaaaaaaaaaa instanceof bbbbbbbbbbbbbbbbbbbbbbb\n" |
| 71 | " && ccccccccccccccccccc instanceof dddddddddddddddddddddd;"); |
Daniel Jasper | a98b7b0 | 2014-11-25 10:05:17 +0000 | [diff] [blame] | 72 | } |
| 73 | |
Nico Weber | 450425c | 2014-11-26 16:43:18 +0000 | [diff] [blame] | 74 | TEST_F(FormatTestJava, Chromium) { |
| 75 | verifyFormat("class SomeClass {\n" |
| 76 | " void f() {}\n" |
| 77 | " int g() {\n" |
| 78 | " return 0;\n" |
| 79 | " }\n" |
| 80 | " void h() {\n" |
| 81 | " while (true) f();\n" |
| 82 | " for (;;) f();\n" |
| 83 | " if (true) f();\n" |
| 84 | " }\n" |
| 85 | "}", |
| 86 | getChromiumStyle(FormatStyle::LK_Java)); |
| 87 | } |
| 88 | |
Daniel Jasper | 8379107 | 2014-12-03 13:20:49 +0000 | [diff] [blame] | 89 | TEST_F(FormatTestJava, QualifiedNames) { |
| 90 | verifyFormat("public some.package.Type someFunction( // comment\n" |
| 91 | " int parameter) {}"); |
| 92 | } |
| 93 | |
Daniel Jasper | e5d7486 | 2014-11-26 08:17:08 +0000 | [diff] [blame] | 94 | TEST_F(FormatTestJava, ClassKeyword) { |
| 95 | verifyFormat("SomeClass.class.getName();"); |
| 96 | verifyFormat("Class c = SomeClass.class;"); |
| 97 | } |
| 98 | |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 99 | TEST_F(FormatTestJava, ClassDeclarations) { |
| 100 | verifyFormat("public class SomeClass {\n" |
| 101 | " private int a;\n" |
| 102 | " private int b;\n" |
| 103 | "}"); |
| 104 | verifyFormat("public class A {\n" |
| 105 | " class B {\n" |
| 106 | " int i;\n" |
| 107 | " }\n" |
| 108 | " class C {\n" |
| 109 | " int j;\n" |
| 110 | " }\n" |
| 111 | "}"); |
Daniel Jasper | 4bf9d47 | 2014-10-21 09:31:29 +0000 | [diff] [blame] | 112 | verifyFormat("public class A extends B.C {}"); |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 113 | |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 114 | verifyFormat("abstract class SomeClass\n" |
| 115 | " extends SomeOtherClass implements SomeInterface {}", |
| 116 | getStyleWithColumns(60)); |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 117 | verifyFormat("abstract class SomeClass extends SomeOtherClass\n" |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 118 | " implements SomeInterfaceeeeeeeeeeeee {}", |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 119 | getStyleWithColumns(60)); |
| 120 | verifyFormat("abstract class SomeClass\n" |
| 121 | " extends SomeOtherClass\n" |
| 122 | " implements SomeInterface {}", |
| 123 | getStyleWithColumns(40)); |
| 124 | verifyFormat("abstract class SomeClass\n" |
| 125 | " extends SomeOtherClass\n" |
| 126 | " implements SomeInterface,\n" |
| 127 | " AnotherInterface {}", |
| 128 | getStyleWithColumns(40)); |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 129 | verifyFormat("abstract class SomeClass\n" |
| 130 | " implements SomeInterface, AnotherInterface {}", |
| 131 | getStyleWithColumns(60)); |
Daniel Jasper | 39af6cd | 2014-11-03 02:27:28 +0000 | [diff] [blame] | 132 | verifyFormat("@SomeAnnotation()\n" |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 133 | "abstract class aaaaaaaaaaaa\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 134 | " extends bbbbbbbbbbbbbbb implements cccccccccccc {}", |
Daniel Jasper | 39af6cd | 2014-11-03 02:27:28 +0000 | [diff] [blame] | 135 | getStyleWithColumns(76)); |
Daniel Jasper | 58fcf6d | 2014-11-04 10:53:14 +0000 | [diff] [blame] | 136 | verifyFormat("@SomeAnnotation()\n" |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 137 | "abstract class aaaaaaaaa<a>\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 138 | " extends bbbbbbbbbbbb<b> implements cccccccccccc {}", |
Daniel Jasper | 58fcf6d | 2014-11-04 10:53:14 +0000 | [diff] [blame] | 139 | getStyleWithColumns(76)); |
Nico Weber | a644d7f | 2014-11-10 16:30:02 +0000 | [diff] [blame] | 140 | verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n" |
| 141 | " void doStuff(int theStuff);\n" |
| 142 | " void doMoreStuff(int moreStuff);\n" |
| 143 | "}"); |
| 144 | verifyFormat("public interface SomeInterface {\n" |
| 145 | " void doStuff(int theStuff);\n" |
| 146 | " void doMoreStuff(int moreStuff);\n" |
| 147 | "}"); |
| 148 | verifyFormat("@interface SomeInterface {\n" |
| 149 | " void doStuff(int theStuff);\n" |
| 150 | " void doMoreStuff(int moreStuff);\n" |
| 151 | "}"); |
| 152 | verifyFormat("public @interface SomeInterface {\n" |
| 153 | " void doStuff(int theStuff);\n" |
| 154 | " void doMoreStuff(int moreStuff);\n" |
| 155 | "}"); |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 156 | } |
| 157 | |
Daniel Jasper | 6acf513 | 2015-03-12 14:44:29 +0000 | [diff] [blame] | 158 | TEST_F(FormatTestJava, AnonymousClasses) { |
| 159 | verifyFormat("return new A() {\n" |
| 160 | " public String toString() {\n" |
| 161 | " return \"NotReallyA\";\n" |
| 162 | " }\n" |
| 163 | "};"); |
| 164 | verifyFormat("A a = new A() {\n" |
| 165 | " public String toString() {\n" |
| 166 | " return \"NotReallyA\";\n" |
| 167 | " }\n" |
| 168 | "};"); |
| 169 | } |
| 170 | |
Daniel Jasper | df2ff00 | 2014-11-02 22:31:39 +0000 | [diff] [blame] | 171 | TEST_F(FormatTestJava, EnumDeclarations) { |
| 172 | verifyFormat("enum SomeThing { ABC, CDE }"); |
| 173 | verifyFormat("enum SomeThing {\n" |
| 174 | " ABC,\n" |
| 175 | " CDE,\n" |
| 176 | "}"); |
| 177 | verifyFormat("public class SomeClass {\n" |
| 178 | " enum SomeThing { ABC, CDE }\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 179 | " void f() {}\n" |
Daniel Jasper | df2ff00 | 2014-11-02 22:31:39 +0000 | [diff] [blame] | 180 | "}"); |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 181 | verifyFormat("public class SomeClass implements SomeInterface {\n" |
| 182 | " enum SomeThing { ABC, CDE }\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 183 | " void f() {}\n" |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 184 | "}"); |
| 185 | verifyFormat("enum SomeThing {\n" |
| 186 | " ABC,\n" |
| 187 | " CDE;\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 188 | " void f() {}\n" |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 189 | "}"); |
| 190 | verifyFormat("enum SomeThing {\n" |
| 191 | " ABC(1, \"ABC\"),\n" |
| 192 | " CDE(2, \"CDE\");\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 193 | " Something(int i, String s) {}\n" |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 194 | "}"); |
| 195 | verifyFormat("enum SomeThing {\n" |
Daniel Jasper | a0143fa | 2014-11-23 20:54:37 +0000 | [diff] [blame] | 196 | " ABC(new int[] {1, 2}),\n" |
| 197 | " CDE(new int[] {2, 3});\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 198 | " Something(int[] i) {}\n" |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 199 | "}"); |
| 200 | verifyFormat("public enum SomeThing {\n" |
| 201 | " ABC {\n" |
| 202 | " public String toString() {\n" |
| 203 | " return \"ABC\";\n" |
| 204 | " }\n" |
| 205 | " },\n" |
| 206 | " CDE {\n" |
| 207 | " @Override\n" |
| 208 | " public String toString() {\n" |
| 209 | " return \"CDE\";\n" |
| 210 | " }\n" |
| 211 | " };\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 212 | " public void f() {}\n" |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 213 | "}"); |
Daniel Jasper | ccb68b4 | 2014-11-19 22:38:18 +0000 | [diff] [blame] | 214 | verifyFormat("private enum SomeEnum implements Foo<?, B> {\n" |
| 215 | " ABC {\n" |
| 216 | " @Override\n" |
| 217 | " public String toString() {\n" |
| 218 | " return \"ABC\";\n" |
| 219 | " }\n" |
| 220 | " },\n" |
| 221 | " CDE {\n" |
| 222 | " @Override\n" |
| 223 | " public String toString() {\n" |
| 224 | " return \"CDE\";\n" |
| 225 | " }\n" |
| 226 | " };\n" |
| 227 | "}"); |
Daniel Jasper | e154020 | 2017-02-28 18:28:15 +0000 | [diff] [blame] | 228 | verifyFormat("public enum VeryLongEnum {\n" |
| 229 | " ENUM_WITH_MANY_PARAMETERS(\n" |
| 230 | " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"bbbbbbbbbbbbbbbb\", " |
| 231 | "\"cccccccccccccccccccccccc\"),\n" |
| 232 | " SECOND_ENUM(\"a\", \"b\", \"c\");\n" |
| 233 | " private VeryLongEnum(String a, String b, String c) {}\n" |
| 234 | "}\n"); |
Daniel Jasper | df2ff00 | 2014-11-02 22:31:39 +0000 | [diff] [blame] | 235 | } |
| 236 | |
Daniel Jasper | a0143fa | 2014-11-23 20:54:37 +0000 | [diff] [blame] | 237 | TEST_F(FormatTestJava, ArrayInitializers) { |
| 238 | verifyFormat("new int[] {1, 2, 3, 4};"); |
| 239 | verifyFormat("new int[] {\n" |
Francois Ferrand | d2130f5 | 2017-06-30 20:00:02 +0000 | [diff] [blame^] | 240 | " 1,\n" |
| 241 | " 2,\n" |
| 242 | " 3,\n" |
| 243 | " 4,\n" |
Daniel Jasper | a0143fa | 2014-11-23 20:54:37 +0000 | [diff] [blame] | 244 | "};"); |
Daniel Jasper | 13404da | 2014-11-27 14:40:48 +0000 | [diff] [blame] | 245 | |
| 246 | FormatStyle Style = getStyleWithColumns(65); |
| 247 | Style.Cpp11BracedListStyle = false; |
| 248 | verifyFormat( |
| 249 | "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n" |
| 250 | " 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };", |
| 251 | Style); |
Daniel Jasper | a0143fa | 2014-11-23 20:54:37 +0000 | [diff] [blame] | 252 | } |
| 253 | |
Daniel Jasper | f26c755 | 2014-10-17 13:36:14 +0000 | [diff] [blame] | 254 | TEST_F(FormatTestJava, ThrowsDeclarations) { |
| 255 | verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 256 | " throws LooooooooooooooooooooooooooooongException {}"); |
Daniel Jasper | 375815d | 2014-11-26 12:31:19 +0000 | [diff] [blame] | 257 | verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" |
| 258 | " throws LoooooooooongException, LooooooooooongException {}"); |
Daniel Jasper | f26c755 | 2014-10-17 13:36:14 +0000 | [diff] [blame] | 259 | } |
| 260 | |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 261 | TEST_F(FormatTestJava, Annotations) { |
| 262 | verifyFormat("@Override\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 263 | "public String toString() {}"); |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 264 | verifyFormat("@Override\n" |
| 265 | "@Nullable\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 266 | "public String getNameIfPresent() {}"); |
Daniel Jasper | 07013a4 | 2014-11-26 11:20:43 +0000 | [diff] [blame] | 267 | verifyFormat("@Override // comment\n" |
| 268 | "@Nullable\n" |
| 269 | "public String getNameIfPresent() {}"); |
Nico Weber | beb0393 | 2015-01-09 23:25:06 +0000 | [diff] [blame] | 270 | verifyFormat("@java.lang.Override // comment\n" |
| 271 | "@Nullable\n" |
| 272 | "public String getNameIfPresent() {}"); |
Daniel Jasper | f1f0c35 | 2014-10-21 09:25:39 +0000 | [diff] [blame] | 273 | |
| 274 | verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 275 | "public void doSomething() {}"); |
Daniel Jasper | d78c422 | 2014-10-21 11:17:56 +0000 | [diff] [blame] | 276 | verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" |
| 277 | "@Author(name = \"abc\")\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 278 | "public void doSomething() {}"); |
Daniel Jasper | f1f0c35 | 2014-10-21 09:25:39 +0000 | [diff] [blame] | 279 | |
Daniel Jasper | c7d024a | 2014-10-21 10:02:03 +0000 | [diff] [blame] | 280 | verifyFormat("DoSomething(new A() {\n" |
| 281 | " @Override\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 282 | " public String toString() {}\n" |
Daniel Jasper | c7d024a | 2014-10-21 10:02:03 +0000 | [diff] [blame] | 283 | "});"); |
| 284 | |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 285 | verifyFormat("void SomeFunction(@Nullable String something) {}"); |
Nico Weber | beb0393 | 2015-01-09 23:25:06 +0000 | [diff] [blame] | 286 | verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}"); |
Daniel Jasper | e9ab42d | 2014-10-31 18:23:49 +0000 | [diff] [blame] | 287 | |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 288 | verifyFormat("@Partial @Mock DataLoader loader;"); |
Nico Weber | 2cd92f1 | 2015-10-15 16:03:01 +0000 | [diff] [blame] | 289 | verifyFormat("@Partial\n" |
| 290 | "@Mock\n" |
| 291 | "DataLoader loader;", |
| 292 | getChromiumStyle(FormatStyle::LK_Java)); |
Daniel Jasper | fd68191 | 2014-10-21 10:58:14 +0000 | [diff] [blame] | 293 | verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" |
| 294 | "public static int iiiiiiiiiiiiiiiiiiiiiiii;"); |
Daniel Jasper | e9ab42d | 2014-10-31 18:23:49 +0000 | [diff] [blame] | 295 | |
| 296 | verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" |
| 297 | "private static final long something = 0L;"); |
Nico Weber | beb0393 | 2015-01-09 23:25:06 +0000 | [diff] [blame] | 298 | verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n" |
| 299 | "private static final long something = 0L;"); |
Daniel Jasper | 211e132 | 2014-12-08 20:08:04 +0000 | [diff] [blame] | 300 | verifyFormat("@Mock\n" |
| 301 | "DataLoader loooooooooooooooooooooooader =\n" |
| 302 | " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", |
| 303 | getStyleWithColumns(60)); |
Nico Weber | beb0393 | 2015-01-09 23:25:06 +0000 | [diff] [blame] | 304 | verifyFormat("@org.llvm.QualifiedMock\n" |
| 305 | "DataLoader loooooooooooooooooooooooader =\n" |
| 306 | " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", |
| 307 | getStyleWithColumns(60)); |
Daniel Jasper | a831c58 | 2015-01-14 09:47:57 +0000 | [diff] [blame] | 308 | verifyFormat("@Test(a)\n" |
| 309 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" |
| 310 | " aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);"); |
Daniel Jasper | 3e1bd14 | 2015-01-14 09:51:32 +0000 | [diff] [blame] | 311 | verifyFormat("@SomeAnnotation(\n" |
| 312 | " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n" |
| 313 | "int i;", |
| 314 | getStyleWithColumns(50)); |
Daniel Jasper | 404658a | 2015-01-14 10:00:20 +0000 | [diff] [blame] | 315 | verifyFormat("@Test\n" |
| 316 | "ReturnType doSomething(\n" |
| 317 | " String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}", |
| 318 | getStyleWithColumns(60)); |
Daniel Jasper | 190fbda | 2015-01-14 10:36:31 +0000 | [diff] [blame] | 319 | verifyFormat("{\n" |
| 320 | " boolean someFunction(\n" |
| 321 | " @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n" |
| 322 | " String bbbbbbbbbbbbbbb) {}\n" |
| 323 | "}", |
| 324 | getStyleWithColumns(60)); |
Daniel Jasper | 15b01116d | 2016-01-27 20:14:23 +0000 | [diff] [blame] | 325 | verifyFormat("@Annotation(\"Some\"\n" |
| 326 | " + \" text\")\n" |
| 327 | "List<Integer> list;"); |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 328 | } |
| 329 | |
Daniel Jasper | 16b107e | 2014-10-21 09:57:09 +0000 | [diff] [blame] | 330 | TEST_F(FormatTestJava, Generics) { |
| 331 | verifyFormat("Iterable<?> a;"); |
| 332 | verifyFormat("Iterable<?> a;"); |
| 333 | verifyFormat("Iterable<? extends SomeObject> a;"); |
Daniel Jasper | 5ffcb7f | 2014-10-21 11:13:31 +0000 | [diff] [blame] | 334 | |
| 335 | verifyFormat("A.<B>doSomething();"); |
Daniel Jasper | 7bd618f | 2014-11-02 21:52:57 +0000 | [diff] [blame] | 336 | |
| 337 | verifyFormat("@Override\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 338 | "public Map<String, ?> getAll() {}"); |
Daniel Jasper | db9a7a2 | 2014-11-03 02:35:14 +0000 | [diff] [blame] | 339 | |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 340 | verifyFormat("public <R> ArrayList<R> get() {}"); |
| 341 | verifyFormat("protected <R> ArrayList<R> get() {}"); |
| 342 | verifyFormat("private <R> ArrayList<R> get() {}"); |
| 343 | verifyFormat("public static <R> ArrayList<R> get() {}"); |
Nico Weber | ed50166 | 2015-01-13 22:32:50 +0000 | [diff] [blame] | 344 | verifyFormat("public static native <R> ArrayList<R> get();"); |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 345 | verifyFormat("public final <X> Foo foo() {}"); |
Daniel Jasper | 82c9275 | 2014-11-21 12:19:07 +0000 | [diff] [blame] | 346 | verifyFormat("public abstract <X> Foo foo();"); |
Daniel Jasper | f056f45 | 2014-11-03 02:45:58 +0000 | [diff] [blame] | 347 | verifyFormat("<T extends B> T getInstance(Class<T> type);"); |
Daniel Jasper | 61d8197 | 2014-11-14 08:22:46 +0000 | [diff] [blame] | 348 | verifyFormat("Function<F, ? extends T> function;"); |
Daniel Jasper | 6761b42 | 2014-11-18 23:48:01 +0000 | [diff] [blame] | 349 | |
| 350 | verifyFormat("private Foo<X, Y>[] foos;"); |
| 351 | verifyFormat("Foo<X, Y>[] foos = this.foos;"); |
Daniel Jasper | 77ef2be | 2015-01-05 10:33:39 +0000 | [diff] [blame] | 352 | verifyFormat("return (a instanceof List<?>)\n" |
| 353 | " ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" |
| 354 | " : aaaaaaaaaaaaaaaaaaaaaaa;", |
| 355 | getStyleWithColumns(60)); |
Daniel Jasper | caf8685 | 2014-11-20 09:48:11 +0000 | [diff] [blame] | 356 | |
| 357 | verifyFormat( |
| 358 | "SomeLoooooooooooooooooooooongType name =\n" |
| 359 | " SomeType.foo(someArgument)\n" |
| 360 | " .<X>method()\n" |
| 361 | " .aaaaaaaaaaaaaaaaaaa()\n" |
| 362 | " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); |
Daniel Jasper | 16b107e | 2014-10-21 09:57:09 +0000 | [diff] [blame] | 363 | } |
| 364 | |
Daniel Jasper | c012686 | 2014-10-21 11:34:53 +0000 | [diff] [blame] | 365 | TEST_F(FormatTestJava, StringConcatenation) { |
| 366 | verifyFormat("String someString = \"abc\"\n" |
Daniel Jasper | 3219e43 | 2014-12-02 13:24:51 +0000 | [diff] [blame] | 367 | " + \"cde\";"); |
Daniel Jasper | c012686 | 2014-10-21 11:34:53 +0000 | [diff] [blame] | 368 | } |
| 369 | |
Daniel Jasper | a3ddf86 | 2014-11-02 19:21:48 +0000 | [diff] [blame] | 370 | TEST_F(FormatTestJava, TryCatchFinally) { |
| 371 | verifyFormat("try {\n" |
| 372 | " Something();\n" |
| 373 | "} catch (SomeException e) {\n" |
| 374 | " HandleException(e);\n" |
| 375 | "}"); |
| 376 | verifyFormat("try {\n" |
| 377 | " Something();\n" |
| 378 | "} finally {\n" |
| 379 | " AlwaysDoThis();\n" |
| 380 | "}"); |
| 381 | verifyFormat("try {\n" |
| 382 | " Something();\n" |
| 383 | "} catch (SomeException e) {\n" |
| 384 | " HandleException(e);\n" |
| 385 | "} finally {\n" |
| 386 | " AlwaysDoThis();\n" |
| 387 | "}"); |
| 388 | |
| 389 | verifyFormat("try {\n" |
| 390 | " Something();\n" |
| 391 | "} catch (SomeException | OtherException e) {\n" |
| 392 | " HandleException(e);\n" |
| 393 | "}"); |
| 394 | } |
| 395 | |
Daniel Jasper | e189d46 | 2015-01-14 10:48:41 +0000 | [diff] [blame] | 396 | TEST_F(FormatTestJava, TryWithResources) { |
| 397 | verifyFormat("try (SomeResource rs = someFunction()) {\n" |
| 398 | " Something();\n" |
| 399 | "}"); |
| 400 | verifyFormat("try (SomeResource rs = someFunction()) {\n" |
| 401 | " Something();\n" |
| 402 | "} catch (SomeException e) {\n" |
| 403 | " HandleException(e);\n" |
| 404 | "}"); |
| 405 | } |
| 406 | |
Daniel Jasper | b9d3db6 | 2014-11-02 22:00:57 +0000 | [diff] [blame] | 407 | TEST_F(FormatTestJava, SynchronizedKeyword) { |
| 408 | verifyFormat("synchronized (mData) {\n" |
| 409 | " // ...\n" |
| 410 | "}"); |
| 411 | } |
| 412 | |
Nico Weber | 4f11349 | 2015-09-15 23:48:17 +0000 | [diff] [blame] | 413 | TEST_F(FormatTestJava, AssertKeyword) { |
| 414 | verifyFormat("assert a && b;"); |
| 415 | } |
| 416 | |
Daniel Jasper | 9b9e076 | 2014-11-26 18:03:42 +0000 | [diff] [blame] | 417 | TEST_F(FormatTestJava, PackageDeclarations) { |
| 418 | verifyFormat("package some.really.loooooooooooooooooooooong.package;", |
| 419 | getStyleWithColumns(50)); |
| 420 | } |
| 421 | |
Daniel Jasper | 5e7be1d | 2014-11-02 22:13:03 +0000 | [diff] [blame] | 422 | TEST_F(FormatTestJava, ImportDeclarations) { |
| 423 | verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;", |
| 424 | getStyleWithColumns(50)); |
Daniel Jasper | 16dbe0b | 2015-01-14 10:02:49 +0000 | [diff] [blame] | 425 | verifyFormat("import static some.really.looooooooooooooooong.imported.Class;", |
| 426 | getStyleWithColumns(50)); |
Daniel Jasper | 5e7be1d | 2014-11-02 22:13:03 +0000 | [diff] [blame] | 427 | } |
| 428 | |
Daniel Jasper | 3aa9a6a | 2014-11-18 23:55:27 +0000 | [diff] [blame] | 429 | TEST_F(FormatTestJava, MethodDeclarations) { |
| 430 | verifyFormat("void methodName(Object arg1,\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 431 | " Object arg2, Object arg3) {}", |
Daniel Jasper | 3aa9a6a | 2014-11-18 23:55:27 +0000 | [diff] [blame] | 432 | getStyleWithColumns(40)); |
| 433 | verifyFormat("void methodName(\n" |
Daniel Jasper | 9e70935 | 2014-11-26 10:43:58 +0000 | [diff] [blame] | 434 | " Object arg1, Object arg2) {}", |
Daniel Jasper | 3aa9a6a | 2014-11-18 23:55:27 +0000 | [diff] [blame] | 435 | getStyleWithColumns(40)); |
| 436 | } |
| 437 | |
Daniel Jasper | fe2cf66 | 2014-11-19 14:11:11 +0000 | [diff] [blame] | 438 | TEST_F(FormatTestJava, CppKeywords) { |
| 439 | verifyFormat("public void union(Type a, Type b);"); |
| 440 | verifyFormat("public void struct(Object o);"); |
| 441 | verifyFormat("public void delete(Object o);"); |
Daniel Jasper | 72a1b6a | 2015-12-22 15:47:56 +0000 | [diff] [blame] | 442 | verifyFormat("return operator && (aa);"); |
Daniel Jasper | fe2cf66 | 2014-11-19 14:11:11 +0000 | [diff] [blame] | 443 | } |
| 444 | |
Daniel Jasper | 6cab678 | 2014-11-20 09:54:49 +0000 | [diff] [blame] | 445 | TEST_F(FormatTestJava, NeverAlignAfterReturn) { |
| 446 | verifyFormat("return aaaaaaaaaaaaaaaaaaa\n" |
| 447 | " && bbbbbbbbbbbbbbbbbbb\n" |
| 448 | " && ccccccccccccccccccc;", |
| 449 | getStyleWithColumns(40)); |
| 450 | verifyFormat("return (result == null)\n" |
| 451 | " ? aaaaaaaaaaaaaaaaa\n" |
| 452 | " : bbbbbbbbbbbbbbbbb;", |
| 453 | getStyleWithColumns(40)); |
| 454 | verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" |
| 455 | " .bbbbbbbbbbbbbbbbbbb()\n" |
| 456 | " .ccccccccccccccccccc();", |
| 457 | getStyleWithColumns(40)); |
Daniel Jasper | a536df4 | 2014-12-08 21:28:31 +0000 | [diff] [blame] | 458 | verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" |
| 459 | " .bbbbbbbbbbbbbbbbbbb(\n" |
Daniel Jasper | 9dedc775 | 2015-04-07 06:41:24 +0000 | [diff] [blame] | 460 | " ccccccccccccccc)\n" |
Daniel Jasper | a536df4 | 2014-12-08 21:28:31 +0000 | [diff] [blame] | 461 | " .ccccccccccccccccccc();", |
| 462 | getStyleWithColumns(40)); |
Daniel Jasper | 6cab678 | 2014-11-20 09:54:49 +0000 | [diff] [blame] | 463 | } |
| 464 | |
Daniel Jasper | 4b44449 | 2014-11-21 13:38:53 +0000 | [diff] [blame] | 465 | TEST_F(FormatTestJava, FormatsInnerBlocks) { |
| 466 | verifyFormat("someObject.someFunction(new Runnable() {\n" |
| 467 | " @Override\n" |
| 468 | " public void run() {\n" |
| 469 | " System.out.println(42);\n" |
| 470 | " }\n" |
| 471 | "}, someOtherParameter);"); |
Daniel Jasper | 5f1fa85 | 2015-01-04 20:40:51 +0000 | [diff] [blame] | 472 | verifyFormat("someFunction(new Runnable() {\n" |
| 473 | " public void run() {\n" |
| 474 | " System.out.println(42);\n" |
| 475 | " }\n" |
| 476 | "});"); |
Daniel Jasper | 4b44449 | 2014-11-21 13:38:53 +0000 | [diff] [blame] | 477 | verifyFormat("someObject.someFunction(\n" |
| 478 | " new Runnable() {\n" |
| 479 | " @Override\n" |
| 480 | " public void run() {\n" |
| 481 | " System.out.println(42);\n" |
| 482 | " }\n" |
| 483 | " },\n" |
| 484 | " new Runnable() {\n" |
| 485 | " @Override\n" |
| 486 | " public void run() {\n" |
| 487 | " System.out.println(43);\n" |
| 488 | " }\n" |
| 489 | " },\n" |
| 490 | " someOtherParameter);"); |
| 491 | } |
| 492 | |
Daniel Jasper | 8354ea8 | 2014-11-21 12:14:12 +0000 | [diff] [blame] | 493 | TEST_F(FormatTestJava, FormatsLambdas) { |
| 494 | verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;"); |
| 495 | verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n" |
| 496 | " -> aaaaaaaaaa + bbbbbbbbbb;", |
| 497 | getStyleWithColumns(40)); |
| 498 | verifyFormat("Runnable someLambda = () -> DoSomething();"); |
| 499 | verifyFormat("Runnable someLambda = () -> {\n" |
| 500 | " DoSomething();\n" |
| 501 | "}"); |
| 502 | |
| 503 | verifyFormat("Runnable someLambda =\n" |
| 504 | " (int aaaaa) -> DoSomething(aaaaa);", |
| 505 | getStyleWithColumns(40)); |
| 506 | } |
| 507 | |
Alexander Kornienko | ff2437f | 2014-12-12 13:03:22 +0000 | [diff] [blame] | 508 | TEST_F(FormatTestJava, BreaksStringLiterals) { |
| 509 | // FIXME: String literal breaking is currently disabled for Java and JS, as it |
| 510 | // requires strings to be merged using "+" which we don't support. |
| 511 | EXPECT_EQ("\"some text other\";", |
| 512 | format("\"some text other\";", getStyleWithColumns(14))); |
| 513 | } |
| 514 | |
Daniel Jasper | 428f0b1 | 2015-01-04 09:11:17 +0000 | [diff] [blame] | 515 | TEST_F(FormatTestJava, AlignsBlockComments) { |
| 516 | EXPECT_EQ("/*\n" |
| 517 | " * Really multi-line\n" |
| 518 | " * comment.\n" |
| 519 | " */\n" |
| 520 | "void f() {}", |
| 521 | format(" /*\n" |
| 522 | " * Really multi-line\n" |
| 523 | " * comment.\n" |
| 524 | " */\n" |
| 525 | " void f() {}")); |
| 526 | } |
| 527 | |
Nico Weber | 48c94a6 | 2017-04-11 15:50:04 +0000 | [diff] [blame] | 528 | TEST_F(FormatTestJava, RetainsLogicalShifts) { |
| 529 | verifyFormat("void f() {\n" |
| 530 | " int a = 1;\n" |
| 531 | " a >>>= 1;\n" |
| 532 | "}"); |
| 533 | verifyFormat("void f() {\n" |
| 534 | " int a = 1;\n" |
| 535 | " a = a >>> 1;\n" |
| 536 | "}"); |
| 537 | } |
| 538 | |
| 539 | |
Alexander Kornienko | ab9db51 | 2015-06-22 23:07:51 +0000 | [diff] [blame] | 540 | } // end namespace tooling |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 541 | } // end namespace clang |