suggest 'test' scope for JUnit4 library by default
authornik <Nikolay.Chashnikov@jetbrains.com>
Fri, 28 Aug 2015 08:20:05 +0000 (11:20 +0300)
committernik <Nikolay.Chashnikov@jetbrains.com>
Fri, 28 Aug 2015 08:20:36 +0000 (11:20 +0300)
plugins/junit/src/com/intellij/execution/junit/JUnitDependencyScopeSuggester.java
plugins/junit/test/com/intellij/execution/junit/JUnitDependencyScopeSuggesterTest.java [new file with mode: 0644]

index addb0b6fbc5e3238a93c239dd0bd7422085de837..f398e5183a42e6fb48903e453f9b5fd3d45ad56a 100644 (file)
@@ -24,18 +24,35 @@ import com.intellij.openapi.vfs.VirtualFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.util.Collections;
+
 /**
  * @author nik
  */
 public class JUnitDependencyScopeSuggester extends LibraryDependencyScopeSuggester {
 /**
  * @author nik
  */
 public class JUnitDependencyScopeSuggester extends LibraryDependencyScopeSuggester {
+  private static final String[] JUNIT_JAR_MARKERS = {
+    "org.junit.Test", "junit.framework.TestCase", "org.hamcrest.Matcher", "org.hamcrest.Matchers"
+  };
+
   @Nullable
   @Override
   public DependencyScope getDefaultDependencyScope(@NotNull Library library) {
     VirtualFile[] files = library.getFiles(OrderRootType.CLASSES);
   @Nullable
   @Override
   public DependencyScope getDefaultDependencyScope(@NotNull Library library) {
     VirtualFile[] files = library.getFiles(OrderRootType.CLASSES);
-    if (files.length == 1 && (LibraryUtil.isClassAvailableInLibrary(files, "junit.framework.TestCase")
-                              || LibraryUtil.isClassAvailableInLibrary(library, "org.junit.Test"))) {
-      return DependencyScope.TEST;
+    if (files.length == 0) return null;
+    for (VirtualFile file : files) {
+      if (!isTestJarRoot(file)) {
+        return null;
+      }
+    }
+    return DependencyScope.TEST;
+  }
+
+  private static boolean isTestJarRoot(VirtualFile file) {
+    for (String marker : JUNIT_JAR_MARKERS) {
+      if (LibraryUtil.isClassAvailableInLibrary(Collections.singletonList(file), marker)) {
+        return true;
+      }
     }
     }
-    return null;
+    return false;
   }
 }
   }
 }
diff --git a/plugins/junit/test/com/intellij/execution/junit/JUnitDependencyScopeSuggesterTest.java b/plugins/junit/test/com/intellij/execution/junit/JUnitDependencyScopeSuggesterTest.java
new file mode 100644 (file)
index 0000000..9bcd693
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2000-2015 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.intellij.execution.junit;
+
+import com.intellij.openapi.projectRoots.ex.JavaSdkUtil;
+import com.intellij.openapi.roots.DependencyScope;
+import com.intellij.openapi.roots.LibraryOrderEntry;
+import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.openapi.roots.impl.OrderEntryUtil;
+import com.intellij.openapi.roots.libraries.Library;
+import com.intellij.testFramework.builders.JavaModuleFixtureBuilder;
+import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
+import com.intellij.util.ArrayUtil;
+
+/**
+ * @author nik
+ */
+public class JUnitDependencyScopeSuggesterTest extends JavaCodeInsightFixtureTestCase {
+  @Override
+  protected void tuneFixture(JavaModuleFixtureBuilder moduleBuilder) throws Exception {
+    moduleBuilder.addLibrary("junit3", JavaSdkUtil.getJunit3JarPath());
+    moduleBuilder.addLibrary("junit4", ArrayUtil.toStringArray(JavaSdkUtil.getJUnit4JarPaths()));
+    moduleBuilder.addLibrary("ideaRt", JavaSdkUtil.getIdeaRtJarPath());
+    moduleBuilder.addLibrary("empty");
+  }
+
+  public void testJunit3() throws Exception {
+    assertSame(DependencyScope.TEST, getScope("junit3"));
+  }
+
+  public void testJunit4() throws Exception {
+    assertSame(DependencyScope.TEST, getScope("junit4"));
+  }
+
+  public void testOrdinaryLibrary() throws Exception {
+    assertNull(getScope("ideaRt"));
+  }
+
+  public void testEmptyLibrary() throws Exception {
+    assertNull(getScope("empty"));
+  }
+
+  private DependencyScope getScope(String name) {
+    LibraryOrderEntry entry = OrderEntryUtil.findLibraryOrderEntry(ModuleRootManager.getInstance(myModule), name);
+    assertNotNull(entry);
+    Library library = entry.getLibrary();
+    assertNotNull(library);
+    return new JUnitDependencyScopeSuggester().getDefaultDependencyScope(library);
+  }
+}
\ No newline at end of file