1c58c70e2SDaniel Jasper //===- unittest/Format/FormatTestJava.cpp - Formatting tests for Java -----===// 2c58c70e2SDaniel Jasper // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6c58c70e2SDaniel Jasper // 7c58c70e2SDaniel Jasper //===----------------------------------------------------------------------===// 8c58c70e2SDaniel Jasper 9c58c70e2SDaniel Jasper #include "FormatTestUtils.h" 10c58c70e2SDaniel Jasper #include "clang/Format/Format.h" 11c58c70e2SDaniel Jasper #include "llvm/Support/Debug.h" 12c58c70e2SDaniel Jasper #include "gtest/gtest.h" 13c58c70e2SDaniel Jasper 14c58c70e2SDaniel Jasper #define DEBUG_TYPE "format-test" 15c58c70e2SDaniel Jasper 16c58c70e2SDaniel Jasper namespace clang { 17c58c70e2SDaniel Jasper namespace format { 18c58c70e2SDaniel Jasper 19c58c70e2SDaniel Jasper class FormatTestJava : public ::testing::Test { 20c58c70e2SDaniel Jasper protected: 21c58c70e2SDaniel Jasper static std::string format(llvm::StringRef Code, unsigned Offset, 22c58c70e2SDaniel Jasper unsigned Length, const FormatStyle &Style) { 233538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << "---\n"); 243538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << Code << "\n\n"); 25c58c70e2SDaniel Jasper std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length)); 26c58c70e2SDaniel Jasper tooling::Replacements Replaces = reformat(Style, Code, Ranges); 274f8d9943SEric Liu auto Result = applyAllReplacements(Code, Replaces); 284f8d9943SEric Liu EXPECT_TRUE(static_cast<bool>(Result)); 293538b39eSNicola Zaghen LLVM_DEBUG(llvm::errs() << "\n" << *Result << "\n\n"); 304f8d9943SEric Liu return *Result; 31c58c70e2SDaniel Jasper } 32c58c70e2SDaniel Jasper 33e6fcf7d3SDaniel Jasper static std::string 34e6fcf7d3SDaniel Jasper format(llvm::StringRef Code, 35c58c70e2SDaniel Jasper const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { 36c58c70e2SDaniel Jasper return format(Code, 0, Code.size(), Style); 37c58c70e2SDaniel Jasper } 38c58c70e2SDaniel Jasper 3950b4bd7cSDaniel Jasper static FormatStyle getStyleWithColumns(unsigned ColumnLimit) { 4050b4bd7cSDaniel Jasper FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java); 4150b4bd7cSDaniel Jasper Style.ColumnLimit = ColumnLimit; 4250b4bd7cSDaniel Jasper return Style; 4350b4bd7cSDaniel Jasper } 4450b4bd7cSDaniel Jasper 45c58c70e2SDaniel Jasper static void verifyFormat( 46c58c70e2SDaniel Jasper llvm::StringRef Code, 47c58c70e2SDaniel Jasper const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { 48c9a918c5SMark Zeren EXPECT_EQ(Code.str(), format(Code, Style)) << "Expected code is not stable"; 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 574f56b0bbSDaniel Jasper TEST_F(FormatTestJava, UnderstandsCasts) { 584f56b0bbSDaniel Jasper verifyFormat("a[b >> 1] = (byte) (c() << 4);"); 594f56b0bbSDaniel Jasper } 604f56b0bbSDaniel Jasper 61a98b7b01SDaniel Jasper TEST_F(FormatTestJava, FormatsInstanceOfLikeOperators) { 62a98b7b01SDaniel Jasper FormatStyle Style = getStyleWithColumns(50); 63a98b7b01SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\n" 64a98b7b01SDaniel Jasper " instanceof bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 65a98b7b01SDaniel Jasper Style); 66a98b7b01SDaniel Jasper Style.BreakBeforeBinaryOperators = FormatStyle::BOS_None; 67a98b7b01SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaaaaaaaaaaaa instanceof\n" 68a98b7b01SDaniel Jasper " bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb;", 69a98b7b01SDaniel Jasper Style); 70043ac050SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa instanceof bbbbbbbbbbbbbbbbbbbbbbb\n" 71043ac050SDaniel Jasper " && ccccccccccccccccccc instanceof dddddddddddddddddddddd;"); 72a98b7b01SDaniel Jasper } 73a98b7b01SDaniel Jasper 74450425c9SNico Weber TEST_F(FormatTestJava, Chromium) { 75450425c9SNico Weber verifyFormat("class SomeClass {\n" 76450425c9SNico Weber " void f() {}\n" 77450425c9SNico Weber " int g() {\n" 78450425c9SNico Weber " return 0;\n" 79450425c9SNico Weber " }\n" 80450425c9SNico Weber " void h() {\n" 81450425c9SNico Weber " while (true) f();\n" 82450425c9SNico Weber " for (;;) f();\n" 83450425c9SNico Weber " if (true) f();\n" 84450425c9SNico Weber " }\n" 85450425c9SNico Weber "}", 86450425c9SNico Weber getChromiumStyle(FormatStyle::LK_Java)); 87450425c9SNico Weber } 88450425c9SNico Weber 898379107aSDaniel Jasper TEST_F(FormatTestJava, QualifiedNames) { 908379107aSDaniel Jasper verifyFormat("public some.package.Type someFunction( // comment\n" 918379107aSDaniel Jasper " int parameter) {}"); 928379107aSDaniel Jasper } 938379107aSDaniel Jasper 94e5d74867SDaniel Jasper TEST_F(FormatTestJava, ClassKeyword) { 95e5d74867SDaniel Jasper verifyFormat("SomeClass.class.getName();"); 96e5d74867SDaniel Jasper verifyFormat("Class c = SomeClass.class;"); 97e5d74867SDaniel Jasper } 98e5d74867SDaniel Jasper 99c58c70e2SDaniel Jasper TEST_F(FormatTestJava, ClassDeclarations) { 100c58c70e2SDaniel Jasper verifyFormat("public class SomeClass {\n" 101c58c70e2SDaniel Jasper " private int a;\n" 102c58c70e2SDaniel Jasper " private int b;\n" 103c58c70e2SDaniel Jasper "}"); 104c58c70e2SDaniel Jasper verifyFormat("public class A {\n" 105c58c70e2SDaniel Jasper " class B {\n" 106c58c70e2SDaniel Jasper " int i;\n" 107c58c70e2SDaniel Jasper " }\n" 108c58c70e2SDaniel Jasper " class C {\n" 109c58c70e2SDaniel Jasper " int j;\n" 110c58c70e2SDaniel Jasper " }\n" 111c58c70e2SDaniel Jasper "}"); 1124bf9d470SDaniel Jasper verifyFormat("public class A extends B.C {}"); 11350b4bd7cSDaniel Jasper 114734d52b5SDaniel Jasper verifyFormat("abstract class SomeClass\n" 115734d52b5SDaniel Jasper " extends SomeOtherClass implements SomeInterface {}", 116734d52b5SDaniel Jasper getStyleWithColumns(60)); 11750b4bd7cSDaniel Jasper verifyFormat("abstract class SomeClass extends SomeOtherClass\n" 118734d52b5SDaniel Jasper " implements SomeInterfaceeeeeeeeeeeee {}", 11950b4bd7cSDaniel Jasper getStyleWithColumns(60)); 12050b4bd7cSDaniel Jasper verifyFormat("abstract class SomeClass\n" 12150b4bd7cSDaniel Jasper " extends SomeOtherClass\n" 12250b4bd7cSDaniel Jasper " implements SomeInterface {}", 12350b4bd7cSDaniel Jasper getStyleWithColumns(40)); 12450b4bd7cSDaniel Jasper verifyFormat("abstract class SomeClass\n" 12550b4bd7cSDaniel Jasper " extends SomeOtherClass\n" 12650b4bd7cSDaniel Jasper " implements SomeInterface,\n" 12750b4bd7cSDaniel Jasper " AnotherInterface {}", 12850b4bd7cSDaniel Jasper getStyleWithColumns(40)); 129734d52b5SDaniel Jasper verifyFormat("abstract class SomeClass\n" 130734d52b5SDaniel Jasper " implements SomeInterface, AnotherInterface {}", 131734d52b5SDaniel Jasper getStyleWithColumns(60)); 13239af6cd5SDaniel Jasper verifyFormat("@SomeAnnotation()\n" 133734d52b5SDaniel Jasper "abstract class aaaaaaaaaaaa\n" 1349e709351SDaniel Jasper " extends bbbbbbbbbbbbbbb implements cccccccccccc {}", 13539af6cd5SDaniel Jasper getStyleWithColumns(76)); 13658fcf6dfSDaniel Jasper verifyFormat("@SomeAnnotation()\n" 137734d52b5SDaniel Jasper "abstract class aaaaaaaaa<a>\n" 1389e709351SDaniel Jasper " extends bbbbbbbbbbbb<b> implements cccccccccccc {}", 13958fcf6dfSDaniel Jasper getStyleWithColumns(76)); 140a644d7f3SNico Weber verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n" 141a644d7f3SNico Weber " void doStuff(int theStuff);\n" 142a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 143a644d7f3SNico Weber "}"); 144a644d7f3SNico Weber verifyFormat("public interface SomeInterface {\n" 145a644d7f3SNico Weber " void doStuff(int theStuff);\n" 146a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 147c29f83b7SNico Weber " default void doStuffWithDefault() {}\n" 148a644d7f3SNico Weber "}"); 149a644d7f3SNico Weber verifyFormat("@interface SomeInterface {\n" 150a644d7f3SNico Weber " void doStuff(int theStuff);\n" 151a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 152a644d7f3SNico Weber "}"); 153a644d7f3SNico Weber verifyFormat("public @interface SomeInterface {\n" 154a644d7f3SNico Weber " void doStuff(int theStuff);\n" 155a644d7f3SNico Weber " void doMoreStuff(int moreStuff);\n" 156a644d7f3SNico Weber "}"); 157749c1b59SHans Wennborg verifyFormat("class A {\n" 158749c1b59SHans Wennborg " public @interface SomeInterface {\n" 159749c1b59SHans Wennborg " int stuff;\n" 160749c1b59SHans Wennborg " void doMoreStuff(int moreStuff);\n" 161749c1b59SHans Wennborg " }\n" 162749c1b59SHans Wennborg "}"); 163749c1b59SHans Wennborg verifyFormat("class A {\n" 164749c1b59SHans Wennborg " public @interface SomeInterface {}\n" 165749c1b59SHans Wennborg "}"); 166c58c70e2SDaniel Jasper } 167c58c70e2SDaniel Jasper 1686acf5130SDaniel Jasper TEST_F(FormatTestJava, AnonymousClasses) { 1696acf5130SDaniel Jasper verifyFormat("return new A() {\n" 1706acf5130SDaniel Jasper " public String toString() {\n" 1716acf5130SDaniel Jasper " return \"NotReallyA\";\n" 1726acf5130SDaniel Jasper " }\n" 1736acf5130SDaniel Jasper "};"); 1746acf5130SDaniel Jasper verifyFormat("A a = new A() {\n" 1756acf5130SDaniel Jasper " public String toString() {\n" 1766acf5130SDaniel Jasper " return \"NotReallyA\";\n" 1776acf5130SDaniel Jasper " }\n" 1786acf5130SDaniel Jasper "};"); 1796acf5130SDaniel Jasper } 1806acf5130SDaniel Jasper 181df2ff002SDaniel Jasper TEST_F(FormatTestJava, EnumDeclarations) { 182df2ff002SDaniel Jasper verifyFormat("enum SomeThing { ABC, CDE }"); 183df2ff002SDaniel Jasper verifyFormat("enum SomeThing {\n" 184df2ff002SDaniel Jasper " ABC,\n" 185df2ff002SDaniel Jasper " CDE,\n" 186df2ff002SDaniel Jasper "}"); 187df2ff002SDaniel Jasper verifyFormat("public class SomeClass {\n" 188df2ff002SDaniel Jasper " enum SomeThing { ABC, CDE }\n" 1899e709351SDaniel Jasper " void f() {}\n" 190df2ff002SDaniel Jasper "}"); 1916be0f55dSDaniel Jasper verifyFormat("public class SomeClass implements SomeInterface {\n" 1926be0f55dSDaniel Jasper " enum SomeThing { ABC, CDE }\n" 1939e709351SDaniel Jasper " void f() {}\n" 1946be0f55dSDaniel Jasper "}"); 1956be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 1966be0f55dSDaniel Jasper " ABC,\n" 1976be0f55dSDaniel Jasper " CDE;\n" 1989e709351SDaniel Jasper " void f() {}\n" 1996be0f55dSDaniel Jasper "}"); 2006be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 2016be0f55dSDaniel Jasper " ABC(1, \"ABC\"),\n" 2026be0f55dSDaniel Jasper " CDE(2, \"CDE\");\n" 2039e709351SDaniel Jasper " Something(int i, String s) {}\n" 2046be0f55dSDaniel Jasper "}"); 2056be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n" 2066be0f55dSDaniel Jasper " ABC(new int[] {1, 2}),\n" 2076be0f55dSDaniel Jasper " CDE(new int[] {2, 3});\n" 2089e709351SDaniel Jasper " Something(int[] i) {}\n" 2096be0f55dSDaniel Jasper "}"); 2106be0f55dSDaniel Jasper verifyFormat("public enum SomeThing {\n" 2116be0f55dSDaniel Jasper " ABC {\n" 2126be0f55dSDaniel Jasper " public String toString() {\n" 2136be0f55dSDaniel Jasper " return \"ABC\";\n" 2146be0f55dSDaniel Jasper " }\n" 2156be0f55dSDaniel Jasper " },\n" 2166be0f55dSDaniel Jasper " CDE {\n" 2176be0f55dSDaniel Jasper " @Override\n" 2186be0f55dSDaniel Jasper " public String toString() {\n" 2196be0f55dSDaniel Jasper " return \"CDE\";\n" 2206be0f55dSDaniel Jasper " }\n" 2216be0f55dSDaniel Jasper " };\n" 2229e709351SDaniel Jasper " public void f() {}\n" 2236be0f55dSDaniel Jasper "}"); 224ccb68b48SDaniel Jasper verifyFormat("private enum SomeEnum implements Foo<?, B> {\n" 225ccb68b48SDaniel Jasper " ABC {\n" 226ccb68b48SDaniel Jasper " @Override\n" 227ccb68b48SDaniel Jasper " public String toString() {\n" 228ccb68b48SDaniel Jasper " return \"ABC\";\n" 229ccb68b48SDaniel Jasper " }\n" 230ccb68b48SDaniel Jasper " },\n" 231ccb68b48SDaniel Jasper " CDE {\n" 232ccb68b48SDaniel Jasper " @Override\n" 233ccb68b48SDaniel Jasper " public String toString() {\n" 234ccb68b48SDaniel Jasper " return \"CDE\";\n" 235ccb68b48SDaniel Jasper " }\n" 236ccb68b48SDaniel Jasper " };\n" 237ccb68b48SDaniel Jasper "}"); 238e154020dSDaniel Jasper verifyFormat("public enum VeryLongEnum {\n" 239e154020dSDaniel Jasper " ENUM_WITH_MANY_PARAMETERS(\n" 240e154020dSDaniel Jasper " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"bbbbbbbbbbbbbbbb\", " 241e154020dSDaniel Jasper "\"cccccccccccccccccccccccc\"),\n" 242e154020dSDaniel Jasper " SECOND_ENUM(\"a\", \"b\", \"c\");\n" 243e154020dSDaniel Jasper " private VeryLongEnum(String a, String b, String c) {}\n" 244e154020dSDaniel Jasper "}\n"); 245a0143fabSDaniel Jasper } 246a0143fabSDaniel Jasper 247a0143fabSDaniel Jasper TEST_F(FormatTestJava, ArrayInitializers) { 248a0143fabSDaniel Jasper verifyFormat("new int[] {1, 2, 3, 4};"); 249a0143fabSDaniel Jasper verifyFormat("new int[] {\n" 250d2130f51SFrancois Ferrand " 1,\n" 251d2130f51SFrancois Ferrand " 2,\n" 252d2130f51SFrancois Ferrand " 3,\n" 253d2130f51SFrancois Ferrand " 4,\n" 254a0143fabSDaniel Jasper "};"); 25513404dadSDaniel Jasper 25613404dadSDaniel Jasper FormatStyle Style = getStyleWithColumns(65); 25713404dadSDaniel Jasper Style.Cpp11BracedListStyle = false; 25813404dadSDaniel Jasper verifyFormat( 25913404dadSDaniel Jasper "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n" 26013404dadSDaniel Jasper " 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };", 26113404dadSDaniel Jasper Style); 262df2ff002SDaniel Jasper } 263df2ff002SDaniel Jasper 264f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) { 265f26c755dSDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" 2669e709351SDaniel Jasper " throws LooooooooooooooooooooooooooooongException {}"); 267375815d2SDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" 268375815d2SDaniel Jasper " throws LoooooooooongException, LooooooooooongException {}"); 269f26c755dSDaniel Jasper } 270f26c755dSDaniel Jasper 271fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) { 272fab69ff0SDaniel Jasper verifyFormat("@Override\n" 2739e709351SDaniel Jasper "public String toString() {}"); 274fab69ff0SDaniel Jasper verifyFormat("@Override\n" 275fab69ff0SDaniel Jasper "@Nullable\n" 2769e709351SDaniel Jasper "public String getNameIfPresent() {}"); 27707013a42SDaniel Jasper verifyFormat("@Override // comment\n" 27807013a42SDaniel Jasper "@Nullable\n" 27907013a42SDaniel Jasper "public String getNameIfPresent() {}"); 280beb03938SNico Weber verifyFormat("@java.lang.Override // comment\n" 281beb03938SNico Weber "@Nullable\n" 282beb03938SNico Weber "public String getNameIfPresent() {}"); 283f1f0c356SDaniel Jasper 284f1f0c356SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" 2859e709351SDaniel Jasper "public void doSomething() {}"); 286d78c4223SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" 287d78c4223SDaniel Jasper "@Author(name = \"abc\")\n" 2889e709351SDaniel Jasper "public void doSomething() {}"); 289f1f0c356SDaniel Jasper 290c7d024acSDaniel Jasper verifyFormat("DoSomething(new A() {\n" 291c7d024acSDaniel Jasper " @Override\n" 2929e709351SDaniel Jasper " public String toString() {}\n" 293c7d024acSDaniel Jasper "});"); 294c7d024acSDaniel Jasper 2959e709351SDaniel Jasper verifyFormat("void SomeFunction(@Nullable String something) {}"); 296beb03938SNico Weber verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}"); 297e9ab42dfSDaniel Jasper 298fab69ff0SDaniel Jasper verifyFormat("@Partial @Mock DataLoader loader;"); 2992cd92f1cSNico Weber verifyFormat("@Partial\n" 3002cd92f1cSNico Weber "@Mock\n" 3012cd92f1cSNico Weber "DataLoader loader;", 3022cd92f1cSNico Weber getChromiumStyle(FormatStyle::LK_Java)); 303fd68191dSDaniel Jasper verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" 304fd68191dSDaniel Jasper "public static int iiiiiiiiiiiiiiiiiiiiiiii;"); 305e9ab42dfSDaniel Jasper 306e9ab42dfSDaniel Jasper verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" 307e9ab42dfSDaniel Jasper "private static final long something = 0L;"); 308beb03938SNico Weber verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n" 309beb03938SNico Weber "private static final long something = 0L;"); 310211e1329SDaniel Jasper verifyFormat("@Mock\n" 311211e1329SDaniel Jasper "DataLoader loooooooooooooooooooooooader =\n" 312211e1329SDaniel Jasper " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 313211e1329SDaniel Jasper getStyleWithColumns(60)); 314beb03938SNico Weber verifyFormat("@org.llvm.QualifiedMock\n" 315beb03938SNico Weber "DataLoader loooooooooooooooooooooooader =\n" 316beb03938SNico Weber " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;", 317beb03938SNico Weber getStyleWithColumns(60)); 318a831c58eSDaniel Jasper verifyFormat("@Test(a)\n" 319a831c58eSDaniel Jasper "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n" 320a831c58eSDaniel Jasper " aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);"); 3213e1bd140SDaniel Jasper verifyFormat("@SomeAnnotation(\n" 3223e1bd140SDaniel Jasper " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n" 3233e1bd140SDaniel Jasper "int i;", 3243e1bd140SDaniel Jasper getStyleWithColumns(50)); 325404658aeSDaniel Jasper verifyFormat("@Test\n" 326404658aeSDaniel Jasper "ReturnType doSomething(\n" 327404658aeSDaniel Jasper " String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}", 328404658aeSDaniel Jasper getStyleWithColumns(60)); 329190fbda6SDaniel Jasper verifyFormat("{\n" 330190fbda6SDaniel Jasper " boolean someFunction(\n" 331190fbda6SDaniel Jasper " @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n" 332190fbda6SDaniel Jasper " String bbbbbbbbbbbbbbb) {}\n" 333190fbda6SDaniel Jasper "}", 334190fbda6SDaniel Jasper getStyleWithColumns(60)); 33515b01116SDaniel Jasper verifyFormat("@Annotation(\"Some\"\n" 33615b01116SDaniel Jasper " + \" text\")\n" 33715b01116SDaniel Jasper "List<Integer> list;"); 338ba3484c0SNico Weber 339ba3484c0SNico Weber verifyFormat( 340ba3484c0SNico Weber "@Test\n" 341ba3484c0SNico Weber "@Feature({\"Android-TabSwitcher\"})\n" 342ba3484c0SNico Weber "@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})\n" 343ba3484c0SNico Weber "@Features.EnableFeatures({FEATURE})\n" 344ba3484c0SNico Weber "public void test(@Foo.bar(\"baz\") @Quux.Qoob int theFirstParaaaaam,\n" 345ba3484c0SNico Weber " @Foo.bar(\"baz\") @Quux.Qoob int theSecondParaaaaaaaaaaaaaaaam) {}"); 346fab69ff0SDaniel Jasper } 347fab69ff0SDaniel Jasper 34816b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) { 34916b107e9SDaniel Jasper verifyFormat("Iterable<?> a;"); 35016b107e9SDaniel Jasper verifyFormat("Iterable<?> a;"); 35116b107e9SDaniel Jasper verifyFormat("Iterable<? extends SomeObject> a;"); 3525ffcb7feSDaniel Jasper 3535ffcb7feSDaniel Jasper verifyFormat("A.<B>doSomething();"); 354b9b18675SNico Weber verifyFormat("A.<B<C>>doSomething();"); 355b9b18675SNico Weber verifyFormat("A.<B<C<D>>>doSomething();"); 356b9b18675SNico Weber verifyFormat("A.<B<C<D<E>>>>doSomething();"); 357b9b18675SNico Weber 358b9b18675SNico Weber verifyFormat("OrderedPair<String, List<Box<Integer>>> p = null;"); 3597bd618f5SDaniel Jasper 3607bd618f5SDaniel Jasper verifyFormat("@Override\n" 3619e709351SDaniel Jasper "public Map<String, ?> getAll() {}"); 362db9a7a2fSDaniel Jasper 3639e709351SDaniel Jasper verifyFormat("public <R> ArrayList<R> get() {}"); 3649e709351SDaniel Jasper verifyFormat("protected <R> ArrayList<R> get() {}"); 3659e709351SDaniel Jasper verifyFormat("private <R> ArrayList<R> get() {}"); 3669e709351SDaniel Jasper verifyFormat("public static <R> ArrayList<R> get() {}"); 367ed50166bSNico Weber verifyFormat("public static native <R> ArrayList<R> get();"); 3689e709351SDaniel Jasper verifyFormat("public final <X> Foo foo() {}"); 36982c92753SDaniel Jasper verifyFormat("public abstract <X> Foo foo();"); 370f056f45bSDaniel Jasper verifyFormat("<T extends B> T getInstance(Class<T> type);"); 37161d81973SDaniel Jasper verifyFormat("Function<F, ? extends T> function;"); 3726761b42bSDaniel Jasper 3736761b42bSDaniel Jasper verifyFormat("private Foo<X, Y>[] foos;"); 3746761b42bSDaniel Jasper verifyFormat("Foo<X, Y>[] foos = this.foos;"); 37577ef2be2SDaniel Jasper verifyFormat("return (a instanceof List<?>)\n" 37677ef2be2SDaniel Jasper " ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n" 37777ef2be2SDaniel Jasper " : aaaaaaaaaaaaaaaaaaaaaaa;", 37877ef2be2SDaniel Jasper getStyleWithColumns(60)); 379caf86859SDaniel Jasper 380caf86859SDaniel Jasper verifyFormat( 381caf86859SDaniel Jasper "SomeLoooooooooooooooooooooongType name =\n" 382caf86859SDaniel Jasper " SomeType.foo(someArgument)\n" 383caf86859SDaniel Jasper " .<X>method()\n" 384caf86859SDaniel Jasper " .aaaaaaaaaaaaaaaaaaa()\n" 385caf86859SDaniel Jasper " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();"); 38616b107e9SDaniel Jasper } 38716b107e9SDaniel Jasper 388c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) { 389c0126864SDaniel Jasper verifyFormat("String someString = \"abc\"\n" 390c0126864SDaniel Jasper " + \"cde\";"); 391c0126864SDaniel Jasper } 392c0126864SDaniel Jasper 393a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) { 394a3ddf86dSDaniel Jasper verifyFormat("try {\n" 395a3ddf86dSDaniel Jasper " Something();\n" 396a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n" 397a3ddf86dSDaniel Jasper " HandleException(e);\n" 398a3ddf86dSDaniel Jasper "}"); 399a3ddf86dSDaniel Jasper verifyFormat("try {\n" 400a3ddf86dSDaniel Jasper " Something();\n" 401a3ddf86dSDaniel Jasper "} finally {\n" 402a3ddf86dSDaniel Jasper " AlwaysDoThis();\n" 403a3ddf86dSDaniel Jasper "}"); 404a3ddf86dSDaniel Jasper verifyFormat("try {\n" 405a3ddf86dSDaniel Jasper " Something();\n" 406a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n" 407a3ddf86dSDaniel Jasper " HandleException(e);\n" 408a3ddf86dSDaniel Jasper "} finally {\n" 409a3ddf86dSDaniel Jasper " AlwaysDoThis();\n" 410a3ddf86dSDaniel Jasper "}"); 411a3ddf86dSDaniel Jasper 412a3ddf86dSDaniel Jasper verifyFormat("try {\n" 413a3ddf86dSDaniel Jasper " Something();\n" 414a3ddf86dSDaniel Jasper "} catch (SomeException | OtherException e) {\n" 415a3ddf86dSDaniel Jasper " HandleException(e);\n" 416a3ddf86dSDaniel Jasper "}"); 417a3ddf86dSDaniel Jasper } 418a3ddf86dSDaniel Jasper 419e189d465SDaniel Jasper TEST_F(FormatTestJava, TryWithResources) { 420e189d465SDaniel Jasper verifyFormat("try (SomeResource rs = someFunction()) {\n" 421e189d465SDaniel Jasper " Something();\n" 422e189d465SDaniel Jasper "}"); 423e189d465SDaniel Jasper verifyFormat("try (SomeResource rs = someFunction()) {\n" 424e189d465SDaniel Jasper " Something();\n" 425e189d465SDaniel Jasper "} catch (SomeException e) {\n" 426e189d465SDaniel Jasper " HandleException(e);\n" 427e189d465SDaniel Jasper "}"); 428e189d465SDaniel Jasper } 429e189d465SDaniel Jasper 430b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) { 431b9d3db6bSDaniel Jasper verifyFormat("synchronized (mData) {\n" 432b9d3db6bSDaniel Jasper " // ...\n" 433b9d3db6bSDaniel Jasper "}"); 434b9d3db6bSDaniel Jasper } 435b9d3db6bSDaniel Jasper 4364f113490SNico Weber TEST_F(FormatTestJava, AssertKeyword) { 4374f113490SNico Weber verifyFormat("assert a && b;"); 438e8eba371SNico Weber verifyFormat("assert (a && b);"); 4394f113490SNico Weber } 4404f113490SNico Weber 4419b9e0760SDaniel Jasper TEST_F(FormatTestJava, PackageDeclarations) { 4429b9e0760SDaniel Jasper verifyFormat("package some.really.loooooooooooooooooooooong.package;", 4439b9e0760SDaniel Jasper getStyleWithColumns(50)); 4449b9e0760SDaniel Jasper } 4459b9e0760SDaniel Jasper 4465e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) { 4475e7be1d5SDaniel Jasper verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;", 4485e7be1d5SDaniel Jasper getStyleWithColumns(50)); 44916dbe0bcSDaniel Jasper verifyFormat("import static some.really.looooooooooooooooong.imported.Class;", 45016dbe0bcSDaniel Jasper getStyleWithColumns(50)); 4515e7be1d5SDaniel Jasper } 4525e7be1d5SDaniel Jasper 4533aa9a6a1SDaniel Jasper TEST_F(FormatTestJava, MethodDeclarations) { 4543aa9a6a1SDaniel Jasper verifyFormat("void methodName(Object arg1,\n" 4559e709351SDaniel Jasper " Object arg2, Object arg3) {}", 4563aa9a6a1SDaniel Jasper getStyleWithColumns(40)); 4573aa9a6a1SDaniel Jasper verifyFormat("void methodName(\n" 4589e709351SDaniel Jasper " Object arg1, Object arg2) {}", 4593aa9a6a1SDaniel Jasper getStyleWithColumns(40)); 4603aa9a6a1SDaniel Jasper } 4613aa9a6a1SDaniel Jasper 462208661b2SNico Weber TEST_F(FormatTestJava, MethodReference) { 463*ece7e95fSmydeveloperday EXPECT_EQ("private void foo() {\n" 464208661b2SNico Weber " f(this::methodReference);\n" 465208661b2SNico Weber " f(C.super::methodReference);\n" 466208661b2SNico Weber " Consumer<String> c = System.out::println;\n" 467208661b2SNico Weber " Iface<Integer> mRef = Ty::<Integer>meth;\n" 468208661b2SNico Weber "}", 469208661b2SNico Weber format("private void foo() {\n" 470208661b2SNico Weber " f(this ::methodReference);\n" 471208661b2SNico Weber " f(C.super ::methodReference);\n" 472208661b2SNico Weber " Consumer<String> c = System.out ::println;\n" 473208661b2SNico Weber " Iface<Integer> mRef = Ty :: <Integer> meth;\n" 474208661b2SNico Weber "}")); 475208661b2SNico Weber } 476208661b2SNico Weber 477fe2cf667SDaniel Jasper TEST_F(FormatTestJava, CppKeywords) { 478fe2cf667SDaniel Jasper verifyFormat("public void union(Type a, Type b);"); 479fe2cf667SDaniel Jasper verifyFormat("public void struct(Object o);"); 480fe2cf667SDaniel Jasper verifyFormat("public void delete(Object o);"); 48172a1b6a5SDaniel Jasper verifyFormat("return operator && (aa);"); 482fe2cf667SDaniel Jasper } 483fe2cf667SDaniel Jasper 4846cab6784SDaniel Jasper TEST_F(FormatTestJava, NeverAlignAfterReturn) { 4856cab6784SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa\n" 4866cab6784SDaniel Jasper " && bbbbbbbbbbbbbbbbbbb\n" 4876cab6784SDaniel Jasper " && ccccccccccccccccccc;", 4886cab6784SDaniel Jasper getStyleWithColumns(40)); 4896cab6784SDaniel Jasper verifyFormat("return (result == null)\n" 4906cab6784SDaniel Jasper " ? aaaaaaaaaaaaaaaaa\n" 4916cab6784SDaniel Jasper " : bbbbbbbbbbbbbbbbb;", 4926cab6784SDaniel Jasper getStyleWithColumns(40)); 4936cab6784SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" 4946cab6784SDaniel Jasper " .bbbbbbbbbbbbbbbbbbb()\n" 4956cab6784SDaniel Jasper " .ccccccccccccccccccc();", 4966cab6784SDaniel Jasper getStyleWithColumns(40)); 497a536df4bSDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n" 498a536df4bSDaniel Jasper " .bbbbbbbbbbbbbbbbbbb(\n" 499a536df4bSDaniel Jasper " ccccccccccccccc)\n" 500a536df4bSDaniel Jasper " .ccccccccccccccccccc();", 501a536df4bSDaniel Jasper getStyleWithColumns(40)); 5026cab6784SDaniel Jasper } 5036cab6784SDaniel Jasper 5044b444495SDaniel Jasper TEST_F(FormatTestJava, FormatsInnerBlocks) { 5054b444495SDaniel Jasper verifyFormat("someObject.someFunction(new Runnable() {\n" 5064b444495SDaniel Jasper " @Override\n" 5074b444495SDaniel Jasper " public void run() {\n" 5084b444495SDaniel Jasper " System.out.println(42);\n" 5094b444495SDaniel Jasper " }\n" 5104b444495SDaniel Jasper "}, someOtherParameter);"); 5115f1fa85eSDaniel Jasper verifyFormat("someFunction(new Runnable() {\n" 5125f1fa85eSDaniel Jasper " public void run() {\n" 5135f1fa85eSDaniel Jasper " System.out.println(42);\n" 5145f1fa85eSDaniel Jasper " }\n" 5155f1fa85eSDaniel Jasper "});"); 5164b444495SDaniel Jasper verifyFormat("someObject.someFunction(\n" 5174b444495SDaniel Jasper " new Runnable() {\n" 5184b444495SDaniel Jasper " @Override\n" 5194b444495SDaniel Jasper " public void run() {\n" 5204b444495SDaniel Jasper " System.out.println(42);\n" 5214b444495SDaniel Jasper " }\n" 5224b444495SDaniel Jasper " },\n" 5234b444495SDaniel Jasper " new Runnable() {\n" 5244b444495SDaniel Jasper " @Override\n" 5254b444495SDaniel Jasper " public void run() {\n" 5264b444495SDaniel Jasper " System.out.println(43);\n" 5274b444495SDaniel Jasper " }\n" 5284b444495SDaniel Jasper " },\n" 5294b444495SDaniel Jasper " someOtherParameter);"); 5304b444495SDaniel Jasper } 5314b444495SDaniel Jasper 5328354ea84SDaniel Jasper TEST_F(FormatTestJava, FormatsLambdas) { 5338354ea84SDaniel Jasper verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;"); 5348354ea84SDaniel Jasper verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n" 5358354ea84SDaniel Jasper " -> aaaaaaaaaa + bbbbbbbbbb;", 5368354ea84SDaniel Jasper getStyleWithColumns(40)); 5378354ea84SDaniel Jasper verifyFormat("Runnable someLambda = () -> DoSomething();"); 5388354ea84SDaniel Jasper verifyFormat("Runnable someLambda = () -> {\n" 5398354ea84SDaniel Jasper " DoSomething();\n" 5408354ea84SDaniel Jasper "}"); 5418354ea84SDaniel Jasper 5428354ea84SDaniel Jasper verifyFormat("Runnable someLambda =\n" 5438354ea84SDaniel Jasper " (int aaaaa) -> DoSomething(aaaaa);", 5448354ea84SDaniel Jasper getStyleWithColumns(40)); 5458354ea84SDaniel Jasper } 5468354ea84SDaniel Jasper 547ff2437feSAlexander Kornienko TEST_F(FormatTestJava, BreaksStringLiterals) { 548ff2437feSAlexander Kornienko // FIXME: String literal breaking is currently disabled for Java and JS, as it 549ff2437feSAlexander Kornienko // requires strings to be merged using "+" which we don't support. 550ff2437feSAlexander Kornienko EXPECT_EQ("\"some text other\";", 551ff2437feSAlexander Kornienko format("\"some text other\";", getStyleWithColumns(14))); 552ff2437feSAlexander Kornienko } 553ff2437feSAlexander Kornienko 554428f0b14SDaniel Jasper TEST_F(FormatTestJava, AlignsBlockComments) { 555428f0b14SDaniel Jasper EXPECT_EQ("/*\n" 556428f0b14SDaniel Jasper " * Really multi-line\n" 557428f0b14SDaniel Jasper " * comment.\n" 558428f0b14SDaniel Jasper " */\n" 559428f0b14SDaniel Jasper "void f() {}", 560428f0b14SDaniel Jasper format(" /*\n" 561428f0b14SDaniel Jasper " * Really multi-line\n" 562428f0b14SDaniel Jasper " * comment.\n" 563428f0b14SDaniel Jasper " */\n" 564428f0b14SDaniel Jasper " void f() {}")); 565428f0b14SDaniel Jasper } 566428f0b14SDaniel Jasper 56722d7e6b0SKrasimir Georgiev TEST_F(FormatTestJava, KeepsDelimitersOnOwnLineInJavaDocComments) { 56822d7e6b0SKrasimir Georgiev EXPECT_EQ("/**\n" 56922d7e6b0SKrasimir Georgiev " * javadoc line 1\n" 57022d7e6b0SKrasimir Georgiev " * javadoc line 2\n" 57122d7e6b0SKrasimir Georgiev " */", 57222d7e6b0SKrasimir Georgiev format("/** javadoc line 1\n" 57322d7e6b0SKrasimir Georgiev " * javadoc line 2 */")); 57422d7e6b0SKrasimir Georgiev } 57522d7e6b0SKrasimir Georgiev 57648c94a61SNico Weber TEST_F(FormatTestJava, RetainsLogicalShifts) { 57748c94a61SNico Weber verifyFormat("void f() {\n" 57848c94a61SNico Weber " int a = 1;\n" 57948c94a61SNico Weber " a >>>= 1;\n" 58048c94a61SNico Weber "}"); 58148c94a61SNico Weber verifyFormat("void f() {\n" 58248c94a61SNico Weber " int a = 1;\n" 58348c94a61SNico Weber " a = a >>> 1;\n" 58448c94a61SNico Weber "}"); 58548c94a61SNico Weber } 58648c94a61SNico Weber 587*ece7e95fSmydeveloperday } // namespace format 588c58c70e2SDaniel Jasper } // end namespace clang 589