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:
format(llvm::StringRef Code,unsigned Offset,unsigned Length,const FormatStyle & Style)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
format(llvm::StringRef Code,const FormatStyle & Style=getGoogleStyle (FormatStyle::LK_Java))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
getStyleWithColumns(unsigned ColumnLimit)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
verifyFormat(llvm::StringRef Code,const FormatStyle & Style=getGoogleStyle (FormatStyle::LK_Java))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
TEST_F(FormatTestJava,NoAlternativeOperatorNames)5330a2406eSDaniel Jasper TEST_F(FormatTestJava, NoAlternativeOperatorNames) {
5430a2406eSDaniel Jasper verifyFormat("someObject.and();");
5530a2406eSDaniel Jasper }
5630a2406eSDaniel Jasper
TEST_F(FormatTestJava,UnderstandsCasts)574f56b0bbSDaniel Jasper TEST_F(FormatTestJava, UnderstandsCasts) {
584f56b0bbSDaniel Jasper verifyFormat("a[b >> 1] = (byte) (c() << 4);");
594f56b0bbSDaniel Jasper }
604f56b0bbSDaniel Jasper
TEST_F(FormatTestJava,FormatsInstanceOfLikeOperators)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
TEST_F(FormatTestJava,Chromium)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
TEST_F(FormatTestJava,QualifiedNames)898379107aSDaniel Jasper TEST_F(FormatTestJava, QualifiedNames) {
908379107aSDaniel Jasper verifyFormat("public some.package.Type someFunction( // comment\n"
918379107aSDaniel Jasper " int parameter) {}");
928379107aSDaniel Jasper }
938379107aSDaniel Jasper
TEST_F(FormatTestJava,ClassKeyword)94e5d74867SDaniel Jasper TEST_F(FormatTestJava, ClassKeyword) {
95e5d74867SDaniel Jasper verifyFormat("SomeClass.class.getName();");
96e5d74867SDaniel Jasper verifyFormat("Class c = SomeClass.class;");
97e5d74867SDaniel Jasper }
98e5d74867SDaniel Jasper
TEST_F(FormatTestJava,ClassDeclarations)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
TEST_F(FormatTestJava,AnonymousClasses)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
TEST_F(FormatTestJava,EnumDeclarations)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"
201*8bfccb96Sowenca " void f() {}");
202*8bfccb96Sowenca verifyFormat("enum SomeThing {\n"
2036be0f55dSDaniel Jasper " ABC(1, \"ABC\"),\n"
2046be0f55dSDaniel Jasper " CDE(2, \"CDE\");\n"
2059e709351SDaniel Jasper " Something(int i, String s) {}\n"
2066be0f55dSDaniel Jasper "}");
2076be0f55dSDaniel Jasper verifyFormat("enum SomeThing {\n"
2086be0f55dSDaniel Jasper " ABC(new int[] {1, 2}),\n"
2096be0f55dSDaniel Jasper " CDE(new int[] {2, 3});\n"
2109e709351SDaniel Jasper " Something(int[] i) {}\n"
2116be0f55dSDaniel Jasper "}");
2126be0f55dSDaniel Jasper verifyFormat("public enum SomeThing {\n"
2136be0f55dSDaniel Jasper " ABC {\n"
2146be0f55dSDaniel Jasper " public String toString() {\n"
2156be0f55dSDaniel Jasper " return \"ABC\";\n"
2166be0f55dSDaniel Jasper " }\n"
2176be0f55dSDaniel Jasper " },\n"
2186be0f55dSDaniel Jasper " CDE {\n"
2196be0f55dSDaniel Jasper " @Override\n"
2206be0f55dSDaniel Jasper " public String toString() {\n"
2216be0f55dSDaniel Jasper " return \"CDE\";\n"
2226be0f55dSDaniel Jasper " }\n"
2236be0f55dSDaniel Jasper " };\n"
2249e709351SDaniel Jasper " public void f() {}\n"
2256be0f55dSDaniel Jasper "}");
226ccb68b48SDaniel Jasper verifyFormat("private enum SomeEnum implements Foo<?, B> {\n"
227ccb68b48SDaniel Jasper " ABC {\n"
228ccb68b48SDaniel Jasper " @Override\n"
229ccb68b48SDaniel Jasper " public String toString() {\n"
230ccb68b48SDaniel Jasper " return \"ABC\";\n"
231ccb68b48SDaniel Jasper " }\n"
232ccb68b48SDaniel Jasper " },\n"
233ccb68b48SDaniel Jasper " CDE {\n"
234ccb68b48SDaniel Jasper " @Override\n"
235ccb68b48SDaniel Jasper " public String toString() {\n"
236ccb68b48SDaniel Jasper " return \"CDE\";\n"
237ccb68b48SDaniel Jasper " }\n"
238ccb68b48SDaniel Jasper " };\n"
239ccb68b48SDaniel Jasper "}");
240e154020dSDaniel Jasper verifyFormat("public enum VeryLongEnum {\n"
241e154020dSDaniel Jasper " ENUM_WITH_MANY_PARAMETERS(\n"
242e154020dSDaniel Jasper " \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"bbbbbbbbbbbbbbbb\", "
243e154020dSDaniel Jasper "\"cccccccccccccccccccccccc\"),\n"
244e154020dSDaniel Jasper " SECOND_ENUM(\"a\", \"b\", \"c\");\n"
245e154020dSDaniel Jasper " private VeryLongEnum(String a, String b, String c) {}\n"
246e154020dSDaniel Jasper "}\n");
247a0143fabSDaniel Jasper }
248a0143fabSDaniel Jasper
TEST_F(FormatTestJava,ArrayInitializers)249a0143fabSDaniel Jasper TEST_F(FormatTestJava, ArrayInitializers) {
250a0143fabSDaniel Jasper verifyFormat("new int[] {1, 2, 3, 4};");
251a0143fabSDaniel Jasper verifyFormat("new int[] {\n"
252d2130f51SFrancois Ferrand " 1,\n"
253d2130f51SFrancois Ferrand " 2,\n"
254d2130f51SFrancois Ferrand " 3,\n"
255d2130f51SFrancois Ferrand " 4,\n"
256a0143fabSDaniel Jasper "};");
25713404dadSDaniel Jasper
25813404dadSDaniel Jasper FormatStyle Style = getStyleWithColumns(65);
25913404dadSDaniel Jasper Style.Cpp11BracedListStyle = false;
26013404dadSDaniel Jasper verifyFormat(
26113404dadSDaniel Jasper "expected = new int[] { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,\n"
26213404dadSDaniel Jasper " 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };",
26313404dadSDaniel Jasper Style);
264df2ff002SDaniel Jasper }
265df2ff002SDaniel Jasper
TEST_F(FormatTestJava,ThrowsDeclarations)266f26c755dSDaniel Jasper TEST_F(FormatTestJava, ThrowsDeclarations) {
267f26c755dSDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
2689e709351SDaniel Jasper " throws LooooooooooooooooooooooooooooongException {}");
269375815d2SDaniel Jasper verifyFormat("public void doSooooooooooooooooooooooooooomething()\n"
270375815d2SDaniel Jasper " throws LoooooooooongException, LooooooooooongException {}");
271f26c755dSDaniel Jasper }
272f26c755dSDaniel Jasper
TEST_F(FormatTestJava,Annotations)273fab69ff0SDaniel Jasper TEST_F(FormatTestJava, Annotations) {
274fab69ff0SDaniel Jasper verifyFormat("@Override\n"
2759e709351SDaniel Jasper "public String toString() {}");
276fab69ff0SDaniel Jasper verifyFormat("@Override\n"
277fab69ff0SDaniel Jasper "@Nullable\n"
2789e709351SDaniel Jasper "public String getNameIfPresent() {}");
27907013a42SDaniel Jasper verifyFormat("@Override // comment\n"
28007013a42SDaniel Jasper "@Nullable\n"
28107013a42SDaniel Jasper "public String getNameIfPresent() {}");
282beb03938SNico Weber verifyFormat("@java.lang.Override // comment\n"
283beb03938SNico Weber "@Nullable\n"
284beb03938SNico Weber "public String getNameIfPresent() {}");
285f1f0c356SDaniel Jasper
286f1f0c356SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
2879e709351SDaniel Jasper "public void doSomething() {}");
288d78c4223SDaniel Jasper verifyFormat("@SuppressWarnings(value = \"unchecked\")\n"
289d78c4223SDaniel Jasper "@Author(name = \"abc\")\n"
2909e709351SDaniel Jasper "public void doSomething() {}");
291f1f0c356SDaniel Jasper
292c7d024acSDaniel Jasper verifyFormat("DoSomething(new A() {\n"
293c7d024acSDaniel Jasper " @Override\n"
2949e709351SDaniel Jasper " public String toString() {}\n"
295c7d024acSDaniel Jasper "});");
296c7d024acSDaniel Jasper
2979e709351SDaniel Jasper verifyFormat("void SomeFunction(@Nullable String something) {}");
298beb03938SNico Weber verifyFormat("void SomeFunction(@org.llvm.Nullable String something) {}");
299e9ab42dfSDaniel Jasper
300fab69ff0SDaniel Jasper verifyFormat("@Partial @Mock DataLoader loader;");
3012cd92f1cSNico Weber verifyFormat("@Partial\n"
3022cd92f1cSNico Weber "@Mock\n"
3032cd92f1cSNico Weber "DataLoader loader;",
3042cd92f1cSNico Weber getChromiumStyle(FormatStyle::LK_Java));
305fd68191dSDaniel Jasper verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n"
306fd68191dSDaniel Jasper "public static int iiiiiiiiiiiiiiiiiiiiiiii;");
307e9ab42dfSDaniel Jasper
308e9ab42dfSDaniel Jasper verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n"
309e9ab42dfSDaniel Jasper "private static final long something = 0L;");
310beb03938SNico Weber verifyFormat("@org.llvm.Qualified(\"With some really looooooooooong text\")\n"
311beb03938SNico Weber "private static final long something = 0L;");
312211e1329SDaniel Jasper verifyFormat("@Mock\n"
313211e1329SDaniel Jasper "DataLoader loooooooooooooooooooooooader =\n"
314211e1329SDaniel Jasper " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
315211e1329SDaniel Jasper getStyleWithColumns(60));
316beb03938SNico Weber verifyFormat("@org.llvm.QualifiedMock\n"
317beb03938SNico Weber "DataLoader loooooooooooooooooooooooader =\n"
318beb03938SNico Weber " aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;",
319beb03938SNico Weber getStyleWithColumns(60));
320a831c58eSDaniel Jasper verifyFormat("@Test(a)\n"
321a831c58eSDaniel Jasper "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =\n"
322a831c58eSDaniel Jasper " aaaaaaaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaaaa);");
3233e1bd140SDaniel Jasper verifyFormat("@SomeAnnotation(\n"
3243e1bd140SDaniel Jasper " aaaaaaaaaaaaaaaaa, aaaaaaaaaaaaaaaaaaaa)\n"
3253e1bd140SDaniel Jasper "int i;",
3263e1bd140SDaniel Jasper getStyleWithColumns(50));
327404658aeSDaniel Jasper verifyFormat("@Test\n"
328404658aeSDaniel Jasper "ReturnType doSomething(\n"
329404658aeSDaniel Jasper " String aaaaaaaaaaaaa, String bbbbbbbbbbbbbbb) {}",
330404658aeSDaniel Jasper getStyleWithColumns(60));
331190fbda6SDaniel Jasper verifyFormat("{\n"
332190fbda6SDaniel Jasper " boolean someFunction(\n"
333190fbda6SDaniel Jasper " @Param(aaaaaaaaaaaaaaaa) String aaaaa,\n"
334190fbda6SDaniel Jasper " String bbbbbbbbbbbbbbb) {}\n"
335190fbda6SDaniel Jasper "}",
336190fbda6SDaniel Jasper getStyleWithColumns(60));
33715b01116SDaniel Jasper verifyFormat("@Annotation(\"Some\"\n"
33815b01116SDaniel Jasper " + \" text\")\n"
33915b01116SDaniel Jasper "List<Integer> list;");
340ba3484c0SNico Weber
341ba3484c0SNico Weber verifyFormat(
342ba3484c0SNico Weber "@Test\n"
343ba3484c0SNico Weber "@Feature({\"Android-TabSwitcher\"})\n"
344ba3484c0SNico Weber "@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})\n"
345ba3484c0SNico Weber "@Features.EnableFeatures({FEATURE})\n"
346ba3484c0SNico Weber "public void test(@Foo.bar(\"baz\") @Quux.Qoob int theFirstParaaaaam,\n"
347ba3484c0SNico Weber " @Foo.bar(\"baz\") @Quux.Qoob int theSecondParaaaaaaaaaaaaaaaam) {}");
348fab69ff0SDaniel Jasper }
349fab69ff0SDaniel Jasper
TEST_F(FormatTestJava,Generics)35016b107e9SDaniel Jasper TEST_F(FormatTestJava, Generics) {
35116b107e9SDaniel Jasper verifyFormat("Iterable<?> a;");
35216b107e9SDaniel Jasper verifyFormat("Iterable<?> a;");
35316b107e9SDaniel Jasper verifyFormat("Iterable<? extends SomeObject> a;");
3545ffcb7feSDaniel Jasper
3555ffcb7feSDaniel Jasper verifyFormat("A.<B>doSomething();");
356b9b18675SNico Weber verifyFormat("A.<B<C>>doSomething();");
357b9b18675SNico Weber verifyFormat("A.<B<C<D>>>doSomething();");
358b9b18675SNico Weber verifyFormat("A.<B<C<D<E>>>>doSomething();");
359b9b18675SNico Weber
360b9b18675SNico Weber verifyFormat("OrderedPair<String, List<Box<Integer>>> p = null;");
3617bd618f5SDaniel Jasper
3627bd618f5SDaniel Jasper verifyFormat("@Override\n"
3639e709351SDaniel Jasper "public Map<String, ?> getAll() {}");
364db9a7a2fSDaniel Jasper
3659e709351SDaniel Jasper verifyFormat("public <R> ArrayList<R> get() {}");
3669e709351SDaniel Jasper verifyFormat("protected <R> ArrayList<R> get() {}");
3679e709351SDaniel Jasper verifyFormat("private <R> ArrayList<R> get() {}");
3689e709351SDaniel Jasper verifyFormat("public static <R> ArrayList<R> get() {}");
369ed50166bSNico Weber verifyFormat("public static native <R> ArrayList<R> get();");
3709e709351SDaniel Jasper verifyFormat("public final <X> Foo foo() {}");
37182c92753SDaniel Jasper verifyFormat("public abstract <X> Foo foo();");
372f056f45bSDaniel Jasper verifyFormat("<T extends B> T getInstance(Class<T> type);");
37361d81973SDaniel Jasper verifyFormat("Function<F, ? extends T> function;");
3746761b42bSDaniel Jasper
3756761b42bSDaniel Jasper verifyFormat("private Foo<X, Y>[] foos;");
3766761b42bSDaniel Jasper verifyFormat("Foo<X, Y>[] foos = this.foos;");
37777ef2be2SDaniel Jasper verifyFormat("return (a instanceof List<?>)\n"
37877ef2be2SDaniel Jasper " ? aaaaaaaaaaaaaaaaaaaaaaa(aaaaaaaaaaaaaaaaaaaaa)\n"
37977ef2be2SDaniel Jasper " : aaaaaaaaaaaaaaaaaaaaaaa;",
38077ef2be2SDaniel Jasper getStyleWithColumns(60));
381caf86859SDaniel Jasper
382caf86859SDaniel Jasper verifyFormat(
383caf86859SDaniel Jasper "SomeLoooooooooooooooooooooongType name =\n"
384caf86859SDaniel Jasper " SomeType.foo(someArgument)\n"
385caf86859SDaniel Jasper " .<X>method()\n"
386caf86859SDaniel Jasper " .aaaaaaaaaaaaaaaaaaa()\n"
387caf86859SDaniel Jasper " .aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa();");
38816b107e9SDaniel Jasper }
38916b107e9SDaniel Jasper
TEST_F(FormatTestJava,StringConcatenation)390c0126864SDaniel Jasper TEST_F(FormatTestJava, StringConcatenation) {
391c0126864SDaniel Jasper verifyFormat("String someString = \"abc\"\n"
392c0126864SDaniel Jasper " + \"cde\";");
393c0126864SDaniel Jasper }
394c0126864SDaniel Jasper
TEST_F(FormatTestJava,TryCatchFinally)395a3ddf86dSDaniel Jasper TEST_F(FormatTestJava, TryCatchFinally) {
396a3ddf86dSDaniel Jasper verifyFormat("try {\n"
397a3ddf86dSDaniel Jasper " Something();\n"
398a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n"
399a3ddf86dSDaniel Jasper " HandleException(e);\n"
400a3ddf86dSDaniel Jasper "}");
401a3ddf86dSDaniel Jasper verifyFormat("try {\n"
402a3ddf86dSDaniel Jasper " Something();\n"
403a3ddf86dSDaniel Jasper "} finally {\n"
404a3ddf86dSDaniel Jasper " AlwaysDoThis();\n"
405a3ddf86dSDaniel Jasper "}");
406a3ddf86dSDaniel Jasper verifyFormat("try {\n"
407a3ddf86dSDaniel Jasper " Something();\n"
408a3ddf86dSDaniel Jasper "} catch (SomeException e) {\n"
409a3ddf86dSDaniel Jasper " HandleException(e);\n"
410a3ddf86dSDaniel Jasper "} finally {\n"
411a3ddf86dSDaniel Jasper " AlwaysDoThis();\n"
412a3ddf86dSDaniel Jasper "}");
413a3ddf86dSDaniel Jasper
414a3ddf86dSDaniel Jasper verifyFormat("try {\n"
415a3ddf86dSDaniel Jasper " Something();\n"
416a3ddf86dSDaniel Jasper "} catch (SomeException | OtherException e) {\n"
417a3ddf86dSDaniel Jasper " HandleException(e);\n"
418a3ddf86dSDaniel Jasper "}");
419a3ddf86dSDaniel Jasper }
420a3ddf86dSDaniel Jasper
TEST_F(FormatTestJava,TryWithResources)421e189d465SDaniel Jasper TEST_F(FormatTestJava, TryWithResources) {
422e189d465SDaniel Jasper verifyFormat("try (SomeResource rs = someFunction()) {\n"
423e189d465SDaniel Jasper " Something();\n"
424e189d465SDaniel Jasper "}");
425e189d465SDaniel Jasper verifyFormat("try (SomeResource rs = someFunction()) {\n"
426e189d465SDaniel Jasper " Something();\n"
427e189d465SDaniel Jasper "} catch (SomeException e) {\n"
428e189d465SDaniel Jasper " HandleException(e);\n"
429e189d465SDaniel Jasper "}");
430e189d465SDaniel Jasper }
431e189d465SDaniel Jasper
TEST_F(FormatTestJava,SynchronizedKeyword)432b9d3db6bSDaniel Jasper TEST_F(FormatTestJava, SynchronizedKeyword) {
433b9d3db6bSDaniel Jasper verifyFormat("synchronized (mData) {\n"
434b9d3db6bSDaniel Jasper " // ...\n"
435b9d3db6bSDaniel Jasper "}");
43691b9e672SMarek Kurdej
43791b9e672SMarek Kurdej FormatStyle Style = getLLVMStyle(FormatStyle::LK_Java);
43891b9e672SMarek Kurdej Style.BreakBeforeBraces = FormatStyle::BS_Custom;
43991b9e672SMarek Kurdej
44091b9e672SMarek Kurdej Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Always;
44191b9e672SMarek Kurdej Style.BraceWrapping.AfterFunction = false;
44291b9e672SMarek Kurdej verifyFormat("synchronized (mData)\n"
44391b9e672SMarek Kurdej "{\n"
44491b9e672SMarek Kurdej " // ...\n"
44591b9e672SMarek Kurdej "}",
44691b9e672SMarek Kurdej Style);
44791b9e672SMarek Kurdej
44891b9e672SMarek Kurdej Style.BraceWrapping.AfterControlStatement = FormatStyle::BWACS_Never;
44991b9e672SMarek Kurdej Style.BraceWrapping.AfterFunction = true;
45091b9e672SMarek Kurdej verifyFormat("synchronized (mData) {\n"
45191b9e672SMarek Kurdej " // ...\n"
45291b9e672SMarek Kurdej "}",
45391b9e672SMarek Kurdej Style);
454b9d3db6bSDaniel Jasper }
455b9d3db6bSDaniel Jasper
TEST_F(FormatTestJava,AssertKeyword)4564f113490SNico Weber TEST_F(FormatTestJava, AssertKeyword) {
4574f113490SNico Weber verifyFormat("assert a && b;");
458e8eba371SNico Weber verifyFormat("assert (a && b);");
4594f113490SNico Weber }
4604f113490SNico Weber
TEST_F(FormatTestJava,PackageDeclarations)4619b9e0760SDaniel Jasper TEST_F(FormatTestJava, PackageDeclarations) {
4629b9e0760SDaniel Jasper verifyFormat("package some.really.loooooooooooooooooooooong.package;",
4639b9e0760SDaniel Jasper getStyleWithColumns(50));
4649b9e0760SDaniel Jasper }
4659b9e0760SDaniel Jasper
TEST_F(FormatTestJava,ImportDeclarations)4665e7be1d5SDaniel Jasper TEST_F(FormatTestJava, ImportDeclarations) {
4675e7be1d5SDaniel Jasper verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;",
4685e7be1d5SDaniel Jasper getStyleWithColumns(50));
46916dbe0bcSDaniel Jasper verifyFormat("import static some.really.looooooooooooooooong.imported.Class;",
47016dbe0bcSDaniel Jasper getStyleWithColumns(50));
4715e7be1d5SDaniel Jasper }
4725e7be1d5SDaniel Jasper
TEST_F(FormatTestJava,MethodDeclarations)4733aa9a6a1SDaniel Jasper TEST_F(FormatTestJava, MethodDeclarations) {
4743aa9a6a1SDaniel Jasper verifyFormat("void methodName(Object arg1,\n"
4759e709351SDaniel Jasper " Object arg2, Object arg3) {}",
4763aa9a6a1SDaniel Jasper getStyleWithColumns(40));
4773aa9a6a1SDaniel Jasper verifyFormat("void methodName(\n"
4789e709351SDaniel Jasper " Object arg1, Object arg2) {}",
4793aa9a6a1SDaniel Jasper getStyleWithColumns(40));
4803aa9a6a1SDaniel Jasper }
4813aa9a6a1SDaniel Jasper
TEST_F(FormatTestJava,MethodReference)482208661b2SNico Weber TEST_F(FormatTestJava, MethodReference) {
483ece7e95fSmydeveloperday EXPECT_EQ("private void foo() {\n"
484208661b2SNico Weber " f(this::methodReference);\n"
485208661b2SNico Weber " f(C.super::methodReference);\n"
486208661b2SNico Weber " Consumer<String> c = System.out::println;\n"
487208661b2SNico Weber " Iface<Integer> mRef = Ty::<Integer>meth;\n"
488208661b2SNico Weber "}",
489208661b2SNico Weber format("private void foo() {\n"
490208661b2SNico Weber " f(this ::methodReference);\n"
491208661b2SNico Weber " f(C.super ::methodReference);\n"
492208661b2SNico Weber " Consumer<String> c = System.out ::println;\n"
493208661b2SNico Weber " Iface<Integer> mRef = Ty :: <Integer> meth;\n"
494208661b2SNico Weber "}"));
495208661b2SNico Weber }
496208661b2SNico Weber
TEST_F(FormatTestJava,CppKeywords)497fe2cf667SDaniel Jasper TEST_F(FormatTestJava, CppKeywords) {
498fe2cf667SDaniel Jasper verifyFormat("public void union(Type a, Type b);");
499fe2cf667SDaniel Jasper verifyFormat("public void struct(Object o);");
500fe2cf667SDaniel Jasper verifyFormat("public void delete(Object o);");
50172a1b6a5SDaniel Jasper verifyFormat("return operator && (aa);");
502fe2cf667SDaniel Jasper }
503fe2cf667SDaniel Jasper
TEST_F(FormatTestJava,NeverAlignAfterReturn)5046cab6784SDaniel Jasper TEST_F(FormatTestJava, NeverAlignAfterReturn) {
5056cab6784SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa\n"
5066cab6784SDaniel Jasper " && bbbbbbbbbbbbbbbbbbb\n"
5076cab6784SDaniel Jasper " && ccccccccccccccccccc;",
5086cab6784SDaniel Jasper getStyleWithColumns(40));
5096cab6784SDaniel Jasper verifyFormat("return (result == null)\n"
5106cab6784SDaniel Jasper " ? aaaaaaaaaaaaaaaaa\n"
5116cab6784SDaniel Jasper " : bbbbbbbbbbbbbbbbb;",
5126cab6784SDaniel Jasper getStyleWithColumns(40));
5136cab6784SDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
5146cab6784SDaniel Jasper " .bbbbbbbbbbbbbbbbbbb()\n"
5156cab6784SDaniel Jasper " .ccccccccccccccccccc();",
5166cab6784SDaniel Jasper getStyleWithColumns(40));
517a536df4bSDaniel Jasper verifyFormat("return aaaaaaaaaaaaaaaaaaa()\n"
518a536df4bSDaniel Jasper " .bbbbbbbbbbbbbbbbbbb(\n"
519a536df4bSDaniel Jasper " ccccccccccccccc)\n"
520a536df4bSDaniel Jasper " .ccccccccccccccccccc();",
521a536df4bSDaniel Jasper getStyleWithColumns(40));
5226cab6784SDaniel Jasper }
5236cab6784SDaniel Jasper
TEST_F(FormatTestJava,FormatsInnerBlocks)5244b444495SDaniel Jasper TEST_F(FormatTestJava, FormatsInnerBlocks) {
5254b444495SDaniel Jasper verifyFormat("someObject.someFunction(new Runnable() {\n"
5264b444495SDaniel Jasper " @Override\n"
5274b444495SDaniel Jasper " public void run() {\n"
5284b444495SDaniel Jasper " System.out.println(42);\n"
5294b444495SDaniel Jasper " }\n"
5304b444495SDaniel Jasper "}, someOtherParameter);");
5315f1fa85eSDaniel Jasper verifyFormat("someFunction(new Runnable() {\n"
5325f1fa85eSDaniel Jasper " public void run() {\n"
5335f1fa85eSDaniel Jasper " System.out.println(42);\n"
5345f1fa85eSDaniel Jasper " }\n"
5355f1fa85eSDaniel Jasper "});");
5364b444495SDaniel Jasper verifyFormat("someObject.someFunction(\n"
5374b444495SDaniel Jasper " new Runnable() {\n"
5384b444495SDaniel Jasper " @Override\n"
5394b444495SDaniel Jasper " public void run() {\n"
5404b444495SDaniel Jasper " System.out.println(42);\n"
5414b444495SDaniel Jasper " }\n"
5424b444495SDaniel Jasper " },\n"
5434b444495SDaniel Jasper " new Runnable() {\n"
5444b444495SDaniel Jasper " @Override\n"
5454b444495SDaniel Jasper " public void run() {\n"
5464b444495SDaniel Jasper " System.out.println(43);\n"
5474b444495SDaniel Jasper " }\n"
5484b444495SDaniel Jasper " },\n"
5494b444495SDaniel Jasper " someOtherParameter);");
5504b444495SDaniel Jasper }
5514b444495SDaniel Jasper
TEST_F(FormatTestJava,FormatsLambdas)5528354ea84SDaniel Jasper TEST_F(FormatTestJava, FormatsLambdas) {
5538354ea84SDaniel Jasper verifyFormat("(aaaaaaaaaa, bbbbbbbbbb) -> aaaaaaaaaa + bbbbbbbbbb;");
5548354ea84SDaniel Jasper verifyFormat("(aaaaaaaaaa, bbbbbbbbbb)\n"
5558354ea84SDaniel Jasper " -> aaaaaaaaaa + bbbbbbbbbb;",
5568354ea84SDaniel Jasper getStyleWithColumns(40));
5578354ea84SDaniel Jasper verifyFormat("Runnable someLambda = () -> DoSomething();");
5588354ea84SDaniel Jasper verifyFormat("Runnable someLambda = () -> {\n"
5598354ea84SDaniel Jasper " DoSomething();\n"
5608354ea84SDaniel Jasper "}");
5618354ea84SDaniel Jasper
5628354ea84SDaniel Jasper verifyFormat("Runnable someLambda =\n"
5638354ea84SDaniel Jasper " (int aaaaa) -> DoSomething(aaaaa);",
5648354ea84SDaniel Jasper getStyleWithColumns(40));
5658354ea84SDaniel Jasper }
5668354ea84SDaniel Jasper
TEST_F(FormatTestJava,BreaksStringLiterals)567ff2437feSAlexander Kornienko TEST_F(FormatTestJava, BreaksStringLiterals) {
568ff2437feSAlexander Kornienko // FIXME: String literal breaking is currently disabled for Java and JS, as it
569ff2437feSAlexander Kornienko // requires strings to be merged using "+" which we don't support.
570ff2437feSAlexander Kornienko EXPECT_EQ("\"some text other\";",
571ff2437feSAlexander Kornienko format("\"some text other\";", getStyleWithColumns(14)));
572ff2437feSAlexander Kornienko }
573ff2437feSAlexander Kornienko
TEST_F(FormatTestJava,AlignsBlockComments)574428f0b14SDaniel Jasper TEST_F(FormatTestJava, AlignsBlockComments) {
575428f0b14SDaniel Jasper EXPECT_EQ("/*\n"
576428f0b14SDaniel Jasper " * Really multi-line\n"
577428f0b14SDaniel Jasper " * comment.\n"
578428f0b14SDaniel Jasper " */\n"
579428f0b14SDaniel Jasper "void f() {}",
580428f0b14SDaniel Jasper format(" /*\n"
581428f0b14SDaniel Jasper " * Really multi-line\n"
582428f0b14SDaniel Jasper " * comment.\n"
583428f0b14SDaniel Jasper " */\n"
584428f0b14SDaniel Jasper " void f() {}"));
585428f0b14SDaniel Jasper }
586428f0b14SDaniel Jasper
TEST_F(FormatTestJava,KeepsDelimitersOnOwnLineInJavaDocComments)58722d7e6b0SKrasimir Georgiev TEST_F(FormatTestJava, KeepsDelimitersOnOwnLineInJavaDocComments) {
58822d7e6b0SKrasimir Georgiev EXPECT_EQ("/**\n"
58922d7e6b0SKrasimir Georgiev " * javadoc line 1\n"
59022d7e6b0SKrasimir Georgiev " * javadoc line 2\n"
59122d7e6b0SKrasimir Georgiev " */",
59222d7e6b0SKrasimir Georgiev format("/** javadoc line 1\n"
59322d7e6b0SKrasimir Georgiev " * javadoc line 2 */"));
59422d7e6b0SKrasimir Georgiev }
59522d7e6b0SKrasimir Georgiev
TEST_F(FormatTestJava,RetainsLogicalShifts)59648c94a61SNico Weber TEST_F(FormatTestJava, RetainsLogicalShifts) {
59748c94a61SNico Weber verifyFormat("void f() {\n"
59848c94a61SNico Weber " int a = 1;\n"
59948c94a61SNico Weber " a >>>= 1;\n"
60048c94a61SNico Weber "}");
60148c94a61SNico Weber verifyFormat("void f() {\n"
60248c94a61SNico Weber " int a = 1;\n"
60348c94a61SNico Weber " a = a >>> 1;\n"
60448c94a61SNico Weber "}");
60548c94a61SNico Weber }
60648c94a61SNico Weber
TEST_F(FormatTestJava,ShortFunctions)6077af11989SMarek Kurdej TEST_F(FormatTestJava, ShortFunctions) {
6087af11989SMarek Kurdej FormatStyle Style = getLLVMStyle(FormatStyle::LK_Java);
6097af11989SMarek Kurdej Style.AllowShortFunctionsOnASingleLine = FormatStyle::SFS_Inline;
6107af11989SMarek Kurdej verifyFormat("enum Enum {\n"
6117af11989SMarek Kurdej " E1,\n"
6127af11989SMarek Kurdej " E2;\n"
6137af11989SMarek Kurdej " void f() { return; }\n"
6147af11989SMarek Kurdej "}",
6157af11989SMarek Kurdej Style);
6167af11989SMarek Kurdej }
6177af11989SMarek Kurdej
618ece7e95fSmydeveloperday } // namespace format
619c58c70e2SDaniel Jasper } // end namespace clang
620