blob: 96496e2418c08328b8f0a5e82de2107e6f19e40c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2020 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.ui.tests.search;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.eclipse.jdt.testplugin.JavaProjectHelper;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.search.IJavaSearchScope;
import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory;
public class WorkspaceScopeTest {
private IJavaProject fProject1;
private IJavaProject fProject2;
private IJavaProject fProject3;
private IJavaProject fProject4;
private ICompilationUnit fCompilationUnit;
@Before
public void setUp() throws Exception {
fProject1= createStandardProject("Test", "test"); //$NON-NLS-1$ //$NON-NLS-2$
IPackageFragment pkg= fProject1.findPackageFragment(new Path("/Test/src/test")); //$NON-NLS-1$
fCompilationUnit= pkg.createCompilationUnit("Test.java", getSource(), true, null); //$NON-NLS-1$
fProject2= createStandardProject("Test2", "test2"); //$NON-NLS-1$//$NON-NLS-2$
JavaProjectHelper.addRequiredProject(fProject2, fProject1);
fProject3= createStandardProject("Test3", "test3"); //$NON-NLS-1$ //$NON-NLS-2$
fProject4= createStandardProject("Test4", "test4", false); //$NON-NLS-1$//$NON-NLS-2$
}
private IJavaProject createStandardProject(String name, String pkgName) throws CoreException, JavaModelException {
return createStandardProject(name, pkgName, true);
}
private IJavaProject createStandardProject(String name, String pkgName, boolean includeJRE) throws CoreException, JavaModelException {
IJavaProject project= JavaProjectHelper.createJavaProject(name, "bin"); //$NON-NLS-1$
IPackageFragmentRoot root= JavaProjectHelper.addSourceContainer(project, "src"); //$NON-NLS-1$
root.createPackageFragment(pkgName, true, null);
if (includeJRE) {
IClasspathEntry jreLib= JavaCore.newContainerEntry(new Path("org.eclipse.jdt.launching.JRE_CONTAINER")); //$NON-NLS-1$
JavaProjectHelper.addToClasspath(project, jreLib);
}
return project;
}
private String getSource() {
return "package test;\n" +
"\n" +
"public class Test {\n" +
" public void publicMethod() {\n" +
" }\n" +
" \n" +
" private void privateMethod() {\n" +
" }\n" +
" \n" +
" protected void protectedMethod() {\n" +
" }\n" +
" \n" +
" void defaultMethod() {\n" +
" }\n" +
"}\n";
}
@Test
public void testPrivateScope() throws JavaModelException {
IType type= fCompilationUnit.findPrimaryType();
type.getMethod("privateMethod", new String[0]); //$NON-NLS-1$
IJavaSearchScope scope= createWorkspaceScope(true);
assertTrue(scope.encloses(fCompilationUnit));
for (IPackageFragmentRoot root : fProject1.getAllPackageFragmentRoots()) {
for (IJavaElement fragment : root.getChildren()) {
assertFalse(scope.encloses(fragment));
}
}
checkNoRoots(scope, fProject2);
checkNoRoots(scope, fProject3);
}
private IJavaSearchScope createWorkspaceScope(boolean includeJRE) {
return JavaSearchScopeFactory.getInstance().createWorkspaceScope(includeJRE);
}
@Test
public void testDefaultScope() throws JavaModelException {
IType type= fCompilationUnit.findPrimaryType();
type.getMethod("defaultMethod", new String[0]); //$NON-NLS-1$
IJavaSearchScope scope= createWorkspaceScope(true);
assertTrue(scope.encloses(fCompilationUnit.getParent()));
for (IPackageFragmentRoot root : fProject1.getAllPackageFragmentRoots()) {
for (IJavaElement fragment : root.getChildren()) {
if (!fragment.equals(fCompilationUnit.getParent())) {
assertFalse(scope.encloses(fragment));
}
}
}
checkNoRoots(scope, fProject2);
checkNoRoots(scope, fProject3);
}
@Test
public void testPublicMethod() throws JavaModelException {
IType type= fCompilationUnit.findPrimaryType();
type.getMethod("publicMethod", new String[0]); //$NON-NLS-1$
IJavaSearchScope scope= createWorkspaceScope(true);
checkNoJreRoots(scope, fProject1);
checkNoJreRoots(scope, fProject2);
checkNoRoots(scope, fProject3);
}
@Test
public void testProtectedMethod() throws JavaModelException {
IType type= fCompilationUnit.findPrimaryType();
type.getMethod("protectedMethod", new String[0]); //$NON-NLS-1$
IJavaSearchScope scope= createWorkspaceScope(true);
checkNoJreRoots(scope, fProject1);
checkNoJreRoots(scope, fProject2);
checkNoRoots(scope, fProject3);
}
private void checkNoJreRoots(IJavaSearchScope scope, IJavaProject project) throws JavaModelException {
for (IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) {
if (scope.encloses(root)) {
assertFalse(root.isExternal());
} else {
assertTrue(root.isExternal());
}
}
}
private void checkJreRoots(IJavaSearchScope scope, IJavaProject project) throws JavaModelException {
for (IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) {
if (scope.encloses(root)) {
assertTrue(root.isExternal());
} else {
assertFalse(root.isExternal());
}
}
}
private void checkNoRoots(IJavaSearchScope scope, IJavaProject project) throws JavaModelException {
for (IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) {
assertFalse(scope.encloses(root));
}
}
private void checkAllRoots(IJavaSearchScope scope, IJavaProject project) throws JavaModelException {
for (IPackageFragmentRoot root : project.getAllPackageFragmentRoots()) {
assertTrue(scope.encloses(root));
}
}
@Test
public void testJREProtected() throws JavaModelException {
IType object= fProject1.findType("java.lang.Object"); //$NON-NLS-1$
object.getMethod("clone", new String [0]); //$NON-NLS-1$
IJavaSearchScope scope= createWorkspaceScope(true);
checkAllRoots(scope, fProject1);
checkAllRoots(scope, fProject2);
checkJreRoots(scope, fProject3);
checkNoRoots(scope, fProject4);
}
}