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 
53c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) {
54c58c70e2SDaniel Jasper   verifyFormat("public class SomeClass {\n"
55c58c70e2SDaniel Jasper                "  private int a;\n"
56c58c70e2SDaniel Jasper                "  private int b;\n"
57c58c70e2SDaniel Jasper                "}");
58c58c70e2SDaniel Jasper   verifyFormat("public class A {\n"
59c58c70e2SDaniel Jasper                "  class B {\n"
60c58c70e2SDaniel Jasper                "    int i;\n"
61c58c70e2SDaniel Jasper                "  }\n"
62c58c70e2SDaniel Jasper                "  class C {\n"
63c58c70e2SDaniel Jasper                "    int j;\n"
64c58c70e2SDaniel Jasper                "  }\n"
65c58c70e2SDaniel Jasper                "}");
664bf9d470SDaniel Jasper   verifyFormat("public class A extends B.C {}");
6750b4bd7cSDaniel Jasper 
6850b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass extends SomeOtherClass\n"
6950b4bd7cSDaniel Jasper                "    implements SomeInterface {}",
7050b4bd7cSDaniel Jasper                getStyleWithColumns(60));
7150b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
7250b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
7350b4bd7cSDaniel Jasper                "    implements SomeInterface {}",
7450b4bd7cSDaniel Jasper                getStyleWithColumns(40));
7550b4bd7cSDaniel Jasper   verifyFormat("abstract class SomeClass\n"
7650b4bd7cSDaniel Jasper                "    extends SomeOtherClass\n"
7750b4bd7cSDaniel Jasper                "    implements SomeInterface,\n"
7850b4bd7cSDaniel Jasper                "               AnotherInterface {}",
7950b4bd7cSDaniel Jasper                getStyleWithColumns(40));
80c58c70e2SDaniel Jasper }
81c58c70e2SDaniel Jasper 
82*df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) {
83*df2ff002SDaniel Jasper   verifyFormat("enum SomeThing { ABC, CDE }");
84*df2ff002SDaniel Jasper   verifyFormat("enum SomeThing {\n"
85*df2ff002SDaniel Jasper                "  ABC,\n"
86*df2ff002SDaniel Jasper                "  CDE,\n"
87*df2ff002SDaniel Jasper                "}");
88*df2ff002SDaniel Jasper   verifyFormat("public class SomeClass {\n"
89*df2ff002SDaniel Jasper                "  enum SomeThing { ABC, CDE }\n"
90*df2ff002SDaniel Jasper                "  void f() {\n"
91*df2ff002SDaniel Jasper                "  }\n"
92*df2ff002SDaniel Jasper                "}");
93*df2ff002SDaniel Jasper }
94*df2ff002SDaniel Jasper 
95f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) {
96f26c755dSDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
97e003b78eSDaniel Jasper                "    throws LooooooooooooooooooooooooooooongException {\n}");
98f26c755dSDaniel Jasper }
99f26c755dSDaniel Jasper 
100fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) {
101fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
102fab69ff0SDaniel Jasper                "public String toString() {\n}");
103fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
104fab69ff0SDaniel Jasper                "@Nullable\n"
105fab69ff0SDaniel Jasper                "public String getNameIfPresent() {\n}");
106f1f0c356SDaniel Jasper 
107f1f0c356SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
108f1f0c356SDaniel Jasper                "public void doSomething() {\n}");
109d78c4223SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
110d78c4223SDaniel Jasper                "@Author(name = \"abc\")\n"
111d78c4223SDaniel Jasper                "public void doSomething() {\n}");
112f1f0c356SDaniel Jasper 
113c7d024acSDaniel Jasper   verifyFormat("DoSomething(new A() {\n"
114c7d024acSDaniel Jasper                "  @Override\n"
115c7d024acSDaniel Jasper                "  public String toString() {\n"
116c7d024acSDaniel Jasper                "  }\n"
117c7d024acSDaniel Jasper                "});");
118c7d024acSDaniel Jasper 
119e9ab42dfSDaniel Jasper   verifyFormat("void SomeFunction(@Nullable String something) {\n"
120e9ab42dfSDaniel Jasper                "}");
121e9ab42dfSDaniel Jasper 
122fab69ff0SDaniel Jasper   verifyFormat("@Partial @Mock DataLoader loader;");
123fd68191dSDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
124fd68191dSDaniel Jasper                "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
125e9ab42dfSDaniel Jasper 
126e9ab42dfSDaniel Jasper   verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n"
127e9ab42dfSDaniel Jasper                "private static final long something = 0L;");
128fab69ff0SDaniel Jasper }
129fab69ff0SDaniel Jasper 
13016b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) {
13116b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
13216b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
13316b107e9SDaniel Jasper   verifyFormat("Iterable<? extends SomeObject> a;");
1345ffcb7feSDaniel Jasper 
1355ffcb7feSDaniel Jasper   verifyFormat("A.<B>doSomething();");
1367bd618f5SDaniel Jasper 
1377bd618f5SDaniel Jasper   verifyFormat("@Override\n"
1387bd618f5SDaniel Jasper                "public Map<String, ?> getAll() {\n"
1397bd618f5SDaniel Jasper                "}");
14016b107e9SDaniel Jasper }
14116b107e9SDaniel Jasper 
142c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) {
143c0126864SDaniel Jasper   verifyFormat("String someString = \"abc\"\n"
144c0126864SDaniel Jasper                "                    + \"cde\";");
145c0126864SDaniel Jasper }
146c0126864SDaniel Jasper 
147a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) {
148a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
149a3ddf86dSDaniel Jasper                "  Something();\n"
150a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
151a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
152a3ddf86dSDaniel Jasper                "}");
153a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
154a3ddf86dSDaniel Jasper                "  Something();\n"
155a3ddf86dSDaniel Jasper                "} finally {\n"
156a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
157a3ddf86dSDaniel Jasper                "}");
158a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
159a3ddf86dSDaniel Jasper                "  Something();\n"
160a3ddf86dSDaniel Jasper                "} catch (SomeException e) {\n"
161a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
162a3ddf86dSDaniel Jasper                "} finally {\n"
163a3ddf86dSDaniel Jasper                "  AlwaysDoThis();\n"
164a3ddf86dSDaniel Jasper                "}");
165a3ddf86dSDaniel Jasper 
166a3ddf86dSDaniel Jasper   verifyFormat("try {\n"
167a3ddf86dSDaniel Jasper                "  Something();\n"
168a3ddf86dSDaniel Jasper                "} catch (SomeException | OtherException e) {\n"
169a3ddf86dSDaniel Jasper                "  HandleException(e);\n"
170a3ddf86dSDaniel Jasper                "}");
171a3ddf86dSDaniel Jasper }
172a3ddf86dSDaniel Jasper 
173b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) {
174b9d3db6bSDaniel Jasper   verifyFormat("synchronized (mData) {\n"
175b9d3db6bSDaniel Jasper                "  // ...\n"
176b9d3db6bSDaniel Jasper                "}");
177b9d3db6bSDaniel Jasper }
178b9d3db6bSDaniel Jasper 
1795e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) {
1805e7be1d5SDaniel Jasper   verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;",
1815e7be1d5SDaniel Jasper                getStyleWithColumns(50));
1825e7be1d5SDaniel Jasper }
1835e7be1d5SDaniel Jasper 
184c58c70e2SDaniel Jasper } // end namespace tooling
185c58c70e2SDaniel Jasper } // end namespace clang
186