blob: 82e1c55896a3f6756174fe439b615cee87544de9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2009 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 junit.framework.Test;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.*;
import org.eclipse.jdt.internal.core.util.Util;
public class WorkingCopyNotInClasspathTests extends ModifyingResourceTests {
private ICompilationUnit workingCopy;
public WorkingCopyNotInClasspathTests(String name) {
super(name);
}
public static Test suite() {
return buildModelTestSuite(WorkingCopyNotInClasspathTests.class);
}
public void setUp() throws Exception {
super.setUp();
try {
this.createJavaProject("P", new String[] {"src"}, "bin");
this.createFolder("P/txt");
IFile file = this.createFile("P/txt/X.java",
"public class X {\n" +
"}");
ICompilationUnit cu = (ICompilationUnit)JavaCore.create(file);
this.workingCopy = cu.getWorkingCopy(null);
} catch (CoreException e) {
e.printStackTrace();
}
}
public void tearDown() throws Exception {
try {
if (this.workingCopy != null) {
this.workingCopy.discardWorkingCopy();
this.workingCopy = null;
}
this.deleteProject("P");
} catch (CoreException e) {
e.printStackTrace();
}
super.tearDown();
}
public void testCommitWorkingCopy1() throws CoreException {
ICompilationUnit primary = this.workingCopy.getPrimary();
assertTrue("Primary element should not be null", primary != null);
IBuffer workingCopyBuffer = this.workingCopy.getBuffer();
assertTrue("Working copy buffer should not be null", workingCopyBuffer != null);
String newContents =
"public class X {\n" +
" public void foo() {\n" +
" }\n" +
"}";
workingCopyBuffer.setContents(newContents);
this.workingCopy.commitWorkingCopy(false, null);
IFile originalFile = (IFile)primary.getResource();
assertSourceEquals(
"Unexpected contents",
newContents,
new String(Util.getResourceContentsAsCharArray(originalFile)));
}
/*
* Ensures that commiting a non-primary working copy that is inside a folder that is excluded doesn't throw a JavaModelException
* (regression test for bug 52355 Not present exception trying to create a class in excluded package)
*/
public void testCommitWorkingCopy2() throws CoreException {
ICompilationUnit copy = null;
try {
createJavaProject( "P2", new String[] {"src"}, null, null, null, "bin", null, null, new String[][] {new String[] {"p1/"}}, "1.4");
createFolder("/P2/src/p1/p2");
createFile("/P2/src/p1/p2/X.java", "");
copy = getCompilationUnit("P2", "src", "p1.p2", "X.java").getWorkingCopy(null);
copy.getBuffer().setContents("public class X {}");
copy.makeConsistent(null);
copy.commitWorkingCopy(false, null);
} finally {
if (copy != null) {
copy.discardWorkingCopy();
}
deleteProject("P2");
}
}
/*
* Ensure that a working copy outside the classpath does not exist
* (but can still be opened).
*/
public void testExistence() {
assertTrue("Working copy should exist", this.workingCopy.exists());
}
public void testGetSource() throws CoreException {
ICompilationUnit copy = null;
try {
this.createJavaProject("P1", new String[] {}, "bin");
this.createFolder("/P1/src/junit/test");
String source =
"package junit.test;\n" +
"public class X {\n" +
"}";
IFile file = this.createFile("/P1/src/junit/test/X.java", source);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(file);
copy = cu.getWorkingCopy(null);
assertEquals(
"Unexpected source",
source,
copy.getSource());
} finally {
if (copy != null) copy.discardWorkingCopy();
this.deleteProject("P1");
}
}
public void testParentExistence() {
assertTrue("Working copy's parent should not exist", !this.workingCopy.getParent().exists());
}
/*
* Ensures that a working copy created on a non-existing project can be reconciled.
* (regression test for bug 40322 Error creating new Java projects)
*/
public void testReconcileNonExistingProject() throws CoreException {
ICompilationUnit wc = null;
try {
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IFile file = root.getProject("NonExisting").getFile("A.java");
wc = JavaCore.createCompilationUnitFrom(file).getWorkingCopy(null);
wc.reconcile(ICompilationUnit.NO_AST, false, null, null);
} finally {
if (wc != null) {
wc.discardWorkingCopy();
}
}
}
/*
* Ensures that a working copy created in a simple project can be reconciled.
* (regression test for bug 55421 Cannot save a .java file in a non-java project anymore)
*/
public void testReconcileSimpleProject() throws CoreException {
ICompilationUnit wc = null;
try {
IProject project = createProject("SimpleProject");
IFile file = project.getFile("A.java");
wc = JavaCore.createCompilationUnitFrom(file);
ReconcilerTests.ProblemRequestor pbRequestor = new ReconcilerTests.ProblemRequestor();
wc.becomeWorkingCopy(null);
wc.getBuffer().setContents("public class A {}");
WorkingCopyOwner owner = newWorkingCopyOwner(pbRequestor);
wc.reconcile(ICompilationUnit.NO_AST, true/*force problem detection*/, owner, null);
} finally {
if (wc != null) {
wc.discardWorkingCopy();
}
deleteProject("SimpleProject");
}
}
/*
* Ensures that a working copy created in a simple project can be reconciled when it is already
* consistent but force problem detection is on.
* (regression test for bug 104486 newNotPresentException when reconciling CU in a non-java project)
*/
public void testReconcileSimpleProject2() throws CoreException {
ICompilationUnit wc = null;
try {
IProject project = createProject("SimpleProject");
IFile file = project.getFile("A.java");
wc = JavaCore.createCompilationUnitFrom(file);
ReconcilerTests.ProblemRequestor pbRequestor = new ReconcilerTests.ProblemRequestor();
wc.becomeWorkingCopy(null);
wc.reconcile(ICompilationUnit.NO_AST, true/*force problem detection*/, newWorkingCopyOwner(pbRequestor), null);
} finally {
if (wc != null) {
wc.discardWorkingCopy();
}
deleteProject("SimpleProject");
}
}
/*
* Ensure that a working copy created on a .java file in a simple project can be opened.
* (regression test for bug 33748 Cannot open working copy on .java file in simple project)
*/
public void testSimpleProject() throws CoreException {
IParent copy = null;
try {
createProject("SimpleProject");
IFile file = createFile(
"/SimpleProject/X.java",
"public class X {\n" +
"}"
);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(file);
copy = cu.getWorkingCopy(null);
try {
copy.getChildren();
} catch (JavaModelException e) {
assertTrue("Should not get JavaModelException", false);
}
} finally {
if (copy != null) {
((ICompilationUnit)copy).discardWorkingCopy();
}
deleteProject("SimpleProject");
}
}
/*
* Ensure that a primary cu (which is outside the classpath) does not exist.
*/
public void testPrimaryExistence() {
ICompilationUnit primary = this.workingCopy.getPrimary();
assertTrue(
"Primary compilation unit should not exist",
!primary.exists());
}
public void testPrimaryParentExistence() {
assertTrue(
"Primary compilation unit's parent should not exist",
!this.workingCopy.getPrimary().getParent().exists());
}
public void testIsOpen() {
assertTrue("Working copy should be open", this.workingCopy.isOpen());
}
/*
* Ensure that a primary cu (which is outside the classpath) is not opened.
*/
public void testPrimaryIsOpen() {
ICompilationUnit original = this.workingCopy.getPrimary();
assertTrue(
"Primary compilation should not be opened",
!original.isOpen());
}
// 31799 - asking project options on non-Java project populates the perProjectInfo cache incorrectly
public void testIsOnClasspath() throws CoreException {
ICompilationUnit copy = null;
try {
createProject("SimpleProject");
this.createFolder("/SimpleProject/src/junit/test");
String source =
"package junit.test;\n" +
"public class X {\n" +
"}";
IFile file = this.createFile("/SimpleProject/src/junit/test/X.java", source);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(file);
copy = cu.getWorkingCopy(null);
// working creation will cause it to open, and thus request project options
boolean isOnClasspath = copy.getJavaProject().isOnClasspath(copy);
assertTrue("working copy shouldn't answer to isOnClasspath", !isOnClasspath);
} finally {
if (copy != null) copy.discardWorkingCopy();
this.deleteProject("SimpleProject");
}
}
// 42281
public void testReconcileAndCommit1() throws CoreException {
ICompilationUnit copy = null;
try {
this.createJavaProject("JavaProject", new String[] {"src"}, "bin");
this.createFolder("/JavaProject/src/native.1");
String source =
"class X {}";
IFile file = this.createFile("/JavaProject/src/native.1/X.java", source);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(file);
copy = cu.getWorkingCopy(null);
IBuffer workingCopyBuffer = copy.getBuffer();
assertTrue("Working copy buffer should not be null", workingCopyBuffer != null);
String newContents =
"public class X {\n" +
" public void foo() {\n" +
" }\n" +
"}";
workingCopyBuffer.setContents(newContents);
copy.reconcile(ICompilationUnit.NO_AST, true, null, null);
copy.commitWorkingCopy(true, null);
IFile originalFile = (IFile)cu.getResource();
assertSourceEquals(
"Unexpected contents",
newContents,
new String(Util.getResourceContentsAsCharArray(originalFile)));
} catch(JavaModelException e) {
e.printStackTrace();
assertTrue("No exception should have occurred: "+ e.getMessage(), false);
} finally {
if (copy != null) copy.discardWorkingCopy();
this.deleteProject("JavaProject");
}
}
// 41583
public void testReconcileAndCommit2() throws CoreException {
ICompilationUnit copy = null;
try {
createProject("SimpleProject");
this.createFolder("/SimpleProject/src/native.1");
String source =
"class X {}";
IFile file = this.createFile("/SimpleProject/src/native.1/X.java", source);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(file);
copy = cu.getWorkingCopy(null);
IBuffer workingCopyBuffer = copy.getBuffer();
assertTrue("Working copy buffer should not be null", workingCopyBuffer != null);
String newContents =
"public class X {\n" +
" public void foo() {\n" +
" }\n" +
"}";
workingCopyBuffer.setContents(newContents);
copy.reconcile(ICompilationUnit.NO_AST, true, null, null);
copy.commitWorkingCopy(true, null);
IFile originalFile = (IFile)cu.getResource();
assertSourceEquals(
"Unexpected contents",
newContents,
new String(Util.getResourceContentsAsCharArray(originalFile)));
assertTrue("buffer should not have been saved successfully", workingCopyBuffer.hasUnsavedChanges());
} catch(JavaModelException e) {
e.printStackTrace();
assertTrue("No exception should have occurred: "+ e.getMessage(), false);
} finally {
if (copy != null) copy.discardWorkingCopy();
this.deleteProject("SimpleProject");
}
}
// 43879 - variation on 41583 (using primary working copy)
public void testReconcileAndCommit3() throws CoreException {
ICompilationUnit primary = null;
try {
createProject("SimpleProject");
this.createFolder("/SimpleProject/src/native.1");
String source =
"class X {}";
IFile file = this.createFile("/SimpleProject/src/native.1/X.java", source);
primary = JavaCore.createCompilationUnitFrom(file);
primary.becomeWorkingCopy(null);
IBuffer workingCopyBuffer = primary.getBuffer();
assertTrue("Working copy buffer should not be null", workingCopyBuffer != null);
String newContents =
"public class X {\n" +
" public void foo() {\n" +
" }\n" +
"}";
workingCopyBuffer.setContents(newContents);
primary.reconcile(ICompilationUnit.NO_AST, true, null, null);
primary.commitWorkingCopy(true, null);
IFile originalFile = (IFile)primary.getResource();
assertSourceEquals(
"Unexpected contents",
newContents,
new String(Util.getResourceContentsAsCharArray(originalFile)));
assertTrue("buffer should have been saved successfully", !workingCopyBuffer.hasUnsavedChanges());
} catch(JavaModelException e) {
e.printStackTrace();
assertTrue("No exception should have occurred: "+ e.getMessage(), false);
} finally {
if (primary != null) primary.discardWorkingCopy();
this.deleteProject("SimpleProject");
}
}
// 44580 - invalid unit name
public void testReconcileAndCommit4() throws CoreException {
ICompilationUnit primary = null;
try {
createProject("SimpleProject");
this.createFolder("/SimpleProject/src/native.1");
String source =
"class X {}";
IFile file = this.createFile("/SimpleProject/src/native.1/some invalid name.java", source);
primary = JavaCore.createCompilationUnitFrom(file);
primary.becomeWorkingCopy(null);
IBuffer workingCopyBuffer = primary.getBuffer();
assertTrue("Working copy buffer should not be null", workingCopyBuffer != null);
String newContents =
"public class X {\n" +
" public void foo() {\n" +
" }\n" +
"}";
workingCopyBuffer.setContents(newContents);
primary.reconcile(ICompilationUnit.NO_AST, true, null, null);
primary.commitWorkingCopy(true, null);
IFile originalFile = (IFile)primary.getResource();
assertSourceEquals(
"Unexpected contents",
newContents,
new String(Util.getResourceContentsAsCharArray(originalFile)));
assertTrue("buffer should have been saved successfully", !workingCopyBuffer.hasUnsavedChanges());
} catch(JavaModelException e) {
e.printStackTrace();
assertTrue("No exception should have occurred: "+ e.getMessage(), false);
} finally {
if (primary != null) primary.discardWorkingCopy();
this.deleteProject("SimpleProject");
}
}
// 44580 - invalid unit name
public void testReconcileAndCommit5() throws CoreException {
ICompilationUnit copy = null;
try {
this.createJavaProject("JavaProject", new String[] {"src"}, "bin");
this.createFolder("/JavaProject/src/p");
String source =
"package p; \n" +
"public class X {}";
IFile file = this.createFile("/JavaProject/src/invalid unit name.java", source);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(file);
copy = cu.getWorkingCopy(null);
IBuffer workingCopyBuffer = copy.getBuffer();
assertTrue("Working copy buffer should not be null", workingCopyBuffer != null);
String newContents =
"public class X {\n" +
" public void foo() {\n" +
" }\n" +
"}";
workingCopyBuffer.setContents(newContents);
copy.reconcile(ICompilationUnit.NO_AST, true, null, null);
copy.commitWorkingCopy(true, null);
IFile originalFile = (IFile)cu.getResource();
assertSourceEquals(
"Unexpected contents",
newContents,
new String(Util.getResourceContentsAsCharArray(originalFile)));
} catch(JavaModelException e) {
e.printStackTrace();
assertTrue("No exception should have occurred: "+ e.getMessage(), false);
} finally {
if (copy != null) copy.discardWorkingCopy();
this.deleteProject("JavaProject");
}
}
}