blob: 59c42e6a6fa3d9100d29ba717027b4280cf40129 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 BEA Systems, Inc.
* 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:
* sbandow@bea.com - initial API and implementation
*
*******************************************************************************/
package org.eclipse.jdt.apt.tests;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jdt.apt.tests.annotations.ProcessorTestStatus;
public class ExceptionHandlingTests extends APTTestBase {
public ExceptionHandlingTests(final String name) {
super(name);
}
public static Test suite() {
return new TestSuite(ExceptionHandlingTests.class);
}
/**
* Annotation that expects a primitive but gets its wrapper class should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testWrapperClassForPrimitiveValue() throws Exception {
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("booleanValue = new Boolean(true)"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from Boolean to boolean", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects one primitive but gets another should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testOtherPrimitiveForBooleanValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("booleanValue = 2"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from int to boolean", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects a primitive but gets a String should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testStringForBooleanValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("booleanValue = \"not a boolean\""));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from String to boolean", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects a primitive but gets an array should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testArrayForBooleanValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("booleanValue = {}"));
fullBuild( project.getFullPath() );
ExpectedProblem ep = new ExpectedProblem("Test", "Type mismatch: cannot convert from Object[] to boolean", testPath);
expectingOnlySpecificProblemFor(testPath, ep);
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects a String but gets a primitive should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testPrimitiveForStringValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("strValue = true"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from boolean to String", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects a String but gets another class should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testOtherClassForStringValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("strValue = new Object()"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from Object to String", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects a String but gets an array should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testArrayForStringValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("strValue = {}"));
fullBuild( project.getFullPath() );
ExpectedProblem ep = new ExpectedProblem("Test", "Type mismatch: cannot convert from Object[] to String", testPath);
expectingOnlySpecificProblemFor(testPath, ep);
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects an array but gets a primitive should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testPrimitiveForArrayValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("arrValue = 'c'"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from char to String[]", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects an array but gets an object should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testNonArrayForArrayValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("arrValue = new Object()"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from Object to String[]", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Annotation that expects an array of enums but gets an annotation should not throw a ClassCastException
*/
@SuppressWarnings("nls")
public void testAnnotationForEnumArrayValue() throws Exception
{
IProject project = env.getProject( getProjectName() );
IPath srcRoot = getSourcePath();
IPath testPath = env.addClass(srcRoot, "test", "Test", getCodeForTest("enumsValue = @ExceptionHandlingAnnotation()"));
fullBuild( project.getFullPath() );
expectingOnlySpecificProblemFor(testPath, new ExpectedProblem("Test", "Type mismatch: cannot convert from ExceptionHandlingAnnotation to ExceptionHandlingAnnotation.EHAEnum[]", testPath));
assertEquals(ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors());
}
/**
* Set up the test code for APT exception handling tests
* @param annoValue attribute values to pass to ExceptionHandlingAnnotation
* @return complete test code
*/
private static String getCodeForTest(String annoValue) {
return "package test;" + "\n" +
"import org.eclipse.jdt.apt.tests.annotations.exceptionhandling.ExceptionHandlingAnnotation;" + "\n" +
"@ExceptionHandlingAnnotation(" +
annoValue +
")" + "\n" +
"public class Test" + "\n" +
"{" + "\n" +
"}";
}
}