blob: dba58619aa2a088f7c30f8f8b39c06f7b308ff86 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016, 2018 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.model;
import java.io.IOException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaModelMarker;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IOrdinaryClassFile;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.WorkingCopyOwner;
import junit.framework.Test;
public class ResolveTests9 extends AbstractJavaModelTests {
ICompilationUnit wc = null;
static {
// TESTS_NAMES = new String[] { "testModuleInfo_" };
// TESTS_NUMBERS = new int[] { 124 };
// TESTS_RANGE = new int[] { 16, -1 };
}
public static Test suite() {
return buildModelTestSuite(ResolveTests9.class);
}
public ResolveTests9(String name) {
super(name);
}
public ICompilationUnit getWorkingCopy(String path, String source) throws JavaModelException {
return super.getWorkingCopy(path, source, this.wcOwner);
}
public void setUpSuite() throws Exception {
super.setUpSuite();
System.setProperty("modules.to.load", "java.base;java.desktop;java.rmi;java.sql;");
IJavaProject project = setUpJavaProject("Resolve", "9", true);
String bootModPath = System.getProperty("java.home");
IClasspathEntry jrtEntry = JavaCore.newLibraryEntry(new Path(bootModPath), null, null, null, null, false);
IClasspathEntry[] old = project.getRawClasspath();
IClasspathEntry[] newPath = new IClasspathEntry[old.length +1];
System.arraycopy(old, 0, newPath, 0, old.length);
newPath[old.length] = jrtEntry;
project.setRawClasspath(newPath, null);
waitUntilIndexesReady();
}
protected void setUp() throws Exception {
super.setUp();
this.wcOwner = new WorkingCopyOwner(){};
}
public void tearDownSuite() throws Exception {
deleteProject("Resolve");
super.tearDownSuite();
}
protected void tearDown() throws Exception {
if (this.wc != null) {
this.wc.discardWorkingCopy();
}
super.tearDown();
}
public void testModuleInfo_serviceImplementation_OK() throws CoreException {
IFile modInfo = null;
try {
getWorkingCopy(
"/Resolve/src/test/ITest.java",
"public interface ITest {}\n");
getWorkingCopy(
"/Resolve/src/test/TestClass.java",
"public class TestClass implements ITest {}\n");
this.wc = getWorkingCopy(
"/Resolve/src/module-info.java",
"module com.test {\n" +
" provides p1.Y with ResolveInterface;\n" +
"}\n");
String str = this.wc.getSource();
String selection = "ResolveInterface";
int start = str.indexOf(selection);
int length = selection.length();
IJavaElement[] elements = this.wc.codeSelect(start, length);
assertElementsEqual(
"Unexpected elements",
"ResolveInterface [in ResolveInterface.java [in <default> [in src [in Resolve]]]]",
elements
);
} finally {
if (modInfo != null)
deleteResource(modInfo);
}
}
public void testModuleInfo_serviceInterface_OK() throws CoreException {
IFile modInfo = null;
IFolder testFolder = null;
try {
testFolder = createFolder("/Resolve/src/test");
createFile(
"/Resolve/src/test/ITest.java",
"public interface ITest {}\n");
createFile(
"/Resolve/src/test/TestClass.java",
"public class TestClass implements ITest {}\n");
this.wc = getWorkingCopy(
"/Resolve/src/module-info.java",
"module com.test {\n" +
" provides test.ITest with test.TestClass;\n" +
"}\n");
String str = this.wc.getSource();
String selection = "ITest";
int start = str.indexOf(selection);
int length = selection.length();
IJavaElement[] elements = this.wc.codeSelect(start, length);
assertElementsEqual(
"Unexpected elements",
"ITest [in ITest.java [in test [in src [in Resolve]]]]",
elements
);
} finally {
if (modInfo != null)
deleteResource(modInfo);
if (testFolder != null)
deleteResource(testFolder);
}
}
public void testModuleInfo_noReferenceAtKeyword() throws CoreException {
IFile providesFile = createFile("/Resolve/src/provides.java", "public class provides {}");
IFile modInfo = null;
try {
getWorkingCopy(
"/Resolve/src/test/ITest.java",
"public interface ITest {}\n");
getWorkingCopy(
"/Resolve/src/test/TestClass.java",
"public class TestClass implements ITest {}\n");
this.wc = getWorkingCopy(
"/Resolve/src/module-info.java",
"module com.test {\n" +
" provides p1.Y with ResolveInterface;\n" +
"}\n");
String str = this.wc.getSource();
String selection = "provides";
int start = str.indexOf(selection);
int length = selection.length();
IJavaElement[] elements = this.wc.codeSelect(start, length);
assertElementsEqual(
"Unexpected elements",
"",
elements
);
} finally {
deleteResource(providesFile);
if (modInfo != null)
deleteResource(modInfo);
}
}
public void testModuleInfo_referenceAtKeywordInNonKWPosition() throws CoreException {
IFile providesFile = createFile("/Resolve/src/provides.java", "public class provides implements p1.Y {}");
IFile modInfo = null;
try {
getWorkingCopy(
"/Resolve/src/test/ITest.java",
"public interface ITest {}\n");
getWorkingCopy(
"/Resolve/src/test/TestClass.java",
"public class TestClass implements ITest {}\n");
this.wc = getWorkingCopy(
"/Resolve/src/module-info.java",
"module com.test {\n" +
" provides p1.Y with provides;\n" +
"}\n");
String str = this.wc.getSource();
String selection = "provides";
int start = str.lastIndexOf(selection);
int length = selection.length();
IJavaElement[] elements = this.wc.codeSelect(start, length);
assertElementsEqual(
"Unexpected elements",
"provides [in provides.java [in <default> [in src [in Resolve]]]]",
elements
);
} finally {
deleteResource(providesFile);
if (modInfo != null)
deleteResource(modInfo);
}
}
public void testClassFileInModule1() throws CoreException, IOException {
if (!isJRE9) {
System.err.println("Test "+getName()+" requires a JRE 9");
return;
}
IJavaProject javaProject = createJava9Project("Test");
try {
IType type = javaProject.findType("java.util.zip.ZipFile");
IOrdinaryClassFile classFile = type.getClassFile();
String contents = classFile.getBuffer().getContents();
int start = contents.indexOf("this(");
IJavaElement[] selected = classFile.codeSelect(start, 4);
assertElementsEqual(
"Unexpected elements",
"ZipFile(java.io.File, int) [in ZipFile [in ZipFile.class [in java.util.zip [in <module:java.base>]]]]",
selected);
} finally {
deleteProject(javaProject);
}
}
public void testUnnamedNamedConflict() throws CoreException, IOException {
if (!isJRE9) {
System.err.println("Test "+getName()+" requires a JRE 9");
return;
}
IJavaProject mod = null;
IJavaProject test = null;
try {
mod = createJava9Project("mod");
createFolder("mod/src/p1/p2");
createFile("mod/src/p1/p2/C.java", "package p1.p2;\n public class C {}\n");
createFile("mod/src/module-info.java",
"module mod {\n" +
" exports p1.p2;\n" +
"}\n");
mod.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
test = createJava9Project("Test");
IClasspathAttribute[] attributes = { JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true") };
addClasspathEntry(test, JavaCore.newProjectEntry(new Path("/mod"), null, false, attributes, false));
createFolder("Test/src/p1/p2");
createFile("Test/src/p1/p2/C1.java", "package p1.p2;\n public class C1 {}\n");
String source =
"package q;\n" +
"public class Main {\n" +
" p1.p2.C c;\n" +
" p1.p2.C1 c1;\n" +
"}\n";
createFolder("Test/src/q");
createFile("Test/src/q/Main.java", source);
test.getProject().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = test.getProject().findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, true, IResource.DEPTH_INFINITE);
sortMarkers(markers);
assertMarkers("Unexpected markers", "The package p1.p2 conflicts with a package accessible from another module: mod", markers);
ICompilationUnit unit = getCompilationUnit("Test/src/q/Main.java");
// test that we can select both types despite the package conflict:
int start = source.indexOf("C c");
IJavaElement[] selected = unit.codeSelect(start, 2);
assertElementsEqual(
"Unexpected elements",
"C [in C.java [in p1.p2 [in src [in mod]]]]",
selected);
start = source.indexOf("C1");
selected = unit.codeSelect(start, 2);
assertElementsEqual(
"Unexpected elements",
"C1 [in C1.java [in p1.p2 [in src [in Test]]]]",
selected);
} finally {
deleteProject(test);
deleteProject(mod);
}
}
}