1c58c70e2SDaniel Jasper //===- unittest/Format/FormatTestJava.cpp - Formatting tests for Java -----===//
2c58c70e2SDaniel Jasper //
3c58c70e2SDaniel Jasper //                     The LLVM Compiler Infrastructure
4c58c70e2SDaniel Jasper //
5c58c70e2SDaniel Jasper // This file is distributed under the University of Illinois Open Source
6c58c70e2SDaniel Jasper // License. See LICENSE.TXT for details.
7c58c70e2SDaniel Jasper //
8c58c70e2SDaniel Jasper //===----------------------------------------------------------------------===//
9c58c70e2SDaniel Jasper 
10c58c70e2SDaniel Jasper #include "FormatTestUtils.h"
11c58c70e2SDaniel Jasper #include "clang/Format/Format.h"
12c58c70e2SDaniel Jasper #include "llvm/Support/Debug.h"
13c58c70e2SDaniel Jasper #include "gtest/gtest.h"
14c58c70e2SDaniel Jasper 
15c58c70e2SDaniel Jasper #define DEBUG_TYPE "format-test"
16c58c70e2SDaniel Jasper 
17c58c70e2SDaniel Jasper namespace clang {
18c58c70e2SDaniel Jasper namespace format {
19c58c70e2SDaniel Jasper 
20c58c70e2SDaniel Jasper class FormatTestJava : public ::testing::Test {
21c58c70e2SDaniel Jasper protected:
22c58c70e2SDaniel Jasper   static std::string format(llvm::StringRef Code, unsigned Offset,
23c58c70e2SDaniel Jasper                             unsigned Length, const FormatStyle &Style) {
24c58c70e2SDaniel Jasper     DEBUG(llvm::errs() << "---\n");
25c58c70e2SDaniel Jasper     DEBUG(llvm::errs() << Code << "\n\n");
26c58c70e2SDaniel Jasper     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
27c58c70e2SDaniel Jasper     tooling::Replacements Replaces = reformat(Style, Code, Ranges);
28c58c70e2SDaniel Jasper     std::string Result = applyAllReplacements(Code, Replaces);
29c58c70e2SDaniel Jasper     EXPECT_NE("", Result);
30c58c70e2SDaniel Jasper     DEBUG(llvm::errs() << "\n" << Result << "\n\n");
31c58c70e2SDaniel Jasper     return Result;
32c58c70e2SDaniel Jasper   }
33c58c70e2SDaniel Jasper 
34e6fcf7d3SDaniel Jasper   static std::string
35e6fcf7d3SDaniel Jasper   format(llvm::StringRef Code,
36c58c70e2SDaniel Jasper          const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) {
37c58c70e2SDaniel Jasper     return format(Code, 0, Code.size(), Style);
38c58c70e2SDaniel Jasper   }
39c58c70e2SDaniel Jasper 
4050b4bd7cSDaniel Jasper   static FormatStyle getStyleWithColumns(unsigned ColumnLimit) {
4150b4bd7cSDaniel Jasper     FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java);
4250b4bd7cSDaniel Jasper     Style.ColumnLimit = ColumnLimit;
4350b4bd7cSDaniel Jasper     return Style;
4450b4bd7cSDaniel Jasper   }
4550b4bd7cSDaniel Jasper 
46c58c70e2SDaniel Jasper   static void verifyFormat(
47c58c70e2SDaniel Jasper       llvm::StringRef Code,
48c58c70e2SDaniel Jasper       const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) {
49c58c70e2SDaniel Jasper     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
50c58c70e2SDaniel Jasper   }
51c58c70e2SDaniel Jasper };
52c58c70e2SDaniel Jasper 
5330a2406eSDaniel Jasper TEST_F(FormatTestJava, NoAlternativeOperatorNames) {
5430a2406eSDaniel Jasper   verifyFormat("someObject.and();");
5530a2406eSDaniel Jasper }
5630a2406eSDaniel Jasper 
574f56b0bbSDaniel Jasper TEST_F(FormatTestJava, UnderstandsCasts) {
584f56b0bbSDaniel Jasper   verifyFormat("a[b >> 1] = (byte) (c() << 4);");
594f56b0bbSDaniel Jasper }
604f56b0bbSDaniel Jasper 
61a98b7b01SDaniel Jasper TEST_F(FormatTestJava, FormatsInstanceOfLikeOperators) {
62a98b7b01SDaniel Jasper   FormatStyle Style = getStyleWithColumns(50);
63a98b7b01SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
64a98b7b01SDaniel Jasper                "    instanceof bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
65a98b7b01SDaniel Jasper                Style);
66a98b7b01SDaniel Jasper   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
67a98b7b01SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa instanceof\n"
68a98b7b01SDaniel Jasper                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
69a98b7b01SDaniel Jasper                Style);
70a98b7b01SDaniel Jasper }
71a98b7b01SDaniel Jasper 
72450425c9SNico Weber TEST_F(FormatTestJava, Chromium) {
73450425c9SNico Weber   verifyFormat("class SomeClass {\n"
74450425c9SNico Weber                "    void f() {}\n"
75450425c9SNico Weber                "    int g() {\n"
76450425c9SNico Weber                "        return 0;\n"
77450425c9SNico Weber                "    }\n"
78450425c9SNico Weber                "    void h() {\n"
79450425c9SNico Weber                "        while (true) f();\n"
80450425c9SNico Weber                "        for (;;) f();\n"
81450425c9SNico Weber                "        if (true) f();\n"
82450425c9SNico Weber                "    }\n"
83450425c9SNico Weber                "}",
84450425c9SNico Weber                getChromiumStyle(FormatStyle::LK_Java));
85450425c9SNico Weber }
86450425c9SNico Weber 
878379107aSDaniel Jasper TEST_F(FormatTestJava, QualifiedNames) {
888379107aSDaniel Jasper   verifyFormat("public some.package.Type someFunction( // comment\n"
898379107aSDaniel Jasper                "    int parameter) {}");
908379107aSDaniel Jasper }
918379107aSDaniel Jasper 
92e5d74867SDaniel Jasper TEST_F(FormatTestJava, ClassKeyword) {
93e5d74867SDaniel Jasper   verifyFormat("SomeClass.class.getName();");
94e5d74867SDaniel Jasper   verifyFormat("Class c = SomeClass.class;");
95e5d74867SDaniel Jasper }
96e5d74867SDaniel Jasper 
97c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) {
98c58c70e2SDaniel Jasper   verifyFormat("public class SomeClass {\n"
99c58c70e2SDaniel Jasper                "  private int a;\n"
100c58c70e2SDaniel Jasper                "  private int b;\n"
101c58c70e2SDaniel Jasper                "}");
102c58c70e2SDaniel Jasper   verifyFormat("public class A {\n"
103c58c70e2SDaniel Jasper                "  class B {\n"
104c58c70e2SDaniel Jasper                "    int i;\n"
105c58c70e2SDaniel Jasper                "  }\n"
106c58c70e2SDaniel Jasper                "  class C {\n"
107c58c70e2SDaniel Jasper                "    int j;\n"
108c58c70e2SDaniel Jasper                "  }\n"
109c58c70e2SDaniel Jasper                "}");
1104bf9d470SDaniel Jasper   verifyFormat("public class A extends B.C {}");
11150b4bd7cSDaniel Jasper 
112734d52b5SDaniel Jasper   verifyFormat("abstract class SomeClass\n"
113734d52b5SDaniel Jasper                "    extends SomeOtherClass implements SomeInterface {}",
114734d52b5SDaniel Jasper                getStyleWithColumns(60));
11550b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass extends SomeOtherClass\n"
116734d52b5SDaniel Jasper                "    implements SomeInterfaceeeeeeeeeeeee {}",
11750b4bd7cSDaniel Jasper                getStyleWithColumns(60));
11850b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
11950b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
12050b4bd7cSDaniel Jasper                "    implements SomeInterface {}",
12150b4bd7cSDaniel Jasper                getStyleWithColumns(40));
12250b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
12350b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
12450b4bd7cSDaniel Jasper                "    implements SomeInterface,\n"
12550b4bd7cSDaniel Jasper                "               AnotherInterface {}",
12650b4bd7cSDaniel Jasper                getStyleWithColumns(40));
127734d52b5SDaniel Jasper   verifyFormat("abstract class SomeClass\n"
128734d52b5SDaniel Jasper                "    implements SomeInterface, AnotherInterface {}",
129734d52b5SDaniel Jasper                getStyleWithColumns(60));
13039af6cd5SDaniel Jasper   verifyFormat("@SomeAnnotation()\n"
131734d52b5SDaniel Jasper                "abstract class aaaaaaaaaaaa\n"
1329e709351SDaniel Jasper                "    extends bbbbbbbbbbbbbbb implements cccccccccccc {}",
13339af6cd5SDaniel Jasper                getStyleWithColumns(76));
13458fcf6dfSDaniel Jasper   verifyFormat("@SomeAnnotation()\n"
135734d52b5SDaniel Jasper                "abstract class aaaaaaaaa<a>\n"
1369e709351SDaniel Jasper                "    extends bbbbbbbbbbbb<b> implements cccccccccccc {}",
13758fcf6dfSDaniel Jasper                getStyleWithColumns(76));
138a644d7f3SNico Weber   verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n"
139a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
140a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
141a644d7f3SNico Weber                "}");
142a644d7f3SNico Weber   verifyFormat("public interface SomeInterface {\n"
143a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
144a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
145a644d7f3SNico Weber                "}");
146a644d7f3SNico Weber   verifyFormat("@interface SomeInterface {\n"
147a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
148a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
149a644d7f3SNico Weber                "}");
150a644d7f3SNico Weber   verifyFormat("public @interface SomeInterface {\n"
151a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
152a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
153a644d7f3SNico Weber                "}");
154c58c70e2SDaniel Jasper }
155c58c70e2SDaniel Jasper 
1566acf5130SDaniel Jasper TEST_F(FormatTestJava, AnonymousClasses) {
1576acf5130SDaniel Jasper   verifyFormat("return new A() {\n"
1586acf5130SDaniel Jasper                "  public String toString() {\n"
1596acf5130SDaniel Jasper                "    return \"NotReallyA\";\n"
1606acf5130SDaniel Jasper                "  }\n"
1616acf5130SDaniel Jasper                "};");
1626acf5130SDaniel Jasper   verifyFormat("A a = new A() {\n"
1636acf5130SDaniel Jasper                "  public String toString() {\n"
1646acf5130SDaniel Jasper                "    return \"NotReallyA\";\n"
1656acf5130SDaniel Jasper                "  }\n"
1666acf5130SDaniel Jasper                "};");
1676acf5130SDaniel Jasper }
1686acf5130SDaniel Jasper 
169df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) {
170df2ff002SDaniel Jasper   verifyFormat("enum SomeThing { ABC, CDE }");
171df2ff002SDaniel Jasper   verifyFormat("enum SomeThing {\n"
172df2ff002SDaniel Jasper                "  ABC,\n"
173df2ff002SDaniel Jasper                "  CDE,\n"
174df2ff002SDaniel Jasper                "}");
175df2ff002SDaniel Jasper   verifyFormat("public class SomeClass {\n"
176df2ff002SDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
1779e709351SDaniel Jasper                "  void f() {}\n"
178df2ff002SDaniel Jasper                "}");
1796be0f55dSDaniel Jasper   verifyFormat("public class SomeClass implements SomeInterface {\n"
1806be0f55dSDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
1819e709351SDaniel Jasper                "  void f() {}\n"
1826be0f55dSDaniel Jasper                "}");
1836be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1846be0f55dSDaniel Jasper                "  ABC,\n"
1856be0f55dSDaniel Jasper                "  CDE;\n"
1869e709351SDaniel Jasper                "  void f() {}\n"
1876be0f55dSDaniel Jasper                "}");
1886be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1896be0f55dSDaniel Jasper                "  ABC(1, \"ABC\"),\n"
1906be0f55dSDaniel Jasper                "  CDE(2, \"CDE\");\n"
1919e709351SDaniel Jasper                "  Something(int i, String s) {}\n"
1926be0f55dSDaniel Jasper                "}");
1936be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1946be0f55dSDaniel Jasper                "  ABC(new int[] {1, 2}),\n"
1956be0f55dSDaniel Jasper                "  CDE(new int[] {2, 3});\n"
1969e709351SDaniel Jasper                "  Something(int[] i) {}\n"
1976be0f55dSDaniel Jasper                "}");
1986be0f55dSDaniel Jasper   verifyFormat("public enum SomeThing {\n"
1996be0f55dSDaniel Jasper                "  ABC {\n"
2006be0f55dSDaniel Jasper                "    public String toString() {\n"
2016be0f55dSDaniel Jasper                "      return \"ABC\";\n"
2026be0f55dSDaniel Jasper                "    }\n"
2036be0f55dSDaniel Jasper                "  },\n"
2046be0f55dSDaniel Jasper                "  CDE {\n"
2056be0f55dSDaniel Jasper                "    @Override\n"
2066be0f55dSDaniel Jasper                "    public String toString() {\n"
2076be0f55dSDaniel Jasper                "      return \"CDE\";\n"
2086be0f55dSDaniel Jasper                "    }\n"
2096be0f55dSDaniel Jasper                "  };\n"
2109e709351SDaniel Jasper                "  public void f() {}\n"
2116be0f55dSDaniel Jasper                "}");
212ccb68b48SDaniel Jasper   verifyFormat("private enum SomeEnum implements Foo<?, B> {\n"
213ccb68b48SDaniel Jasper                "  ABC {\n"
214ccb68b48SDaniel Jasper                "    @Override\n"
215ccb68b48SDaniel Jasper                "    public String toString() {\n"
216ccb68b48SDaniel Jasper                "      return \"ABC\";\n"
217ccb68b48SDaniel Jasper                "    }\n"
218ccb68b48SDaniel Jasper                "  },\n"
219ccb68b48SDaniel Jasper                "  CDE {\n"
220ccb68b48SDaniel Jasper                "    @Override\n"
221ccb68b48SDaniel Jasper                "    public String toString() {\n"
222ccb68b48SDaniel Jasper                "      return \"CDE\";\n"
223ccb68b48SDaniel Jasper                "    }\n"
224ccb68b48SDaniel Jasper                "  };\n"
225ccb68b48SDaniel Jasper                "}");
226a0143fabSDaniel Jasper }
227a0143fabSDaniel Jasper 
228a0143fabSDaniel Jasper TEST_F(FormatTestJava, ArrayInitializers) {
229a0143fabSDaniel Jasper   verifyFormat("new int[] {1, 2, 3, 4};");
230a0143fabSDaniel Jasper   verifyFormat("new int[] {\n"
231a0143fabSDaniel Jasper                "    1, 2, 3, 4,\n"
232a0143fabSDaniel Jasper                "};");
23313404dadSDaniel Jasper 
23413404dadSDaniel Jasper   FormatStyle Style = getStyleWithColumns(65);
23513404dadSDaniel Jasper   Style.Cpp11BracedListStyle = false;
23613404dadSDaniel Jasper   verifyFormat(
23713404dadSDaniel Jasper       "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n"
23813404dadSDaniel Jasper       "  100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };",
23913404dadSDaniel Jasper       Style);
240df2ff002SDaniel Jasper }
241df2ff002SDaniel Jasper 
242f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) {
243f26c755dSDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
2449e709351SDaniel Jasper                "    throws LooooooooooooooooooooooooooooongException {}");
245375815d2SDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
246375815d2SDaniel Jasper                "    throws LoooooooooongException, LooooooooooongException {}");
247f26c755dSDaniel Jasper }
248f26c755dSDaniel Jasper 
249fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) {
250fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
2519e709351SDaniel Jasper                "public String toString() {}");
252fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
253fab69ff0SDaniel Jasper                "@Nullable\n"
2549e709351SDaniel Jasper                "public String getNameIfPresent() {}");
25507013a42SDaniel Jasper   verifyFormat("@Override // comment\n"
25607013a42SDaniel Jasper                "@Nullable\n"
25707013a42SDaniel Jasper                "public String getNameIfPresent() {}");
258beb03938SNico Weber   verifyFormat("@java.lang.Override // comment\n"
259beb03938SNico Weber                "@Nullable\n"
260beb03938SNico Weber                "public String getNameIfPresent() {}");
261f1f0c356SDaniel Jasper 
262f1f0c356SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
2639e709351SDaniel Jasper                "public void doSomething() {}");
264d78c4223SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
265d78c4223SDaniel Jasper                "@Author(name = \"abc\")\n"
2669e709351SDaniel Jasper                "public void doSomething() {}");
267f1f0c356SDaniel Jasper 
268c7d024acSDaniel Jasper   verifyFormat("DoSomething(new A() {\n"
269c7d024acSDaniel Jasper                "  @Override\n"
2709e709351SDaniel Jasper                "  public String toString() {}\n"
271c7d024acSDaniel Jasper                "});");
272c7d024acSDaniel Jasper 
2739e709351SDaniel Jasper   verifyFormat("void SomeFunction(@Nullable String something) {}");
274beb03938SNico Weber   verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}");
275e9ab42dfSDaniel Jasper 
276fab69ff0SDaniel Jasper   verifyFormat("@Partial @Mock DataLoader loader;");
277fd68191dSDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
278fd68191dSDaniel Jasper                "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
279e9ab42dfSDaniel Jasper 
280e9ab42dfSDaniel Jasper   verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n"
281e9ab42dfSDaniel Jasper                "private static final long something = 0L;");
282beb03938SNico Weber   verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n"
283beb03938SNico Weber                "private static final long something = 0L;");
284211e1329SDaniel Jasper   verifyFormat("@Mock\n"
285211e1329SDaniel Jasper                "DataLoader loooooooooooooooooooooooader =\n"
286211e1329SDaniel Jasper                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
287211e1329SDaniel Jasper                getStyleWithColumns(60));
288beb03938SNico Weber   verifyFormat("@org.llvm.QualifiedMock\n"
289beb03938SNico Weber                "DataLoader loooooooooooooooooooooooader =\n"
290beb03938SNico Weber                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
291beb03938SNico Weber                getStyleWithColumns(60));
292a831c58eSDaniel Jasper   verifyFormat("@Test(a)\n"
293a831c58eSDaniel Jasper                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
294a831c58eSDaniel Jasper                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);");
2953e1bd140SDaniel Jasper   verifyFormat("@SomeAnnotation(\n"
2963e1bd140SDaniel Jasper                "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n"
2973e1bd140SDaniel Jasper                "int i;",
2983e1bd140SDaniel Jasper                getStyleWithColumns(50));
299404658aeSDaniel Jasper   verifyFormat("@Test\n"
300404658aeSDaniel Jasper                "ReturnType doSomething(\n"
301404658aeSDaniel Jasper                "    String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}",
302404658aeSDaniel Jasper                getStyleWithColumns(60));
303190fbda6SDaniel Jasper   verifyFormat("{\n"
304190fbda6SDaniel Jasper                "  boolean someFunction(\n"
305190fbda6SDaniel Jasper                "      @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n"
306190fbda6SDaniel Jasper                "      String bbbbbbbbbbbbbbb) {}\n"
307190fbda6SDaniel Jasper                "}",
308190fbda6SDaniel Jasper                getStyleWithColumns(60));
309fab69ff0SDaniel Jasper }
310fab69ff0SDaniel Jasper 
31116b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) {
31216b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
31316b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
31416b107e9SDaniel Jasper   verifyFormat("Iterable<? extends SomeObject> a;");
3155ffcb7feSDaniel Jasper 
3165ffcb7feSDaniel Jasper   verifyFormat("A.<B>doSomething();");
3177bd618f5SDaniel Jasper 
3187bd618f5SDaniel Jasper   verifyFormat("@Override\n"
3199e709351SDaniel Jasper                "public Map<String, ?> getAll() {}");
320db9a7a2fSDaniel Jasper 
3219e709351SDaniel Jasper   verifyFormat("public <R> ArrayList<R> get() {}");
3229e709351SDaniel Jasper   verifyFormat("protected <R> ArrayList<R> get() {}");
3239e709351SDaniel Jasper   verifyFormat("private <R> ArrayList<R> get() {}");
3249e709351SDaniel Jasper   verifyFormat("public static <R> ArrayList<R> get() {}");
325ed50166bSNico Weber   verifyFormat("public static native <R> ArrayList<R> get();");
3269e709351SDaniel Jasper   verifyFormat("public final <X> Foo foo() {}");
32782c92753SDaniel Jasper   verifyFormat("public abstract <X> Foo foo();");
328f056f45bSDaniel Jasper   verifyFormat("<T extends B> T getInstance(Class<T> type);");
32961d81973SDaniel Jasper   verifyFormat("Function<F, ? extends T> function;");
3306761b42bSDaniel Jasper 
3316761b42bSDaniel Jasper   verifyFormat("private Foo<X, Y>[] foos;");
3326761b42bSDaniel Jasper   verifyFormat("Foo<X, Y>[] foos = this.foos;");
33377ef2be2SDaniel Jasper   verifyFormat("return (a instanceof List<?>)\n"
33477ef2be2SDaniel Jasper                "    ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
33577ef2be2SDaniel Jasper                "    : aaaaaaaaaaaaaaaaaaaaaaa;",
33677ef2be2SDaniel Jasper                getStyleWithColumns(60));
337caf86859SDaniel Jasper 
338caf86859SDaniel Jasper   verifyFormat(
339caf86859SDaniel Jasper       "SomeLoooooooooooooooooooooongType name =\n"
340caf86859SDaniel Jasper       "    SomeType.foo(someArgument)\n"
341caf86859SDaniel Jasper       "        .<X>method()\n"
342caf86859SDaniel Jasper       "        .aaaaaaaaaaaaaaaaaaa()\n"
343caf86859SDaniel Jasper       "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
34416b107e9SDaniel Jasper }
34516b107e9SDaniel Jasper 
346c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) {
347c0126864SDaniel Jasper   verifyFormat("String someString = \"abc\"\n"
348c0126864SDaniel Jasper                "    + \"cde\";");
349c0126864SDaniel Jasper }
350c0126864SDaniel Jasper 
351a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) {
352a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
353a3ddf86dSDaniel Jasper                "  Something();\n"
354a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
355a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
356a3ddf86dSDaniel Jasper                "}");
357a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
358a3ddf86dSDaniel Jasper                "  Something();\n"
359a3ddf86dSDaniel Jasper                "} finally {\n"
360a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
361a3ddf86dSDaniel Jasper                "}");
362a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
363a3ddf86dSDaniel Jasper                "  Something();\n"
364a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
365a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
366a3ddf86dSDaniel Jasper                "} finally {\n"
367a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
368a3ddf86dSDaniel Jasper                "}");
369a3ddf86dSDaniel Jasper 
370a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
371a3ddf86dSDaniel Jasper                "  Something();\n"
372a3ddf86dSDaniel Jasper                "} catch (SomeException | OtherException e) {\n"
373a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
374a3ddf86dSDaniel Jasper                "}");
375a3ddf86dSDaniel Jasper }
376a3ddf86dSDaniel Jasper 
377e189d465SDaniel Jasper TEST_F(FormatTestJava, TryWithResources) {
378e189d465SDaniel Jasper   verifyFormat("try (SomeResource rs = someFunction()) {\n"
379e189d465SDaniel Jasper                "  Something();\n"
380e189d465SDaniel Jasper                "}");
381e189d465SDaniel Jasper   verifyFormat("try (SomeResource rs = someFunction()) {\n"
382e189d465SDaniel Jasper                "  Something();\n"
383e189d465SDaniel Jasper                "} catch (SomeException e) {\n"
384e189d465SDaniel Jasper                "  HandleException(e);\n"
385e189d465SDaniel Jasper                "}");
386e189d465SDaniel Jasper }
387e189d465SDaniel Jasper 
388b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) {
389b9d3db6bSDaniel Jasper   verifyFormat("synchronized (mData) {\n"
390b9d3db6bSDaniel Jasper                "  // ...\n"
391b9d3db6bSDaniel Jasper                "}");
392b9d3db6bSDaniel Jasper }
393b9d3db6bSDaniel Jasper 
3949b9e0760SDaniel Jasper TEST_F(FormatTestJava, PackageDeclarations) {
3959b9e0760SDaniel Jasper   verifyFormat("package some.really.loooooooooooooooooooooong.package;",
3969b9e0760SDaniel Jasper                getStyleWithColumns(50));
3979b9e0760SDaniel Jasper }
3989b9e0760SDaniel Jasper 
3995e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) {
4005e7be1d5SDaniel Jasper   verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;",
4015e7be1d5SDaniel Jasper                getStyleWithColumns(50));
40216dbe0bcSDaniel Jasper   verifyFormat("import static some.really.looooooooooooooooong.imported.Class;",
40316dbe0bcSDaniel Jasper                getStyleWithColumns(50));
4045e7be1d5SDaniel Jasper }
4055e7be1d5SDaniel Jasper 
4063aa9a6a1SDaniel Jasper TEST_F(FormatTestJava, MethodDeclarations) {
4073aa9a6a1SDaniel Jasper   verifyFormat("void methodName(Object arg1,\n"
4089e709351SDaniel Jasper                "    Object arg2, Object arg3) {}",
4093aa9a6a1SDaniel Jasper                getStyleWithColumns(40));
4103aa9a6a1SDaniel Jasper   verifyFormat("void methodName(\n"
4119e709351SDaniel Jasper                "    Object arg1, Object arg2) {}",
4123aa9a6a1SDaniel Jasper                getStyleWithColumns(40));
4133aa9a6a1SDaniel Jasper }
4143aa9a6a1SDaniel Jasper 
415fe2cf667SDaniel Jasper TEST_F(FormatTestJava, CppKeywords) {
416fe2cf667SDaniel Jasper   verifyFormat("public void union(Type a, Type b);");
417fe2cf667SDaniel Jasper   verifyFormat("public void struct(Object o);");
418fe2cf667SDaniel Jasper   verifyFormat("public void delete(Object o);");
419fe2cf667SDaniel Jasper }
420fe2cf667SDaniel Jasper 
4216cab6784SDaniel Jasper TEST_F(FormatTestJava, NeverAlignAfterReturn) {
4226cab6784SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa\n"
4236cab6784SDaniel Jasper                "    && bbbbbbbbbbbbbbbbbbb\n"
4246cab6784SDaniel Jasper                "    && ccccccccccccccccccc;",
4256cab6784SDaniel Jasper                getStyleWithColumns(40));
4266cab6784SDaniel Jasper   verifyFormat("return (result == null)\n"
4276cab6784SDaniel Jasper                "    ? aaaaaaaaaaaaaaaaa\n"
4286cab6784SDaniel Jasper                "    : bbbbbbbbbbbbbbbbb;",
4296cab6784SDaniel Jasper                getStyleWithColumns(40));
4306cab6784SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
4316cab6784SDaniel Jasper                "    .bbbbbbbbbbbbbbbbbbb()\n"
4326cab6784SDaniel Jasper                "    .ccccccccccccccccccc();",
4336cab6784SDaniel Jasper                getStyleWithColumns(40));
434a536df4bSDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
435a536df4bSDaniel Jasper                "    .bbbbbbbbbbbbbbbbbbb(\n"
436a536df4bSDaniel Jasper                "        ccccccccccccccc)\n"
437a536df4bSDaniel Jasper                "    .ccccccccccccccccccc();",
438a536df4bSDaniel Jasper                getStyleWithColumns(40));
4396cab6784SDaniel Jasper }
4406cab6784SDaniel Jasper 
4414b444495SDaniel Jasper TEST_F(FormatTestJava, FormatsInnerBlocks) {
4424b444495SDaniel Jasper   verifyFormat("someObject.someFunction(new Runnable() {\n"
4434b444495SDaniel Jasper                "  @Override\n"
4444b444495SDaniel Jasper                "  public void run() {\n"
4454b444495SDaniel Jasper                "    System.out.println(42);\n"
4464b444495SDaniel Jasper                "  }\n"
4474b444495SDaniel Jasper                "}, someOtherParameter);");
4485f1fa85eSDaniel Jasper   verifyFormat("someFunction(new Runnable() {\n"
4495f1fa85eSDaniel Jasper                "  public void run() {\n"
4505f1fa85eSDaniel Jasper                "    System.out.println(42);\n"
4515f1fa85eSDaniel Jasper                "  }\n"
4525f1fa85eSDaniel Jasper                "});");
4534b444495SDaniel Jasper   verifyFormat("someObject.someFunction(\n"
4544b444495SDaniel Jasper                "    new Runnable() {\n"
4554b444495SDaniel Jasper                "      @Override\n"
4564b444495SDaniel Jasper                "      public void run() {\n"
4574b444495SDaniel Jasper                "        System.out.println(42);\n"
4584b444495SDaniel Jasper                "      }\n"
4594b444495SDaniel Jasper                "    },\n"
4604b444495SDaniel Jasper                "    new Runnable() {\n"
4614b444495SDaniel Jasper                "      @Override\n"
4624b444495SDaniel Jasper                "      public void run() {\n"
4634b444495SDaniel Jasper                "        System.out.println(43);\n"
4644b444495SDaniel Jasper                "      }\n"
4654b444495SDaniel Jasper                "    },\n"
4664b444495SDaniel Jasper                "    someOtherParameter);");
4674b444495SDaniel Jasper }
4684b444495SDaniel Jasper 
4698354ea84SDaniel Jasper TEST_F(FormatTestJava, FormatsLambdas) {
4708354ea84SDaniel Jasper   verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;");
4718354ea84SDaniel Jasper   verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n"
4728354ea84SDaniel Jasper                "    -> aaaaaaaaaa + bbbbbbbbbb;",
4738354ea84SDaniel Jasper                getStyleWithColumns(40));
4748354ea84SDaniel Jasper   verifyFormat("Runnable someLambda = () -> DoSomething();");
4758354ea84SDaniel Jasper   verifyFormat("Runnable someLambda = () -> {\n"
4768354ea84SDaniel Jasper                "  DoSomething();\n"
4778354ea84SDaniel Jasper                "}");
4788354ea84SDaniel Jasper 
4798354ea84SDaniel Jasper   verifyFormat("Runnable someLambda =\n"
4808354ea84SDaniel Jasper                "    (int aaaaa) -> DoSomething(aaaaa);",
4818354ea84SDaniel Jasper                getStyleWithColumns(40));
4828354ea84SDaniel Jasper }
4838354ea84SDaniel Jasper 
484ff2437feSAlexander Kornienko TEST_F(FormatTestJava, BreaksStringLiterals) {
485ff2437feSAlexander Kornienko   // FIXME: String literal breaking is currently disabled for Java and JS, as it
486ff2437feSAlexander Kornienko   // requires strings to be merged using "+" which we don't support.
487ff2437feSAlexander Kornienko   EXPECT_EQ("\"some text other\";",
488ff2437feSAlexander Kornienko             format("\"some text other\";", getStyleWithColumns(14)));
489ff2437feSAlexander Kornienko }
490ff2437feSAlexander Kornienko 
491428f0b14SDaniel Jasper TEST_F(FormatTestJava, AlignsBlockComments) {
492428f0b14SDaniel Jasper   EXPECT_EQ("/*\n"
493428f0b14SDaniel Jasper             " * Really multi-line\n"
494428f0b14SDaniel Jasper             " * comment.\n"
495428f0b14SDaniel Jasper             " */\n"
496428f0b14SDaniel Jasper             "void f() {}",
497428f0b14SDaniel Jasper             format("  /*\n"
498428f0b14SDaniel Jasper                    "   * Really multi-line\n"
499428f0b14SDaniel Jasper                    "   * comment.\n"
500428f0b14SDaniel Jasper                    "   */\n"
501428f0b14SDaniel Jasper                    "  void f() {}"));
502428f0b14SDaniel Jasper }
503428f0b14SDaniel Jasper 
504*ab9db510SAlexander Kornienko } // end namespace tooling
505c58c70e2SDaniel Jasper } // end namespace clang
506