/******************************************************************************* * Copyright (c) 2008, 2015 Walter Harley 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: * eclipse@cafewalter.com - initial API and implementation * IBM Corporation - Added new test testInfoProblems() *******************************************************************************/ package org.eclipse.jdt.apt.pluggable.tests; import javax.lang.model.SourceVersion; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.apt.core.util.AptConfig; import org.eclipse.jdt.apt.pluggable.tests.processors.modeltester.ModelTester8Proc; import org.eclipse.jdt.apt.pluggable.tests.processors.modeltester.ModelTesterProc; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; /** * Basic tests for the typesystem model interfaces in the IDE. * Note that most coverage of these interfaces is provided by * org.eclipse.jdt.compiler.apt.tests. */ public class ModelTests extends TestBase { public ModelTests(String name) { super(name); } public static Test suite() { return new TestSuite(ModelTests.class); } /** * Call ModelTesterProc.testFieldType(), which checks the type of a field */ public void testFieldType() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), ModelTesterProc.TEST_FIELD_TYPE_PKG, ModelTesterProc.TEST_FIELD_TYPE_CLASS, ModelTesterProc.TEST_FIELD_TYPE_SOURCE); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } /** * Call ModelTesterProc.testMethodType(), which checks the type of a method */ public void testMethodType() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), ModelTesterProc.TEST_METHOD_TYPE_PKG, ModelTesterProc.TEST_METHOD_TYPE_CLASS, ModelTesterProc.TEST_METHOD_TYPE_SOURCE); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } /** * Test whether problems with severity Info are flagged accordingly. * * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=83548 */ public void testInfoProblems() throws Throwable { ProcessorTestStatus.reset(); IJavaProject jproj = createJavaProject(_projectName); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); jproj.setOption(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.WARNING); jproj.setOption(CompilerOptions.OPTION_ReportUnqualifiedFieldAccess, CompilerOptions.INFO); jproj.setOption(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.INFO); IPath className = env.addClass(projPath.append("src"), ModelTesterProc.TEST_METHOD_TYPE_PKG, "X", "package p;\n" + "public class X { \n" + " int i;\n" + " public int foo(int p) {\n" + " int k = 0;\n" + " return i;\n" + " }\n" + "}"); fullBuild(); expectingProblemsFor(className, "Problem : The value of the local variable k is not used [ resource : </"+ _projectName + "/src/p/X.java> range : <68,69> category : <120> severity : <0>]\n" + "Problem : The value of the parameter p is not used [ resource : </"+ _projectName + "/src/p/X.java> range : <57,58> category : <120> severity : <1>]\n" + "Problem : Unqualified access to the field X.i [ resource : </"+ _projectName + "/src/p/X.java> range : <84,85> category : <80> severity : <0>]"); env.removeClass(projPath.append("src").append(ModelTesterProc.TEST_METHOD_TYPE_PKG), ModelTesterProc.TEST_METHOD_TYPE_CLASS); } /** * Call ModelTester8Proc.testMethodParameters(), which checks the type of a method */ public void testMethodParameters() throws Throwable { if (!canRunJava8()) { return; } ProcessorTestStatus.reset(); IJavaProject jproj = createJava8Project(_projectName); jproj.setOption(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.DO_NOT_GENERATE); jproj.setOption(CompilerOptions.OPTION_MethodParametersAttribute, CompilerOptions.GENERATE); disableJava5Factories(jproj); IProject proj = jproj.getProject(); IPath projPath = proj.getFullPath(); env.addClass(projPath.append("src"), ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE1_PKG, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE1_CLASS, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE1_SOURCE); env.addClass(projPath.append("src"), ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE2_PKG, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE2_CLASS, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE2_SOURCE); fullBuild(); expectingNoProblems(); assertFalse("Processor ran too early", ProcessorTestStatus.processorRan()); keepBinaryOnly(jproj, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE1_PKG, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE1_CLASS); keepBinaryOnly(jproj, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE2_PKG, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE2_CLASS); fullBuild(); env.addClass(projPath.append("src"), ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE3_PKG, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE3_CLASS, ModelTester8Proc.TEST_METHOD_PARAMETERS_TYPE3_SOURCE); AptConfig.setEnabled(jproj, true); fullBuild(); expectingNoProblems(); assertTrue("Processor did not run", ProcessorTestStatus.processorRan()); assertEquals("Processor reported errors", ProcessorTestStatus.NO_ERRORS, ProcessorTestStatus.getErrors()); } private void keepBinaryOnly(IJavaProject jproj, String packageName, String className) throws CoreException { IFile realSourceFile = jproj.getProject().getFolder("src").getFolder(packageName).getFile(className + ".java"); IFile compiledClassFile = jproj.getProject().getFolder("bin").getFolder(packageName).getFile(className + ".class"); assertTrue("No compiled class for " + packageName + "." + className + ": ",compiledClassFile.exists()); IFile prebuiltClassFile = jproj.getProject().getFolder("prebuilt").getFolder(packageName).getFile(className + ".class"); assertFalse("Compiled class already in src: ",prebuiltClassFile.exists()); compiledClassFile.copy(prebuiltClassFile.getFullPath(), true, new NullProgressMonitor()); assertTrue("Compiled class not copied to src",prebuiltClassFile.exists()); realSourceFile.delete(true, new NullProgressMonitor()); assertFalse("Still source?: ", realSourceFile.exists()); } public boolean canRunJava8() { try { SourceVersion.valueOf("RELEASE_8"); } catch(IllegalArgumentException iae) { return false; } return true; } }