355 lines · cpp
1#include "clang/Format/Format.h"2#include "gtest/gtest.h"3 4#define DEBUG_TYPE "format-test"5 6namespace clang {7namespace format {8namespace {9 10class SortImportsTestJava : public testing::Test {11protected:12 std::vector<tooling::Range> GetCodeRange(StringRef Code) {13 return std::vector<tooling::Range>(1, tooling::Range(0, Code.size()));14 }15 16 std::string sort(StringRef Code, std::vector<tooling::Range> Ranges) {17 auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.java");18 Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);19 auto Sorted = applyAllReplacements(Code, Replaces);20 EXPECT_TRUE(static_cast<bool>(Sorted));21 auto Result = applyAllReplacements(22 *Sorted, reformat(FmtStyle, *Sorted, Ranges, "input.java"));23 EXPECT_TRUE(static_cast<bool>(Result));24 return *Result;25 }26 27 std::string sort(StringRef Code) { return sort(Code, GetCodeRange(Code)); }28 29 FormatStyle FmtStyle;30 31public:32 SortImportsTestJava() {33 FmtStyle = getGoogleStyle(FormatStyle::LK_Java);34 EXPECT_TRUE(FmtStyle.SortIncludes.Enabled);35 FmtStyle.JavaImportGroups = {"com.test", "org", "com"};36 FmtStyle.SortIncludes.IgnoreCase = true;37 }38};39 40TEST_F(SortImportsTestJava, StaticSplitFromNormal) {41 EXPECT_EQ("import static org.b;\n"42 "\n"43 "import org.a;",44 sort("import org.a;\n"45 "import static org.b;"));46}47 48TEST_F(SortImportsTestJava, CapitalBeforeLowercase) {49 EXPECT_EQ("import org.Test;\n"50 "import org.a.Test;\n"51 "import org.b;",52 sort("import org.a.Test;\n"53 "import org.Test;\n"54 "import org.b;"));55}56 57TEST_F(SortImportsTestJava, KeepSplitGroupsWithOneNewImport) {58 EXPECT_EQ("import static com.test.a;\n"59 "\n"60 "import static org.a;\n"61 "\n"62 "import static com.a;\n"63 "\n"64 "import com.test.b;\n"65 "import com.test.c;\n"66 "\n"67 "import org.b;\n"68 "\n"69 "import com.b;",70 sort("import static com.test.a;\n"71 "\n"72 "import static org.a;\n"73 "\n"74 "import static com.a;\n"75 "\n"76 "import com.test.b;\n"77 "\n"78 "import org.b;\n"79 "\n"80 "import com.b;\n"81 "import com.test.c;"));82}83 84TEST_F(SortImportsTestJava, SplitGroupsWithNewline) {85 EXPECT_EQ("import static com.test.a;\n"86 "\n"87 "import static org.a;\n"88 "\n"89 "import static com.a;\n"90 "\n"91 "import com.test.b;\n"92 "\n"93 "import org.b;\n"94 "\n"95 "import com.b;",96 sort("import static com.test.a;\n"97 "import static org.a;\n"98 "import static com.a;\n"99 "import com.test.b;\n"100 "import org.b;\n"101 "import com.b;"));102}103 104TEST_F(SortImportsTestJava, UnspecifiedGroupAfterAllGroups) {105 EXPECT_EQ("import com.test.a;\n"106 "\n"107 "import org.a;\n"108 "\n"109 "import com.a;\n"110 "\n"111 "import abc.a;\n"112 "import xyz.b;",113 sort("import com.test.a;\n"114 "import com.a;\n"115 "import xyz.b;\n"116 "import abc.a;\n"117 "import org.a;"));118}119 120TEST_F(SortImportsTestJava, NoSortOutsideRange) {121 std::vector<tooling::Range> Ranges = {tooling::Range(27, 15)};122 EXPECT_EQ("import org.b;\n"123 "import org.a;\n"124 "// comments\n"125 "// that do\n"126 "// nothing",127 sort("import org.b;\n"128 "import org.a;\n"129 "// comments\n"130 "// that do\n"131 "// nothing",132 Ranges));133}134 135TEST_F(SortImportsTestJava, SortWhenRangeContainsOneLine) {136 std::vector<tooling::Range> Ranges = {tooling::Range(27, 20)};137 EXPECT_EQ("import org.a;\n"138 "import org.b;\n"139 "\n"140 "import com.a;\n"141 "// comments\n"142 "// that do\n"143 "// nothing",144 sort("import org.b;\n"145 "import org.a;\n"146 "import com.a;\n"147 "// comments\n"148 "// that do\n"149 "// nothing",150 Ranges));151}152 153TEST_F(SortImportsTestJava, SortLexicographically) {154 EXPECT_EQ("import org.a.*;\n"155 "import org.a.a;\n"156 "import org.aA;\n"157 "import org.aa;",158 sort("import org.aa;\n"159 "import org.a.a;\n"160 "import org.a.*;\n"161 "import org.aA;"));162}163 164TEST_F(SortImportsTestJava, StaticInCommentHasNoEffect) {165 EXPECT_EQ("import org.a; // static\n"166 "import org.b;\n"167 "import org.c; // static",168 sort("import org.a; // static\n"169 "import org.c; // static\n"170 "import org.b;"));171}172 173TEST_F(SortImportsTestJava, CommentsWithAffectedImports) {174 EXPECT_EQ("import org.a;\n"175 "// commentB\n"176 "/* commentB\n"177 " commentB*/\n"178 "import org.b;\n"179 "// commentC\n"180 "import org.c;",181 sort("import org.a;\n"182 "// commentC\n"183 "import org.c;\n"184 "// commentB\n"185 "/* commentB\n"186 " commentB*/\n"187 "import org.b;"));188}189 190TEST_F(SortImportsTestJava, CommentWithUnaffectedImports) {191 EXPECT_EQ("import org.a;\n"192 "// comment\n"193 "import org.b;",194 sort("import org.a;\n"195 "// comment\n"196 "import org.b;"));197}198 199TEST_F(SortImportsTestJava, CommentAfterAffectedImports) {200 EXPECT_EQ("import org.a;\n"201 "import org.b;\n"202 "// comment",203 sort("import org.b;\n"204 "import org.a;\n"205 "// comment"));206}207 208TEST_F(SortImportsTestJava, CommentBeforeAffectedImports) {209 EXPECT_EQ("// comment\n"210 "import org.a;\n"211 "import org.b;",212 sort("// comment\n"213 "import org.b;\n"214 "import org.a;"));215}216 217TEST_F(SortImportsTestJava, FormatTotallyOff) {218 EXPECT_EQ("// clang-format off\n"219 "import org.b;\n"220 "import org.a;\n"221 "// clang-format on",222 sort("// clang-format off\n"223 "import org.b;\n"224 "import org.a;\n"225 "// clang-format on"));226}227 228TEST_F(SortImportsTestJava, FormatTotallyOn) {229 EXPECT_EQ("// clang-format off\n"230 "// clang-format on\n"231 "import org.a;\n"232 "import org.b;",233 sort("// clang-format off\n"234 "// clang-format on\n"235 "import org.b;\n"236 "import org.a;"));237}238 239TEST_F(SortImportsTestJava, FormatPariallyOnShouldNotReorder) {240 EXPECT_EQ("// clang-format off\n"241 "import org.b;\n"242 "import org.a;\n"243 "// clang-format on\n"244 "import org.d;\n"245 "import org.c;",246 sort("// clang-format off\n"247 "import org.b;\n"248 "import org.a;\n"249 "// clang-format on\n"250 "import org.d;\n"251 "import org.c;"));252}253 254TEST_F(SortImportsTestJava, SortJavaStaticImport) {255 FmtStyle.SortJavaStaticImport = FormatStyle::SJSIO_Before;256 EXPECT_EQ("import static com.test.a;\n"257 "\n"258 "import static org.a;\n"259 "\n"260 "import static com.a;\n"261 "\n"262 "import com.test.b;\n"263 "\n"264 "import org.b;\n"265 "\n"266 "import com.b;",267 sort("import static com.test.a;\n"268 "import static org.a;\n"269 "import static com.a;\n"270 "import com.test.b;\n"271 "import org.b;\n"272 "import com.b;"));273 274 FmtStyle.SortJavaStaticImport = FormatStyle::SJSIO_After;275 EXPECT_EQ("import com.test.b;\n"276 "import com.test.c;\n"277 "\n"278 "import org.b;\n"279 "\n"280 "import com.b;\n"281 "\n"282 "import static com.test.a;\n"283 "\n"284 "import static org.a;\n"285 "\n"286 "import static com.a;",287 sort("import static com.test.a;\n"288 "import static org.a;\n"289 "import static com.a;\n"290 "import com.test.b;\n"291 "import org.b;\n"292 "import com.b;\n"293 "import com.test.c;"));294}295 296TEST_F(SortImportsTestJava, SortJavaStaticImportAsGroup) {297 FmtStyle.SortJavaStaticImport = FormatStyle::SJSIO_After;298 299 EXPECT_EQ("import com.test.a;\n"300 "import com.test.b;\n"301 "\n"302 "import static org.a;\n"303 "import static org.b;",304 sort("import com.test.a;\n"305 "import static org.a;\n"306 "import com.test.b;\n"307 "import static org.b;"));308}309 310TEST_F(SortImportsTestJava, DeduplicateImports) {311 EXPECT_EQ("import org.a;", sort("import org.a;\n"312 "import org.a;"));313}314 315TEST_F(SortImportsTestJava, NoNewlineAtEnd) {316 EXPECT_EQ("import org.a;\n"317 "import org.b;",318 sort("import org.b;\n"319 "import org.a;"));320}321 322TEST_F(SortImportsTestJava, ImportNamedFunction) {323 EXPECT_EQ("import X;\n"324 "class C {\n"325 " void m() {\n"326 " importFile();\n"327 " }\n"328 "}",329 sort("import X;\n"330 "class C {\n"331 " void m() {\n"332 " importFile();\n"333 " }\n"334 "}"));335}336 337TEST_F(SortImportsTestJava, NoReplacementsForValidImports) {338 // Identical #includes have led to a failure with an unstable sort.339 std::string Code = "import org.a;\n"340 "import org.b;\n";341 EXPECT_TRUE(342 sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.java").empty());343}344 345TEST_F(SortImportsTestJava, NoReplacementsForValidImportsWindows) {346 std::string Code = "import org.a;\r\n"347 "import org.b;\r\n";348 EXPECT_TRUE(349 sortIncludes(FmtStyle, Code, GetCodeRange(Code), "input.java").empty());350}351 352} // end namespace353} // end namespace format354} // end namespace clang355