import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.Collections;
+
/**
* @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);
- 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;
}
}
--- /dev/null
+/*
+ * 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