blob: 0895d12434a6328793ab29d25fcef288e996b77b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2008 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.wst.jsdt.core.tests.model;
import java.io.File;
import java.io.IOException;
import junit.framework.Test;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.wst.jsdt.core.IImportDeclaration;
import org.eclipse.wst.jsdt.core.IJavaScriptModelStatusConstants;
import org.eclipse.wst.jsdt.core.IJavaScriptUnit;
import org.eclipse.wst.jsdt.core.IPackageFragment;
import org.eclipse.wst.jsdt.core.IType;
import org.eclipse.wst.jsdt.core.JavaScriptModelException;
public class CreateCompilationUnitTests extends ModifyingResourceTests {
public CreateCompilationUnitTests(String name) {
super(name);
}
public static Test suite() {
return buildModelTestSuite(CreateCompilationUnitTests.class);
}
public void setUp() throws Exception {
super.setUp();
createJavaProject("P");
createFolder("/P/p");
startDeltas();
}
public void tearDown() throws Exception {
stopDeltas();
deleteProject("P");
super.tearDown();
}
/**
* Ensures that a compilation unit can be created with specified source
* in a package.
* Verifies that the proper change deltas are generated as a side effect
* of running the operation.
* Ensure that the import container has been created correctly.
*/
//no imports in JS
public void _testCUAndImportContainer() throws JavaScriptModelException {
IPackageFragment pkg = getPackage("/P/p");
IJavaScriptUnit cu= pkg.createCompilationUnit("HelloImports.js",
("package p;\n" +
"\n" +
"import java.util.Enumeration;\n" +
"import java.util.Vector;\n" +
"\n" +
"public class HelloImports {\n" +
"\n" +
" public static main(String[] args) {\n" +
" System.out.println(\"HelloWorld\");\n" +
" }\n" +
"}\n"), false,null);
assertCreation(cu);
assertDeltas(
"Unexpected delta",
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" p[*]: {CHILDREN}\n" +
" HelloImports.js[+]: {}"
);
IImportDeclaration[] imprts= cu.getImports();
assertTrue("Import does not exist", imprts.length == 2 && imprts[0].exists());
cu.close();
imprts= cu.getImports();
assertTrue("Import does not exist", imprts.length == 2 && imprts[0].exists());
}
/**
* Ensures that a default compilation unit is created for a type if
* it does not yet exist.
*/
public void testDefaultCU() throws CoreException {
IPackageFragment pkg = getPackage("/P/p");
IJavaScriptUnit cu= pkg.getJavaScriptUnit("Default.js");
IType type= cu.createType("function Default (){this.foo = \"\";}", null, false, null);
assertCreation(cu);
assertCreation(type);
assertDeltas(
"Unexpected delta",
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" p[*]: {CHILDREN}\n" +
" Default.js[+]: {}\n" +
"\n" +
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" p[*]: {CHILDREN}\n" +
" Default.js[*]: {CHILDREN | FINE GRAINED | PRIMARY RESOURCE}\n" +
" Default[+]: {}"
);
// CU should have a package statement and type
assertElementDescendants(
"Unexpected children",
"Default.js\n" +
" function Default()\n" +
" class Default\n" +
" var foo\n" +
" Default()",
cu);
// should fail if we try again
try {
pkg.createCompilationUnit("Default.js", "", false, null);
} catch (JavaScriptModelException jme) {
assertTrue("Exception status not correct for creating a cu that already exists", jme.getStatus().getCode() == IJavaScriptModelStatusConstants.NAME_COLLISION);
}
// should fail if we try again
try {
pkg.createCompilationUnit("Default.js", "public class Default {}", true, null);
return;
} catch (JavaScriptModelException jme) {
}
assertTrue("Creation should not fail if the compilation unit already exists", false);
}
/**
* Ensures that a default compilation unit is created for a type if
* it does not yet exist.
*/
public void testEmptyCU() {
IPackageFragment pkg = getPackage("/P/p");
// should fail if we try again
try {
pkg.createCompilationUnit("Empty.js", "", true, null);
} catch (JavaScriptModelException jme) {
}
IJavaScriptUnit cu= pkg.getJavaScriptUnit("Empty.js");
assertCreation(cu);
}
/*
* Ensures that a compilation unit can be created even if a file already exists on the file system.
* (regression test for bug 41611 CreateCompilationUnitOperation.executeOperation() should probably force creation more agressively)
*/
public void testForce() throws JavaScriptModelException, IOException {
IPackageFragment pkg = getPackage("/P/p");
File folder = pkg.getResource().getLocation().toFile();
new File(folder, "X.js").createNewFile();
IJavaScriptUnit cu = pkg.createCompilationUnit(
"X.js",
"function X() {\n" +
" \"\".toLowerCase();\n" +
"}",
true, // force,
null);
assertCreation(cu);
assertDeltas(
"Unexpected delta",
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" p[*]: {CHILDREN}\n" +
" X.js[+]: {}"
);
}
/**
* Ensures that a compilation unit cannot be created with an invalid name
* in a package.
*/
public void testInvalidName() {
IPackageFragment pkg = getPackage("/P/p");
try {
pkg.createCompilationUnit("HelloWorld.j", null, false, null);
} catch (JavaScriptModelException jme) {
assertTrue("Incorrect JavaScriptModelException thrown for creating a cu with invalid name", jme.getStatus().getCode() == IJavaScriptModelStatusConstants.INVALID_NAME);
try {
pkg.createCompilationUnit(null, null, false,null);
} catch (JavaScriptModelException jme2) {
assertTrue("Incorrect JavaScriptModelException thrown for creating a cu with invalid name", jme2.getStatus().getCode() == IJavaScriptModelStatusConstants.INVALID_NAME);
return;
}
}
assertTrue("No JavaScriptModelException thrown for creating a cu with an invalid name", false);
}
/**
* Ensures that a compilation unit cannot be created with <code>null</code> source
* in a package.
*/
public void testNullContents() {
IPackageFragment pkg = getPackage("/P/p");
try {
pkg.createCompilationUnit("HelloWorld.js", null, false, null);
} catch (JavaScriptModelException jme) {
assertTrue("Incorrect JavaScriptModelException thrown for creating a cu with null contents: " + jme, jme.getStatus().getCode() == IJavaScriptModelStatusConstants.INVALID_CONTENTS);
return;
}
assertTrue("No JavaScriptModelException thrown for creating a cu with null contents", false);
}
/**
* Ensures that a compilation unit can be created with specified source
* in a package.
* Verifies that the proper change deltas are generated as a side effect
* of running the operation.
*/
public void testSimpleCreation() throws JavaScriptModelException {
IPackageFragment pkg = getPackage("/P/p");
IJavaScriptUnit cu= pkg.createCompilationUnit("HelloWorld.js",
("function HelloWorld() {\n" +
"\n" +
" this.main = function(String[] args) {\n" +
" \"HelloWorld\".toLowerCase();\n" +
" }\n" +
"}\n"), false, null);
assertCreation(cu);
assertDeltas(
"Unexpected delta",
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" p[*]: {CHILDREN}\n" +
" HelloWorld.js[+]: {}"
);
}
/**
* Ensures that a default compilation unit is created for a type if
* it does not yet exist.
*/
public void testDefaultCUNewFolder() throws CoreException {
createFolder("/P/z");
IPackageFragment pkg = getPackage("/P/z");
IJavaScriptUnit cu= pkg.getJavaScriptUnit("Default.js");
IType type= cu.createType("function Default2 (){this.foo = \"\";}", null, false, null);
assertCreation(cu);
assertCreation(type);
assertDeltas(
"Unexpected delta",
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" z[+]: {}\n"+
"\n"+
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" z[*]: {CHILDREN}\n" +
" Default.js[+]: {}\n" +
"\n" +
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" z[*]: {CHILDREN}\n" +
" Default.js[*]: {CHILDREN | FINE GRAINED | PRIMARY RESOURCE}\n" +
" Default2[+]: {}"
);
// CU should have a package statement and type
assertElementDescendants(
"Unexpected children",
"Default.js\n" +
" function Default2()\n" +
" class Default2\n" +
" var foo\n" +
" Default2()",
cu);
// should fail if we try again
try {
pkg.createCompilationUnit("Default.js", "", false, null);
} catch (JavaScriptModelException jme) {
assertTrue("Exception status not correct for creating a cu that already exists", jme.getStatus().getCode() == IJavaScriptModelStatusConstants.NAME_COLLISION);
}
// should fail if we try again
try {
pkg.createCompilationUnit("Default.js", "public class Default {}", true, null);
return;
} catch (JavaScriptModelException jme) {
}
assertTrue("Creation should not fail if the compilation unit already exists", false);
}
/**
* Ensures that creating a folder, compilation unit, and types results in
* minimized deltas if in a workspace runnable, but that element info is
* still made available.
*/
public void testDefaultCUNewFolderOperation() throws CoreException {
IWorkspaceRunnable testRun = new IWorkspaceRunnable(){
public void run(IProgressMonitor monitor) throws CoreException {
createFolder("/P/z");
IPackageFragment pkg = getPackage("/P/z");
IJavaScriptUnit cu= pkg.getJavaScriptUnit("Default.js");
IType type= cu.createType("function Default2 (){this.foo = \"\";}", null, false, null);
assertCreation(cu);
assertCreation(type);
}
};
ResourcesPlugin.getWorkspace().run(testRun, null);
assertDeltas(
"Unexpected delta",
"P[*]: {CHILDREN}\n" +
" <project root>[*]: {CHILDREN}\n" +
" z[+]: {}"//\n"+
// "\n"+
// "P[*]: {CHILDREN}\n" +
// " <project root>[*]: {CHILDREN}\n" +
// " z[*]: {CHILDREN}\n" +
// " Default.js[+]: {}\n" +
// "\n" +
// "P[*]: {CHILDREN}\n" +
// " <project root>[*]: {CHILDREN}\n" +
// " z[*]: {CHILDREN}\n" +
// " Default.js[*]: {CHILDREN | FINE GRAINED | PRIMARY RESOURCE}\n" +
// " Default2[+]: {}"
);
IPackageFragment pkg = getPackage("/P/z");
IJavaScriptUnit cu= pkg.getJavaScriptUnit("Default.js");
// CU should have a package statement and type
assertElementDescendants(
"Unexpected children",
"Default.js\n" +
" function Default2()\n" +
" class Default2\n" +
" var foo\n" +
" Default2()",
cu);
// should fail if we try again
try {
pkg.createCompilationUnit("Default.js", "", false, null);
} catch (JavaScriptModelException jme) {
assertTrue("Exception status not correct for creating a cu that already exists", jme.getStatus().getCode() == IJavaScriptModelStatusConstants.NAME_COLLISION);
}
// should fail if we try again
try {
pkg.createCompilationUnit("Default.js", "public class Default {}", true, null);
return;
} catch (JavaScriptModelException jme) {
}
assertTrue("Creation should not fail if the compilation unit already exists", false);
}
}