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)); 8039af6cd5SDaniel Jasper verifyFormat("@SomeAnnotation()\n" 8139af6cd5SDaniel Jasper "abstract class aaaaaaaaaaaa extends bbbbbbbbbbbbbbb\n" 8239af6cd5SDaniel Jasper " implements cccccccccccc {\n" 8339af6cd5SDaniel Jasper "}", 8439af6cd5SDaniel Jasper getStyleWithColumns(76)); 8558fcf6dfSDaniel Jasper verifyFormat("@SomeAnnotation()\n" 8658fcf6dfSDaniel Jasper "abstract class aaaaaaaaa<a> extends bbbbbbbbbbbb<b>\n" 8758fcf6dfSDaniel Jasper " implements cccccccccccc {\n" 8858fcf6dfSDaniel Jasper "}", 8958fcf6dfSDaniel Jasper getStyleWithColumns(76)); 90a644d7f3SNico Weber verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n" 91a644d7f3SNico Weber " void doStuff(int theStuff);\n" 92a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 93a644d7f3SNico Weber "}"); 94a644d7f3SNico Weber verifyFormat("public interface SomeInterface {\n" 95a644d7f3SNico Weber " void doStuff(int theStuff);\n" 96a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 97a644d7f3SNico Weber "}"); 98a644d7f3SNico Weber verifyFormat("@interface SomeInterface {\n" 99a644d7f3SNico Weber " void doStuff(int theStuff);\n" 100a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 101a644d7f3SNico Weber "}"); 102a644d7f3SNico Weber verifyFormat("public @interface SomeInterface {\n" 103a644d7f3SNico Weber " void doStuff(int theStuff);\n" 104a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 105a644d7f3SNico Weber "}"); 106c58c70e2SDaniel Jasper } 107c58c70e2SDaniel Jasper 108df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) { 109df2ff002SDaniel Jasper verifyFormat("enum SomeThing { ABC, CDE }"); 110df2ff002SDaniel Jasper verifyFormat("enum SomeThing {\n" 111df2ff002SDaniel Jasper " ABC,\n" 112df2ff002SDaniel Jasper " CDE,\n" 113df2ff002SDaniel Jasper "}"); 114df2ff002SDaniel Jasper verifyFormat("public class SomeClass {\n" 115df2ff002SDaniel Jasper " enum SomeThing { ABC, CDE }\n" 116df2ff002SDaniel Jasper " void f() {\n" 117df2ff002SDaniel Jasper " }\n" 118df2ff002SDaniel Jasper "}"); 119*6be0f55dSDaniel Jasper verifyFormat("public class SomeClass implements SomeInterface {\n" 120*6be0f55dSDaniel Jasper " enum SomeThing { ABC, CDE }\n" 121*6be0f55dSDaniel Jasper " void f() {\n" 122*6be0f55dSDaniel Jasper " }\n" 123*6be0f55dSDaniel Jasper "}"); 124*6be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 125*6be0f55dSDaniel Jasper " ABC,\n" 126*6be0f55dSDaniel Jasper " CDE;\n" 127*6be0f55dSDaniel Jasper " void f() {\n" 128*6be0f55dSDaniel Jasper " }\n" 129*6be0f55dSDaniel Jasper "}"); 130*6be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 131*6be0f55dSDaniel Jasper " ABC(1, \"ABC\"),\n" 132*6be0f55dSDaniel Jasper " CDE(2, \"CDE\");\n" 133*6be0f55dSDaniel Jasper " Something(int i, String s) {\n" 134*6be0f55dSDaniel Jasper " }\n" 135*6be0f55dSDaniel Jasper "}"); 136*6be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 137*6be0f55dSDaniel Jasper " ABC(new int[]{1, 2}),\n" 138*6be0f55dSDaniel Jasper " CDE(new int[]{2, 3});\n" 139*6be0f55dSDaniel Jasper " Something(int[] i) {\n" 140*6be0f55dSDaniel Jasper " }\n" 141*6be0f55dSDaniel Jasper "}"); 142*6be0f55dSDaniel Jasper verifyFormat("public enum SomeThing {\n" 143*6be0f55dSDaniel Jasper " ABC {\n" 144*6be0f55dSDaniel Jasper " public String toString() {\n" 145*6be0f55dSDaniel Jasper " return \"ABC\";\n" 146*6be0f55dSDaniel Jasper " }\n" 147*6be0f55dSDaniel Jasper " },\n" 148*6be0f55dSDaniel Jasper " CDE {\n" 149*6be0f55dSDaniel Jasper " @Override\n" 150*6be0f55dSDaniel Jasper " public String toString() {\n" 151*6be0f55dSDaniel Jasper " return \"CDE\";\n" 152*6be0f55dSDaniel Jasper " }\n" 153*6be0f55dSDaniel Jasper " };\n" 154*6be0f55dSDaniel Jasper " public void f() {\n" 155*6be0f55dSDaniel Jasper " }\n" 156*6be0f55dSDaniel Jasper "}"); 157df2ff002SDaniel Jasper } 158df2ff002SDaniel Jasper 159f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) { 160f26c755dSDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" 161e003b78eSDaniel Jasper " throws LooooooooooooooooooooooooooooongException {\n}"); 162f26c755dSDaniel Jasper } 163f26c755dSDaniel Jasper 164fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) { 165fab69ff0SDaniel Jasper verifyFormat("@Override\n" 166fab69ff0SDaniel Jasper "public String toString() {\n}"); 167fab69ff0SDaniel Jasper verifyFormat("@Override\n" 168fab69ff0SDaniel Jasper "@Nullable\n" 169fab69ff0SDaniel Jasper "public String getNameIfPresent() {\n}"); 170f1f0c356SDaniel Jasper 171f1f0c356SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" 172f1f0c356SDaniel Jasper "public void doSomething() {\n}"); 173d78c4223SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" 174d78c4223SDaniel Jasper "@Author(name = \"abc\")\n" 175d78c4223SDaniel Jasper "public void doSomething() {\n}"); 176f1f0c356SDaniel Jasper 177c7d024acSDaniel Jasper verifyFormat("DoSomething(new A() {\n" 178c7d024acSDaniel Jasper " @Override\n" 179c7d024acSDaniel Jasper " public String toString() {\n" 180c7d024acSDaniel Jasper " }\n" 181c7d024acSDaniel Jasper "});"); 182c7d024acSDaniel Jasper 183e9ab42dfSDaniel Jasper verifyFormat("void SomeFunction(@Nullable String something) {\n" 184e9ab42dfSDaniel Jasper "}"); 185e9ab42dfSDaniel Jasper 186fab69ff0SDaniel Jasper verifyFormat("@Partial @Mock DataLoader loader;"); 187fd68191dSDaniel Jasper verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" 188fd68191dSDaniel Jasper "public static int iiiiiiiiiiiiiiiiiiiiiiii;"); 189e9ab42dfSDaniel Jasper 190e9ab42dfSDaniel Jasper verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" 191e9ab42dfSDaniel Jasper "private static final long something = 0L;"); 192fab69ff0SDaniel Jasper } 193fab69ff0SDaniel Jasper 19416b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) { 19516b107e9SDaniel Jasper verifyFormat("Iterable<?> a;"); 19616b107e9SDaniel Jasper verifyFormat("Iterable<?> a;"); 19716b107e9SDaniel Jasper verifyFormat("Iterable<? extends SomeObject> a;"); 1985ffcb7feSDaniel Jasper 1995ffcb7feSDaniel Jasper verifyFormat("A.<B>doSomething();"); 2007bd618f5SDaniel Jasper 2017bd618f5SDaniel Jasper verifyFormat("@Override\n" 202db9a7a2fSDaniel Jasper "public Map<String, ?> getAll() {\n}"); 203db9a7a2fSDaniel Jasper 204db9a7a2fSDaniel Jasper verifyFormat("public static <R> ArrayList<R> get() {\n}"); 205f056f45bSDaniel Jasper verifyFormat("<T extends B> T getInstance(Class<T> type);"); 20616b107e9SDaniel Jasper } 20716b107e9SDaniel Jasper 208c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) { 209c0126864SDaniel Jasper verifyFormat("String someString = \"abc\"\n" 210c0126864SDaniel Jasper " + \"cde\";"); 211c0126864SDaniel Jasper } 212c0126864SDaniel Jasper 213a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) { 214a3ddf86dSDaniel Jasper verifyFormat("try {\n" 215a3ddf86dSDaniel Jasper " Something();\n" 216a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n" 217a3ddf86dSDaniel Jasper " HandleException(e);\n" 218a3ddf86dSDaniel Jasper "}"); 219a3ddf86dSDaniel Jasper verifyFormat("try {\n" 220a3ddf86dSDaniel Jasper " Something();\n" 221a3ddf86dSDaniel Jasper "} finally {\n" 222a3ddf86dSDaniel Jasper " AlwaysDoThis();\n" 223a3ddf86dSDaniel Jasper "}"); 224a3ddf86dSDaniel Jasper verifyFormat("try {\n" 225a3ddf86dSDaniel Jasper " Something();\n" 226a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n" 227a3ddf86dSDaniel Jasper " HandleException(e);\n" 228a3ddf86dSDaniel Jasper "} finally {\n" 229a3ddf86dSDaniel Jasper " AlwaysDoThis();\n" 230a3ddf86dSDaniel Jasper "}"); 231a3ddf86dSDaniel Jasper 232a3ddf86dSDaniel Jasper verifyFormat("try {\n" 233a3ddf86dSDaniel Jasper " Something();\n" 234a3ddf86dSDaniel Jasper "} catch (SomeException | OtherException e) {\n" 235a3ddf86dSDaniel Jasper " HandleException(e);\n" 236a3ddf86dSDaniel Jasper "}"); 237a3ddf86dSDaniel Jasper } 238a3ddf86dSDaniel Jasper 239b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) { 240b9d3db6bSDaniel Jasper verifyFormat("synchronized (mData) {\n" 241b9d3db6bSDaniel Jasper " // ...\n" 242b9d3db6bSDaniel Jasper "}"); 243b9d3db6bSDaniel Jasper } 244b9d3db6bSDaniel Jasper 2455e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) { 2465e7be1d5SDaniel Jasper verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;", 2475e7be1d5SDaniel Jasper getStyleWithColumns(50)); 2485e7be1d5SDaniel Jasper } 2495e7be1d5SDaniel Jasper 250c58c70e2SDaniel Jasper } // end namespace tooling 251c58c70e2SDaniel Jasper } // end namespace clang 252