SortImportsTestJava.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. #include "clang/Format/Format.h"
  2. #include "gtest/gtest.h"
  3. #define DEBUG_TYPE "format-test"
  4. namespace clang {
  5. namespace format {
  6. namespace {
  7. class SortImportsTestJava : public ::testing::Test {
  8. protected:
  9. std::vector<tooling::Range> GetCodeRange(StringRef Code) {
  10. return std::vector<tooling::Range>(1, tooling::Range(0, Code.size()));
  11. }
  12. std::string sort(StringRef Code, std::vector<tooling::Range> Ranges) {
  13. auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.java");
  14. Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);
  15. auto Sorted = applyAllReplacements(Code, Replaces);
  16. EXPECT_TRUE(static_cast<bool>(Sorted));
  17. auto Result = applyAllReplacements(
  18. *Sorted, reformat(FmtStyle, *Sorted, Ranges, "input.java"));
  19. EXPECT_TRUE(static_cast<bool>(Result));
  20. return *Result;
  21. }
  22. std::string sort(StringRef Code) { return sort(Code, GetCodeRange(Code)); }
  23. FormatStyle FmtStyle;
  24. public:
  25. SortImportsTestJava() {
  26. FmtStyle = getGoogleStyle(FormatStyle::LK_Java);
  27. FmtStyle.JavaImportGroups = {"com.test", "org", "com"};
  28. FmtStyle.SortIncludes = true;
  29. }
  30. };
  31. TEST_F(SortImportsTestJava, StaticSplitFromNormal) {
  32. EXPECT_EQ("import static org.b;\n"
  33. "\n"
  34. "import org.a;\n",
  35. sort("import org.a;\n"
  36. "import static org.b;\n"));
  37. }
  38. TEST_F(SortImportsTestJava, CapitalBeforeLowercase) {
  39. EXPECT_EQ("import org.Test;\n"
  40. "import org.a.Test;\n"
  41. "import org.b;\n",
  42. sort("import org.a.Test;\n"
  43. "import org.Test;\n"
  44. "import org.b;\n"));
  45. }
  46. TEST_F(SortImportsTestJava, KeepSplitGroupsWithOneNewImport) {
  47. EXPECT_EQ("import static com.test.a;\n"
  48. "\n"
  49. "import static org.a;\n"
  50. "\n"
  51. "import static com.a;\n"
  52. "\n"
  53. "import com.test.b;\n"
  54. "import com.test.c;\n"
  55. "\n"
  56. "import org.b;\n"
  57. "\n"
  58. "import com.b;\n",
  59. sort("import static com.test.a;\n"
  60. "\n"
  61. "import static org.a;\n"
  62. "\n"
  63. "import static com.a;\n"
  64. "\n"
  65. "import com.test.b;\n"
  66. "\n"
  67. "import org.b;\n"
  68. "\n"
  69. "import com.b;\n"
  70. "import com.test.c;\n"));
  71. }
  72. TEST_F(SortImportsTestJava, SplitGroupsWithNewline) {
  73. EXPECT_EQ("import static com.test.a;\n"
  74. "\n"
  75. "import static org.a;\n"
  76. "\n"
  77. "import static com.a;\n"
  78. "\n"
  79. "import com.test.b;\n"
  80. "\n"
  81. "import org.b;\n"
  82. "\n"
  83. "import com.b;\n",
  84. sort("import static com.test.a;\n"
  85. "import static org.a;\n"
  86. "import static com.a;\n"
  87. "import com.test.b;\n"
  88. "import org.b;\n"
  89. "import com.b;\n"));
  90. }
  91. TEST_F(SortImportsTestJava, UnspecifiedGroupAfterAllGroups) {
  92. EXPECT_EQ("import com.test.a;\n"
  93. "\n"
  94. "import org.a;\n"
  95. "\n"
  96. "import com.a;\n"
  97. "\n"
  98. "import abc.a;\n"
  99. "import xyz.b;\n",
  100. sort("import com.test.a;\n"
  101. "import com.a;\n"
  102. "import xyz.b;\n"
  103. "import abc.a;\n"
  104. "import org.a;\n"));
  105. }
  106. TEST_F(SortImportsTestJava, NoSortOutsideRange) {
  107. std::vector<tooling::Range> Ranges = {tooling::Range(27, 15)};
  108. EXPECT_EQ("import org.b;\n"
  109. "import org.a;\n"
  110. "// comments\n"
  111. "// that do\n"
  112. "// nothing\n",
  113. sort("import org.b;\n"
  114. "import org.a;\n"
  115. "// comments\n"
  116. "// that do\n"
  117. "// nothing\n",
  118. Ranges));
  119. }
  120. TEST_F(SortImportsTestJava, SortWhenRangeContainsOneLine) {
  121. std::vector<tooling::Range> Ranges = {tooling::Range(27, 20)};
  122. EXPECT_EQ("import org.a;\n"
  123. "import org.b;\n"
  124. "\n"
  125. "import com.a;\n"
  126. "// comments\n"
  127. "// that do\n"
  128. "// nothing\n",
  129. sort("import org.b;\n"
  130. "import org.a;\n"
  131. "import com.a;\n"
  132. "// comments\n"
  133. "// that do\n"
  134. "// nothing\n",
  135. Ranges));
  136. }
  137. TEST_F(SortImportsTestJava, SortLexicographically) {
  138. EXPECT_EQ("import org.a.*;\n"
  139. "import org.a.a;\n"
  140. "import org.aA;\n"
  141. "import org.aa;\n",
  142. sort("import org.aa;\n"
  143. "import org.a.a;\n"
  144. "import org.a.*;\n"
  145. "import org.aA;\n"));
  146. }
  147. TEST_F(SortImportsTestJava, StaticInCommentHasNoEffect) {
  148. EXPECT_EQ("import org.a; // static\n"
  149. "import org.b;\n"
  150. "import org.c; // static\n",
  151. sort("import org.a; // static\n"
  152. "import org.c; // static\n"
  153. "import org.b;\n"));
  154. }
  155. TEST_F(SortImportsTestJava, CommentsWithAffectedImports) {
  156. EXPECT_EQ("import org.a;\n"
  157. "// commentB\n"
  158. "/* commentB\n"
  159. " commentB*/\n"
  160. "import org.b;\n"
  161. "// commentC\n"
  162. "import org.c;\n",
  163. sort("import org.a;\n"
  164. "// commentC\n"
  165. "import org.c;\n"
  166. "// commentB\n"
  167. "/* commentB\n"
  168. " commentB*/\n"
  169. "import org.b;\n"));
  170. }
  171. TEST_F(SortImportsTestJava, CommentWithUnaffectedImports) {
  172. EXPECT_EQ("import org.a;\n"
  173. "// comment\n"
  174. "import org.b;\n",
  175. sort("import org.a;\n"
  176. "// comment\n"
  177. "import org.b;\n"));
  178. }
  179. TEST_F(SortImportsTestJava, CommentAfterAffectedImports) {
  180. EXPECT_EQ("import org.a;\n"
  181. "import org.b;\n"
  182. "// comment\n",
  183. sort("import org.b;\n"
  184. "import org.a;\n"
  185. "// comment\n"));
  186. }
  187. TEST_F(SortImportsTestJava, CommentBeforeAffectedImports) {
  188. EXPECT_EQ("// comment\n"
  189. "import org.a;\n"
  190. "import org.b;\n",
  191. sort("// comment\n"
  192. "import org.b;\n"
  193. "import org.a;\n"));
  194. }
  195. TEST_F(SortImportsTestJava, FormatTotallyOff) {
  196. EXPECT_EQ("// clang-format off\n"
  197. "import org.b;\n"
  198. "import org.a;\n"
  199. "// clang-format on\n",
  200. sort("// clang-format off\n"
  201. "import org.b;\n"
  202. "import org.a;\n"
  203. "// clang-format on\n"));
  204. }
  205. TEST_F(SortImportsTestJava, FormatTotallyOn) {
  206. EXPECT_EQ("// clang-format off\n"
  207. "// clang-format on\n"
  208. "import org.a;\n"
  209. "import org.b;\n",
  210. sort("// clang-format off\n"
  211. "// clang-format on\n"
  212. "import org.b;\n"
  213. "import org.a;\n"));
  214. }
  215. TEST_F(SortImportsTestJava, FormatPariallyOnShouldNotReorder) {
  216. EXPECT_EQ("// clang-format off\n"
  217. "import org.b;\n"
  218. "import org.a;\n"
  219. "// clang-format on\n"
  220. "import org.d;\n"
  221. "import org.c;\n",
  222. sort("// clang-format off\n"
  223. "import org.b;\n"
  224. "import org.a;\n"
  225. "// clang-format on\n"
  226. "import org.d;\n"
  227. "import org.c;\n"));
  228. }
  229. TEST_F(SortImportsTestJava, DeduplicateImports) {
  230. EXPECT_EQ("import org.a;\n", sort("import org.a;\n"
  231. "import org.a;\n"));
  232. }
  233. TEST_F(SortImportsTestJava, NoNewlineAtEnd) {
  234. EXPECT_EQ("import org.a;\n"
  235. "import org.b;",
  236. sort("import org.b;\n"
  237. "import org.a;"));
  238. }
  239. } // end namespace
  240. } // end namespace format
  241. } // end namespace clang