summaryrefslogtreecommitdiff
path: root/unittests/Format/SortImportsTestJava.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'unittests/Format/SortImportsTestJava.cpp')
-rw-r--r--unittests/Format/SortImportsTestJava.cpp267
1 files changed, 267 insertions, 0 deletions
diff --git a/unittests/Format/SortImportsTestJava.cpp b/unittests/Format/SortImportsTestJava.cpp
new file mode 100644
index 0000000000000..3bcf809d961bb
--- /dev/null
+++ b/unittests/Format/SortImportsTestJava.cpp
@@ -0,0 +1,267 @@
+#include "clang/Format/Format.h"
+#include "gtest/gtest.h"
+
+#define DEBUG_TYPE "format-test"
+
+namespace clang {
+namespace format {
+namespace {
+
+class SortImportsTestJava : public ::testing::Test {
+protected:
+ std::vector<tooling::Range> GetCodeRange(StringRef Code) {
+ return std::vector<tooling::Range>(1, tooling::Range(0, Code.size()));
+ }
+
+ std::string sort(StringRef Code, std::vector<tooling::Range> Ranges) {
+ auto Replaces = sortIncludes(FmtStyle, Code, Ranges, "input.java");
+ Ranges = tooling::calculateRangesAfterReplacements(Replaces, Ranges);
+ auto Sorted = applyAllReplacements(Code, Replaces);
+ EXPECT_TRUE(static_cast<bool>(Sorted));
+ auto Result = applyAllReplacements(
+ *Sorted, reformat(FmtStyle, *Sorted, Ranges, "input.java"));
+ EXPECT_TRUE(static_cast<bool>(Result));
+ return *Result;
+ }
+
+ std::string sort(StringRef Code) { return sort(Code, GetCodeRange(Code)); }
+
+ FormatStyle FmtStyle;
+
+public:
+ SortImportsTestJava() {
+ FmtStyle = getGoogleStyle(FormatStyle::LK_Java);
+ FmtStyle.JavaImportGroups = {"com.test", "org", "com"};
+ FmtStyle.SortIncludes = true;
+ }
+};
+
+TEST_F(SortImportsTestJava, StaticSplitFromNormal) {
+ EXPECT_EQ("import static org.b;\n"
+ "\n"
+ "import org.a;\n",
+ sort("import org.a;\n"
+ "import static org.b;\n"));
+}
+
+TEST_F(SortImportsTestJava, CapitalBeforeLowercase) {
+ EXPECT_EQ("import org.Test;\n"
+ "import org.a.Test;\n"
+ "import org.b;\n",
+ sort("import org.a.Test;\n"
+ "import org.Test;\n"
+ "import org.b;\n"));
+}
+
+TEST_F(SortImportsTestJava, KeepSplitGroupsWithOneNewImport) {
+ EXPECT_EQ("import static com.test.a;\n"
+ "\n"
+ "import static org.a;\n"
+ "\n"
+ "import static com.a;\n"
+ "\n"
+ "import com.test.b;\n"
+ "import com.test.c;\n"
+ "\n"
+ "import org.b;\n"
+ "\n"
+ "import com.b;\n",
+ sort("import static com.test.a;\n"
+ "\n"
+ "import static org.a;\n"
+ "\n"
+ "import static com.a;\n"
+ "\n"
+ "import com.test.b;\n"
+ "\n"
+ "import org.b;\n"
+ "\n"
+ "import com.b;\n"
+ "import com.test.c;\n"));
+}
+
+TEST_F(SortImportsTestJava, SplitGroupsWithNewline) {
+ EXPECT_EQ("import static com.test.a;\n"
+ "\n"
+ "import static org.a;\n"
+ "\n"
+ "import static com.a;\n"
+ "\n"
+ "import com.test.b;\n"
+ "\n"
+ "import org.b;\n"
+ "\n"
+ "import com.b;\n",
+ sort("import static com.test.a;\n"
+ "import static org.a;\n"
+ "import static com.a;\n"
+ "import com.test.b;\n"
+ "import org.b;\n"
+ "import com.b;\n"));
+}
+
+TEST_F(SortImportsTestJava, UnspecifiedGroupAfterAllGroups) {
+ EXPECT_EQ("import com.test.a;\n"
+ "\n"
+ "import org.a;\n"
+ "\n"
+ "import com.a;\n"
+ "\n"
+ "import abc.a;\n"
+ "import xyz.b;\n",
+ sort("import com.test.a;\n"
+ "import com.a;\n"
+ "import xyz.b;\n"
+ "import abc.a;\n"
+ "import org.a;\n"));
+}
+
+TEST_F(SortImportsTestJava, NoSortOutsideRange) {
+ std::vector<tooling::Range> Ranges = {tooling::Range(27, 15)};
+ EXPECT_EQ("import org.b;\n"
+ "import org.a;\n"
+ "// comments\n"
+ "// that do\n"
+ "// nothing\n",
+ sort("import org.b;\n"
+ "import org.a;\n"
+ "// comments\n"
+ "// that do\n"
+ "// nothing\n",
+ Ranges));
+}
+
+TEST_F(SortImportsTestJava, SortWhenRangeContainsOneLine) {
+ std::vector<tooling::Range> Ranges = {tooling::Range(27, 20)};
+ EXPECT_EQ("import org.a;\n"
+ "import org.b;\n"
+ "\n"
+ "import com.a;\n"
+ "// comments\n"
+ "// that do\n"
+ "// nothing\n",
+ sort("import org.b;\n"
+ "import org.a;\n"
+ "import com.a;\n"
+ "// comments\n"
+ "// that do\n"
+ "// nothing\n",
+ Ranges));
+}
+
+TEST_F(SortImportsTestJava, SortLexicographically) {
+ EXPECT_EQ("import org.a.*;\n"
+ "import org.a.a;\n"
+ "import org.aA;\n"
+ "import org.aa;\n",
+ sort("import org.aa;\n"
+ "import org.a.a;\n"
+ "import org.a.*;\n"
+ "import org.aA;\n"));
+}
+
+TEST_F(SortImportsTestJava, StaticInCommentHasNoEffect) {
+ EXPECT_EQ("import org.a; // static\n"
+ "import org.b;\n"
+ "import org.c; // static\n",
+ sort("import org.a; // static\n"
+ "import org.c; // static\n"
+ "import org.b;\n"));
+}
+
+TEST_F(SortImportsTestJava, CommentsWithAffectedImports) {
+ EXPECT_EQ("import org.a;\n"
+ "// commentB\n"
+ "/* commentB\n"
+ " commentB*/\n"
+ "import org.b;\n"
+ "// commentC\n"
+ "import org.c;\n",
+ sort("import org.a;\n"
+ "// commentC\n"
+ "import org.c;\n"
+ "// commentB\n"
+ "/* commentB\n"
+ " commentB*/\n"
+ "import org.b;\n"));
+}
+
+TEST_F(SortImportsTestJava, CommentWithUnaffectedImports) {
+ EXPECT_EQ("import org.a;\n"
+ "// comment\n"
+ "import org.b;\n",
+ sort("import org.a;\n"
+ "// comment\n"
+ "import org.b;\n"));
+}
+
+TEST_F(SortImportsTestJava, CommentAfterAffectedImports) {
+ EXPECT_EQ("import org.a;\n"
+ "import org.b;\n"
+ "// comment\n",
+ sort("import org.b;\n"
+ "import org.a;\n"
+ "// comment\n"));
+}
+
+TEST_F(SortImportsTestJava, CommentBeforeAffectedImports) {
+ EXPECT_EQ("// comment\n"
+ "import org.a;\n"
+ "import org.b;\n",
+ sort("// comment\n"
+ "import org.b;\n"
+ "import org.a;\n"));
+}
+
+TEST_F(SortImportsTestJava, FormatTotallyOff) {
+ EXPECT_EQ("// clang-format off\n"
+ "import org.b;\n"
+ "import org.a;\n"
+ "// clang-format on\n",
+ sort("// clang-format off\n"
+ "import org.b;\n"
+ "import org.a;\n"
+ "// clang-format on\n"));
+}
+
+TEST_F(SortImportsTestJava, FormatTotallyOn) {
+ EXPECT_EQ("// clang-format off\n"
+ "// clang-format on\n"
+ "import org.a;\n"
+ "import org.b;\n",
+ sort("// clang-format off\n"
+ "// clang-format on\n"
+ "import org.b;\n"
+ "import org.a;\n"));
+}
+
+TEST_F(SortImportsTestJava, FormatPariallyOnShouldNotReorder) {
+ EXPECT_EQ("// clang-format off\n"
+ "import org.b;\n"
+ "import org.a;\n"
+ "// clang-format on\n"
+ "import org.d;\n"
+ "import org.c;\n",
+ sort("// clang-format off\n"
+ "import org.b;\n"
+ "import org.a;\n"
+ "// clang-format on\n"
+ "import org.d;\n"
+ "import org.c;\n"));
+}
+
+TEST_F(SortImportsTestJava, DeduplicateImports) {
+ EXPECT_EQ("import org.a;\n", sort("import org.a;\n"
+ "import org.a;\n"));
+}
+
+TEST_F(SortImportsTestJava, NoNewlineAtEnd) {
+ EXPECT_EQ("import org.a;\n"
+ "import org.b;",
+ sort("import org.b;\n"
+ "import org.a;"));
+}
+
+} // end namespace
+} // end namespace format
+} // end namespace clang