Home | History | Annotate | Download | only in Format
      1 //===- unittest/Format/FormatTestJava.cpp - Formatting tests for Java -----===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "FormatTestUtils.h"
     11 #include "clang/Format/Format.h"
     12 #include "llvm/Support/Debug.h"
     13 #include "gtest/gtest.h"
     14 
     15 #define DEBUG_TYPE "format-test"
     16 
     17 namespace clang {
     18 namespace format {
     19 
     20 class FormatTestJava : public ::testing::Test {
     21 protected:
     22   static std::string format(llvm::StringRef Code, unsigned Offset,
     23                             unsigned Length, const FormatStyle &Style) {
     24     DEBUG(llvm::errs() << "---\n");
     25     DEBUG(llvm::errs() << Code << "\n\n");
     26     std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length));
     27     tooling::Replacements Replaces = reformat(Style, Code, Ranges);
     28     std::string Result = applyAllReplacements(Code, Replaces);
     29     EXPECT_NE("", Result);
     30     DEBUG(llvm::errs() << "\n" << Result << "\n\n");
     31     return Result;
     32   }
     33 
     34   static std::string format(
     35       llvm::StringRef Code,
     36       const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) {
     37     return format(Code, 0, Code.size(), Style);
     38   }
     39 
     40   static FormatStyle getStyleWithColumns(unsigned ColumnLimit) {
     41     FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java);
     42     Style.ColumnLimit = ColumnLimit;
     43     return Style;
     44   }
     45 
     46   static void verifyFormat(
     47       llvm::StringRef Code,
     48       const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) {
     49     EXPECT_EQ(Code.str(), format(test::messUp(Code), Style));
     50   }
     51 };
     52 
     53 TEST_F(FormatTestJava, NoAlternativeOperatorNames) {
     54   verifyFormat("someObject.and();");
     55 }
     56 
     57 TEST_F(FormatTestJava, UnderstandsCasts) {
     58   verifyFormat("a[b >> 1] = (byte) (c() << 4);");
     59 }
     60 
     61 TEST_F(FormatTestJava, FormatsInstanceOfLikeOperators) {
     62   FormatStyle Style = getStyleWithColumns(50);
     63   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n"
     64                "    instanceof bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
     65                Style);
     66   Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None;
     67   verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa instanceof\n"
     68                "    bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;",
     69                Style);
     70 }
     71 
     72 TEST_F(FormatTestJava, Chromium) {
     73   verifyFormat("class SomeClass {\n"
     74                "    void f() {}\n"
     75                "    int g() {\n"
     76                "        return 0;\n"
     77                "    }\n"
     78                "    void h() {\n"
     79                "        while (true) f();\n"
     80                "        for (;;) f();\n"
     81                "        if (true) f();\n"
     82                "    }\n"
     83                "}",
     84                getChromiumStyle(FormatStyle::LK_Java));
     85 }
     86 
     87 TEST_F(FormatTestJava, QualifiedNames) {
     88   verifyFormat("public some.package.Type someFunction( // comment\n"
     89                "    int parameter) {}");
     90 }
     91 
     92 TEST_F(FormatTestJava, ClassKeyword) {
     93   verifyFormat("SomeClass.class.getName();");
     94   verifyFormat("Class c = SomeClass.class;");
     95 }
     96 
     97 TEST_F(FormatTestJava, ClassDeclarations) {
     98   verifyFormat("public class SomeClass {\n"
     99                "  private int a;\n"
    100                "  private int b;\n"
    101                "}");
    102   verifyFormat("public class A {\n"
    103                "  class B {\n"
    104                "    int i;\n"
    105                "  }\n"
    106                "  class C {\n"
    107                "    int j;\n"
    108                "  }\n"
    109                "}");
    110   verifyFormat("public class A extends B.C {}");
    111 
    112   verifyFormat("abstract class SomeClass\n"
    113                "    extends SomeOtherClass implements SomeInterface {}",
    114                getStyleWithColumns(60));
    115   verifyFormat("abstract class SomeClass extends SomeOtherClass\n"
    116                "    implements SomeInterfaceeeeeeeeeeeee {}",
    117                getStyleWithColumns(60));
    118   verifyFormat("abstract class SomeClass\n"
    119                "    extends SomeOtherClass\n"
    120                "    implements SomeInterface {}",
    121                getStyleWithColumns(40));
    122   verifyFormat("abstract class SomeClass\n"
    123                "    extends SomeOtherClass\n"
    124                "    implements SomeInterface,\n"
    125                "               AnotherInterface {}",
    126                getStyleWithColumns(40));
    127   verifyFormat("abstract class SomeClass\n"
    128                "    implements SomeInterface, AnotherInterface {}",
    129                getStyleWithColumns(60));
    130   verifyFormat("@SomeAnnotation()\n"
    131                "abstract class aaaaaaaaaaaa\n"
    132                "    extends bbbbbbbbbbbbbbb implements cccccccccccc {}",
    133                getStyleWithColumns(76));
    134   verifyFormat("@SomeAnnotation()\n"
    135                "abstract class aaaaaaaaa<a>\n"
    136                "    extends bbbbbbbbbbbb<b> implements cccccccccccc {}",
    137                getStyleWithColumns(76));
    138   verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n"
    139                "  void doStuff(int theStuff);\n"
    140                "  void doMoreStuff(int moreStuff);\n"
    141                "}");
    142   verifyFormat("public interface SomeInterface {\n"
    143                "  void doStuff(int theStuff);\n"
    144                "  void doMoreStuff(int moreStuff);\n"
    145                "}");
    146   verifyFormat("@interface SomeInterface {\n"
    147                "  void doStuff(int theStuff);\n"
    148                "  void doMoreStuff(int moreStuff);\n"
    149                "}");
    150   verifyFormat("public @interface SomeInterface {\n"
    151                "  void doStuff(int theStuff);\n"
    152                "  void doMoreStuff(int moreStuff);\n"
    153                "}");
    154 }
    155 
    156 TEST_F(FormatTestJava, AnonymousClasses) {
    157   verifyFormat("return new A() {\n"
    158                "  public String toString() {\n"
    159                "    return \"NotReallyA\";\n"
    160                "  }\n"
    161                "};");
    162   verifyFormat("A a = new A() {\n"
    163                "  public String toString() {\n"
    164                "    return \"NotReallyA\";\n"
    165                "  }\n"
    166                "};");
    167 }
    168 
    169 TEST_F(FormatTestJava, EnumDeclarations) {
    170   verifyFormat("enum SomeThing { ABC, CDE }");
    171   verifyFormat("enum SomeThing {\n"
    172                "  ABC,\n"
    173                "  CDE,\n"
    174                "}");
    175   verifyFormat("public class SomeClass {\n"
    176                "  enum SomeThing { ABC, CDE }\n"
    177                "  void f() {}\n"
    178                "}");
    179   verifyFormat("public class SomeClass implements SomeInterface {\n"
    180                "  enum SomeThing { ABC, CDE }\n"
    181                "  void f() {}\n"
    182                "}");
    183   verifyFormat("enum SomeThing {\n"
    184                "  ABC,\n"
    185                "  CDE;\n"
    186                "  void f() {}\n"
    187                "}");
    188   verifyFormat("enum SomeThing {\n"
    189                "  ABC(1, \"ABC\"),\n"
    190                "  CDE(2, \"CDE\");\n"
    191                "  Something(int i, String s) {}\n"
    192                "}");
    193   verifyFormat("enum SomeThing {\n"
    194                "  ABC(new int[] {1, 2}),\n"
    195                "  CDE(new int[] {2, 3});\n"
    196                "  Something(int[] i) {}\n"
    197                "}");
    198   verifyFormat("public enum SomeThing {\n"
    199                "  ABC {\n"
    200                "    public String toString() {\n"
    201                "      return \"ABC\";\n"
    202                "    }\n"
    203                "  },\n"
    204                "  CDE {\n"
    205                "    @Override\n"
    206                "    public String toString() {\n"
    207                "      return \"CDE\";\n"
    208                "    }\n"
    209                "  };\n"
    210                "  public void f() {}\n"
    211                "}");
    212   verifyFormat("private enum SomeEnum implements Foo<?, B> {\n"
    213                "  ABC {\n"
    214                "    @Override\n"
    215                "    public String toString() {\n"
    216                "      return \"ABC\";\n"
    217                "    }\n"
    218                "  },\n"
    219                "  CDE {\n"
    220                "    @Override\n"
    221                "    public String toString() {\n"
    222                "      return \"CDE\";\n"
    223                "    }\n"
    224                "  };\n"
    225                "}");
    226 }
    227 
    228 TEST_F(FormatTestJava, ArrayInitializers) {
    229   verifyFormat("new int[] {1, 2, 3, 4};");
    230   verifyFormat("new int[] {\n"
    231                "    1, 2, 3, 4,\n"
    232                "};");
    233 
    234   FormatStyle Style = getStyleWithColumns(65);
    235   Style.Cpp11BracedListStyle = false;
    236   verifyFormat(
    237       "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n"
    238       "  100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };",
    239       Style);
    240 }
    241 
    242 TEST_F(FormatTestJava, ThrowsDeclarations) {
    243   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
    244                "    throws LooooooooooooooooooooooooooooongException {}");
    245   verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
    246                "    throws LoooooooooongException, LooooooooooongException {}");
    247 }
    248 
    249 TEST_F(FormatTestJava, Annotations) {
    250   verifyFormat("@Override\n"
    251                "public String toString() {}");
    252   verifyFormat("@Override\n"
    253                "@Nullable\n"
    254                "public String getNameIfPresent() {}");
    255   verifyFormat("@Override // comment\n"
    256                "@Nullable\n"
    257                "public String getNameIfPresent() {}");
    258   verifyFormat("@java.lang.Override // comment\n"
    259                "@Nullable\n"
    260                "public String getNameIfPresent() {}");
    261 
    262   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
    263                "public void doSomething() {}");
    264   verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
    265                "@Author(name = \"abc\")\n"
    266                "public void doSomething() {}");
    267 
    268   verifyFormat("DoSomething(new A() {\n"
    269                "  @Override\n"
    270                "  public String toString() {}\n"
    271                "});");
    272 
    273   verifyFormat("void SomeFunction(@Nullable String something) {}");
    274   verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}");
    275 
    276   verifyFormat("@Partial @Mock DataLoader loader;");
    277   verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
    278                "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
    279 
    280   verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n"
    281                "private static final long something = 0L;");
    282   verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n"
    283                "private static final long something = 0L;");
    284   verifyFormat("@Mock\n"
    285                "DataLoader loooooooooooooooooooooooader =\n"
    286                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
    287                getStyleWithColumns(60));
    288   verifyFormat("@org.llvm.QualifiedMock\n"
    289                "DataLoader loooooooooooooooooooooooader =\n"
    290                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
    291                getStyleWithColumns(60));
    292   verifyFormat("@Test(a)\n"
    293                "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
    294                "    aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);");
    295   verifyFormat("@SomeAnnotation(\n"
    296                "    aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n"
    297                "int i;",
    298                getStyleWithColumns(50));
    299   verifyFormat("@Test\n"
    300                "ReturnType doSomething(\n"
    301                "    String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}",
    302                getStyleWithColumns(60));
    303   verifyFormat("{\n"
    304                "  boolean someFunction(\n"
    305                "      @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n"
    306                "      String bbbbbbbbbbbbbbb) {}\n"
    307                "}",
    308                getStyleWithColumns(60));
    309 }
    310 
    311 TEST_F(FormatTestJava, Generics) {
    312   verifyFormat("Iterable<?> a;");
    313   verifyFormat("Iterable<?> a;");
    314   verifyFormat("Iterable<? extends SomeObject> a;");
    315 
    316   verifyFormat("A.<B>doSomething();");
    317 
    318   verifyFormat("@Override\n"
    319                "public Map<String, ?> getAll() {}");
    320 
    321   verifyFormat("public <R> ArrayList<R> get() {}");
    322   verifyFormat("protected <R> ArrayList<R> get() {}");
    323   verifyFormat("private <R> ArrayList<R> get() {}");
    324   verifyFormat("public static <R> ArrayList<R> get() {}");
    325   verifyFormat("public static native <R> ArrayList<R> get();");
    326   verifyFormat("public final <X> Foo foo() {}");
    327   verifyFormat("public abstract <X> Foo foo();");
    328   verifyFormat("<T extends B> T getInstance(Class<T> type);");
    329   verifyFormat("Function<F, ? extends T> function;");
    330 
    331   verifyFormat("private Foo<X, Y>[] foos;");
    332   verifyFormat("Foo<X, Y>[] foos = this.foos;");
    333   verifyFormat("return (a instanceof List<?>)\n"
    334                "    ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
    335                "    : aaaaaaaaaaaaaaaaaaaaaaa;",
    336                getStyleWithColumns(60));
    337 
    338   verifyFormat(
    339       "SomeLoooooooooooooooooooooongType name =\n"
    340       "    SomeType.foo(someArgument)\n"
    341       "        .<X>method()\n"
    342       "        .aaaaaaaaaaaaaaaaaaa()\n"
    343       "        .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
    344 }
    345 
    346 TEST_F(FormatTestJava, StringConcatenation) {
    347   verifyFormat("String someString = \"abc\"\n"
    348                "    + \"cde\";");
    349 }
    350 
    351 TEST_F(FormatTestJava, TryCatchFinally) {
    352   verifyFormat("try {\n"
    353                "  Something();\n"
    354                "} catch (SomeException e) {\n"
    355                "  HandleException(e);\n"
    356                "}");
    357   verifyFormat("try {\n"
    358                "  Something();\n"
    359                "} finally {\n"
    360                "  AlwaysDoThis();\n"
    361                "}");
    362   verifyFormat("try {\n"
    363                "  Something();\n"
    364                "} catch (SomeException e) {\n"
    365                "  HandleException(e);\n"
    366                "} finally {\n"
    367                "  AlwaysDoThis();\n"
    368                "}");
    369 
    370   verifyFormat("try {\n"
    371                "  Something();\n"
    372                "} catch (SomeException | OtherException e) {\n"
    373                "  HandleException(e);\n"
    374                "}");
    375 }
    376 
    377 TEST_F(FormatTestJava, TryWithResources) {
    378   verifyFormat("try (SomeResource rs = someFunction()) {\n"
    379                "  Something();\n"
    380                "}");
    381   verifyFormat("try (SomeResource rs = someFunction()) {\n"
    382                "  Something();\n"
    383                "} catch (SomeException e) {\n"
    384                "  HandleException(e);\n"
    385                "}");
    386 }
    387 
    388 TEST_F(FormatTestJava, SynchronizedKeyword) {
    389   verifyFormat("synchronized (mData) {\n"
    390                "  // ...\n"
    391                "}");
    392 }
    393 
    394 TEST_F(FormatTestJava, PackageDeclarations) {
    395   verifyFormat("package some.really.loooooooooooooooooooooong.package;",
    396                getStyleWithColumns(50));
    397 }
    398 
    399 TEST_F(FormatTestJava, ImportDeclarations) {
    400   verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;",
    401                getStyleWithColumns(50));
    402   verifyFormat("import static some.really.looooooooooooooooong.imported.Class;",
    403                getStyleWithColumns(50));
    404 }
    405 
    406 TEST_F(FormatTestJava, MethodDeclarations) {
    407   verifyFormat("void methodName(Object arg1,\n"
    408                "    Object arg2, Object arg3) {}",
    409                getStyleWithColumns(40));
    410   verifyFormat("void methodName(\n"
    411                "    Object arg1, Object arg2) {}",
    412                getStyleWithColumns(40));
    413 }
    414 
    415 TEST_F(FormatTestJava, CppKeywords) {
    416   verifyFormat("public void union(Type a, Type b);");
    417   verifyFormat("public void struct(Object o);");
    418   verifyFormat("public void delete(Object o);");
    419 }
    420 
    421 TEST_F(FormatTestJava, NeverAlignAfterReturn) {
    422   verifyFormat("return aaaaaaaaaaaaaaaaaaa\n"
    423                "    && bbbbbbbbbbbbbbbbbbb\n"
    424                "    && ccccccccccccccccccc;",
    425                getStyleWithColumns(40));
    426   verifyFormat("return (result == null)\n"
    427                "    ? aaaaaaaaaaaaaaaaa\n"
    428                "    : bbbbbbbbbbbbbbbbb;",
    429                getStyleWithColumns(40));
    430   verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
    431                "    .bbbbbbbbbbbbbbbbbbb()\n"
    432                "    .ccccccccccccccccccc();",
    433                getStyleWithColumns(40));
    434   verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
    435                "    .bbbbbbbbbbbbbbbbbbb(\n"
    436                "        ccccccccccccccc)\n"
    437                "    .ccccccccccccccccccc();",
    438                getStyleWithColumns(40));
    439 }
    440 
    441 TEST_F(FormatTestJava, FormatsInnerBlocks) {
    442   verifyFormat("someObject.someFunction(new Runnable() {\n"
    443                "  @Override\n"
    444                "  public void run() {\n"
    445                "    System.out.println(42);\n"
    446                "  }\n"
    447                "}, someOtherParameter);");
    448   verifyFormat("someFunction(new Runnable() {\n"
    449                "  public void run() {\n"
    450                "    System.out.println(42);\n"
    451                "  }\n"
    452                "});");
    453   verifyFormat("someObject.someFunction(\n"
    454                "    new Runnable() {\n"
    455                "      @Override\n"
    456                "      public void run() {\n"
    457                "        System.out.println(42);\n"
    458                "      }\n"
    459                "    },\n"
    460                "    new Runnable() {\n"
    461                "      @Override\n"
    462                "      public void run() {\n"
    463                "        System.out.println(43);\n"
    464                "      }\n"
    465                "    },\n"
    466                "    someOtherParameter);");
    467 }
    468 
    469 TEST_F(FormatTestJava, FormatsLambdas) {
    470   verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;");
    471   verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n"
    472                "    -> aaaaaaaaaa + bbbbbbbbbb;",
    473                getStyleWithColumns(40));
    474   verifyFormat("Runnable someLambda = () -> DoSomething();");
    475   verifyFormat("Runnable someLambda = () -> {\n"
    476                "  DoSomething();\n"
    477                "}");
    478 
    479   verifyFormat("Runnable someLambda =\n"
    480                "    (int aaaaa) -> DoSomething(aaaaa);",
    481                getStyleWithColumns(40));
    482 }
    483 
    484 TEST_F(FormatTestJava, BreaksStringLiterals) {
    485   // FIXME: String literal breaking is currently disabled for Java and JS, as it
    486   // requires strings to be merged using "+" which we don't support.
    487   EXPECT_EQ("\"some text other\";",
    488             format("\"some text other\";", getStyleWithColumns(14)));
    489 }
    490 
    491 TEST_F(FormatTestJava, AlignsBlockComments) {
    492   EXPECT_EQ("/*\n"
    493             " * Really multi-line\n"
    494             " * comment.\n"
    495             " */\n"
    496             "void f() {}",
    497             format("  /*\n"
    498                    "   * Really multi-line\n"
    499                    "   * comment.\n"
    500                    "   */\n"
    501                    "  void f() {}"));
    502 }
    503 
    504 } // end namespace tooling
    505 } // end namespace clang
    506