| /******************************************************************************* |
| * Copyright (c) 2000, 2016 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.core.tests.builder; |
| |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.Hashtable; |
| import java.util.List; |
| |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.core.runtime.Path; |
| import org.eclipse.core.runtime.preferences.IEclipsePreferences; |
| import org.eclipse.jdt.core.IClasspathEntry; |
| import org.eclipse.jdt.core.IJavaElement; |
| import org.eclipse.jdt.core.IJavaProject; |
| import org.eclipse.jdt.core.JavaCore; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.core.compiler.CategorizedProblem; |
| import org.eclipse.jdt.core.tests.util.AbstractCompilerTest; |
| import org.eclipse.jdt.core.tests.util.Util; |
| import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; |
| import org.eclipse.jdt.internal.core.JavaModel; |
| import org.eclipse.jdt.internal.core.JavaModelManager; |
| import org.eclipse.jdt.internal.core.JavaProject; |
| |
| import junit.framework.Test; |
| |
| @SuppressWarnings({"unchecked", "rawtypes"}) |
| public class BuildpathTests extends BuilderTests { |
| |
| public BuildpathTests(String name) { |
| super(name); |
| } |
| |
| public static Test suite() { |
| return buildTestSuite(BuildpathTests.class); |
| } |
| @Override |
| protected void setUp() throws Exception { |
| super.setUp(); |
| } |
| |
| private String getJdkLevelProblem(String expectedRuntime, String path, int severity) { |
| Object target = JavaModel.getTarget(new Path(path).makeAbsolute(), true); |
| long libraryJDK = org.eclipse.jdt.internal.core.util.Util.getJdkLevel(target); |
| String jclRuntime = CompilerOptions.versionFromJdkLevel(libraryJDK); |
| StringBuffer jdkLevelProblem = new StringBuffer("Problem : Incompatible .class files version in required binaries. Project 'Project' is targeting a "); |
| jdkLevelProblem.append(expectedRuntime); |
| jdkLevelProblem.append(" runtime, but is compiled against '"); |
| jdkLevelProblem.append(path); |
| jdkLevelProblem.append("' which requires a "); |
| jdkLevelProblem.append(jclRuntime); |
| jdkLevelProblem.append(" runtime [ resource : </Project> range : <-1,-1> category : <10> severity : <"); |
| jdkLevelProblem.append(severity); |
| jdkLevelProblem.append(">]"); |
| return jdkLevelProblem.toString(); |
| } |
| |
| public void testClasspathFileChange() throws JavaModelException { |
| // create project with src folder, and alternate unused src2 folder |
| IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath root = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| IPath classTest1 = env.addClass(root, "p1", "Test1", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p1;\n"+ //$NON-NLS-1$ |
| "public class Test1 extends Zork1 {}" //$NON-NLS-1$ |
| ); |
| // not yet on the classpath |
| IPath src2Path = env.addFolder(projectPath, "src2"); //$NON-NLS-1$ |
| IPath src2p1Path = env.addFolder(src2Path, "p1"); //$NON-NLS-1$ |
| env.addFile(src2p1Path, "Zork1.java", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p1;\n"+ //$NON-NLS-1$ |
| "public class Zork1 {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingSpecificProblemFor(classTest1, new Problem("src", "Zork1 cannot be resolved to a type", classTest1,39, 44, CategorizedProblem.CAT_TYPE, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| //---------------------------- |
| // Step 2 |
| //---------------------------- |
| StringBuffer buffer = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); //$NON-NLS-1$ |
| buffer.append("<classpath>\n"); //$NON-NLS-1$ |
| buffer.append(" <classpathentry kind=\"src\" path=\"src\"/>\n"); //$NON-NLS-1$ |
| buffer.append(" <classpathentry kind=\"src\" path=\"src2\"/>\n"); // add src2 on classpath through resource change //$NON-NLS-1$ |
| String[] classlibs = Util.getJavaClassLibs(); |
| for (int i = 0; i < classlibs.length; i++) { |
| buffer.append(" <classpathentry kind=\"lib\" path=\"").append(classlibs[i]).append("\"/>\n"); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| buffer.append(" <classpathentry kind=\"output\" path=\"bin\"/>\n"); //$NON-NLS-1$ |
| buffer.append("</classpath>"); //$NON-NLS-1$ |
| boolean wasAutoBuilding = env.isAutoBuilding(); |
| try { |
| // turn autobuild on |
| env.setAutoBuilding(true); |
| // write new .classpath, will trigger autobuild |
| env.addFile(projectPath, ".classpath", buffer.toString()); //$NON-NLS-1$ |
| // ensures the builder did see the classpath change |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| } finally { |
| env.setAutoBuilding(wasAutoBuilding); |
| } |
| } |
| |
| public void testClosedProject() throws JavaModelException, IOException { |
| IPath project1Path = env.addProject("CP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| IPath jarPath = addEmptyInternalJar(project1Path, "temp.jar"); |
| |
| IPath project2Path = env.addProject("CP2"); //$NON-NLS-1$ |
| env.addExternalJars(project2Path, Util.getJavaClassLibs()); |
| env.addRequiredProject(project2Path, project1Path); |
| |
| IPath project3Path = env.addProject("CP3"); //$NON-NLS-1$ |
| env.addExternalJars(project3Path, Util.getJavaClassLibs()); |
| env.addExternalJar(project3Path, jarPath.toString()); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| //---------------------------- |
| // Step 2 |
| //---------------------------- |
| env.closeProject(project1Path); |
| |
| incrementalBuild(); |
| expectingOnlyProblemsFor(new IPath[] {project2Path, project3Path}); |
| expectingOnlySpecificProblemsFor(project2Path, |
| new Problem[] { |
| new Problem("", "The project cannot be built until build path errors are resolved", project2Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR), //$NON-NLS-1$ //$NON-NLS-2$ |
| new Problem("Build path", "Project 'CP2' is missing required Java project: 'CP1'", project2Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| ); |
| expectingOnlySpecificProblemsFor(project3Path, |
| new Problem[] { |
| new Problem("", "The project cannot be built until build path errors are resolved", project3Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR), //$NON-NLS-1$ //$NON-NLS-2$ |
| new Problem("Build path", "Project 'CP3' is missing required library: '/CP1/temp.jar'", project3Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| ); |
| |
| env.openProject(project1Path); |
| incrementalBuild(); |
| expectingNoProblems(); |
| |
| //---------------------------- |
| // Step 3 |
| //---------------------------- |
| Hashtable<String, String> options = JavaCore.getOptions(); |
| options.put(JavaCore.CORE_JAVA_BUILD_INVALID_CLASSPATH, JavaCore.IGNORE); |
| JavaCore.setOptions(options); |
| env.closeProject(project1Path); |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingOnlyProblemsFor(new IPath[] {project2Path, project3Path}); |
| expectingOnlySpecificProblemFor(project2Path, |
| new Problem("Build path", "Project 'CP2' is missing required Java project: 'CP1'", project2Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| ); |
| expectingOnlySpecificProblemFor(project3Path, |
| new Problem("Build path", "Project 'CP3' is missing required library: '/CP1/temp.jar'", project3Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| ); |
| |
| env.openProject(project1Path); |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(project1Path); |
| } |
| |
| public void testCorruptBuilder() throws JavaModelException { |
| IPath project1Path = env.addProject("P1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| env.addClass(project1Path, "p", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;" + //$NON-NLS-1$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| IPath outputFolderPackage = env.getOutputLocation(project1Path).append("p"); //$NON-NLS-1$ |
| env.removeBinaryClass(outputFolderPackage, "Test"); //$NON-NLS-1$ |
| |
| IPath subTest = env.addClass(project1Path, "", "SubTest", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class SubTest extends p.Test {}" //$NON-NLS-1$ |
| ); |
| |
| incrementalBuild(); |
| expectingOnlySpecificProblemFor(subTest, new Problem("", "p.Test cannot be resolved to a type", subTest, 29, 35, CategorizedProblem.CAT_TYPE, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$) |
| |
| env.addClass(project1Path, "p", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;" + //$NON-NLS-1$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| Hashtable<String, String> options = JavaCore.getOptions(); |
| options.put(JavaCore.CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER, JavaCore.ENABLED); |
| JavaCore.setOptions(options); |
| |
| env.removeBinaryClass(outputFolderPackage, "Test"); //$NON-NLS-1$ |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| env.removeProject(project1Path); |
| } |
| |
| public void testCorruptBuilder2() throws JavaModelException { |
| IPath project1Path = env.addProject("P2"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| env.removePackageFragmentRoot(project1Path, ""); //$NON-NLS-1$ |
| IPath src = env.addPackageFragmentRoot(project1Path, "src"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(project1Path, "bin"); //$NON-NLS-1$ |
| |
| env.addClass(src, "p", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;" + //$NON-NLS-1$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| |
| IPath outputFolderPackage = bin.append("p"); //$NON-NLS-1$ |
| env.removeBinaryClass(outputFolderPackage, "Test"); //$NON-NLS-1$ |
| |
| IPath subTest = env.addClass(src, "p2", "SubTest", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p2;" + //$NON-NLS-1$ |
| "public class SubTest extends p.Test {}" //$NON-NLS-1$ |
| ); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingOnlySpecificProblemFor(subTest, new Problem("", "p.Test cannot be resolved to a type", subTest, 40, 46, CategorizedProblem.CAT_TYPE, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$) |
| |
| env.addClass(src, "p", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;" + //$NON-NLS-1$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| |
| Hashtable<String, String> options = JavaCore.getOptions(); |
| options.put(JavaCore.CORE_JAVA_BUILD_RECREATE_MODIFIED_CLASS_FILES_IN_OUTPUT_FOLDER, JavaCore.ENABLED); |
| JavaCore.setOptions(options); |
| |
| env.removeBinaryClass(outputFolderPackage, "Test"); //$NON-NLS-1$ |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(project1Path); |
| } |
| |
| /* |
| * Ensures that changing a type in an external folder and refreshing triggers a rebuild |
| */ |
| public void testChangeExternalFolder() throws CoreException { |
| String externalLib = Util.getOutputDirectory() + File.separator + "externalLib"; |
| IPath projectPath = env.addProject("Project"); |
| try { |
| new File(externalLib).mkdirs(); |
| Util.compile( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X {\n" + |
| " public void foo() {\n" + |
| " }\n" + |
| "}" |
| }, |
| new HashMap<String, String>(), |
| externalLib |
| ); |
| |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| env.addExternalFolders(projectPath, new String[] {externalLib}); |
| |
| IPath root = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| env.setOutputFolder(projectPath, ""); |
| |
| IPath classY = env.addClass(root, "q", "Y", |
| "package q;\n"+ |
| "public class Y {\n" + |
| " void bar(p.X x) {\n" + |
| " x.foo();\n" + |
| " }\n" + |
| "}" |
| ); |
| |
| fullBuild(projectPath); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| |
| String externalClassFile = externalLib + File.separator + "p" + File.separator + "X.class"; |
| long lastModified = new java.io.File(externalClassFile).lastModified(); |
| try { |
| Thread.sleep(1000); |
| } catch(InterruptedException e) { |
| } |
| Util.compile( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X {\n" + |
| "}" |
| }, |
| new HashMap<String, String>(), |
| externalLib |
| ); |
| new java.io.File(externalClassFile).setLastModified(lastModified + 1000); // to be sure its different |
| |
| env.getProject(projectPath).refreshLocal(IResource.DEPTH_INFINITE, null); |
| env.waitForManualRefresh(); |
| |
| incrementalBuild(projectPath); |
| env.waitForAutoBuild(); |
| expectingProblemsFor( |
| classY, |
| "Problem : The method foo() is undefined for the type X [ resource : </Project/q/Y.java> range : <54,57> category : <50> severity : <2>]" |
| ); |
| } finally { |
| new File(externalLib).delete(); |
| env.removeProject(projectPath); |
| } |
| } |
| |
| /* |
| * Ensures that changing a type in an external ZIP archive and refreshing triggers a rebuild |
| */ |
| public void testChangeZIPArchive1() throws Exception { |
| String externalLib = Util.getOutputDirectory() + File.separator + "externalLib.abc"; |
| IPath projectPath = env.addProject("Project"); |
| try { |
| org.eclipse.jdt.core.tests.util.Util.createJar( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X {\n" + |
| " public void foo() {\n" + |
| " }\n" + |
| "}" |
| }, |
| externalLib, |
| "1.4"); |
| |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| env.addExternalJars(projectPath, new String[] {externalLib}); |
| |
| IPath root = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| env.setOutputFolder(projectPath, ""); |
| |
| IPath classY = env.addClass(root, "q", "Y", |
| "package q;\n"+ |
| "public class Y {\n" + |
| " void bar(p.X x) {\n" + |
| " x.foo();\n" + |
| " }\n" + |
| "}" |
| ); |
| |
| fullBuild(projectPath); |
| expectingNoProblems(); |
| |
| org.eclipse.jdt.core.tests.util.Util.createJar( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X {\n" + |
| "}" |
| }, |
| externalLib, |
| "1.4"); |
| |
| IJavaProject p = env.getJavaProject(projectPath); |
| p.getJavaModel().refreshExternalArchives(new IJavaElement[] {p}, null); |
| |
| incrementalBuild(projectPath); |
| expectingProblemsFor( |
| classY, |
| "Problem : The method foo() is undefined for the type X [ resource : </Project/q/Y.java> range : <54,57> category : <50> severity : <2>]" |
| ); |
| } finally { |
| new File(externalLib).delete(); |
| env.removeProject(projectPath); |
| } |
| } |
| |
| /* |
| * Ensures that changing a type in an internal ZIP archive and refreshing triggers a rebuild |
| */ |
| public void testChangeZIPArchive2() throws Exception { |
| IPath projectPath = env.addProject("Project"); |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| String internalLib = env.getProject("Project").getLocation().toOSString() + File.separator + "internalLib.abc"; |
| org.eclipse.jdt.core.tests.util.Util.createJar( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X {\n" + |
| " public void foo() {\n" + |
| " }\n" + |
| "}" |
| }, |
| internalLib, |
| "1.4"); |
| env.getProject(projectPath).refreshLocal(IResource.DEPTH_INFINITE, null); |
| env.addEntry(projectPath, JavaCore.newLibraryEntry(new Path("/Project/internalLib.abc"), null, null)); |
| |
| IPath root = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| env.setOutputFolder(projectPath, ""); |
| |
| IPath classY = env.addClass(root, "q", "Y", |
| "package q;\n"+ |
| "public class Y {\n" + |
| " void bar(p.X x) {\n" + |
| " x.foo();\n" + |
| " }\n" + |
| "}" |
| ); |
| |
| fullBuild(projectPath); |
| expectingNoProblems(); |
| |
| org.eclipse.jdt.core.tests.util.Util.createJar( |
| new String[] { |
| "p/X.java", |
| "package p;\n" + |
| "public class X {\n" + |
| "}" |
| }, |
| internalLib, |
| "1.4"); |
| |
| env.getProject(projectPath).refreshLocal(IResource.DEPTH_INFINITE, null); |
| |
| incrementalBuild(projectPath); |
| expectingProblemsFor( |
| classY, |
| "Problem : The method foo() is undefined for the type X [ resource : </Project/q/Y.java> range : <54,57> category : <50> severity : <2>]" |
| ); |
| env.removeProject(projectPath); |
| } |
| |
| /* |
| * Ensures that changing an external jar and refreshing the projects triggers a rebuild |
| * (regression test for bug 50207 Compile errors fixed by 'refresh' do not reset problem list or package explorer error states) |
| */ |
| public void testExternalJarChange() throws JavaModelException, IOException { |
| // setup |
| IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| IPath root = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| IPath classTest = env.addClass(root, "p", "X", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;\n"+ //$NON-NLS-1$ |
| "public class X {\n" + //$NON-NLS-1$ |
| " void foo() {\n" + //$NON-NLS-1$ |
| " new q.Y().bar();\n" + //$NON-NLS-1$ |
| " }\n" + //$NON-NLS-1$ |
| "}" //$NON-NLS-1$ |
| ); |
| String externalJar = Util.getOutputDirectory() + File.separator + "test.jar"; //$NON-NLS-1$ |
| Util.createJar( |
| new String[] { |
| "q/Y.java", //$NON-NLS-1$ |
| "package q;\n" + //$NON-NLS-1$ |
| "public class Y {\n" + //$NON-NLS-1$ |
| "}" //$NON-NLS-1$ |
| }, |
| new HashMap<String, String>(), |
| externalJar |
| ); |
| env.addExternalJar(projectPath, externalJar); |
| |
| // build -> expecting problems |
| fullBuild(); |
| expectingProblemsFor( |
| classTest, |
| "Problem : The method bar() is undefined for the type Y [ resource : </Project/p/X.java> range : <57,60> category : <50> severity : <2>]" |
| ); |
| |
| // fix jar |
| Util.createJar( |
| new String[] { |
| "q/Y.java", //$NON-NLS-1$ |
| "package q;\n" + //$NON-NLS-1$ |
| "public class Y {\n" + //$NON-NLS-1$ |
| " public void bar() {\n" + //$NON-NLS-1$ |
| " }\n" + //$NON-NLS-1$ |
| "}" //$NON-NLS-1$ |
| }, |
| new HashMap<String, String>(), |
| externalJar |
| ); |
| |
| // refresh project and rebuild -> expecting no problems |
| IJavaProject project = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot().getProject("Project")); //$NON-NLS-1$ |
| project.getJavaModel().refreshExternalArchives(new IJavaElement[] {project}, null); |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(projectPath); |
| } |
| |
| public void testMissingBuilder() throws JavaModelException { |
| IPath project1Path = env.addProject("P1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| IPath project2Path = env.addProject("P2"); //$NON-NLS-1$ |
| env.addExternalJars(project2Path, Util.getJavaClassLibs()); |
| env.addRequiredProject(project2Path, project1Path); |
| |
| env.addClass(project1Path, "", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| IPath sub = env.addClass(project2Path, "", "SubTest", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class SubTest extends Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| env.removeRequiredProject(project2Path, project1Path); |
| |
| incrementalBuild(); |
| expectingOnlySpecificProblemFor(sub, new Problem("", "Test cannot be resolved to a type", sub, 29, 33, CategorizedProblem.CAT_TYPE, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$) |
| |
| env.addRequiredProject(project2Path, project1Path); |
| |
| try { |
| JavaProject p = (JavaProject) env.getJavaProject(project1Path); |
| p.deconfigure(); |
| JavaModelManager.getJavaModelManager().setLastBuiltState(p.getProject(), null); |
| } catch (CoreException e) { |
| e.printStackTrace(); |
| } |
| |
| env.addClass(project2Path, "", "SubTest", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class SubTest extends Test {}" //$NON-NLS-1$ |
| ); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(project1Path); |
| env.removeProject(project2Path); |
| } |
| |
| public void testMissingFieldType() throws JavaModelException { |
| IPath projectPath = env.addProject("Project1"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| IPath root = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| env.addClass(root, "p1", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p1;\n"+ //$NON-NLS-1$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| IPath projectPath2 = env.addProject("Project2"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath2, Util.getJavaClassLibs()); |
| env.addRequiredProject(projectPath2, projectPath); |
| IPath root2 = env.getPackageFragmentRootPath(projectPath2, ""); //$NON-NLS-1$ |
| env.addClass(root2, "p2", "Test2", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p2;\n"+ //$NON-NLS-1$ |
| "public class Test2 {\n" + //$NON-NLS-1$ |
| " public static p1.Test field;\n" + //$NON-NLS-1$ |
| "}" //$NON-NLS-1$ |
| ); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| |
| IPath projectPath3 = env.addProject("Project3"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath3, Util.getJavaClassLibs()); |
| env.addRequiredProject(projectPath3, projectPath2); |
| IPath root3 = env.getPackageFragmentRootPath(projectPath3, ""); //$NON-NLS-1$ |
| env.addClass(root3, "p3", "Test3", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p3;\n"+ //$NON-NLS-1$ |
| "public class Test3 extends p2.Test2 {\n" + //$NON-NLS-1$ |
| " static Object field;\n" + //$NON-NLS-1$ |
| "}" //$NON-NLS-1$ |
| ); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(projectPath); |
| } |
| |
| public void testMissingLibrary1() throws JavaModelException { |
| IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath root = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| IPath classTest1 = env.addClass(root, "p1", "Test1", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p1;\n"+ //$NON-NLS-1$ |
| "public class Test1 {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingOnlyProblemsFor(new IPath[] {projectPath, classTest1}); |
| expectingOnlySpecificProblemsFor(projectPath, |
| new Problem[] { |
| new Problem("", "The project was not built since its build path is incomplete. Cannot find the class file for java.lang.Object. Fix the build path then try building this project", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR), //$NON-NLS-1$ //$NON-NLS-2$ |
| new Problem("p1", "The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", classTest1, 0, 1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| ); |
| |
| //---------------------------- |
| // Step 2 |
| //---------------------------- |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[]{ |
| bin.append("p1").append("Test1.class"), //$NON-NLS-1$ //$NON-NLS-2$ |
| }); |
| env.removeProject(projectPath); |
| } |
| |
| public void testMissingLibrary2() throws JavaModelException { |
| IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath root = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| IPath classTest1 = env.addClass(root, "p2", "Test1", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p2;\n"+ //$NON-NLS-1$ |
| "public class Test1 {}" //$NON-NLS-1$ |
| ); |
| IPath classTest2 = env.addClass(root, "p2", "Test2", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p2;\n"+ //$NON-NLS-1$ |
| "public class Test2 {}" //$NON-NLS-1$ |
| ); |
| IPath classTest3 = env.addClass(root, "p3", "Test3", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p3;\n"+ //$NON-NLS-1$ |
| "public class Test3 {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("", "The project was not built since its build path is incomplete. Cannot find the class file for java.lang.Object. Fix the build path then try building this project", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| Problem[] prob1 = env.getProblemsFor(classTest1); |
| Problem[] prob2 = env.getProblemsFor(classTest2); |
| Problem[] prob3 = env.getProblemsFor(classTest3); |
| assertEquals("too many problems", prob1.length + prob2.length + prob3.length, 1); //$NON-NLS-1$ |
| if(prob1.length == 1) { |
| expectingSpecificProblemFor(classTest1, new Problem("p2", "The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", classTest1, 0, 1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } else if (prob2.length == 1) { |
| expectingSpecificProblemFor(classTest2, new Problem("p2", "The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", classTest2, -1, -1, -1, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } else { |
| expectingSpecificProblemFor(classTest3, new Problem("p3", "The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files", classTest3, -1, -1, -1, IMarker.SEVERITY_ERROR)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| |
| //---------------------------- |
| // Step 2 |
| //---------------------------- |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[]{ |
| bin.append("p2").append("Test1.class"), //$NON-NLS-1$ //$NON-NLS-2$ |
| bin.append("p2").append("Test2.class"), //$NON-NLS-1$ //$NON-NLS-2$ |
| bin.append("p3").append("Test3.class") //$NON-NLS-1$ //$NON-NLS-2$ |
| }); |
| env.removeProject(projectPath); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=172345 |
| public void testMissingLibrary3() throws JavaModelException { |
| this.abortOnFailure = false; // this test is failing on some releng boxes => do not abort on failures |
| IPath projectPath = env.addProject("Project"); |
| IJavaProject project = env.getJavaProject(projectPath); |
| fullBuild(); |
| expectingNoProblems(); |
| project.setOption(JavaCore.CORE_INCOMPLETE_CLASSPATH, CompilerOptions.WARNING); |
| env.waitForManualRefresh(); |
| env.addLibrary(projectPath, projectPath.append("/lib/dummy.jar"), null, null); |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("Build path", "Project 'Project' is missing required library: 'lib/dummy.jar'", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, |
| IMarker.SEVERITY_WARNING)); |
| project.setOption(JavaCore.CORE_INCOMPLETE_CLASSPATH, CompilerOptions.ERROR); |
| env.waitForManualRefresh(); |
| // force classpath change delta - should not have to do this |
| IClasspathEntry[] classpath = project.getRawClasspath(); |
| IPath outputLocation; |
| project.setRawClasspath(null, outputLocation = project.getOutputLocation(), false, null); |
| project.setRawClasspath(classpath, outputLocation, false, null); |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("", "The project cannot be built until build path errors are resolved", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR)); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("Build path", "Project 'Project' is missing required library: 'lib/dummy.jar'", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR)); |
| env.removeProject(projectPath); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=172345 |
| public void testMissingLibrary4() throws JavaModelException { |
| this.abortOnFailure = false; // this test is failing on some releng boxes => do not abort on failures |
| IPath projectPath = env.addProject("Project"); |
| IJavaProject project = env.getJavaProject(projectPath); |
| fullBuild(); |
| expectingNoProblems(); |
| env.addLibrary(projectPath, projectPath.append("/lib/dummy.jar"), null, null); |
| env.waitForManualRefresh(); |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("", "The project cannot be built until build path errors are resolved", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR)); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("Build path", "Project 'Project' is missing required library: 'lib/dummy.jar'", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR)); |
| project.setOption(JavaCore.CORE_INCOMPLETE_CLASSPATH, CompilerOptions.WARNING); |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForManualRefresh(); |
| expectingSpecificProblemFor( |
| projectPath, |
| new Problem("Build path", "Project 'Project' is missing required library: 'lib/dummy.jar'", projectPath, -1, -1, CategorizedProblem.CAT_BUILDPATH, |
| IMarker.SEVERITY_WARNING)); |
| env.removeProject(projectPath); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=172345 |
| public void testIncompatibleJdkLEvelOnProject() throws JavaModelException { |
| |
| // Create project |
| IPath projectPath = env.addProject("Project"); |
| IJavaProject project = env.getJavaProject(projectPath); |
| String[] classlibs = Util.getJavaClassLibs(); |
| env.addExternalJars(projectPath, classlibs); |
| Arrays.sort(classlibs); |
| |
| // Build it expecting no problem |
| fullBuild(); |
| expectingNoProblems(); |
| |
| // Build incompatible jdk level problem string |
| String projectRuntime = project.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, true); |
| |
| // Change project incompatible jdk level preferences to warning, perform incremental build and expect 1 problem |
| project.setOption(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, CompilerOptions.WARNING); |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| long projectRuntimeJDKLevel = CompilerOptions.versionToJdkLevel(projectRuntime); |
| int max = classlibs.length; |
| List expectedProblems = new ArrayList(); |
| for (int i = 0; i < max; i++) { |
| String path = project.getPackageFragmentRoot(classlibs[i]).getPath().makeRelative().toString(); |
| Object target = JavaModel.getTarget(new Path(path).makeAbsolute(), true); |
| long libraryJDK = org.eclipse.jdt.internal.core.util.Util.getJdkLevel(target); |
| if (libraryJDK > projectRuntimeJDKLevel) { |
| expectedProblems.add(getJdkLevelProblem(projectRuntime, path, IMarker.SEVERITY_WARNING)); |
| } |
| } |
| expectingProblemsFor(projectPath, expectedProblems); |
| |
| // Change project incompatible jdk level preferences to error, perform incremental build and expect 2 problems |
| project.setOption(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, CompilerOptions.ERROR); |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| |
| expectedProblems = new ArrayList(); |
| for (int i = 0; i < max; i++) { |
| String path = project.getPackageFragmentRoot(classlibs[i]).getPath().makeRelative().toString(); |
| Object target = JavaModel.getTarget(new Path(path).makeAbsolute(), true); |
| long libraryJDK = org.eclipse.jdt.internal.core.util.Util.getJdkLevel(target); |
| if (libraryJDK > projectRuntimeJDKLevel) { |
| expectedProblems.add(getJdkLevelProblem(projectRuntime, path, IMarker.SEVERITY_ERROR)); |
| } |
| } |
| expectedProblems.add("Problem : The project cannot be built until build path errors are resolved [ resource : </Project> range : <-1,-1> category : <10> severity : <2>]"); |
| expectingProblemsFor(projectPath, expectedProblems); |
| |
| // Remove project to avoid side effect on other tests |
| env.removeProject(projectPath); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=172345 |
| public void testIncompatibleJdkLEvelOnWksp() throws JavaModelException { |
| |
| // Save preference |
| JavaModelManager manager = JavaModelManager.getJavaModelManager(); |
| IEclipsePreferences preferences = manager.getInstancePreferences(); |
| String incompatibleJdkLevel = preferences.get(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, null); |
| try { |
| |
| // Create project |
| IPath projectPath = env.addProject("Project"); |
| IJavaProject project = env.getJavaProject(projectPath); |
| String[] classlibs = Util.getJavaClassLibs(); |
| env.addExternalJars(projectPath, classlibs); |
| |
| // Build it expecting no problem |
| fullBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| |
| // Build incompatible jdk level problem string |
| String wkspRuntime = JavaCore.getOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM); |
| long wkspRuntimeJDKLevel = CompilerOptions.versionToJdkLevel(wkspRuntime); |
| // sort classlibs |
| Arrays.sort(classlibs); |
| // Change workspace incompatible jdk level preferences to warning, perform incremental build and expect 1 problem |
| preferences.put(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, JavaCore.WARNING); |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| List expectedProblems = new ArrayList(); |
| int max = classlibs.length; |
| for (int i = 0; i < max; i++) { |
| String path = project.getPackageFragmentRoot(classlibs[i]).getPath().makeRelative().toString(); |
| Object target = JavaModel.getTarget(new Path(path).makeAbsolute(), true); |
| long libraryJDK = org.eclipse.jdt.internal.core.util.Util.getJdkLevel(target); |
| if (libraryJDK > wkspRuntimeJDKLevel) { |
| expectedProblems.add(getJdkLevelProblem(wkspRuntime, path, IMarker.SEVERITY_WARNING)); |
| } |
| } |
| expectingProblemsFor(projectPath, expectedProblems); |
| |
| // Change workspace incompatible jdk level preferences to error, perform incremental build and expect 2 problems |
| preferences.put(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, JavaCore.ERROR); |
| env.waitForManualRefresh(); |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectedProblems = new ArrayList(); |
| for (int i = 0; i < max; i++) { |
| String path = project.getPackageFragmentRoot(classlibs[i]).getPath().makeRelative().toString(); |
| Object target = JavaModel.getTarget(new Path(path).makeAbsolute(), true); |
| long libraryJDK = org.eclipse.jdt.internal.core.util.Util.getJdkLevel(target); |
| if (libraryJDK > wkspRuntimeJDKLevel) { |
| expectedProblems.add(getJdkLevelProblem(wkspRuntime, path, IMarker.SEVERITY_ERROR)); |
| } |
| } |
| expectedProblems.add("Problem : The project cannot be built until build path errors are resolved [ resource : </Project> range : <-1,-1> category : <10> severity : <2>]"); |
| expectingProblemsFor(projectPath, expectedProblems); |
| |
| // Remove project to avoid side effect on other tests |
| env.removeProject(projectPath); |
| } finally { |
| // Put back workspace preferences same as before running the test |
| if (incompatibleJdkLevel == null) { |
| preferences.remove(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL); |
| } else { |
| preferences.put(JavaCore.CORE_INCOMPATIBLE_JDK_LEVEL, incompatibleJdkLevel); |
| } |
| } |
| } |
| |
| public void testMissingProject() throws JavaModelException { |
| IPath project1Path = env.addProject("MP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| IPath project2Path = env.addProject("MP2"); //$NON-NLS-1$ |
| env.addExternalJars(project2Path, Util.getJavaClassLibs()); |
| env.addRequiredProject(project2Path, project1Path); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| //---------------------------- |
| // Step 2 |
| //---------------------------- |
| env.removeProject(project1Path); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingOnlyProblemsFor(project2Path); |
| expectingOnlySpecificProblemsFor(project2Path, |
| new Problem[] { |
| new Problem("", "The project cannot be built until build path errors are resolved", project2Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR), //$NON-NLS-1$ //$NON-NLS-2$ |
| new Problem("Build path", "Project 'MP2' is missing required Java project: 'MP1'", project2Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| ); |
| |
| project1Path = env.addProject("MP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| |
| //---------------------------- |
| // Step 3 |
| //---------------------------- |
| Hashtable<String, String> options = JavaCore.getOptions(); |
| options.put(JavaCore.CORE_JAVA_BUILD_INVALID_CLASSPATH, JavaCore.IGNORE); |
| JavaCore.setOptions(options); |
| env.waitForManualRefresh(); |
| env.removeProject(project1Path); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingOnlyProblemsFor(project2Path); |
| expectingOnlySpecificProblemFor(project2Path, |
| new Problem("Build path", "Project 'MP2' is missing required Java project: 'MP1'", project2Path, -1, -1, CategorizedProblem.CAT_BUILDPATH, IMarker.SEVERITY_ERROR) //$NON-NLS-1$ //$NON-NLS-2$ |
| ); |
| |
| project1Path = env.addProject("MP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| env.removeProject(project1Path); |
| env.removeProject(project2Path); |
| } |
| |
| public void testMissingOptionalProject() throws JavaModelException { |
| IPath project1Path = env.addProject("MP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| IPath project2Path = env.addProject("MP2"); //$NON-NLS-1$ |
| env.addExternalJars(project2Path, Util.getJavaClassLibs()); |
| env.addRequiredProject(project2Path, project1Path, true/*optional*/); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| //---------------------------- |
| // Step 2 |
| //---------------------------- |
| env.removeProject(project1Path); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| |
| project1Path = env.addProject("MP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| |
| //---------------------------- |
| // Step 3 |
| //---------------------------- |
| Hashtable<String, String> options = JavaCore.getOptions(); |
| options.put(JavaCore.CORE_JAVA_BUILD_INVALID_CLASSPATH, JavaCore.IGNORE); |
| JavaCore.setOptions(options); |
| env.waitForManualRefresh(); |
| env.removeProject(project1Path); |
| |
| incrementalBuild(); |
| env.waitForAutoBuild(); |
| expectingNoProblems(); |
| |
| project1Path = env.addProject("MP1"); //$NON-NLS-1$ |
| env.addExternalJars(project1Path, Util.getJavaClassLibs()); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(project1Path); |
| env.removeProject(project2Path); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=160132 |
| public void test0100() throws JavaModelException { |
| if (!AbstractCompilerTest.isJRELevel(AbstractCompilerTest.F_1_5)) { |
| // expected to run only in 1.5 mode on top of a jre 1.5 or above |
| return; |
| } |
| IPath projectPath = env.addProject("P", "1.5"); |
| IPath defaultPackagePath = env.addPackage(projectPath, ""); |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| env.addClass(defaultPackagePath, "X", |
| "public interface X<E extends Object & X.Entry> {\n" + |
| " interface Entry {\n" + |
| " interface Internal extends Entry {\n" + |
| " Internal createEntry();\n" + |
| " }\n" + |
| " }\n" + |
| "}" |
| ); |
| fullBuild(); |
| expectingNoProblems(); |
| env.addClass(defaultPackagePath, "Y", |
| "public class Y implements X.Entry.Internal {\n" + |
| " public Internal createEntry() {\n" + |
| " return null;\n" + |
| " }\n" + |
| "}"); |
| incrementalBuild(); |
| expectingNoProblems(); |
| env.removeProject(projectPath); |
| } |
| |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=143025 |
| public void testMissingOutputFolder() throws JavaModelException { |
| IPath projectPath = env.addProject("P"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| |
| fullBuild(); |
| expectingNoProblems(); |
| |
| env.removeFolder(bin); |
| |
| incrementalBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(bin); // check that bin folder was recreated and is marked as derived |
| if (!env.getProject(projectPath).getFolder("bin").isDerived()) |
| fail("output folder is not derived"); |
| env.removeProject(projectPath); |
| } |
| @Override |
| protected void tearDown() throws Exception { |
| super.tearDown(); |
| } |
| } |