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 
40c58c70e2SDaniel Jasper   static void verifyFormat(
41c58c70e2SDaniel Jasper       llvm::StringRef Code,
42c58c70e2SDaniel Jasper       const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) {
43c58c70e2SDaniel Jasper     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
44c58c70e2SDaniel Jasper   }
45c58c70e2SDaniel Jasper };
46c58c70e2SDaniel Jasper 
47c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) {
48c58c70e2SDaniel Jasper   verifyFormat("public class SomeClass {\n"
49c58c70e2SDaniel Jasper                "  private int a;\n"
50c58c70e2SDaniel Jasper                "  private int b;\n"
51c58c70e2SDaniel Jasper                "}");
52c58c70e2SDaniel Jasper   verifyFormat("public class A {\n"
53c58c70e2SDaniel Jasper                "  class B {\n"
54c58c70e2SDaniel Jasper                "    int i;\n"
55c58c70e2SDaniel Jasper                "  }\n"
56c58c70e2SDaniel Jasper                "  class C {\n"
57c58c70e2SDaniel Jasper                "    int j;\n"
58c58c70e2SDaniel Jasper                "  }\n"
59c58c70e2SDaniel Jasper                "}");
604bf9d470SDaniel Jasper   verifyFormat("public class A extends B.C {}");
61c58c70e2SDaniel Jasper }
62c58c70e2SDaniel Jasper 
63f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) {
64f26c755dSDaniel Jasper   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
65*e003b78eSDaniel Jasper                "    throws LooooooooooooooooooooooooooooongException {\n}");
66f26c755dSDaniel Jasper }
67f26c755dSDaniel Jasper 
68fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) {
69fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
70fab69ff0SDaniel Jasper                "public String toString() {\n}");
71fab69ff0SDaniel Jasper   verifyFormat("@Override\n"
72fab69ff0SDaniel Jasper                "@Nullable\n"
73fab69ff0SDaniel Jasper                "public String getNameIfPresent() {\n}");
74f1f0c356SDaniel Jasper 
75f1f0c356SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
76f1f0c356SDaniel Jasper                "public void doSomething() {\n}");
77d78c4223SDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
78d78c4223SDaniel Jasper                "@Author(name = \"abc\")\n"
79d78c4223SDaniel Jasper                "public void doSomething() {\n}");
80f1f0c356SDaniel Jasper 
81c7d024acSDaniel Jasper   verifyFormat("DoSomething(new A() {\n"
82c7d024acSDaniel Jasper                "  @Override\n"
83c7d024acSDaniel Jasper                "  public String toString() {\n"
84c7d024acSDaniel Jasper                "  }\n"
85c7d024acSDaniel Jasper                "});");
86c7d024acSDaniel Jasper 
87fab69ff0SDaniel Jasper   verifyFormat("@Partial @Mock DataLoader loader;");
88fd68191dSDaniel Jasper   verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
89fd68191dSDaniel Jasper                "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
90fab69ff0SDaniel Jasper }
91fab69ff0SDaniel Jasper 
9216b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) {
9316b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
9416b107e9SDaniel Jasper   verifyFormat("Iterable<?> a;");
9516b107e9SDaniel Jasper   verifyFormat("Iterable<? extends SomeObject> a;");
965ffcb7feSDaniel Jasper 
975ffcb7feSDaniel Jasper   verifyFormat("A.<B>doSomething();");
9816b107e9SDaniel Jasper }
9916b107e9SDaniel Jasper 
100c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) {
101c0126864SDaniel Jasper   verifyFormat("String someString = \"abc\"\n"
102c0126864SDaniel Jasper                "                    + \"cde\";");
103c0126864SDaniel Jasper }
104c0126864SDaniel Jasper 
105c58c70e2SDaniel Jasper } // end namespace tooling
106c58c70e2SDaniel Jasper } // end namespace clang
107