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) {
243538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << "---\n");
253538b39eSNicola Zaghen     LLVM_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);
284f8d9943SEric Liu     auto Result = applyAllReplacements(Code, Replaces);
294f8d9943SEric Liu     EXPECT_TRUE(static_cast<bool>(Result));
303538b39eSNicola Zaghen     LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n");
314f8d9943SEric Liu     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)) {
49c9a918c5SMark Zeren     EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable";
50c58c70e2SDaniel Jasper     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
51c58c70e2SDaniel Jasper   }
52c58c70e2SDaniel Jasper };
53c58c70e2SDaniel Jasper 
5430a2406eSDaniel Jasper TEST_F(FormatTestJava, NoAlternativeOperatorNames) {
5530a2406eSDaniel Jasper   verifyFormat("someObject.and();");
5630a2406eSDaniel Jasper }
5730a2406eSDaniel Jasper 
584f56b0bbSDaniel Jasper TEST_F(FormatTestJava, UnderstandsCasts) {
594f56b0bbSDaniel Jasper   verifyFormat("a[b >> 1] = (byte) (c() << 4);");
604f56b0bbSDaniel Jasper }
614f56b0bbSDaniel Jasper 
62a98b7b01SDaniel Jasper TEST_F(FormatTestJava, FormatsInstanceOfLikeOperators) {
63a98b7b01SDaniel Jasper   FormatStyle Style = getStyleWithColumns(50);
64a98b7b01SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
65a98b7b01SDaniel Jasper                "    instanceof bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
66a98b7b01SDaniel Jasper                Style);
67a98b7b01SDaniel Jasper   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
68a98b7b01SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa instanceof\n"
69a98b7b01SDaniel Jasper                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
70a98b7b01SDaniel Jasper                Style);
71043ac050SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa instanceof bbbbbbbbbbbbbbbbbbbbbbb\n"
72043ac050SDaniel Jasper                "    && ccccccccccccccccccc instanceof dddddddddddddddddddddd;");
73a98b7b01SDaniel Jasper }
74a98b7b01SDaniel Jasper 
75450425c9SNico Weber TEST_F(FormatTestJava, Chromium) {
76450425c9SNico Weber   verifyFormat("class SomeClass {\n"
77450425c9SNico Weber                "    void f() {}\n"
78450425c9SNico Weber                "    int g() {\n"
79450425c9SNico Weber                "        return 0;\n"
80450425c9SNico Weber                "    }\n"
81450425c9SNico Weber                "    void h() {\n"
82450425c9SNico Weber                "        while (true) f();\n"
83450425c9SNico Weber                "        for (;;) f();\n"
84450425c9SNico Weber                "        if (true) f();\n"
85450425c9SNico Weber                "    }\n"
86450425c9SNico Weber                "}",
87450425c9SNico Weber                getChromiumStyle(FormatStyle::LK_Java));
88450425c9SNico Weber }
89450425c9SNico Weber 
908379107aSDaniel Jasper TEST_F(FormatTestJava, QualifiedNames) {
918379107aSDaniel Jasper   verifyFormat("public some.package.Type someFunction( // comment\n"
928379107aSDaniel Jasper                "    int parameter) {}");
938379107aSDaniel Jasper }
948379107aSDaniel Jasper 
95e5d74867SDaniel Jasper TEST_F(FormatTestJava, ClassKeyword) {
96e5d74867SDaniel Jasper   verifyFormat("SomeClass.class.getName();");
97e5d74867SDaniel Jasper   verifyFormat("Class c = SomeClass.class;");
98e5d74867SDaniel Jasper }
99e5d74867SDaniel Jasper 
100c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) {
101c58c70e2SDaniel Jasper   verifyFormat("public class SomeClass {\n"
102c58c70e2SDaniel Jasper                "  private int a;\n"
103c58c70e2SDaniel Jasper                "  private int b;\n"
104c58c70e2SDaniel Jasper                "}");
105c58c70e2SDaniel Jasper   verifyFormat("public class A {\n"
106c58c70e2SDaniel Jasper                "  class B {\n"
107c58c70e2SDaniel Jasper                "    int i;\n"
108c58c70e2SDaniel Jasper                "  }\n"
109c58c70e2SDaniel Jasper                "  class C {\n"
110c58c70e2SDaniel Jasper                "    int j;\n"
111c58c70e2SDaniel Jasper                "  }\n"
112c58c70e2SDaniel Jasper                "}");
1134bf9d470SDaniel Jasper   verifyFormat("public class A extends B.C {}");
11450b4bd7cSDaniel Jasper 
115734d52b5SDaniel Jasper   verifyFormat("abstract class SomeClass\n"
116734d52b5SDaniel Jasper                "    extends SomeOtherClass implements SomeInterface {}",
117734d52b5SDaniel Jasper                getStyleWithColumns(60));
11850b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass extends SomeOtherClass\n"
119734d52b5SDaniel Jasper                "    implements SomeInterfaceeeeeeeeeeeee {}",
12050b4bd7cSDaniel Jasper                getStyleWithColumns(60));
12150b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
12250b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
12350b4bd7cSDaniel Jasper                "    implements SomeInterface {}",
12450b4bd7cSDaniel Jasper                getStyleWithColumns(40));
12550b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
12650b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
12750b4bd7cSDaniel Jasper                "    implements SomeInterface,\n"
12850b4bd7cSDaniel Jasper                "               AnotherInterface {}",
12950b4bd7cSDaniel Jasper                getStyleWithColumns(40));
130734d52b5SDaniel Jasper   verifyFormat("abstract class SomeClass\n"
131734d52b5SDaniel Jasper                "    implements SomeInterface, AnotherInterface {}",
132734d52b5SDaniel Jasper                getStyleWithColumns(60));
13339af6cd5SDaniel Jasper   verifyFormat("@SomeAnnotation()\n"
134734d52b5SDaniel Jasper                "abstract class aaaaaaaaaaaa\n"
1359e709351SDaniel Jasper                "    extends bbbbbbbbbbbbbbb implements cccccccccccc {}",
13639af6cd5SDaniel Jasper                getStyleWithColumns(76));
13758fcf6dfSDaniel Jasper   verifyFormat("@SomeAnnotation()\n"
138734d52b5SDaniel Jasper                "abstract class aaaaaaaaa<a>\n"
1399e709351SDaniel Jasper                "    extends bbbbbbbbbbbb<b> implements cccccccccccc {}",
14058fcf6dfSDaniel Jasper                getStyleWithColumns(76));
141a644d7f3SNico Weber   verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n"
142a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
143a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
144a644d7f3SNico Weber                "}");
145a644d7f3SNico Weber   verifyFormat("public interface SomeInterface {\n"
146a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
147a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
148c29f83b7SNico Weber                "  default void doStuffWithDefault() {}\n"
149a644d7f3SNico Weber                "}");
150a644d7f3SNico Weber   verifyFormat("@interface SomeInterface {\n"
151a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
152a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
153a644d7f3SNico Weber                "}");
154a644d7f3SNico Weber   verifyFormat("public @interface SomeInterface {\n"
155a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
156a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
157a644d7f3SNico Weber                "}");
158*749c1b59SHans Wennborg   verifyFormat("class A {\n"
159*749c1b59SHans Wennborg                "  public @interface SomeInterface {\n"
160*749c1b59SHans Wennborg                "    int stuff;\n"
161*749c1b59SHans Wennborg                "    void doMoreStuff(int moreStuff);\n"
162*749c1b59SHans Wennborg                "  }\n"
163*749c1b59SHans Wennborg                "}");
164*749c1b59SHans Wennborg   verifyFormat("class A {\n"
165*749c1b59SHans Wennborg                "  public @interface SomeInterface {}\n"
166*749c1b59SHans Wennborg                "}");
167c58c70e2SDaniel Jasper }
168c58c70e2SDaniel Jasper 
1696acf5130SDaniel Jasper TEST_F(FormatTestJava, AnonymousClasses) {
1706acf5130SDaniel Jasper   verifyFormat("return new A() {\n"
1716acf5130SDaniel Jasper                "  public String toString() {\n"
1726acf5130SDaniel Jasper                "    return \"NotReallyA\";\n"
1736acf5130SDaniel Jasper                "  }\n"
1746acf5130SDaniel Jasper                "};");
1756acf5130SDaniel Jasper   verifyFormat("A a = new A() {\n"
1766acf5130SDaniel Jasper                "  public String toString() {\n"
1776acf5130SDaniel Jasper                "    return \"NotReallyA\";\n"
1786acf5130SDaniel Jasper                "  }\n"
1796acf5130SDaniel Jasper                "};");
1806acf5130SDaniel Jasper }
1816acf5130SDaniel Jasper 
182df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) {
183df2ff002SDaniel Jasper   verifyFormat("enum SomeThing { ABC, CDE }");
184df2ff002SDaniel Jasper   verifyFormat("enum SomeThing {\n"
185df2ff002SDaniel Jasper                "  ABC,\n"
186df2ff002SDaniel Jasper                "  CDE,\n"
187df2ff002SDaniel Jasper                "}");
188df2ff002SDaniel Jasper   verifyFormat("public class SomeClass {\n"
189df2ff002SDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
1909e709351SDaniel Jasper                "  void f() {}\n"
191df2ff002SDaniel Jasper                "}");
1926be0f55dSDaniel Jasper   verifyFormat("public class SomeClass implements SomeInterface {\n"
1936be0f55dSDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
1949e709351SDaniel Jasper                "  void f() {}\n"
1956be0f55dSDaniel Jasper                "}");
1966be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1976be0f55dSDaniel Jasper                "  ABC,\n"
1986be0f55dSDaniel Jasper                "  CDE;\n"
1999e709351SDaniel Jasper                "  void f() {}\n"
2006be0f55dSDaniel Jasper                "}");
2016be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
2026be0f55dSDaniel Jasper                "  ABC(1, \"ABC\"),\n"
2036be0f55dSDaniel Jasper                "  CDE(2, \"CDE\");\n"
2049e709351SDaniel Jasper                "  Something(int i, String s) {}\n"
2056be0f55dSDaniel Jasper                "}");
2066be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
2076be0f55dSDaniel Jasper                "  ABC(new int[] {1, 2}),\n"
2086be0f55dSDaniel Jasper                "  CDE(new int[] {2, 3});\n"
2099e709351SDaniel Jasper                "  Something(int[] i) {}\n"
2106be0f55dSDaniel Jasper                "}");
2116be0f55dSDaniel Jasper   verifyFormat("public enum SomeThing {\n"
2126be0f55dSDaniel Jasper                "  ABC {\n"
2136be0f55dSDaniel Jasper                "    public String toString() {\n"
2146be0f55dSDaniel Jasper                "      return \"ABC\";\n"
2156be0f55dSDaniel Jasper                "    }\n"
2166be0f55dSDaniel Jasper                "  },\n"
2176be0f55dSDaniel Jasper                "  CDE {\n"
2186be0f55dSDaniel Jasper                "    @Override\n"
2196be0f55dSDaniel Jasper                "    public String toString() {\n"
2206be0f55dSDaniel Jasper                "      return \"CDE\";\n"
2216be0f55dSDaniel Jasper                "    }\n"
2226be0f55dSDaniel Jasper                "  };\n"
2239e709351SDaniel Jasper                "  public void f() {}\n"
2246be0f55dSDaniel Jasper                "}");
225ccb68b48SDaniel Jasper   verifyFormat("private enum SomeEnum implements Foo<?, B> {\n"
226ccb68b48SDaniel Jasper                "  ABC {\n"
227ccb68b48SDaniel Jasper                "    @Override\n"
228ccb68b48SDaniel Jasper                "    public String toString() {\n"
229ccb68b48SDaniel Jasper                "      return \"ABC\";\n"
230ccb68b48SDaniel Jasper                "    }\n"
231ccb68b48SDaniel Jasper                "  },\n"
232ccb68b48SDaniel Jasper                "  CDE {\n"
233ccb68b48SDaniel Jasper                "    @Override\n"
234ccb68b48SDaniel Jasper                "    public String toString() {\n"
235ccb68b48SDaniel Jasper                "      return \"CDE\";\n"
236ccb68b48SDaniel Jasper                "    }\n"
237ccb68b48SDaniel Jasper                "  };\n"
238ccb68b48SDaniel Jasper                "}");
239e154020dSDaniel Jasper   verifyFormat("public enum VeryLongEnum {\n"
240e154020dSDaniel Jasper                "  ENUM_WITH_MANY_PARAMETERS(\n"
241e154020dSDaniel Jasper                "      \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"bbbbbbbbbbbbbbbb\", "
242e154020dSDaniel Jasper                "\"cccccccccccccccccccccccc\"),\n"
243e154020dSDaniel Jasper                "  SECOND_ENUM(\"a\", \"b\", \"c\");\n"
244e154020dSDaniel Jasper                "  private VeryLongEnum(String a, String b, String c) {}\n"
245e154020dSDaniel Jasper                "}\n");
246a0143fabSDaniel Jasper }
247a0143fabSDaniel Jasper 
248a0143fabSDaniel Jasper TEST_F(FormatTestJava, ArrayInitializers) {
249a0143fabSDaniel Jasper   verifyFormat("new int[] {1, 2, 3, 4};");
250a0143fabSDaniel Jasper   verifyFormat("new int[] {\n"
251d2130f51SFrancois Ferrand                "    1,\n"
252d2130f51SFrancois Ferrand                "    2,\n"
253d2130f51SFrancois Ferrand                "    3,\n"
254d2130f51SFrancois Ferrand                "    4,\n"
255a0143fabSDaniel Jasper                "};");
25613404dadSDaniel Jasper 
25713404dadSDaniel Jasper   FormatStyle Style = getStyleWithColumns(65);
25813404dadSDaniel Jasper   Style.Cpp11BracedListStyle = false;
25913404dadSDaniel Jasper   verifyFormat(
26013404dadSDaniel Jasper       "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n"
26113404dadSDaniel Jasper       "  100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };",
26213404dadSDaniel Jasper       Style);
263df2ff002SDaniel Jasper }
264df2ff002SDaniel Jasper 
265f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) {
266f26c755dSDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
2679e709351SDaniel Jasper                "    throws LooooooooooooooooooooooooooooongException {}");
268375815d2SDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
269375815d2SDaniel Jasper                "    throws LoooooooooongException, LooooooooooongException {}");
270f26c755dSDaniel Jasper }
271f26c755dSDaniel Jasper 
272fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) {
273fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
2749e709351SDaniel Jasper                "public String toString() {}");
275fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
276fab69ff0SDaniel Jasper                "@Nullable\n"
2779e709351SDaniel Jasper                "public String getNameIfPresent() {}");
27807013a42SDaniel Jasper   verifyFormat("@Override // comment\n"
27907013a42SDaniel Jasper                "@Nullable\n"
28007013a42SDaniel Jasper                "public String getNameIfPresent() {}");
281beb03938SNico Weber   verifyFormat("@java.lang.Override // comment\n"
282beb03938SNico Weber                "@Nullable\n"
283beb03938SNico Weber                "public String getNameIfPresent() {}");
284f1f0c356SDaniel Jasper 
285f1f0c356SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
2869e709351SDaniel Jasper                "public void doSomething() {}");
287d78c4223SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
288d78c4223SDaniel Jasper                "@Author(name = \"abc\")\n"
2899e709351SDaniel Jasper                "public void doSomething() {}");
290f1f0c356SDaniel Jasper 
291c7d024acSDaniel Jasper   verifyFormat("DoSomething(new A() {\n"
292c7d024acSDaniel Jasper                "  @Override\n"
2939e709351SDaniel Jasper                "  public String toString() {}\n"
294c7d024acSDaniel Jasper                "});");
295c7d024acSDaniel Jasper 
2969e709351SDaniel Jasper   verifyFormat("void SomeFunction(@Nullable String something) {}");
297beb03938SNico Weber   verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}");
298e9ab42dfSDaniel Jasper 
299fab69ff0SDaniel Jasper   verifyFormat("@Partial @Mock DataLoader loader;");
3002cd92f1cSNico Weber   verifyFormat("@Partial\n"
3012cd92f1cSNico Weber                "@Mock\n"
3022cd92f1cSNico Weber                "DataLoader loader;",
3032cd92f1cSNico Weber                getChromiumStyle(FormatStyle::LK_Java));
304fd68191dSDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
305fd68191dSDaniel Jasper                "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
306e9ab42dfSDaniel Jasper 
307e9ab42dfSDaniel Jasper   verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n"
308e9ab42dfSDaniel Jasper                "private static final long something = 0L;");
309beb03938SNico Weber   verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n"
310beb03938SNico Weber                "private static final long something = 0L;");
311211e1329SDaniel Jasper   verifyFormat("@Mock\n"
312211e1329SDaniel Jasper                "DataLoader loooooooooooooooooooooooader =\n"
313211e1329SDaniel Jasper                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
314211e1329SDaniel Jasper                getStyleWithColumns(60));
315beb03938SNico Weber   verifyFormat("@org.llvm.QualifiedMock\n"
316beb03938SNico Weber                "DataLoader loooooooooooooooooooooooader =\n"
317beb03938SNico Weber                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
318beb03938SNico Weber                getStyleWithColumns(60));
319a831c58eSDaniel Jasper   verifyFormat("@Test(a)\n"
320a831c58eSDaniel Jasper                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
321a831c58eSDaniel Jasper                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);");
3223e1bd140SDaniel Jasper   verifyFormat("@SomeAnnotation(\n"
3233e1bd140SDaniel Jasper                "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n"
3243e1bd140SDaniel Jasper                "int i;",
3253e1bd140SDaniel Jasper                getStyleWithColumns(50));
326404658aeSDaniel Jasper   verifyFormat("@Test\n"
327404658aeSDaniel Jasper                "ReturnType doSomething(\n"
328404658aeSDaniel Jasper                "    String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}",
329404658aeSDaniel Jasper                getStyleWithColumns(60));
330190fbda6SDaniel Jasper   verifyFormat("{\n"
331190fbda6SDaniel Jasper                "  boolean someFunction(\n"
332190fbda6SDaniel Jasper                "      @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n"
333190fbda6SDaniel Jasper                "      String bbbbbbbbbbbbbbb) {}\n"
334190fbda6SDaniel Jasper                "}",
335190fbda6SDaniel Jasper                getStyleWithColumns(60));
33615b01116SDaniel Jasper   verifyFormat("@Annotation(\"Some\"\n"
33715b01116SDaniel Jasper                "    + \" text\")\n"
33815b01116SDaniel Jasper                "List<Integer> list;");
339fab69ff0SDaniel Jasper }
340fab69ff0SDaniel Jasper 
34116b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) {
34216b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
34316b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
34416b107e9SDaniel Jasper   verifyFormat("Iterable<? extends SomeObject> a;");
3455ffcb7feSDaniel Jasper 
3465ffcb7feSDaniel Jasper   verifyFormat("A.<B>doSomething();");
347b9b18675SNico Weber   verifyFormat("A.<B<C>>doSomething();");
348b9b18675SNico Weber   verifyFormat("A.<B<C<D>>>doSomething();");
349b9b18675SNico Weber   verifyFormat("A.<B<C<D<E>>>>doSomething();");
350b9b18675SNico Weber 
351b9b18675SNico Weber   verifyFormat("OrderedPair<String, List<Box<Integer>>> p = null;");
3527bd618f5SDaniel Jasper 
3537bd618f5SDaniel Jasper   verifyFormat("@Override\n"
3549e709351SDaniel Jasper                "public Map<String, ?> getAll() {}");
355db9a7a2fSDaniel Jasper 
3569e709351SDaniel Jasper   verifyFormat("public <R> ArrayList<R> get() {}");
3579e709351SDaniel Jasper   verifyFormat("protected <R> ArrayList<R> get() {}");
3589e709351SDaniel Jasper   verifyFormat("private <R> ArrayList<R> get() {}");
3599e709351SDaniel Jasper   verifyFormat("public static <R> ArrayList<R> get() {}");
360ed50166bSNico Weber   verifyFormat("public static native <R> ArrayList<R> get();");
3619e709351SDaniel Jasper   verifyFormat("public final <X> Foo foo() {}");
36282c92753SDaniel Jasper   verifyFormat("public abstract <X> Foo foo();");
363f056f45bSDaniel Jasper   verifyFormat("<T extends B> T getInstance(Class<T> type);");
36461d81973SDaniel Jasper   verifyFormat("Function<F, ? extends T> function;");
3656761b42bSDaniel Jasper 
3666761b42bSDaniel Jasper   verifyFormat("private Foo<X, Y>[] foos;");
3676761b42bSDaniel Jasper   verifyFormat("Foo<X, Y>[] foos = this.foos;");
36877ef2be2SDaniel Jasper   verifyFormat("return (a instanceof List<?>)\n"
36977ef2be2SDaniel Jasper                "    ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
37077ef2be2SDaniel Jasper                "    : aaaaaaaaaaaaaaaaaaaaaaa;",
37177ef2be2SDaniel Jasper                getStyleWithColumns(60));
372caf86859SDaniel Jasper 
373caf86859SDaniel Jasper   verifyFormat(
374caf86859SDaniel Jasper       "SomeLoooooooooooooooooooooongType name =\n"
375caf86859SDaniel Jasper       "    SomeType.foo(someArgument)\n"
376caf86859SDaniel Jasper       "        .<X>method()\n"
377caf86859SDaniel Jasper       "        .aaaaaaaaaaaaaaaaaaa()\n"
378caf86859SDaniel Jasper       "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
37916b107e9SDaniel Jasper }
38016b107e9SDaniel Jasper 
381c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) {
382c0126864SDaniel Jasper   verifyFormat("String someString = \"abc\"\n"
383c0126864SDaniel Jasper                "    + \"cde\";");
384c0126864SDaniel Jasper }
385c0126864SDaniel Jasper 
386a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) {
387a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
388a3ddf86dSDaniel Jasper                "  Something();\n"
389a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
390a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
391a3ddf86dSDaniel Jasper                "}");
392a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
393a3ddf86dSDaniel Jasper                "  Something();\n"
394a3ddf86dSDaniel Jasper                "} finally {\n"
395a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
396a3ddf86dSDaniel Jasper                "}");
397a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
398a3ddf86dSDaniel Jasper                "  Something();\n"
399a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
400a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
401a3ddf86dSDaniel Jasper                "} finally {\n"
402a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
403a3ddf86dSDaniel Jasper                "}");
404a3ddf86dSDaniel Jasper 
405a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
406a3ddf86dSDaniel Jasper                "  Something();\n"
407a3ddf86dSDaniel Jasper                "} catch (SomeException | OtherException e) {\n"
408a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
409a3ddf86dSDaniel Jasper                "}");
410a3ddf86dSDaniel Jasper }
411a3ddf86dSDaniel Jasper 
412e189d465SDaniel Jasper TEST_F(FormatTestJava, TryWithResources) {
413e189d465SDaniel Jasper   verifyFormat("try (SomeResource rs = someFunction()) {\n"
414e189d465SDaniel Jasper                "  Something();\n"
415e189d465SDaniel Jasper                "}");
416e189d465SDaniel Jasper   verifyFormat("try (SomeResource rs = someFunction()) {\n"
417e189d465SDaniel Jasper                "  Something();\n"
418e189d465SDaniel Jasper                "} catch (SomeException e) {\n"
419e189d465SDaniel Jasper                "  HandleException(e);\n"
420e189d465SDaniel Jasper                "}");
421e189d465SDaniel Jasper }
422e189d465SDaniel Jasper 
423b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) {
424b9d3db6bSDaniel Jasper   verifyFormat("synchronized (mData) {\n"
425b9d3db6bSDaniel Jasper                "  // ...\n"
426b9d3db6bSDaniel Jasper                "}");
427b9d3db6bSDaniel Jasper }
428b9d3db6bSDaniel Jasper 
4294f113490SNico Weber TEST_F(FormatTestJava, AssertKeyword) {
4304f113490SNico Weber   verifyFormat("assert a && b;");
431e8eba371SNico Weber   verifyFormat("assert (a && b);");
4324f113490SNico Weber }
4334f113490SNico Weber 
4349b9e0760SDaniel Jasper TEST_F(FormatTestJava, PackageDeclarations) {
4359b9e0760SDaniel Jasper   verifyFormat("package some.really.loooooooooooooooooooooong.package;",
4369b9e0760SDaniel Jasper                getStyleWithColumns(50));
4379b9e0760SDaniel Jasper }
4389b9e0760SDaniel Jasper 
4395e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) {
4405e7be1d5SDaniel Jasper   verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;",
4415e7be1d5SDaniel Jasper                getStyleWithColumns(50));
44216dbe0bcSDaniel Jasper   verifyFormat("import static some.really.looooooooooooooooong.imported.Class;",
44316dbe0bcSDaniel Jasper                getStyleWithColumns(50));
4445e7be1d5SDaniel Jasper }
4455e7be1d5SDaniel Jasper 
4463aa9a6a1SDaniel Jasper TEST_F(FormatTestJava, MethodDeclarations) {
4473aa9a6a1SDaniel Jasper   verifyFormat("void methodName(Object arg1,\n"
4489e709351SDaniel Jasper                "    Object arg2, Object arg3) {}",
4493aa9a6a1SDaniel Jasper                getStyleWithColumns(40));
4503aa9a6a1SDaniel Jasper   verifyFormat("void methodName(\n"
4519e709351SDaniel Jasper                "    Object arg1, Object arg2) {}",
4523aa9a6a1SDaniel Jasper                getStyleWithColumns(40));
4533aa9a6a1SDaniel Jasper }
4543aa9a6a1SDaniel Jasper 
455208661b2SNico Weber TEST_F(FormatTestJava, MethodReference) {
456208661b2SNico Weber   EXPECT_EQ(
457208661b2SNico Weber       "private void foo() {\n"
458208661b2SNico Weber       "  f(this::methodReference);\n"
459208661b2SNico Weber       "  f(C.super::methodReference);\n"
460208661b2SNico Weber       "  Consumer<String> c = System.out::println;\n"
461208661b2SNico Weber       "  Iface<Integer> mRef = Ty::<Integer>meth;\n"
462208661b2SNico Weber       "}",
463208661b2SNico Weber       format("private void foo() {\n"
464208661b2SNico Weber              "  f(this ::methodReference);\n"
465208661b2SNico Weber              "  f(C.super ::methodReference);\n"
466208661b2SNico Weber              "  Consumer<String> c = System.out ::println;\n"
467208661b2SNico Weber              "  Iface<Integer> mRef = Ty :: <Integer> meth;\n"
468208661b2SNico Weber              "}"));
469208661b2SNico Weber }
470208661b2SNico Weber 
471fe2cf667SDaniel Jasper TEST_F(FormatTestJava, CppKeywords) {
472fe2cf667SDaniel Jasper   verifyFormat("public void union(Type a, Type b);");
473fe2cf667SDaniel Jasper   verifyFormat("public void struct(Object o);");
474fe2cf667SDaniel Jasper   verifyFormat("public void delete(Object o);");
47572a1b6a5SDaniel Jasper   verifyFormat("return operator && (aa);");
476fe2cf667SDaniel Jasper }
477fe2cf667SDaniel Jasper 
4786cab6784SDaniel Jasper TEST_F(FormatTestJava, NeverAlignAfterReturn) {
4796cab6784SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa\n"
4806cab6784SDaniel Jasper                "    && bbbbbbbbbbbbbbbbbbb\n"
4816cab6784SDaniel Jasper                "    && ccccccccccccccccccc;",
4826cab6784SDaniel Jasper                getStyleWithColumns(40));
4836cab6784SDaniel Jasper   verifyFormat("return (result == null)\n"
4846cab6784SDaniel Jasper                "    ? aaaaaaaaaaaaaaaaa\n"
4856cab6784SDaniel Jasper                "    : bbbbbbbbbbbbbbbbb;",
4866cab6784SDaniel Jasper                getStyleWithColumns(40));
4876cab6784SDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
4886cab6784SDaniel Jasper                "    .bbbbbbbbbbbbbbbbbbb()\n"
4896cab6784SDaniel Jasper                "    .ccccccccccccccccccc();",
4906cab6784SDaniel Jasper                getStyleWithColumns(40));
491a536df4bSDaniel Jasper   verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
492a536df4bSDaniel Jasper                "    .bbbbbbbbbbbbbbbbbbb(\n"
493a536df4bSDaniel Jasper                "        ccccccccccccccc)\n"
494a536df4bSDaniel Jasper                "    .ccccccccccccccccccc();",
495a536df4bSDaniel Jasper                getStyleWithColumns(40));
4966cab6784SDaniel Jasper }
4976cab6784SDaniel Jasper 
4984b444495SDaniel Jasper TEST_F(FormatTestJava, FormatsInnerBlocks) {
4994b444495SDaniel Jasper   verifyFormat("someObject.someFunction(new Runnable() {\n"
5004b444495SDaniel Jasper                "  @Override\n"
5014b444495SDaniel Jasper                "  public void run() {\n"
5024b444495SDaniel Jasper                "    System.out.println(42);\n"
5034b444495SDaniel Jasper                "  }\n"
5044b444495SDaniel Jasper                "}, someOtherParameter);");
5055f1fa85eSDaniel Jasper   verifyFormat("someFunction(new Runnable() {\n"
5065f1fa85eSDaniel Jasper                "  public void run() {\n"
5075f1fa85eSDaniel Jasper                "    System.out.println(42);\n"
5085f1fa85eSDaniel Jasper                "  }\n"
5095f1fa85eSDaniel Jasper                "});");
5104b444495SDaniel Jasper   verifyFormat("someObject.someFunction(\n"
5114b444495SDaniel Jasper                "    new Runnable() {\n"
5124b444495SDaniel Jasper                "      @Override\n"
5134b444495SDaniel Jasper                "      public void run() {\n"
5144b444495SDaniel Jasper                "        System.out.println(42);\n"
5154b444495SDaniel Jasper                "      }\n"
5164b444495SDaniel Jasper                "    },\n"
5174b444495SDaniel Jasper                "    new Runnable() {\n"
5184b444495SDaniel Jasper                "      @Override\n"
5194b444495SDaniel Jasper                "      public void run() {\n"
5204b444495SDaniel Jasper                "        System.out.println(43);\n"
5214b444495SDaniel Jasper                "      }\n"
5224b444495SDaniel Jasper                "    },\n"
5234b444495SDaniel Jasper                "    someOtherParameter);");
5244b444495SDaniel Jasper }
5254b444495SDaniel Jasper 
5268354ea84SDaniel Jasper TEST_F(FormatTestJava, FormatsLambdas) {
5278354ea84SDaniel Jasper   verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;");
5288354ea84SDaniel Jasper   verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n"
5298354ea84SDaniel Jasper                "    -> aaaaaaaaaa + bbbbbbbbbb;",
5308354ea84SDaniel Jasper                getStyleWithColumns(40));
5318354ea84SDaniel Jasper   verifyFormat("Runnable someLambda = () -> DoSomething();");
5328354ea84SDaniel Jasper   verifyFormat("Runnable someLambda = () -> {\n"
5338354ea84SDaniel Jasper                "  DoSomething();\n"
5348354ea84SDaniel Jasper                "}");
5358354ea84SDaniel Jasper 
5368354ea84SDaniel Jasper   verifyFormat("Runnable someLambda =\n"
5378354ea84SDaniel Jasper                "    (int aaaaa) -> DoSomething(aaaaa);",
5388354ea84SDaniel Jasper                getStyleWithColumns(40));
5398354ea84SDaniel Jasper }
5408354ea84SDaniel Jasper 
541ff2437feSAlexander Kornienko TEST_F(FormatTestJava, BreaksStringLiterals) {
542ff2437feSAlexander Kornienko   // FIXME: String literal breaking is currently disabled for Java and JS, as it
543ff2437feSAlexander Kornienko   // requires strings to be merged using "+" which we don't support.
544ff2437feSAlexander Kornienko   EXPECT_EQ("\"some text other\";",
545ff2437feSAlexander Kornienko             format("\"some text other\";", getStyleWithColumns(14)));
546ff2437feSAlexander Kornienko }
547ff2437feSAlexander Kornienko 
548428f0b14SDaniel Jasper TEST_F(FormatTestJava, AlignsBlockComments) {
549428f0b14SDaniel Jasper   EXPECT_EQ("/*\n"
550428f0b14SDaniel Jasper             " * Really multi-line\n"
551428f0b14SDaniel Jasper             " * comment.\n"
552428f0b14SDaniel Jasper             " */\n"
553428f0b14SDaniel Jasper             "void f() {}",
554428f0b14SDaniel Jasper             format("  /*\n"
555428f0b14SDaniel Jasper                    "   * Really multi-line\n"
556428f0b14SDaniel Jasper                    "   * comment.\n"
557428f0b14SDaniel Jasper                    "   */\n"
558428f0b14SDaniel Jasper                    "  void f() {}"));
559428f0b14SDaniel Jasper }
560428f0b14SDaniel Jasper 
56122d7e6b0SKrasimir Georgiev TEST_F(FormatTestJava, KeepsDelimitersOnOwnLineInJavaDocComments) {
56222d7e6b0SKrasimir Georgiev   EXPECT_EQ("/**\n"
56322d7e6b0SKrasimir Georgiev             " * javadoc line 1\n"
56422d7e6b0SKrasimir Georgiev             " * javadoc line 2\n"
56522d7e6b0SKrasimir Georgiev             " */",
56622d7e6b0SKrasimir Georgiev             format("/** javadoc line 1\n"
56722d7e6b0SKrasimir Georgiev                    " * javadoc line 2 */"));
56822d7e6b0SKrasimir Georgiev }
56922d7e6b0SKrasimir Georgiev 
57048c94a61SNico Weber TEST_F(FormatTestJava, RetainsLogicalShifts) {
57148c94a61SNico Weber     verifyFormat("void f() {\n"
57248c94a61SNico Weber                  "  int a = 1;\n"
57348c94a61SNico Weber                  "  a >>>= 1;\n"
57448c94a61SNico Weber                  "}");
57548c94a61SNico Weber     verifyFormat("void f() {\n"
57648c94a61SNico Weber                  "  int a = 1;\n"
57748c94a61SNico Weber                  "  a = a >>> 1;\n"
57848c94a61SNico Weber                  "}");
57948c94a61SNico Weber }
58048c94a61SNico Weber 
58148c94a61SNico Weber 
582ab9db510SAlexander Kornienko } // end namespace tooling
583c58c70e2SDaniel Jasper } // end namespace clang
584