brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.4 KiB · 26674c7 Raw
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