Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 1 | //===- unittest/Format/FormatTestJava.cpp - Formatting tests for Java -----===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | |
| 10 | #include "FormatTestUtils.h" |
| 11 | #include "clang/Format/Format.h" |
| 12 | #include "llvm/Support/Debug.h" |
| 13 | #include "gtest/gtest.h" |
| 14 | |
| 15 | #define DEBUG_TYPE "format-test" |
| 16 | |
| 17 | namespace clang { |
| 18 | namespace format { |
| 19 | |
| 20 | class FormatTestJava : public ::testing::Test { |
| 21 | protected: |
| 22 | static std::string format(llvm::StringRef Code, unsigned Offset, |
| 23 | unsigned Length, const FormatStyle &Style) { |
| 24 | DEBUG(llvm::errs() << "---\n"); |
| 25 | DEBUG(llvm::errs() << Code << "\n\n"); |
| 26 | std::vector<tooling::Range> Ranges(1, tooling::Range(Offset, Length)); |
| 27 | tooling::Replacements Replaces = reformat(Style, Code, Ranges); |
| 28 | std::string Result = applyAllReplacements(Code, Replaces); |
| 29 | EXPECT_NE("", Result); |
| 30 | DEBUG(llvm::errs() << "\n" << Result << "\n\n"); |
| 31 | return Result; |
| 32 | } |
| 33 | |
| 34 | static std::string format( |
| 35 | llvm::StringRef Code, |
| 36 | const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { |
| 37 | return format(Code, 0, Code.size(), Style); |
| 38 | } |
| 39 | |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 40 | static FormatStyle getStyleWithColumns(unsigned ColumnLimit) { |
| 41 | FormatStyle Style = getGoogleStyle(FormatStyle::LK_Java); |
| 42 | Style.ColumnLimit = ColumnLimit; |
| 43 | return Style; |
| 44 | } |
| 45 | |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 46 | static void verifyFormat( |
| 47 | llvm::StringRef Code, |
| 48 | const FormatStyle &Style = getGoogleStyle(FormatStyle::LK_Java)) { |
| 49 | EXPECT_EQ(Code.str(), format(test::messUp(Code), Style)); |
| 50 | } |
| 51 | }; |
| 52 | |
Daniel Jasper | 30a2406 | 2014-11-14 09:02:28 +0000 | [diff] [blame] | 53 | TEST_F(FormatTestJava, NoAlternativeOperatorNames) { |
| 54 | verifyFormat("someObject.and();"); |
| 55 | } |
| 56 | |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 57 | TEST_F(FormatTestJava, ClassDeclarations) { |
| 58 | verifyFormat("public class SomeClass {\n" |
| 59 | " private int a;\n" |
| 60 | " private int b;\n" |
| 61 | "}"); |
| 62 | verifyFormat("public class A {\n" |
| 63 | " class B {\n" |
| 64 | " int i;\n" |
| 65 | " }\n" |
| 66 | " class C {\n" |
| 67 | " int j;\n" |
| 68 | " }\n" |
| 69 | "}"); |
Daniel Jasper | 4bf9d47 | 2014-10-21 09:31:29 +0000 | [diff] [blame] | 70 | verifyFormat("public class A extends B.C {}"); |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 71 | |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 72 | verifyFormat("abstract class SomeClass\n" |
| 73 | " extends SomeOtherClass implements SomeInterface {}", |
| 74 | getStyleWithColumns(60)); |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 75 | verifyFormat("abstract class SomeClass extends SomeOtherClass\n" |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 76 | " implements SomeInterfaceeeeeeeeeeeee {}", |
Daniel Jasper | 50b4bd7 | 2014-11-02 19:16:41 +0000 | [diff] [blame] | 77 | getStyleWithColumns(60)); |
| 78 | verifyFormat("abstract class SomeClass\n" |
| 79 | " extends SomeOtherClass\n" |
| 80 | " implements SomeInterface {}", |
| 81 | getStyleWithColumns(40)); |
| 82 | verifyFormat("abstract class SomeClass\n" |
| 83 | " extends SomeOtherClass\n" |
| 84 | " implements SomeInterface,\n" |
| 85 | " AnotherInterface {}", |
| 86 | getStyleWithColumns(40)); |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 87 | verifyFormat("abstract class SomeClass\n" |
| 88 | " implements SomeInterface, AnotherInterface {}", |
| 89 | getStyleWithColumns(60)); |
Daniel Jasper | 39af6cd | 2014-11-03 02:27:28 +0000 | [diff] [blame] | 90 | verifyFormat("@SomeAnnotation()\n" |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 91 | "abstract class aaaaaaaaaaaa\n" |
| 92 | " extends bbbbbbbbbbbbbbb implements cccccccccccc {\n" |
Daniel Jasper | 39af6cd | 2014-11-03 02:27:28 +0000 | [diff] [blame] | 93 | "}", |
| 94 | getStyleWithColumns(76)); |
Daniel Jasper | 58fcf6d | 2014-11-04 10:53:14 +0000 | [diff] [blame] | 95 | verifyFormat("@SomeAnnotation()\n" |
Daniel Jasper | 734d52b | 2014-11-14 10:15:56 +0000 | [diff] [blame] | 96 | "abstract class aaaaaaaaa<a>\n" |
| 97 | " extends bbbbbbbbbbbb<b> implements cccccccccccc {\n" |
Daniel Jasper | 58fcf6d | 2014-11-04 10:53:14 +0000 | [diff] [blame] | 98 | "}", |
| 99 | getStyleWithColumns(76)); |
Nico Weber | a644d7f | 2014-11-10 16:30:02 +0000 | [diff] [blame] | 100 | verifyFormat("interface SomeInterface<A> extends Foo, Bar {\n" |
| 101 | " void doStuff(int theStuff);\n" |
| 102 | " void doMoreStuff(int moreStuff);\n" |
| 103 | "}"); |
| 104 | verifyFormat("public interface SomeInterface {\n" |
| 105 | " void doStuff(int theStuff);\n" |
| 106 | " void doMoreStuff(int moreStuff);\n" |
| 107 | "}"); |
| 108 | verifyFormat("@interface SomeInterface {\n" |
| 109 | " void doStuff(int theStuff);\n" |
| 110 | " void doMoreStuff(int moreStuff);\n" |
| 111 | "}"); |
| 112 | verifyFormat("public @interface SomeInterface {\n" |
| 113 | " void doStuff(int theStuff);\n" |
| 114 | " void doMoreStuff(int moreStuff);\n" |
| 115 | "}"); |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 116 | } |
| 117 | |
Daniel Jasper | df2ff00 | 2014-11-02 22:31:39 +0000 | [diff] [blame] | 118 | TEST_F(FormatTestJava, EnumDeclarations) { |
| 119 | verifyFormat("enum SomeThing { ABC, CDE }"); |
| 120 | verifyFormat("enum SomeThing {\n" |
| 121 | " ABC,\n" |
| 122 | " CDE,\n" |
| 123 | "}"); |
| 124 | verifyFormat("public class SomeClass {\n" |
| 125 | " enum SomeThing { ABC, CDE }\n" |
| 126 | " void f() {\n" |
| 127 | " }\n" |
| 128 | "}"); |
Daniel Jasper | 6be0f55 | 2014-11-13 15:56:28 +0000 | [diff] [blame] | 129 | verifyFormat("public class SomeClass implements SomeInterface {\n" |
| 130 | " enum SomeThing { ABC, CDE }\n" |
| 131 | " void f() {\n" |
| 132 | " }\n" |
| 133 | "}"); |
| 134 | verifyFormat("enum SomeThing {\n" |
| 135 | " ABC,\n" |
| 136 | " CDE;\n" |
| 137 | " void f() {\n" |
| 138 | " }\n" |
| 139 | "}"); |
| 140 | verifyFormat("enum SomeThing {\n" |
| 141 | " ABC(1, \"ABC\"),\n" |
| 142 | " CDE(2, \"CDE\");\n" |
| 143 | " Something(int i, String s) {\n" |
| 144 | " }\n" |
| 145 | "}"); |
| 146 | verifyFormat("enum SomeThing {\n" |
| 147 | " ABC(new int[]{1, 2}),\n" |
| 148 | " CDE(new int[]{2, 3});\n" |
| 149 | " Something(int[] i) {\n" |
| 150 | " }\n" |
| 151 | "}"); |
| 152 | verifyFormat("public enum SomeThing {\n" |
| 153 | " ABC {\n" |
| 154 | " public String toString() {\n" |
| 155 | " return \"ABC\";\n" |
| 156 | " }\n" |
| 157 | " },\n" |
| 158 | " CDE {\n" |
| 159 | " @Override\n" |
| 160 | " public String toString() {\n" |
| 161 | " return \"CDE\";\n" |
| 162 | " }\n" |
| 163 | " };\n" |
| 164 | " public void f() {\n" |
| 165 | " }\n" |
| 166 | "}"); |
Daniel Jasper | df2ff00 | 2014-11-02 22:31:39 +0000 | [diff] [blame] | 167 | } |
| 168 | |
Daniel Jasper | f26c755 | 2014-10-17 13:36:14 +0000 | [diff] [blame] | 169 | TEST_F(FormatTestJava, ThrowsDeclarations) { |
| 170 | verifyFormat("public void doSooooooooooooooooooooooooooomething()\n" |
Daniel Jasper | e003b78 | 2014-10-28 16:29:56 +0000 | [diff] [blame] | 171 | " throws LooooooooooooooooooooooooooooongException {\n}"); |
Daniel Jasper | f26c755 | 2014-10-17 13:36:14 +0000 | [diff] [blame] | 172 | } |
| 173 | |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 174 | TEST_F(FormatTestJava, Annotations) { |
| 175 | verifyFormat("@Override\n" |
| 176 | "public String toString() {\n}"); |
| 177 | verifyFormat("@Override\n" |
| 178 | "@Nullable\n" |
| 179 | "public String getNameIfPresent() {\n}"); |
Daniel Jasper | f1f0c35 | 2014-10-21 09:25:39 +0000 | [diff] [blame] | 180 | |
| 181 | verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" |
| 182 | "public void doSomething() {\n}"); |
Daniel Jasper | d78c422 | 2014-10-21 11:17:56 +0000 | [diff] [blame] | 183 | verifyFormat("@SuppressWarnings(value = \"unchecked\")\n" |
| 184 | "@Author(name = \"abc\")\n" |
| 185 | "public void doSomething() {\n}"); |
Daniel Jasper | f1f0c35 | 2014-10-21 09:25:39 +0000 | [diff] [blame] | 186 | |
Daniel Jasper | c7d024a | 2014-10-21 10:02:03 +0000 | [diff] [blame] | 187 | verifyFormat("DoSomething(new A() {\n" |
| 188 | " @Override\n" |
| 189 | " public String toString() {\n" |
| 190 | " }\n" |
| 191 | "});"); |
| 192 | |
Daniel Jasper | e9ab42d | 2014-10-31 18:23:49 +0000 | [diff] [blame] | 193 | verifyFormat("void SomeFunction(@Nullable String something) {\n" |
| 194 | "}"); |
| 195 | |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 196 | verifyFormat("@Partial @Mock DataLoader loader;"); |
Daniel Jasper | fd68191 | 2014-10-21 10:58:14 +0000 | [diff] [blame] | 197 | verifyFormat("@SuppressWarnings(value = \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\")\n" |
| 198 | "public static int iiiiiiiiiiiiiiiiiiiiiiii;"); |
Daniel Jasper | e9ab42d | 2014-10-31 18:23:49 +0000 | [diff] [blame] | 199 | |
| 200 | verifyFormat("@SomeAnnotation(\"With some really looooooooooooooong text\")\n" |
| 201 | "private static final long something = 0L;"); |
Daniel Jasper | fab69ff | 2014-10-21 08:24:18 +0000 | [diff] [blame] | 202 | } |
| 203 | |
Daniel Jasper | 16b107e | 2014-10-21 09:57:09 +0000 | [diff] [blame] | 204 | TEST_F(FormatTestJava, Generics) { |
| 205 | verifyFormat("Iterable<?> a;"); |
| 206 | verifyFormat("Iterable<?> a;"); |
| 207 | verifyFormat("Iterable<? extends SomeObject> a;"); |
Daniel Jasper | 5ffcb7f | 2014-10-21 11:13:31 +0000 | [diff] [blame] | 208 | |
| 209 | verifyFormat("A.<B>doSomething();"); |
Daniel Jasper | 7bd618f | 2014-11-02 21:52:57 +0000 | [diff] [blame] | 210 | |
| 211 | verifyFormat("@Override\n" |
Daniel Jasper | db9a7a2 | 2014-11-03 02:35:14 +0000 | [diff] [blame] | 212 | "public Map<String, ?> getAll() {\n}"); |
| 213 | |
Daniel Jasper | 09f6abe | 2014-11-14 09:05:32 +0000 | [diff] [blame] | 214 | verifyFormat("public <R> ArrayList<R> get() {\n}"); |
Daniel Jasper | 4bfa736 | 2014-11-14 17:30:15 +0000 | [diff] [blame] | 215 | verifyFormat("protected <R> ArrayList<R> get() {\n}"); |
| 216 | verifyFormat("private <R> ArrayList<R> get() {\n}"); |
Daniel Jasper | db9a7a2 | 2014-11-03 02:35:14 +0000 | [diff] [blame] | 217 | verifyFormat("public static <R> ArrayList<R> get() {\n}"); |
Daniel Jasper | f056f45 | 2014-11-03 02:45:58 +0000 | [diff] [blame] | 218 | verifyFormat("<T extends B> T getInstance(Class<T> type);"); |
Daniel Jasper | 61d8197 | 2014-11-14 08:22:46 +0000 | [diff] [blame] | 219 | verifyFormat("Function<F, ? extends T> function;"); |
Daniel Jasper | 6761b42 | 2014-11-18 23:48:01 +0000 | [diff] [blame^] | 220 | |
| 221 | verifyFormat("private Foo<X, Y>[] foos;"); |
| 222 | verifyFormat("Foo<X, Y>[] foos = this.foos;"); |
Daniel Jasper | 16b107e | 2014-10-21 09:57:09 +0000 | [diff] [blame] | 223 | } |
| 224 | |
Daniel Jasper | c012686 | 2014-10-21 11:34:53 +0000 | [diff] [blame] | 225 | TEST_F(FormatTestJava, StringConcatenation) { |
| 226 | verifyFormat("String someString = \"abc\"\n" |
| 227 | " + \"cde\";"); |
| 228 | } |
| 229 | |
Daniel Jasper | a3ddf86 | 2014-11-02 19:21:48 +0000 | [diff] [blame] | 230 | TEST_F(FormatTestJava, TryCatchFinally) { |
| 231 | verifyFormat("try {\n" |
| 232 | " Something();\n" |
| 233 | "} catch (SomeException e) {\n" |
| 234 | " HandleException(e);\n" |
| 235 | "}"); |
| 236 | verifyFormat("try {\n" |
| 237 | " Something();\n" |
| 238 | "} finally {\n" |
| 239 | " AlwaysDoThis();\n" |
| 240 | "}"); |
| 241 | verifyFormat("try {\n" |
| 242 | " Something();\n" |
| 243 | "} catch (SomeException e) {\n" |
| 244 | " HandleException(e);\n" |
| 245 | "} finally {\n" |
| 246 | " AlwaysDoThis();\n" |
| 247 | "}"); |
| 248 | |
| 249 | verifyFormat("try {\n" |
| 250 | " Something();\n" |
| 251 | "} catch (SomeException | OtherException e) {\n" |
| 252 | " HandleException(e);\n" |
| 253 | "}"); |
| 254 | } |
| 255 | |
Daniel Jasper | b9d3db6 | 2014-11-02 22:00:57 +0000 | [diff] [blame] | 256 | TEST_F(FormatTestJava, SynchronizedKeyword) { |
| 257 | verifyFormat("synchronized (mData) {\n" |
| 258 | " // ...\n" |
| 259 | "}"); |
| 260 | } |
| 261 | |
Daniel Jasper | 5e7be1d | 2014-11-02 22:13:03 +0000 | [diff] [blame] | 262 | TEST_F(FormatTestJava, ImportDeclarations) { |
| 263 | verifyFormat("import some.really.loooooooooooooooooooooong.imported.Class;", |
| 264 | getStyleWithColumns(50)); |
| 265 | } |
| 266 | |
Daniel Jasper | c58c70e | 2014-09-15 11:21:46 +0000 | [diff] [blame] | 267 | } // end namespace tooling |
| 268 | } // end namespace clang |