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