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 
34c58c70e2SDaniel Jasper   static std::string format(
35c58c70e2SDaniel Jasper       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 
57c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) {
58c58c70e2SDaniel Jasper   verifyFormat("public class SomeClass {\n"
59c58c70e2SDaniel Jasper                "  private int a;\n"
60c58c70e2SDaniel Jasper                "  private int b;\n"
61c58c70e2SDaniel Jasper                "}");
62c58c70e2SDaniel Jasper   verifyFormat("public class A {\n"
63c58c70e2SDaniel Jasper                "  class B {\n"
64c58c70e2SDaniel Jasper                "    int i;\n"
65c58c70e2SDaniel Jasper                "  }\n"
66c58c70e2SDaniel Jasper                "  class C {\n"
67c58c70e2SDaniel Jasper                "    int j;\n"
68c58c70e2SDaniel Jasper                "  }\n"
69c58c70e2SDaniel Jasper                "}");
704bf9d470SDaniel Jasper   verifyFormat("public class A extends B.C {}");
7150b4bd7cSDaniel Jasper 
72734d52b5SDaniel Jasper   verifyFormat("abstract class SomeClass\n"
73734d52b5SDaniel Jasper                "    extends SomeOtherClass implements SomeInterface {}",
74734d52b5SDaniel Jasper                getStyleWithColumns(60));
7550b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass extends SomeOtherClass\n"
76734d52b5SDaniel Jasper                "    implements SomeInterfaceeeeeeeeeeeee {}",
7750b4bd7cSDaniel Jasper                getStyleWithColumns(60));
7850b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
7950b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
8050b4bd7cSDaniel Jasper                "    implements SomeInterface {}",
8150b4bd7cSDaniel Jasper                getStyleWithColumns(40));
8250b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
8350b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
8450b4bd7cSDaniel Jasper                "    implements SomeInterface,\n"
8550b4bd7cSDaniel Jasper                "               AnotherInterface {}",
8650b4bd7cSDaniel Jasper                getStyleWithColumns(40));
87734d52b5SDaniel Jasper   verifyFormat("abstract class SomeClass\n"
88734d52b5SDaniel Jasper                "    implements SomeInterface, AnotherInterface {}",
89734d52b5SDaniel Jasper                getStyleWithColumns(60));
9039af6cd5SDaniel Jasper   verifyFormat("@SomeAnnotation()\n"
91734d52b5SDaniel Jasper                "abstract class aaaaaaaaaaaa\n"
92734d52b5SDaniel Jasper                "    extends bbbbbbbbbbbbbbb implements cccccccccccc {\n"
9339af6cd5SDaniel Jasper                "}",
9439af6cd5SDaniel Jasper                getStyleWithColumns(76));
9558fcf6dfSDaniel Jasper   verifyFormat("@SomeAnnotation()\n"
96734d52b5SDaniel Jasper                "abstract class aaaaaaaaa<a>\n"
97734d52b5SDaniel Jasper                "    extends bbbbbbbbbbbb<b> implements cccccccccccc {\n"
9858fcf6dfSDaniel Jasper                "}",
9958fcf6dfSDaniel Jasper                getStyleWithColumns(76));
100a644d7f3SNico Weber   verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n"
101a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
102a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
103a644d7f3SNico Weber                "}");
104a644d7f3SNico Weber   verifyFormat("public interface SomeInterface {\n"
105a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
106a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
107a644d7f3SNico Weber                "}");
108a644d7f3SNico Weber   verifyFormat("@interface SomeInterface {\n"
109a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
110a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
111a644d7f3SNico Weber                "}");
112a644d7f3SNico Weber   verifyFormat("public @interface SomeInterface {\n"
113a644d7f3SNico Weber                "  void doStuff(int theStuff);\n"
114a644d7f3SNico Weber                "  void doMoreStuff(int moreStuff);\n"
115a644d7f3SNico Weber                "}");
116c58c70e2SDaniel Jasper }
117c58c70e2SDaniel Jasper 
118df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) {
119df2ff002SDaniel Jasper   verifyFormat("enum SomeThing { ABC, CDE }");
120df2ff002SDaniel Jasper   verifyFormat("enum SomeThing {\n"
121df2ff002SDaniel Jasper                "  ABC,\n"
122df2ff002SDaniel Jasper                "  CDE,\n"
123df2ff002SDaniel Jasper                "}");
124df2ff002SDaniel Jasper   verifyFormat("public class SomeClass {\n"
125df2ff002SDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
126df2ff002SDaniel Jasper                "  void f() {\n"
127df2ff002SDaniel Jasper                "  }\n"
128df2ff002SDaniel Jasper                "}");
1296be0f55dSDaniel Jasper   verifyFormat("public class SomeClass implements SomeInterface {\n"
1306be0f55dSDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
1316be0f55dSDaniel Jasper                "  void f() {\n"
1326be0f55dSDaniel Jasper                "  }\n"
1336be0f55dSDaniel Jasper                "}");
1346be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1356be0f55dSDaniel Jasper                "  ABC,\n"
1366be0f55dSDaniel Jasper                "  CDE;\n"
1376be0f55dSDaniel Jasper                "  void f() {\n"
1386be0f55dSDaniel Jasper                "  }\n"
1396be0f55dSDaniel Jasper                "}");
1406be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1416be0f55dSDaniel Jasper                "  ABC(1, \"ABC\"),\n"
1426be0f55dSDaniel Jasper                "  CDE(2, \"CDE\");\n"
1436be0f55dSDaniel Jasper                "  Something(int i, String s) {\n"
1446be0f55dSDaniel Jasper                "  }\n"
1456be0f55dSDaniel Jasper                "}");
1466be0f55dSDaniel Jasper   verifyFormat("enum SomeThing {\n"
1476be0f55dSDaniel Jasper                "  ABC(new int[]{1, 2}),\n"
1486be0f55dSDaniel Jasper                "  CDE(new int[]{2, 3});\n"
1496be0f55dSDaniel Jasper                "  Something(int[] i) {\n"
1506be0f55dSDaniel Jasper                "  }\n"
1516be0f55dSDaniel Jasper                "}");
1526be0f55dSDaniel Jasper   verifyFormat("public enum SomeThing {\n"
1536be0f55dSDaniel Jasper                "  ABC {\n"
1546be0f55dSDaniel Jasper                "    public String toString() {\n"
1556be0f55dSDaniel Jasper                "      return \"ABC\";\n"
1566be0f55dSDaniel Jasper                "    }\n"
1576be0f55dSDaniel Jasper                "  },\n"
1586be0f55dSDaniel Jasper                "  CDE {\n"
1596be0f55dSDaniel Jasper                "    @Override\n"
1606be0f55dSDaniel Jasper                "    public String toString() {\n"
1616be0f55dSDaniel Jasper                "      return \"CDE\";\n"
1626be0f55dSDaniel Jasper                "    }\n"
1636be0f55dSDaniel Jasper                "  };\n"
1646be0f55dSDaniel Jasper                "  public void f() {\n"
1656be0f55dSDaniel Jasper                "  }\n"
1666be0f55dSDaniel Jasper                "}");
167*ccb68b48SDaniel Jasper   verifyFormat("private enum SomeEnum implements Foo<?, B> {\n"
168*ccb68b48SDaniel Jasper                "  ABC {\n"
169*ccb68b48SDaniel Jasper                "    @Override\n"
170*ccb68b48SDaniel Jasper                "    public String toString() {\n"
171*ccb68b48SDaniel Jasper                "      return \"ABC\";\n"
172*ccb68b48SDaniel Jasper                "    }\n"
173*ccb68b48SDaniel Jasper                "  },\n"
174*ccb68b48SDaniel Jasper                "  CDE {\n"
175*ccb68b48SDaniel Jasper                "    @Override\n"
176*ccb68b48SDaniel Jasper                "    public String toString() {\n"
177*ccb68b48SDaniel Jasper                "      return \"CDE\";\n"
178*ccb68b48SDaniel Jasper                "    }\n"
179*ccb68b48SDaniel Jasper                "  };\n"
180*ccb68b48SDaniel Jasper                "}");
181df2ff002SDaniel Jasper }
182df2ff002SDaniel Jasper 
183f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) {
184f26c755dSDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
185e003b78eSDaniel Jasper                "    throws LooooooooooooooooooooooooooooongException {\n}");
186f26c755dSDaniel Jasper }
187f26c755dSDaniel Jasper 
188fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) {
189fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
190fab69ff0SDaniel Jasper                "public String toString() {\n}");
191fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
192fab69ff0SDaniel Jasper                "@Nullable\n"
193fab69ff0SDaniel Jasper                "public String getNameIfPresent() {\n}");
194f1f0c356SDaniel Jasper 
195f1f0c356SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
196f1f0c356SDaniel Jasper                "public void doSomething() {\n}");
197d78c4223SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
198d78c4223SDaniel Jasper                "@Author(name = \"abc\")\n"
199d78c4223SDaniel Jasper                "public void doSomething() {\n}");
200f1f0c356SDaniel Jasper 
201c7d024acSDaniel Jasper   verifyFormat("DoSomething(new A() {\n"
202c7d024acSDaniel Jasper                "  @Override\n"
203c7d024acSDaniel Jasper                "  public String toString() {\n"
204c7d024acSDaniel Jasper                "  }\n"
205c7d024acSDaniel Jasper                "});");
206c7d024acSDaniel Jasper 
207e9ab42dfSDaniel Jasper   verifyFormat("void SomeFunction(@Nullable String something) {\n"
208e9ab42dfSDaniel Jasper                "}");
209e9ab42dfSDaniel Jasper 
210fab69ff0SDaniel Jasper   verifyFormat("@Partial @Mock DataLoader loader;");
211fd68191dSDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
212fd68191dSDaniel Jasper                "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
213e9ab42dfSDaniel Jasper 
214e9ab42dfSDaniel Jasper   verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n"
215e9ab42dfSDaniel Jasper                "private static final long something = 0L;");
216fab69ff0SDaniel Jasper }
217fab69ff0SDaniel Jasper 
21816b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) {
21916b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
22016b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
22116b107e9SDaniel Jasper   verifyFormat("Iterable<? extends SomeObject> a;");
2225ffcb7feSDaniel Jasper 
2235ffcb7feSDaniel Jasper   verifyFormat("A.<B>doSomething();");
2247bd618f5SDaniel Jasper 
2257bd618f5SDaniel Jasper   verifyFormat("@Override\n"
226db9a7a2fSDaniel Jasper                "public Map<String, ?> getAll() {\n}");
227db9a7a2fSDaniel Jasper 
22809f6abe8SDaniel Jasper   verifyFormat("public <R> ArrayList<R> get() {\n}");
2294bfa736fSDaniel Jasper   verifyFormat("protected <R> ArrayList<R> get() {\n}");
2304bfa736fSDaniel Jasper   verifyFormat("private <R> ArrayList<R> get() {\n}");
231db9a7a2fSDaniel Jasper   verifyFormat("public static <R> ArrayList<R> get() {\n}");
232f056f45bSDaniel Jasper   verifyFormat("<T extends B> T getInstance(Class<T> type);");
23361d81973SDaniel Jasper   verifyFormat("Function<F, ? extends T> function;");
2346761b42bSDaniel Jasper 
2356761b42bSDaniel Jasper   verifyFormat("private Foo<X, Y>[] foos;");
2366761b42bSDaniel Jasper   verifyFormat("Foo<X, Y>[] foos = this.foos;");
23716b107e9SDaniel Jasper }
23816b107e9SDaniel Jasper 
239c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) {
240c0126864SDaniel Jasper   verifyFormat("String someString = \"abc\"\n"
241c0126864SDaniel Jasper                "                    + \"cde\";");
242c0126864SDaniel Jasper }
243c0126864SDaniel Jasper 
244a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) {
245a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
246a3ddf86dSDaniel Jasper                "  Something();\n"
247a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
248a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
249a3ddf86dSDaniel Jasper                "}");
250a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
251a3ddf86dSDaniel Jasper                "  Something();\n"
252a3ddf86dSDaniel Jasper                "} finally {\n"
253a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
254a3ddf86dSDaniel Jasper                "}");
255a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
256a3ddf86dSDaniel Jasper                "  Something();\n"
257a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
258a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
259a3ddf86dSDaniel Jasper                "} finally {\n"
260a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
261a3ddf86dSDaniel Jasper                "}");
262a3ddf86dSDaniel Jasper 
263a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
264a3ddf86dSDaniel Jasper                "  Something();\n"
265a3ddf86dSDaniel Jasper                "} catch (SomeException | OtherException e) {\n"
266a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
267a3ddf86dSDaniel Jasper                "}");
268a3ddf86dSDaniel Jasper }
269a3ddf86dSDaniel Jasper 
270b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) {
271b9d3db6bSDaniel Jasper   verifyFormat("synchronized (mData) {\n"
272b9d3db6bSDaniel Jasper                "  // ...\n"
273b9d3db6bSDaniel Jasper                "}");
274b9d3db6bSDaniel Jasper }
275b9d3db6bSDaniel Jasper 
2765e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) {
2775e7be1d5SDaniel Jasper   verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;",
2785e7be1d5SDaniel Jasper                getStyleWithColumns(50));
2795e7be1d5SDaniel Jasper }
2805e7be1d5SDaniel Jasper 
2813aa9a6a1SDaniel Jasper TEST_F(FormatTestJava, MethodDeclarations) {
2823aa9a6a1SDaniel Jasper   verifyFormat("void methodName(Object arg1,\n"
2833aa9a6a1SDaniel Jasper                "    Object arg2, Object arg3) {\n"
2843aa9a6a1SDaniel Jasper                "}",
2853aa9a6a1SDaniel Jasper                getStyleWithColumns(40));
2863aa9a6a1SDaniel Jasper   verifyFormat("void methodName(\n"
2873aa9a6a1SDaniel Jasper                "    Object arg1, Object arg2) {\n"
2883aa9a6a1SDaniel Jasper                "}",
2893aa9a6a1SDaniel Jasper                getStyleWithColumns(40));
2903aa9a6a1SDaniel Jasper }
2913aa9a6a1SDaniel Jasper 
292fe2cf667SDaniel Jasper TEST_F(FormatTestJava, CppKeywords) {
293fe2cf667SDaniel Jasper   verifyFormat("public void union(Type a, Type b);");
294fe2cf667SDaniel Jasper   verifyFormat("public void struct(Object o);");
295fe2cf667SDaniel Jasper   verifyFormat("public void delete(Object o);");
296fe2cf667SDaniel Jasper }
297fe2cf667SDaniel Jasper 
298c58c70e2SDaniel Jasper } // end namespace tooling
299c58c70e2SDaniel Jasper } // end namespace clang
300