1 | //===- unittest/Format/FormatTestJava.cpp - Formatting tests for Java -----===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #include "FormatTestUtils.h" |
10 | #include "clang/Format/Format.h" |
11 | #include "llvm/Support/Debug.h" |
12 | #include "gtest/gtest.h" |
13 | |
14 | #define DEBUG_TYPE "format-test" |
15 | |
16 | namespace clang { |
17 | namespace format { |
18 | |
19 | class FormatTestJava : public ::testing::Test { |
20 | protected: |
21 | static std::string format(llvm::StringRef Code, unsigned Offset, |
22 | unsigned Length, const FormatStyle &Style) { |
23 | LLVM_DEBUG(llvm::errs() << "---\n"); |
24 | LLVM_DEBUG(llvm::errs() << Code << "\n\n"); |
25 | std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length)); |
26 | tooling::Replacements Replaces = reformat(Style, Code, Ranges); |
27 | auto Result = applyAllReplacements(Code, Replaces); |
28 | EXPECT_TRUE(static_cast<bool>(Result)); |
29 | LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); |
30 | return *Result; |
31 | } |
32 | |
33 | static std::string |
34 | format(llvm::StringRef Code, |
35 | const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { |
36 | return format(Code, 0, Code.size(), Style); |
37 | } |
38 | |
39 | static FormatStyle getStyleWithColumns(unsigned ColumnLimit) { |
40 | FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java); |
41 | Style.ColumnLimit = ColumnLimit; |
42 | return Style; |
43 | } |
44 | |
45 | static void verifyFormat( |
46 | llvm::StringRef Code, |
47 | const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { |
48 | EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable"; |
49 | EXPECT_EQ(Code.str(), format(test::messUp(Code), Style)); |
50 | } |
51 | }; |
52 | |
53 | TEST_F(FormatTestJava, NoAlternativeOperatorNames) { |
54 | verifyFormat("someObject.and();"); |
55 | } |
56 | |
57 | TEST_F(FormatTestJava, UnderstandsCasts) { |
58 | verifyFormat("a[b >> 1] = (byte) (c() << 4);"); |
59 | } |
60 | |
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); |
70 | verifyFormat("return aaaaaaaaaaaaaaaaaaa instanceof bbbbbbbbbbbbbbbbbbbbbbb\n" |
71 | " && ccccccccccccccccccc instanceof dddddddddddddddddddddd;"); |
72 | } |
73 | |
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 | |
89 | TEST_F(FormatTestJava, QualifiedNames) { |
90 | verifyFormat("public some.package.Type someFunction( // comment\n" |
91 | " int parameter) {}"); |
92 | } |
93 | |
94 | TEST_F(FormatTestJava, ClassKeyword) { |
95 | verifyFormat("SomeClass.class.getName();"); |
96 | verifyFormat("Class c = SomeClass.class;"); |
97 | } |
98 | |
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 | "}"); |
112 | verifyFormat("public class A extends B.C {}"); |
113 | |
114 | verifyFormat("abstract class SomeClass\n" |
115 | " extends SomeOtherClass implements SomeInterface {}", |
116 | getStyleWithColumns(60)); |
117 | verifyFormat("abstract class SomeClass extends SomeOtherClass\n" |
118 | " implements SomeInterfaceeeeeeeeeeeee {}", |
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)); |
129 | verifyFormat("abstract class SomeClass\n" |
130 | " implements SomeInterface, AnotherInterface {}", |
131 | getStyleWithColumns(60)); |
132 | verifyFormat("@SomeAnnotation()\n" |
133 | "abstract class aaaaaaaaaaaa\n" |
134 | " extends bbbbbbbbbbbbbbb implements cccccccccccc {}", |
135 | getStyleWithColumns(76)); |
136 | verifyFormat("@SomeAnnotation()\n" |
137 | "abstract class aaaaaaaaa<a>\n" |
138 | " extends bbbbbbbbbbbb<b> implements cccccccccccc {}", |
139 | getStyleWithColumns(76)); |
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 | " default void doStuffWithDefault() {}\n" |
148 | "}"); |
149 | verifyFormat("@interface SomeInterface {\n" |
150 | " void doStuff(int theStuff);\n" |
151 | " void doMoreStuff(int moreStuff);\n" |
152 | "}"); |
153 | verifyFormat("public @interface SomeInterface {\n" |
154 | " void doStuff(int theStuff);\n" |
155 | " void doMoreStuff(int moreStuff);\n" |
156 | "}"); |
157 | verifyFormat("class A {\n" |
158 | " public @interface SomeInterface {\n" |
159 | " int stuff;\n" |
160 | " void doMoreStuff(int moreStuff);\n" |
161 | " }\n" |
162 | "}"); |
163 | verifyFormat("class A {\n" |
164 | " public @interface SomeInterface {}\n" |
165 | "}"); |
166 | } |
167 | |
168 | TEST_F(FormatTestJava, AnonymousClasses) { |
169 | verifyFormat("return new A() {\n" |
170 | " public String toString() {\n" |
171 | " return \"NotReallyA\";\n" |
172 | " }\n" |
173 | "};"); |
174 | verifyFormat("A a = new A() {\n" |
175 | " public String toString() {\n" |
176 | " return \"NotReallyA\";\n" |
177 | " }\n" |
178 | "};"); |
179 | } |
180 | |
181 | TEST_F(FormatTestJava, EnumDeclarations) { |
182 | verifyFormat("enum SomeThing { ABC, CDE }"); |
183 | verifyFormat("enum SomeThing {\n" |
184 | " ABC,\n" |
185 | " CDE,\n" |
186 | "}"); |
187 | verifyFormat("public class SomeClass {\n" |
188 | " enum SomeThing { ABC, CDE }\n" |
189 | " void f() {}\n" |
190 | "}"); |
191 | verifyFormat("public class SomeClass implements SomeInterface {\n" |
192 | " enum SomeThing { ABC, CDE }\n" |
193 | " void f() {}\n" |
194 | "}"); |
195 | verifyFormat("enum SomeThing {\n" |
196 | " ABC,\n" |
197 | " CDE;\n" |
198 | " void f() {}\n" |
199 | "}"); |
200 | verifyFormat("enum SomeThing {\n" |
201 | " ABC(1, \"ABC\"),\n" |
202 | " CDE(2, \"CDE\");\n" |
203 | " Something(int i, String s) {}\n" |
204 | "}"); |
205 | verifyFormat("enum SomeThing {\n" |
206 | " ABC(new int[] {1, 2}),\n" |
207 | " CDE(new int[] {2, 3});\n" |
208 | " Something(int[] i) {}\n" |
209 | "}"); |
210 | verifyFormat("public enum SomeThing {\n" |
211 | " ABC {\n" |
212 | " public String toString() {\n" |
213 | " return \"ABC\";\n" |
214 | " }\n" |
215 | " },\n" |
216 | " CDE {\n" |
217 | " @Override\n" |
218 | " public String toString() {\n" |
219 | " return \"CDE\";\n" |
220 | " }\n" |
221 | " };\n" |
222 | " public void f() {}\n" |
223 | "}"); |
224 | verifyFormat("private enum SomeEnum implements Foo<?, B> {\n" |
225 | " ABC {\n" |
226 | " @Override\n" |
227 | " public String toString() {\n" |
228 | " return \"ABC\";\n" |
229 | " }\n" |
230 | " },\n" |
231 | " CDE {\n" |
232 | " @Override\n" |
233 | " public String toString() {\n" |
234 | " return \"CDE\";\n" |
235 | " }\n" |
236 | " };\n" |
237 | "}"); |
238 | verifyFormat("public enum VeryLongEnum {\n" |
239 | " ENUM_WITH_MANY_PARAMETERS(\n" |
240 | " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"bbbbbbbbbbbbbbbb\", " |
241 | "\"cccccccccccccccccccccccc\"),\n" |
242 | " SECOND_ENUM(\"a\", \"b\", \"c\");\n" |
243 | " private VeryLongEnum(String a, String b, String c) {}\n" |
244 | "}\n"); |
245 | } |
246 | |
247 | TEST_F(FormatTestJava, ArrayInitializers) { |
248 | verifyFormat("new int[] {1, 2, 3, 4};"); |
249 | verifyFormat("new int[] {\n" |
250 | " 1,\n" |
251 | " 2,\n" |
252 | " 3,\n" |
253 | " 4,\n" |
254 | "};"); |
255 | |
256 | FormatStyle Style = getStyleWithColumns(65); |
257 | Style.Cpp11BracedListStyle = false; |
258 | verifyFormat( |
259 | "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n" |
260 | " 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };", |
261 | Style); |
262 | } |
263 | |
264 | TEST_F(FormatTestJava, ThrowsDeclarations) { |
265 | verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" |
266 | " throws LooooooooooooooooooooooooooooongException {}"); |
267 | verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" |
268 | " throws LoooooooooongException, LooooooooooongException {}"); |
269 | } |
270 | |
271 | TEST_F(FormatTestJava, Annotations) { |
272 | verifyFormat("@Override\n" |
273 | "public String toString() {}"); |
274 | verifyFormat("@Override\n" |
275 | "@Nullable\n" |
276 | "public String getNameIfPresent() {}"); |
277 | verifyFormat("@Override // comment\n" |
278 | "@Nullable\n" |
279 | "public String getNameIfPresent() {}"); |
280 | verifyFormat("@java.lang.Override // comment\n" |
281 | "@Nullable\n" |
282 | "public String getNameIfPresent() {}"); |
283 | |
284 | verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" |
285 | "public void doSomething() {}"); |
286 | verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" |
287 | "@Author(name = \"abc\")\n" |
288 | "public void doSomething() {}"); |
289 | |
290 | verifyFormat("DoSomething(new A() {\n" |
291 | " @Override\n" |
292 | " public String toString() {}\n" |
293 | "});"); |
294 | |
295 | verifyFormat("void SomeFunction(@Nullable String something) {}"); |
296 | verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}"); |
297 | |
298 | verifyFormat("@Partial @Mock DataLoader loader;"); |
299 | verifyFormat("@Partial\n" |
300 | "@Mock\n" |
301 | "DataLoader loader;", |
302 | getChromiumStyle(FormatStyle::LK_Java)); |
303 | verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" |
304 | "public static int iiiiiiiiiiiiiiiiiiiiiiii;"); |
305 | |
306 | verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" |
307 | "private static final long something = 0L;"); |
308 | verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n" |
309 | "private static final long something = 0L;"); |
310 | verifyFormat("@Mock\n" |
311 | "DataLoader loooooooooooooooooooooooader =\n" |
312 | " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", |
313 | getStyleWithColumns(60)); |
314 | verifyFormat("@org.llvm.QualifiedMock\n" |
315 | "DataLoader loooooooooooooooooooooooader =\n" |
316 | " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", |
317 | getStyleWithColumns(60)); |
318 | verifyFormat("@Test(a)\n" |
319 | "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" |
320 | " aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);"); |
321 | verifyFormat("@SomeAnnotation(\n" |
322 | " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n" |
323 | "int i;", |
324 | getStyleWithColumns(50)); |
325 | verifyFormat("@Test\n" |
326 | "ReturnType doSomething(\n" |
327 | " String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}", |
328 | getStyleWithColumns(60)); |
329 | verifyFormat("{\n" |
330 | " boolean someFunction(\n" |
331 | " @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n" |
332 | " String bbbbbbbbbbbbbbb) {}\n" |
333 | "}", |
334 | getStyleWithColumns(60)); |
335 | verifyFormat("@Annotation(\"Some\"\n" |
336 | " + \" text\")\n" |
337 | "List<Integer> list;"); |
338 | } |
339 | |
340 | TEST_F(FormatTestJava, Generics) { |
341 | verifyFormat("Iterable<?> a;"); |
342 | verifyFormat("Iterable<?> a;"); |
343 | verifyFormat("Iterable<? extends SomeObject> a;"); |
344 | |
345 | verifyFormat("A.<B>doSomething();"); |
346 | verifyFormat("A.<B<C>>doSomething();"); |
347 | verifyFormat("A.<B<C<D>>>doSomething();"); |
348 | verifyFormat("A.<B<C<D<E>>>>doSomething();"); |
349 | |
350 | verifyFormat("OrderedPair<String, List<Box<Integer>>> p = null;"); |
351 | |
352 | verifyFormat("@Override\n" |
353 | "public Map<String, ?> getAll() {}"); |
354 | |
355 | verifyFormat("public <R> ArrayList<R> get() {}"); |
356 | verifyFormat("protected <R> ArrayList<R> get() {}"); |
357 | verifyFormat("private <R> ArrayList<R> get() {}"); |
358 | verifyFormat("public static <R> ArrayList<R> get() {}"); |
359 | verifyFormat("public static native <R> ArrayList<R> get();"); |
360 | verifyFormat("public final <X> Foo foo() {}"); |
361 | verifyFormat("public abstract <X> Foo foo();"); |
362 | verifyFormat("<T extends B> T getInstance(Class<T> type);"); |
363 | verifyFormat("Function<F, ? extends T> function;"); |
364 | |
365 | verifyFormat("private Foo<X, Y>[] foos;"); |
366 | verifyFormat("Foo<X, Y>[] foos = this.foos;"); |
367 | verifyFormat("return (a instanceof List<?>)\n" |
368 | " ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" |
369 | " : aaaaaaaaaaaaaaaaaaaaaaa;", |
370 | getStyleWithColumns(60)); |
371 | |
372 | verifyFormat( |
373 | "SomeLoooooooooooooooooooooongType name =\n" |
374 | " SomeType.foo(someArgument)\n" |
375 | " .<X>method()\n" |
376 | " .aaaaaaaaaaaaaaaaaaa()\n" |
377 | " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); |
378 | } |
379 | |
380 | TEST_F(FormatTestJava, StringConcatenation) { |
381 | verifyFormat("String someString = \"abc\"\n" |
382 | " + \"cde\";"); |
383 | } |
384 | |
385 | TEST_F(FormatTestJava, TryCatchFinally) { |
386 | verifyFormat("try {\n" |
387 | " Something();\n" |
388 | "} catch (SomeException e) {\n" |
389 | " HandleException(e);\n" |
390 | "}"); |
391 | verifyFormat("try {\n" |
392 | " Something();\n" |
393 | "} finally {\n" |
394 | " AlwaysDoThis();\n" |
395 | "}"); |
396 | verifyFormat("try {\n" |
397 | " Something();\n" |
398 | "} catch (SomeException e) {\n" |
399 | " HandleException(e);\n" |
400 | "} finally {\n" |
401 | " AlwaysDoThis();\n" |
402 | "}"); |
403 | |
404 | verifyFormat("try {\n" |
405 | " Something();\n" |
406 | "} catch (SomeException | OtherException e) {\n" |
407 | " HandleException(e);\n" |
408 | "}"); |
409 | } |
410 | |
411 | TEST_F(FormatTestJava, TryWithResources) { |
412 | verifyFormat("try (SomeResource rs = someFunction()) {\n" |
413 | " Something();\n" |
414 | "}"); |
415 | verifyFormat("try (SomeResource rs = someFunction()) {\n" |
416 | " Something();\n" |
417 | "} catch (SomeException e) {\n" |
418 | " HandleException(e);\n" |
419 | "}"); |
420 | } |
421 | |
422 | TEST_F(FormatTestJava, SynchronizedKeyword) { |
423 | verifyFormat("synchronized (mData) {\n" |
424 | " // ...\n" |
425 | "}"); |
426 | } |
427 | |
428 | TEST_F(FormatTestJava, AssertKeyword) { |
429 | verifyFormat("assert a && b;"); |
430 | verifyFormat("assert (a && b);"); |
431 | } |
432 | |
433 | TEST_F(FormatTestJava, PackageDeclarations) { |
434 | verifyFormat("package some.really.loooooooooooooooooooooong.package;", |
435 | getStyleWithColumns(50)); |
436 | } |
437 | |
438 | TEST_F(FormatTestJava, ImportDeclarations) { |
439 | verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;", |
440 | getStyleWithColumns(50)); |
441 | verifyFormat("import static some.really.looooooooooooooooong.imported.Class;", |
442 | getStyleWithColumns(50)); |
443 | } |
444 | |
445 | TEST_F(FormatTestJava, MethodDeclarations) { |
446 | verifyFormat("void methodName(Object arg1,\n" |
447 | " Object arg2, Object arg3) {}", |
448 | getStyleWithColumns(40)); |
449 | verifyFormat("void methodName(\n" |
450 | " Object arg1, Object arg2) {}", |
451 | getStyleWithColumns(40)); |
452 | } |
453 | |
454 | TEST_F(FormatTestJava, MethodReference) { |
455 | EXPECT_EQ( |
456 | "private void foo() {\n" |
457 | " f(this::methodReference);\n" |
458 | " f(C.super::methodReference);\n" |
459 | " Consumer<String> c = System.out::println;\n" |
460 | " Iface<Integer> mRef = Ty::<Integer>meth;\n" |
461 | "}", |
462 | format("private void foo() {\n" |
463 | " f(this ::methodReference);\n" |
464 | " f(C.super ::methodReference);\n" |
465 | " Consumer<String> c = System.out ::println;\n" |
466 | " Iface<Integer> mRef = Ty :: <Integer> meth;\n" |
467 | "}")); |
468 | } |
469 | |
470 | TEST_F(FormatTestJava, CppKeywords) { |
471 | verifyFormat("public void union(Type a, Type b);"); |
472 | verifyFormat("public void struct(Object o);"); |
473 | verifyFormat("public void delete(Object o);"); |
474 | verifyFormat("return operator && (aa);"); |
475 | } |
476 | |
477 | TEST_F(FormatTestJava, NeverAlignAfterReturn) { |
478 | verifyFormat("return aaaaaaaaaaaaaaaaaaa\n" |
479 | " && bbbbbbbbbbbbbbbbbbb\n" |
480 | " && ccccccccccccccccccc;", |
481 | getStyleWithColumns(40)); |
482 | verifyFormat("return (result == null)\n" |
483 | " ? aaaaaaaaaaaaaaaaa\n" |
484 | " : bbbbbbbbbbbbbbbbb;", |
485 | getStyleWithColumns(40)); |
486 | verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" |
487 | " .bbbbbbbbbbbbbbbbbbb()\n" |
488 | " .ccccccccccccccccccc();", |
489 | getStyleWithColumns(40)); |
490 | verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" |
491 | " .bbbbbbbbbbbbbbbbbbb(\n" |
492 | " ccccccccccccccc)\n" |
493 | " .ccccccccccccccccccc();", |
494 | getStyleWithColumns(40)); |
495 | } |
496 | |
497 | TEST_F(FormatTestJava, FormatsInnerBlocks) { |
498 | verifyFormat("someObject.someFunction(new Runnable() {\n" |
499 | " @Override\n" |
500 | " public void run() {\n" |
501 | " System.out.println(42);\n" |
502 | " }\n" |
503 | "}, someOtherParameter);"); |
504 | verifyFormat("someFunction(new Runnable() {\n" |
505 | " public void run() {\n" |
506 | " System.out.println(42);\n" |
507 | " }\n" |
508 | "});"); |
509 | verifyFormat("someObject.someFunction(\n" |
510 | " new Runnable() {\n" |
511 | " @Override\n" |
512 | " public void run() {\n" |
513 | " System.out.println(42);\n" |
514 | " }\n" |
515 | " },\n" |
516 | " new Runnable() {\n" |
517 | " @Override\n" |
518 | " public void run() {\n" |
519 | " System.out.println(43);\n" |
520 | " }\n" |
521 | " },\n" |
522 | " someOtherParameter);"); |
523 | } |
524 | |
525 | TEST_F(FormatTestJava, FormatsLambdas) { |
526 | verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;"); |
527 | verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n" |
528 | " -> aaaaaaaaaa + bbbbbbbbbb;", |
529 | getStyleWithColumns(40)); |
530 | verifyFormat("Runnable someLambda = () -> DoSomething();"); |
531 | verifyFormat("Runnable someLambda = () -> {\n" |
532 | " DoSomething();\n" |
533 | "}"); |
534 | |
535 | verifyFormat("Runnable someLambda =\n" |
536 | " (int aaaaa) -> DoSomething(aaaaa);", |
537 | getStyleWithColumns(40)); |
538 | } |
539 | |
540 | TEST_F(FormatTestJava, BreaksStringLiterals) { |
541 | // FIXME: String literal breaking is currently disabled for Java and JS, as it |
542 | // requires strings to be merged using "+" which we don't support. |
543 | EXPECT_EQ("\"some text other\";", |
544 | format("\"some text other\";", getStyleWithColumns(14))); |
545 | } |
546 | |
547 | TEST_F(FormatTestJava, AlignsBlockComments) { |
548 | EXPECT_EQ("/*\n" |
549 | " * Really multi-line\n" |
550 | " * comment.\n" |
551 | " */\n" |
552 | "void f() {}", |
553 | format(" /*\n" |
554 | " * Really multi-line\n" |
555 | " * comment.\n" |
556 | " */\n" |
557 | " void f() {}")); |
558 | } |
559 | |
560 | TEST_F(FormatTestJava, KeepsDelimitersOnOwnLineInJavaDocComments) { |
561 | EXPECT_EQ("/**\n" |
562 | " * javadoc line 1\n" |
563 | " * javadoc line 2\n" |
564 | " */", |
565 | format("/** javadoc line 1\n" |
566 | " * javadoc line 2 */")); |
567 | } |
568 | |
569 | TEST_F(FormatTestJava, RetainsLogicalShifts) { |
570 | verifyFormat("void f() {\n" |
571 | " int a = 1;\n" |
572 | " a >>>= 1;\n" |
573 | "}"); |
574 | verifyFormat("void f() {\n" |
575 | " int a = 1;\n" |
576 | " a = a >>> 1;\n" |
577 | "}"); |
578 | } |
579 | |
580 | |
581 | } // end namespace tooling |
582 | } // end namespace clang |
583 | |