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) { 24*3538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << "---\n"); 25*3538b39eSNicola Zaghen LLVM_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); 284f8d9943SEric Liu auto Result = applyAllReplacements(Code, Replaces); 294f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 30*3538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 314f8d9943SEric Liu return *Result; 32c58c70e2SDaniel Jasper } 33c58c70e2SDaniel Jasper 34e6fcf7d3SDaniel Jasper static std::string 35e6fcf7d3SDaniel Jasper format(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)) { 49c9a918c5SMark Zeren EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable"; 50c58c70e2SDaniel Jasper EXPECT_EQ(Code.str(), format(test::messUp(Code), Style)); 51c58c70e2SDaniel Jasper } 52c58c70e2SDaniel Jasper }; 53c58c70e2SDaniel Jasper 5430a2406eSDaniel Jasper TEST_F(FormatTestJava, NoAlternativeOperatorNames) { 5530a2406eSDaniel Jasper verifyFormat("someObject.and();"); 5630a2406eSDaniel Jasper } 5730a2406eSDaniel Jasper 584f56b0bbSDaniel Jasper TEST_F(FormatTestJava, UnderstandsCasts) { 594f56b0bbSDaniel Jasper verifyFormat("a[b >> 1] = (byte) (c() << 4);"); 604f56b0bbSDaniel Jasper } 614f56b0bbSDaniel Jasper 62a98b7b01SDaniel Jasper TEST_F(FormatTestJava, FormatsInstanceOfLikeOperators) { 63a98b7b01SDaniel Jasper FormatStyle Style = getStyleWithColumns(50); 64a98b7b01SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 65a98b7b01SDaniel Jasper " instanceof bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 66a98b7b01SDaniel Jasper Style); 67a98b7b01SDaniel Jasper Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 68a98b7b01SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa instanceof\n" 69a98b7b01SDaniel Jasper " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 70a98b7b01SDaniel Jasper Style); 71043ac050SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa instanceof bbbbbbbbbbbbbbbbbbbbbbb\n" 72043ac050SDaniel Jasper " && ccccccccccccccccccc instanceof dddddddddddddddddddddd;"); 73a98b7b01SDaniel Jasper } 74a98b7b01SDaniel Jasper 75450425c9SNico Weber TEST_F(FormatTestJava, Chromium) { 76450425c9SNico Weber verifyFormat("class SomeClass {\n" 77450425c9SNico Weber " void f() {}\n" 78450425c9SNico Weber " int g() {\n" 79450425c9SNico Weber " return 0;\n" 80450425c9SNico Weber " }\n" 81450425c9SNico Weber " void h() {\n" 82450425c9SNico Weber " while (true) f();\n" 83450425c9SNico Weber " for (;;) f();\n" 84450425c9SNico Weber " if (true) f();\n" 85450425c9SNico Weber " }\n" 86450425c9SNico Weber "}", 87450425c9SNico Weber getChromiumStyle(FormatStyle::LK_Java)); 88450425c9SNico Weber } 89450425c9SNico Weber 908379107aSDaniel Jasper TEST_F(FormatTestJava, QualifiedNames) { 918379107aSDaniel Jasper verifyFormat("public some.package.Type someFunction( // comment\n" 928379107aSDaniel Jasper " int parameter) {}"); 938379107aSDaniel Jasper } 948379107aSDaniel Jasper 95e5d74867SDaniel Jasper TEST_F(FormatTestJava, ClassKeyword) { 96e5d74867SDaniel Jasper verifyFormat("SomeClass.class.getName();"); 97e5d74867SDaniel Jasper verifyFormat("Class c = SomeClass.class;"); 98e5d74867SDaniel Jasper } 99e5d74867SDaniel Jasper 100c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) { 101c58c70e2SDaniel Jasper verifyFormat("public class SomeClass {\n" 102c58c70e2SDaniel Jasper " private int a;\n" 103c58c70e2SDaniel Jasper " private int b;\n" 104c58c70e2SDaniel Jasper "}"); 105c58c70e2SDaniel Jasper verifyFormat("public class A {\n" 106c58c70e2SDaniel Jasper " class B {\n" 107c58c70e2SDaniel Jasper " int i;\n" 108c58c70e2SDaniel Jasper " }\n" 109c58c70e2SDaniel Jasper " class C {\n" 110c58c70e2SDaniel Jasper " int j;\n" 111c58c70e2SDaniel Jasper " }\n" 112c58c70e2SDaniel Jasper "}"); 1134bf9d470SDaniel Jasper verifyFormat("public class A extends B.C {}"); 11450b4bd7cSDaniel Jasper 115734d52b5SDaniel Jasper verifyFormat("abstract class SomeClass\n" 116734d52b5SDaniel Jasper " extends SomeOtherClass implements SomeInterface {}", 117734d52b5SDaniel Jasper getStyleWithColumns(60)); 11850b4bd7cSDaniel Jasper verifyFormat("abstract class SomeClass extends SomeOtherClass\n" 119734d52b5SDaniel Jasper " implements SomeInterfaceeeeeeeeeeeee {}", 12050b4bd7cSDaniel Jasper getStyleWithColumns(60)); 12150b4bd7cSDaniel Jasper verifyFormat("abstract class SomeClass\n" 12250b4bd7cSDaniel Jasper " extends SomeOtherClass\n" 12350b4bd7cSDaniel Jasper " implements SomeInterface {}", 12450b4bd7cSDaniel Jasper getStyleWithColumns(40)); 12550b4bd7cSDaniel Jasper verifyFormat("abstract class SomeClass\n" 12650b4bd7cSDaniel Jasper " extends SomeOtherClass\n" 12750b4bd7cSDaniel Jasper " implements SomeInterface,\n" 12850b4bd7cSDaniel Jasper " AnotherInterface {}", 12950b4bd7cSDaniel Jasper getStyleWithColumns(40)); 130734d52b5SDaniel Jasper verifyFormat("abstract class SomeClass\n" 131734d52b5SDaniel Jasper " implements SomeInterface, AnotherInterface {}", 132734d52b5SDaniel Jasper getStyleWithColumns(60)); 13339af6cd5SDaniel Jasper verifyFormat("@SomeAnnotation()\n" 134734d52b5SDaniel Jasper "abstract class aaaaaaaaaaaa\n" 1359e709351SDaniel Jasper " extends bbbbbbbbbbbbbbb implements cccccccccccc {}", 13639af6cd5SDaniel Jasper getStyleWithColumns(76)); 13758fcf6dfSDaniel Jasper verifyFormat("@SomeAnnotation()\n" 138734d52b5SDaniel Jasper "abstract class aaaaaaaaa<a>\n" 1399e709351SDaniel Jasper " extends bbbbbbbbbbbb<b> implements cccccccccccc {}", 14058fcf6dfSDaniel Jasper getStyleWithColumns(76)); 141a644d7f3SNico Weber verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n" 142a644d7f3SNico Weber " void doStuff(int theStuff);\n" 143a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 144a644d7f3SNico Weber "}"); 145a644d7f3SNico Weber verifyFormat("public interface SomeInterface {\n" 146a644d7f3SNico Weber " void doStuff(int theStuff);\n" 147a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 148c29f83b7SNico Weber " default void doStuffWithDefault() {}\n" 149a644d7f3SNico Weber "}"); 150a644d7f3SNico Weber verifyFormat("@interface SomeInterface {\n" 151a644d7f3SNico Weber " void doStuff(int theStuff);\n" 152a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 153a644d7f3SNico Weber "}"); 154a644d7f3SNico Weber verifyFormat("public @interface SomeInterface {\n" 155a644d7f3SNico Weber " void doStuff(int theStuff);\n" 156a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 157a644d7f3SNico Weber "}"); 158c58c70e2SDaniel Jasper } 159c58c70e2SDaniel Jasper 1606acf5130SDaniel Jasper TEST_F(FormatTestJava, AnonymousClasses) { 1616acf5130SDaniel Jasper verifyFormat("return new A() {\n" 1626acf5130SDaniel Jasper " public String toString() {\n" 1636acf5130SDaniel Jasper " return \"NotReallyA\";\n" 1646acf5130SDaniel Jasper " }\n" 1656acf5130SDaniel Jasper "};"); 1666acf5130SDaniel Jasper verifyFormat("A a = new A() {\n" 1676acf5130SDaniel Jasper " public String toString() {\n" 1686acf5130SDaniel Jasper " return \"NotReallyA\";\n" 1696acf5130SDaniel Jasper " }\n" 1706acf5130SDaniel Jasper "};"); 1716acf5130SDaniel Jasper } 1726acf5130SDaniel Jasper 173df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) { 174df2ff002SDaniel Jasper verifyFormat("enum SomeThing { ABC, CDE }"); 175df2ff002SDaniel Jasper verifyFormat("enum SomeThing {\n" 176df2ff002SDaniel Jasper " ABC,\n" 177df2ff002SDaniel Jasper " CDE,\n" 178df2ff002SDaniel Jasper "}"); 179df2ff002SDaniel Jasper verifyFormat("public class SomeClass {\n" 180df2ff002SDaniel Jasper " enum SomeThing { ABC, CDE }\n" 1819e709351SDaniel Jasper " void f() {}\n" 182df2ff002SDaniel Jasper "}"); 1836be0f55dSDaniel Jasper verifyFormat("public class SomeClass implements SomeInterface {\n" 1846be0f55dSDaniel Jasper " enum SomeThing { ABC, CDE }\n" 1859e709351SDaniel Jasper " void f() {}\n" 1866be0f55dSDaniel Jasper "}"); 1876be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 1886be0f55dSDaniel Jasper " ABC,\n" 1896be0f55dSDaniel Jasper " CDE;\n" 1909e709351SDaniel Jasper " void f() {}\n" 1916be0f55dSDaniel Jasper "}"); 1926be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 1936be0f55dSDaniel Jasper " ABC(1, \"ABC\"),\n" 1946be0f55dSDaniel Jasper " CDE(2, \"CDE\");\n" 1959e709351SDaniel Jasper " Something(int i, String s) {}\n" 1966be0f55dSDaniel Jasper "}"); 1976be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 1986be0f55dSDaniel Jasper " ABC(new int[] {1, 2}),\n" 1996be0f55dSDaniel Jasper " CDE(new int[] {2, 3});\n" 2009e709351SDaniel Jasper " Something(int[] i) {}\n" 2016be0f55dSDaniel Jasper "}"); 2026be0f55dSDaniel Jasper verifyFormat("public enum SomeThing {\n" 2036be0f55dSDaniel Jasper " ABC {\n" 2046be0f55dSDaniel Jasper " public String toString() {\n" 2056be0f55dSDaniel Jasper " return \"ABC\";\n" 2066be0f55dSDaniel Jasper " }\n" 2076be0f55dSDaniel Jasper " },\n" 2086be0f55dSDaniel Jasper " CDE {\n" 2096be0f55dSDaniel Jasper " @Override\n" 2106be0f55dSDaniel Jasper " public String toString() {\n" 2116be0f55dSDaniel Jasper " return \"CDE\";\n" 2126be0f55dSDaniel Jasper " }\n" 2136be0f55dSDaniel Jasper " };\n" 2149e709351SDaniel Jasper " public void f() {}\n" 2156be0f55dSDaniel Jasper "}"); 216ccb68b48SDaniel Jasper verifyFormat("private enum SomeEnum implements Foo<?, B> {\n" 217ccb68b48SDaniel Jasper " ABC {\n" 218ccb68b48SDaniel Jasper " @Override\n" 219ccb68b48SDaniel Jasper " public String toString() {\n" 220ccb68b48SDaniel Jasper " return \"ABC\";\n" 221ccb68b48SDaniel Jasper " }\n" 222ccb68b48SDaniel Jasper " },\n" 223ccb68b48SDaniel Jasper " CDE {\n" 224ccb68b48SDaniel Jasper " @Override\n" 225ccb68b48SDaniel Jasper " public String toString() {\n" 226ccb68b48SDaniel Jasper " return \"CDE\";\n" 227ccb68b48SDaniel Jasper " }\n" 228ccb68b48SDaniel Jasper " };\n" 229ccb68b48SDaniel Jasper "}"); 230e154020dSDaniel Jasper verifyFormat("public enum VeryLongEnum {\n" 231e154020dSDaniel Jasper " ENUM_WITH_MANY_PARAMETERS(\n" 232e154020dSDaniel Jasper " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"bbbbbbbbbbbbbbbb\", " 233e154020dSDaniel Jasper "\"cccccccccccccccccccccccc\"),\n" 234e154020dSDaniel Jasper " SECOND_ENUM(\"a\", \"b\", \"c\");\n" 235e154020dSDaniel Jasper " private VeryLongEnum(String a, String b, String c) {}\n" 236e154020dSDaniel Jasper "}\n"); 237a0143fabSDaniel Jasper } 238a0143fabSDaniel Jasper 239a0143fabSDaniel Jasper TEST_F(FormatTestJava, ArrayInitializers) { 240a0143fabSDaniel Jasper verifyFormat("new int[] {1, 2, 3, 4};"); 241a0143fabSDaniel Jasper verifyFormat("new int[] {\n" 242d2130f51SFrancois Ferrand " 1,\n" 243d2130f51SFrancois Ferrand " 2,\n" 244d2130f51SFrancois Ferrand " 3,\n" 245d2130f51SFrancois Ferrand " 4,\n" 246a0143fabSDaniel Jasper "};"); 24713404dadSDaniel Jasper 24813404dadSDaniel Jasper FormatStyle Style = getStyleWithColumns(65); 24913404dadSDaniel Jasper Style.Cpp11BracedListStyle = false; 25013404dadSDaniel Jasper verifyFormat( 25113404dadSDaniel Jasper "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n" 25213404dadSDaniel Jasper " 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };", 25313404dadSDaniel Jasper Style); 254df2ff002SDaniel Jasper } 255df2ff002SDaniel Jasper 256f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) { 257f26c755dSDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" 2589e709351SDaniel Jasper " throws LooooooooooooooooooooooooooooongException {}"); 259375815d2SDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" 260375815d2SDaniel Jasper " throws LoooooooooongException, LooooooooooongException {}"); 261f26c755dSDaniel Jasper } 262f26c755dSDaniel Jasper 263fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) { 264fab69ff0SDaniel Jasper verifyFormat("@Override\n" 2659e709351SDaniel Jasper "public String toString() {}"); 266fab69ff0SDaniel Jasper verifyFormat("@Override\n" 267fab69ff0SDaniel Jasper "@Nullable\n" 2689e709351SDaniel Jasper "public String getNameIfPresent() {}"); 26907013a42SDaniel Jasper verifyFormat("@Override // comment\n" 27007013a42SDaniel Jasper "@Nullable\n" 27107013a42SDaniel Jasper "public String getNameIfPresent() {}"); 272beb03938SNico Weber verifyFormat("@java.lang.Override // comment\n" 273beb03938SNico Weber "@Nullable\n" 274beb03938SNico Weber "public String getNameIfPresent() {}"); 275f1f0c356SDaniel Jasper 276f1f0c356SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" 2779e709351SDaniel Jasper "public void doSomething() {}"); 278d78c4223SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" 279d78c4223SDaniel Jasper "@Author(name = \"abc\")\n" 2809e709351SDaniel Jasper "public void doSomething() {}"); 281f1f0c356SDaniel Jasper 282c7d024acSDaniel Jasper verifyFormat("DoSomething(new A() {\n" 283c7d024acSDaniel Jasper " @Override\n" 2849e709351SDaniel Jasper " public String toString() {}\n" 285c7d024acSDaniel Jasper "});"); 286c7d024acSDaniel Jasper 2879e709351SDaniel Jasper verifyFormat("void SomeFunction(@Nullable String something) {}"); 288beb03938SNico Weber verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}"); 289e9ab42dfSDaniel Jasper 290fab69ff0SDaniel Jasper verifyFormat("@Partial @Mock DataLoader loader;"); 2912cd92f1cSNico Weber verifyFormat("@Partial\n" 2922cd92f1cSNico Weber "@Mock\n" 2932cd92f1cSNico Weber "DataLoader loader;", 2942cd92f1cSNico Weber getChromiumStyle(FormatStyle::LK_Java)); 295fd68191dSDaniel Jasper verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" 296fd68191dSDaniel Jasper "public static int iiiiiiiiiiiiiiiiiiiiiiii;"); 297e9ab42dfSDaniel Jasper 298e9ab42dfSDaniel Jasper verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" 299e9ab42dfSDaniel Jasper "private static final long something = 0L;"); 300beb03938SNico Weber verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n" 301beb03938SNico Weber "private static final long something = 0L;"); 302211e1329SDaniel Jasper verifyFormat("@Mock\n" 303211e1329SDaniel Jasper "DataLoader loooooooooooooooooooooooader =\n" 304211e1329SDaniel Jasper " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 305211e1329SDaniel Jasper getStyleWithColumns(60)); 306beb03938SNico Weber verifyFormat("@org.llvm.QualifiedMock\n" 307beb03938SNico Weber "DataLoader loooooooooooooooooooooooader =\n" 308beb03938SNico Weber " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 309beb03938SNico Weber getStyleWithColumns(60)); 310a831c58eSDaniel Jasper verifyFormat("@Test(a)\n" 311a831c58eSDaniel Jasper "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 312a831c58eSDaniel Jasper " aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);"); 3133e1bd140SDaniel Jasper verifyFormat("@SomeAnnotation(\n" 3143e1bd140SDaniel Jasper " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n" 3153e1bd140SDaniel Jasper "int i;", 3163e1bd140SDaniel Jasper getStyleWithColumns(50)); 317404658aeSDaniel Jasper verifyFormat("@Test\n" 318404658aeSDaniel Jasper "ReturnType doSomething(\n" 319404658aeSDaniel Jasper " String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}", 320404658aeSDaniel Jasper getStyleWithColumns(60)); 321190fbda6SDaniel Jasper verifyFormat("{\n" 322190fbda6SDaniel Jasper " boolean someFunction(\n" 323190fbda6SDaniel Jasper " @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n" 324190fbda6SDaniel Jasper " String bbbbbbbbbbbbbbb) {}\n" 325190fbda6SDaniel Jasper "}", 326190fbda6SDaniel Jasper getStyleWithColumns(60)); 32715b01116SDaniel Jasper verifyFormat("@Annotation(\"Some\"\n" 32815b01116SDaniel Jasper " + \" text\")\n" 32915b01116SDaniel Jasper "List<Integer> list;"); 330fab69ff0SDaniel Jasper } 331fab69ff0SDaniel Jasper 33216b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) { 33316b107e9SDaniel Jasper verifyFormat("Iterable<?> a;"); 33416b107e9SDaniel Jasper verifyFormat("Iterable<?> a;"); 33516b107e9SDaniel Jasper verifyFormat("Iterable<? extends SomeObject> a;"); 3365ffcb7feSDaniel Jasper 3375ffcb7feSDaniel Jasper verifyFormat("A.<B>doSomething();"); 338b9b18675SNico Weber verifyFormat("A.<B<C>>doSomething();"); 339b9b18675SNico Weber verifyFormat("A.<B<C<D>>>doSomething();"); 340b9b18675SNico Weber verifyFormat("A.<B<C<D<E>>>>doSomething();"); 341b9b18675SNico Weber 342b9b18675SNico Weber verifyFormat("OrderedPair<String, List<Box<Integer>>> p = null;"); 3437bd618f5SDaniel Jasper 3447bd618f5SDaniel Jasper verifyFormat("@Override\n" 3459e709351SDaniel Jasper "public Map<String, ?> getAll() {}"); 346db9a7a2fSDaniel Jasper 3479e709351SDaniel Jasper verifyFormat("public <R> ArrayList<R> get() {}"); 3489e709351SDaniel Jasper verifyFormat("protected <R> ArrayList<R> get() {}"); 3499e709351SDaniel Jasper verifyFormat("private <R> ArrayList<R> get() {}"); 3509e709351SDaniel Jasper verifyFormat("public static <R> ArrayList<R> get() {}"); 351ed50166bSNico Weber verifyFormat("public static native <R> ArrayList<R> get();"); 3529e709351SDaniel Jasper verifyFormat("public final <X> Foo foo() {}"); 35382c92753SDaniel Jasper verifyFormat("public abstract <X> Foo foo();"); 354f056f45bSDaniel Jasper verifyFormat("<T extends B> T getInstance(Class<T> type);"); 35561d81973SDaniel Jasper verifyFormat("Function<F, ? extends T> function;"); 3566761b42bSDaniel Jasper 3576761b42bSDaniel Jasper verifyFormat("private Foo<X, Y>[] foos;"); 3586761b42bSDaniel Jasper verifyFormat("Foo<X, Y>[] foos = this.foos;"); 35977ef2be2SDaniel Jasper verifyFormat("return (a instanceof List<?>)\n" 36077ef2be2SDaniel Jasper " ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 36177ef2be2SDaniel Jasper " : aaaaaaaaaaaaaaaaaaaaaaa;", 36277ef2be2SDaniel Jasper getStyleWithColumns(60)); 363caf86859SDaniel Jasper 364caf86859SDaniel Jasper verifyFormat( 365caf86859SDaniel Jasper "SomeLoooooooooooooooooooooongType name =\n" 366caf86859SDaniel Jasper " SomeType.foo(someArgument)\n" 367caf86859SDaniel Jasper " .<X>method()\n" 368caf86859SDaniel Jasper " .aaaaaaaaaaaaaaaaaaa()\n" 369caf86859SDaniel Jasper " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 37016b107e9SDaniel Jasper } 37116b107e9SDaniel Jasper 372c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) { 373c0126864SDaniel Jasper verifyFormat("String someString = \"abc\"\n" 374c0126864SDaniel Jasper " + \"cde\";"); 375c0126864SDaniel Jasper } 376c0126864SDaniel Jasper 377a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) { 378a3ddf86dSDaniel Jasper verifyFormat("try {\n" 379a3ddf86dSDaniel Jasper " Something();\n" 380a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n" 381a3ddf86dSDaniel Jasper " HandleException(e);\n" 382a3ddf86dSDaniel Jasper "}"); 383a3ddf86dSDaniel Jasper verifyFormat("try {\n" 384a3ddf86dSDaniel Jasper " Something();\n" 385a3ddf86dSDaniel Jasper "} finally {\n" 386a3ddf86dSDaniel Jasper " AlwaysDoThis();\n" 387a3ddf86dSDaniel Jasper "}"); 388a3ddf86dSDaniel Jasper verifyFormat("try {\n" 389a3ddf86dSDaniel Jasper " Something();\n" 390a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n" 391a3ddf86dSDaniel Jasper " HandleException(e);\n" 392a3ddf86dSDaniel Jasper "} finally {\n" 393a3ddf86dSDaniel Jasper " AlwaysDoThis();\n" 394a3ddf86dSDaniel Jasper "}"); 395a3ddf86dSDaniel Jasper 396a3ddf86dSDaniel Jasper verifyFormat("try {\n" 397a3ddf86dSDaniel Jasper " Something();\n" 398a3ddf86dSDaniel Jasper "} catch (SomeException | OtherException e) {\n" 399a3ddf86dSDaniel Jasper " HandleException(e);\n" 400a3ddf86dSDaniel Jasper "}"); 401a3ddf86dSDaniel Jasper } 402a3ddf86dSDaniel Jasper 403e189d465SDaniel Jasper TEST_F(FormatTestJava, TryWithResources) { 404e189d465SDaniel Jasper verifyFormat("try (SomeResource rs = someFunction()) {\n" 405e189d465SDaniel Jasper " Something();\n" 406e189d465SDaniel Jasper "}"); 407e189d465SDaniel Jasper verifyFormat("try (SomeResource rs = someFunction()) {\n" 408e189d465SDaniel Jasper " Something();\n" 409e189d465SDaniel Jasper "} catch (SomeException e) {\n" 410e189d465SDaniel Jasper " HandleException(e);\n" 411e189d465SDaniel Jasper "}"); 412e189d465SDaniel Jasper } 413e189d465SDaniel Jasper 414b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) { 415b9d3db6bSDaniel Jasper verifyFormat("synchronized (mData) {\n" 416b9d3db6bSDaniel Jasper " // ...\n" 417b9d3db6bSDaniel Jasper "}"); 418b9d3db6bSDaniel Jasper } 419b9d3db6bSDaniel Jasper 4204f113490SNico Weber TEST_F(FormatTestJava, AssertKeyword) { 4214f113490SNico Weber verifyFormat("assert a && b;"); 422e8eba371SNico Weber verifyFormat("assert (a && b);"); 4234f113490SNico Weber } 4244f113490SNico Weber 4259b9e0760SDaniel Jasper TEST_F(FormatTestJava, PackageDeclarations) { 4269b9e0760SDaniel Jasper verifyFormat("package some.really.loooooooooooooooooooooong.package;", 4279b9e0760SDaniel Jasper getStyleWithColumns(50)); 4289b9e0760SDaniel Jasper } 4299b9e0760SDaniel Jasper 4305e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) { 4315e7be1d5SDaniel Jasper verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;", 4325e7be1d5SDaniel Jasper getStyleWithColumns(50)); 43316dbe0bcSDaniel Jasper verifyFormat("import static some.really.looooooooooooooooong.imported.Class;", 43416dbe0bcSDaniel Jasper getStyleWithColumns(50)); 4355e7be1d5SDaniel Jasper } 4365e7be1d5SDaniel Jasper 4373aa9a6a1SDaniel Jasper TEST_F(FormatTestJava, MethodDeclarations) { 4383aa9a6a1SDaniel Jasper verifyFormat("void methodName(Object arg1,\n" 4399e709351SDaniel Jasper " Object arg2, Object arg3) {}", 4403aa9a6a1SDaniel Jasper getStyleWithColumns(40)); 4413aa9a6a1SDaniel Jasper verifyFormat("void methodName(\n" 4429e709351SDaniel Jasper " Object arg1, Object arg2) {}", 4433aa9a6a1SDaniel Jasper getStyleWithColumns(40)); 4443aa9a6a1SDaniel Jasper } 4453aa9a6a1SDaniel Jasper 446fe2cf667SDaniel Jasper TEST_F(FormatTestJava, CppKeywords) { 447fe2cf667SDaniel Jasper verifyFormat("public void union(Type a, Type b);"); 448fe2cf667SDaniel Jasper verifyFormat("public void struct(Object o);"); 449fe2cf667SDaniel Jasper verifyFormat("public void delete(Object o);"); 45072a1b6a5SDaniel Jasper verifyFormat("return operator && (aa);"); 451fe2cf667SDaniel Jasper } 452fe2cf667SDaniel Jasper 4536cab6784SDaniel Jasper TEST_F(FormatTestJava, NeverAlignAfterReturn) { 4546cab6784SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa\n" 4556cab6784SDaniel Jasper " && bbbbbbbbbbbbbbbbbbb\n" 4566cab6784SDaniel Jasper " && ccccccccccccccccccc;", 4576cab6784SDaniel Jasper getStyleWithColumns(40)); 4586cab6784SDaniel Jasper verifyFormat("return (result == null)\n" 4596cab6784SDaniel Jasper " ? aaaaaaaaaaaaaaaaa\n" 4606cab6784SDaniel Jasper " : bbbbbbbbbbbbbbbbb;", 4616cab6784SDaniel Jasper getStyleWithColumns(40)); 4626cab6784SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" 4636cab6784SDaniel Jasper " .bbbbbbbbbbbbbbbbbbb()\n" 4646cab6784SDaniel Jasper " .ccccccccccccccccccc();", 4656cab6784SDaniel Jasper getStyleWithColumns(40)); 466a536df4bSDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" 467a536df4bSDaniel Jasper " .bbbbbbbbbbbbbbbbbbb(\n" 468a536df4bSDaniel Jasper " ccccccccccccccc)\n" 469a536df4bSDaniel Jasper " .ccccccccccccccccccc();", 470a536df4bSDaniel Jasper getStyleWithColumns(40)); 4716cab6784SDaniel Jasper } 4726cab6784SDaniel Jasper 4734b444495SDaniel Jasper TEST_F(FormatTestJava, FormatsInnerBlocks) { 4744b444495SDaniel Jasper verifyFormat("someObject.someFunction(new Runnable() {\n" 4754b444495SDaniel Jasper " @Override\n" 4764b444495SDaniel Jasper " public void run() {\n" 4774b444495SDaniel Jasper " System.out.println(42);\n" 4784b444495SDaniel Jasper " }\n" 4794b444495SDaniel Jasper "}, someOtherParameter);"); 4805f1fa85eSDaniel Jasper verifyFormat("someFunction(new Runnable() {\n" 4815f1fa85eSDaniel Jasper " public void run() {\n" 4825f1fa85eSDaniel Jasper " System.out.println(42);\n" 4835f1fa85eSDaniel Jasper " }\n" 4845f1fa85eSDaniel Jasper "});"); 4854b444495SDaniel Jasper verifyFormat("someObject.someFunction(\n" 4864b444495SDaniel Jasper " new Runnable() {\n" 4874b444495SDaniel Jasper " @Override\n" 4884b444495SDaniel Jasper " public void run() {\n" 4894b444495SDaniel Jasper " System.out.println(42);\n" 4904b444495SDaniel Jasper " }\n" 4914b444495SDaniel Jasper " },\n" 4924b444495SDaniel Jasper " new Runnable() {\n" 4934b444495SDaniel Jasper " @Override\n" 4944b444495SDaniel Jasper " public void run() {\n" 4954b444495SDaniel Jasper " System.out.println(43);\n" 4964b444495SDaniel Jasper " }\n" 4974b444495SDaniel Jasper " },\n" 4984b444495SDaniel Jasper " someOtherParameter);"); 4994b444495SDaniel Jasper } 5004b444495SDaniel Jasper 5018354ea84SDaniel Jasper TEST_F(FormatTestJava, FormatsLambdas) { 5028354ea84SDaniel Jasper verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;"); 5038354ea84SDaniel Jasper verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n" 5048354ea84SDaniel Jasper " -> aaaaaaaaaa + bbbbbbbbbb;", 5058354ea84SDaniel Jasper getStyleWithColumns(40)); 5068354ea84SDaniel Jasper verifyFormat("Runnable someLambda = () -> DoSomething();"); 5078354ea84SDaniel Jasper verifyFormat("Runnable someLambda = () -> {\n" 5088354ea84SDaniel Jasper " DoSomething();\n" 5098354ea84SDaniel Jasper "}"); 5108354ea84SDaniel Jasper 5118354ea84SDaniel Jasper verifyFormat("Runnable someLambda =\n" 5128354ea84SDaniel Jasper " (int aaaaa) -> DoSomething(aaaaa);", 5138354ea84SDaniel Jasper getStyleWithColumns(40)); 5148354ea84SDaniel Jasper } 5158354ea84SDaniel Jasper 516ff2437feSAlexander Kornienko TEST_F(FormatTestJava, BreaksStringLiterals) { 517ff2437feSAlexander Kornienko // FIXME: String literal breaking is currently disabled for Java and JS, as it 518ff2437feSAlexander Kornienko // requires strings to be merged using "+" which we don't support. 519ff2437feSAlexander Kornienko EXPECT_EQ("\"some text other\";", 520ff2437feSAlexander Kornienko format("\"some text other\";", getStyleWithColumns(14))); 521ff2437feSAlexander Kornienko } 522ff2437feSAlexander Kornienko 523428f0b14SDaniel Jasper TEST_F(FormatTestJava, AlignsBlockComments) { 524428f0b14SDaniel Jasper EXPECT_EQ("/*\n" 525428f0b14SDaniel Jasper " * Really multi-line\n" 526428f0b14SDaniel Jasper " * comment.\n" 527428f0b14SDaniel Jasper " */\n" 528428f0b14SDaniel Jasper "void f() {}", 529428f0b14SDaniel Jasper format(" /*\n" 530428f0b14SDaniel Jasper " * Really multi-line\n" 531428f0b14SDaniel Jasper " * comment.\n" 532428f0b14SDaniel Jasper " */\n" 533428f0b14SDaniel Jasper " void f() {}")); 534428f0b14SDaniel Jasper } 535428f0b14SDaniel Jasper 53622d7e6b0SKrasimir Georgiev TEST_F(FormatTestJava, KeepsDelimitersOnOwnLineInJavaDocComments) { 53722d7e6b0SKrasimir Georgiev EXPECT_EQ("/**\n" 53822d7e6b0SKrasimir Georgiev " * javadoc line 1\n" 53922d7e6b0SKrasimir Georgiev " * javadoc line 2\n" 54022d7e6b0SKrasimir Georgiev " */", 54122d7e6b0SKrasimir Georgiev format("/** javadoc line 1\n" 54222d7e6b0SKrasimir Georgiev " * javadoc line 2 */")); 54322d7e6b0SKrasimir Georgiev } 54422d7e6b0SKrasimir Georgiev 54548c94a61SNico Weber TEST_F(FormatTestJava, RetainsLogicalShifts) { 54648c94a61SNico Weber verifyFormat("void f() {\n" 54748c94a61SNico Weber " int a = 1;\n" 54848c94a61SNico Weber " a >>>= 1;\n" 54948c94a61SNico Weber "}"); 55048c94a61SNico Weber verifyFormat("void f() {\n" 55148c94a61SNico Weber " int a = 1;\n" 55248c94a61SNico Weber " a = a >>> 1;\n" 55348c94a61SNico Weber "}"); 55448c94a61SNico Weber } 55548c94a61SNico Weber 55648c94a61SNico Weber 557ab9db510SAlexander Kornienko } // end namespace tooling 558c58c70e2SDaniel Jasper } // end namespace clang 559