| /******************************************************************************* |
| * Copyright (c) 2000, 2010 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.builder; |
| |
| import junit.framework.*; |
| |
| import org.eclipse.core.runtime.IPath; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jdt.core.tests.util.Util; |
| import org.eclipse.jdt.internal.core.JavaModelManager; |
| import org.eclipse.jdt.internal.core.JavaProject; |
| |
| /** |
| * Basic tests of the image builder. |
| */ |
| public class OutputFolderTests extends BuilderTests { |
| |
| public OutputFolderTests(String name) { |
| super(name); |
| } |
| |
| public static Test suite() { |
| return buildTestSuite(OutputFolderTests.class); |
| } |
| |
| public void testChangeOutputFolder() throws JavaModelException { |
| IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| // remove old package fragment root so that names don't collide |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| |
| IPath root = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| IPath bin1 = env.setOutputFolder(projectPath, "bin1"); //$NON-NLS-1$ |
| |
| env.addClass(root, "p", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;\n" + //$NON-NLS-1$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(bin1.append("p/Test.class")); //$NON-NLS-1$ |
| |
| IPath bin2 = env.setOutputFolder(projectPath, "bin2"); //$NON-NLS-1$ |
| incrementalBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(bin2.append("p/Test.class")); //$NON-NLS-1$ |
| } |
| |
| public void testDeleteOutputFolder() throws JavaModelException { |
| IPath projectPath = env.addProject("Project"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| IPath root = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| |
| env.addClass(root, "", "Test", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class Test {}" //$NON-NLS-1$ |
| ); |
| env.addFile(root, "Test.txt", ""); //$NON-NLS-1$ //$NON-NLS-2$ |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[]{ |
| bin.append("Test.class"), //$NON-NLS-1$ |
| bin.append("Test.txt") //$NON-NLS-1$ |
| }); |
| |
| env.removeFolder(bin); |
| // incrementalBuild(); currently not detected by the incremental builder... should it? |
| fullBuild(); |
| expectingPresenceOf(new IPath[]{ |
| bin.append("Test.class"), //$NON-NLS-1$ |
| bin.append("Test.txt") //$NON-NLS-1$ |
| }); |
| } |
| /* |
| * Ensures that changing the output to be the project (when the project has a source folder src) |
| * doesn't scrub the project on exit/restart. |
| * (regression test for bug 32588 Error saving changed source files; all files in project deleted) |
| */ |
| public void testInvalidOutput() throws JavaModelException { |
| // setup project with 1 src folder and 1 output folder |
| IPath projectPath = env.addProject("P"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| // add cu and build |
| env.addClass(projectPath, "src", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| fullBuild(); |
| expectingNoProblems(); |
| |
| // set invalid output foder by editing the .classpath file |
| env.addFile( |
| projectPath, |
| ".classpath", //$NON-NLS-1$ |
| "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + //$NON-NLS-1$ |
| "<classpath>\n" + //$NON-NLS-1$ |
| " <classpathentry kind=\"src\" path=\"src\"/>\n" + //$NON-NLS-1$ |
| " <classpathentry kind=\"var\" path=\"" + Util.getJavaClassLibs() + "\"/>\n" + //$NON-NLS-1$ //$NON-NLS-2$ |
| " <classpathentry kind=\"output\" path=\"\"/>\n" + //$NON-NLS-1$ |
| "</classpath>" //$NON-NLS-1$ |
| ); |
| |
| // simulate exit/restart |
| JavaModelManager manager = JavaModelManager.getJavaModelManager(); |
| JavaProject project = (JavaProject)manager.getJavaModel().getJavaProject("P"); //$NON-NLS-1$ |
| manager.removePerProjectInfo(project, true /* remove external jar files indexes and timestamps*/); |
| |
| // change cu and build |
| IPath cuPath = env.addClass(projectPath, "src", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A { String s;}" //$NON-NLS-1$ |
| ); |
| incrementalBuild(); |
| |
| expectingPresenceOf(new IPath[] {cuPath}); |
| } |
| |
| public void testSimpleProject() throws JavaModelException { |
| IPath projectPath = env.addProject("P1"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, ""); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(projectPath, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(projectPath, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| bin.append("A.class"), //$NON-NLS-1$ |
| bin.append("p/B.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void testProjectWithBin() throws JavaModelException { |
| IPath projectPath = env.addProject("P2"); //$NON-NLS-1$ |
| IPath src = env.getPackageFragmentRootPath(projectPath, ""); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(src, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| bin.append("A.class"), //$NON-NLS-1$ |
| bin.append("p/B.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void testProjectWithSrcBin() throws JavaModelException { |
| IPath projectPath = env.addProject("P3"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath src = env.addPackageFragmentRoot(projectPath, "src"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(src, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| bin.append("A.class"), //$NON-NLS-1$ |
| bin.append("p/B.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void testProjectWith2SrcBin() throws JavaModelException { |
| IPath projectPath = env.addProject("P4"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath src1 = env.addPackageFragmentRoot(projectPath, "src1"); //$NON-NLS-1$ |
| IPath src2 = env.addPackageFragmentRoot(projectPath, "src2"); //$NON-NLS-1$ |
| IPath bin = env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(src1, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src2, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| bin.append("A.class"), //$NON-NLS-1$ |
| bin.append("p/B.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void testProjectWith2SrcAsBin() throws JavaModelException { |
| IPath projectPath = env.addProject("P5"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath src1 = env.addPackageFragmentRoot(projectPath, "src1", null, "src1"); //$NON-NLS-1$ //$NON-NLS-2$ |
| IPath src2 = env.addPackageFragmentRoot(projectPath, "src2", null, "src2"); //$NON-NLS-1$ //$NON-NLS-2$ |
| /*IPath bin =*/ env.setOutputFolder(projectPath, "bin"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(src1, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src2, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| src1.append("A.class"), //$NON-NLS-1$ |
| src2.append("p/B.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void testProjectWith2Src2Bin() throws JavaModelException { |
| IPath projectPath = env.addProject("P6"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath src1 = env.addPackageFragmentRoot(projectPath, "src1", null, "bin1"); //$NON-NLS-1$ //$NON-NLS-2$ |
| IPath src2 = env.addPackageFragmentRoot(projectPath, "src2", null, "bin2"); //$NON-NLS-1$ //$NON-NLS-2$ |
| env.setOutputFolder(projectPath, "bin1"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(src1, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src2, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| projectPath.append("bin1/A.class"), //$NON-NLS-1$ |
| projectPath.append("bin2/p/B.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void testProjectWith3Src2Bin() throws JavaModelException { |
| IPath projectPath = env.addProject("P6"); //$NON-NLS-1$ |
| env.removePackageFragmentRoot(projectPath, ""); //$NON-NLS-1$ |
| IPath src1 = env.addPackageFragmentRoot(projectPath, "src1", null, "bin1"); //$NON-NLS-1$ //$NON-NLS-2$ |
| IPath src2 = env.addPackageFragmentRoot(projectPath, "src2", null, "bin2"); //$NON-NLS-1$ //$NON-NLS-2$ |
| IPath src3 = env.addPackageFragmentRoot(projectPath, "src3", null, "bin2"); //$NON-NLS-1$ //$NON-NLS-2$ |
| env.setOutputFolder(projectPath, "bin1"); //$NON-NLS-1$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| env.addClass(src1, "", "A", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class A {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src2, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| env.addClass(src3, "", "C", //$NON-NLS-1$ //$NON-NLS-2$ |
| "public class C {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(new IPath[] { |
| projectPath.append("bin1/A.class"), //$NON-NLS-1$ |
| projectPath.append("bin2/p/B.class"), //$NON-NLS-1$ |
| projectPath.append("bin2/C.class") //$NON-NLS-1$ |
| }); |
| } |
| |
| public void test2ProjectWith1Bin() throws JavaModelException { |
| IPath projectPath = env.addProject("P7"); //$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$ |
| env.addExternalJars(projectPath, Util.getJavaClassLibs()); |
| |
| IPath projectPath2 = env.addProject("P8"); //$NON-NLS-1$ |
| IPath binLocation = env.getProject(projectPath).getFolder("bin").getLocation(); //$NON-NLS-1$ |
| env.setExternalOutputFolder(projectPath2, "externalBin", binLocation); //$NON-NLS-1$ |
| env.addExternalJars(projectPath2, Util.getJavaClassLibs()); |
| env.addRequiredProject(projectPath2, projectPath); |
| |
| env.addClass(projectPath2, "p", "B", //$NON-NLS-1$ //$NON-NLS-2$ |
| "package p;"+ //$NON-NLS-1$ |
| "public class B {}" //$NON-NLS-1$ |
| ); |
| |
| fullBuild(); |
| expectingNoProblems(); |
| expectingPresenceOf(bin.append("p/B.class")); //$NON-NLS-1$ |
| } |
| } |