/*******************************************************************************
* Copyright (c) 2012 VMware, 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:
* VMware, Inc. - initial API and implementation
*******************************************************************************/
package org.springframework.ide.eclipse.quickfix.proposals.tests;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IMethod;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.ClassInstanceCreation;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.IMethodBinding;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodInvocation;
import org.eclipse.jdt.core.dom.SimpleName;
import org.springframework.ide.eclipse.core.java.Introspector;
import org.springframework.ide.eclipse.quickfix.QuickfixUtils;
import org.springframework.ide.eclipse.quickfix.proposals.QuickfixReflectionUtils;
import org.springframework.ide.eclipse.quickfix.tests.AbstractQuickfixTestCase;
/**
* @author Terry Denney
* @author Leo Dos Santos
* @author Christian Dupuis
*/
public class QuickfixReflectionUtilsTest extends AbstractQuickfixTestCase {
private IJavaProject javaProject;
private ITypeBinding objectBinding, targetTypeBinding;
private IType targetType;
private ICompilationUnit targetCU;
private static final String ACCOUNT_CLASS_NAME = "com.test.Account", OBJECT = "java.lang.Object";
@Override
protected void setUp() throws Exception {
copyProjectCreateDocument("src/class-attribute.xml");
javaProject = JavaCore.create(project);
objectBinding = QuickfixUtils.getTargetTypeBinding(javaProject, javaProject.findType(OBJECT));
targetType = javaProject.findType(ACCOUNT_CLASS_NAME);
targetCU = targetType.getCompilationUnit();
targetTypeBinding = QuickfixUtils.getTargetTypeBinding(javaProject, targetType);
}
private Object createChangeMethodSignatureProposal() throws JavaModelException {
Set<IMethod> allConstructors = Introspector.findAllConstructors(targetType);
IMethod constructor = null;
for(IMethod c: allConstructors) {
if (c.getDeclaringType().equals(targetType) && c.getNumberOfParameters() == 0) {
constructor = c;
break;
}
}
ClassInstanceCreation invocationNode = QuickfixUtils.getMockConstructorInvocation(ACCOUNT_CLASS_NAME, new String[0]);
IMethodBinding methodBinding = QuickfixUtils.getMethodBinding(javaProject, constructor);
Object[] changeDesc = QuickfixReflectionUtils.createChangeDescriptionArray(1);
changeDesc[0] = QuickfixReflectionUtils.createInsertDescription(targetTypeBinding, "obj");
return QuickfixReflectionUtils.createChangeMethodSignatureProposal("", targetCU, invocationNode, methodBinding, changeDesc, 5, null);
}
private Object createNewFieldProposal() {
MethodInvocation expr = QuickfixUtils.getMockMethodInvocation("property", new String[0], "void", false);
SimpleName simpleName = expr.getName();
return QuickfixReflectionUtils.createNewFieldProposal("", targetCU, simpleName, targetTypeBinding, 5, null);
}
private Object createNewMethodProposal() {
ClassInstanceCreation invocationNode = QuickfixUtils.getMockConstructorInvocation(ACCOUNT_CLASS_NAME, new String[0]);
List<Expression> arguments = new ArrayList<Expression>();
return QuickfixReflectionUtils.createNewMethodProposal("", targetCU, invocationNode, arguments, targetTypeBinding, 5, null);
}
public void testApplyProposal() throws Exception {
assertTrue(QuickfixReflectionUtils.applyProposal(createChangeMethodSignatureProposal(), document));
assertTrue(QuickfixReflectionUtils.applyProposal(createNewFieldProposal(), document));
assertTrue(QuickfixReflectionUtils.applyProposal(createNewMethodProposal(), document));
}
private void testArray(Object obj, int length) {
assertNotNull(obj);
assertTrue("Expects array", obj instanceof Object[]);
Object[] array = (Object[]) obj;
assertEquals("Expect array to be of lengh " + length, length, array.length);
}
public void testCreateChangeDescriptionArray() {
testArray(QuickfixReflectionUtils.createChangeDescriptionArray(0), 0);
testArray(QuickfixReflectionUtils.createChangeDescriptionArray(1), 1);
testArray(QuickfixReflectionUtils.createChangeDescriptionArray(5), 5);
}
public void testCreateInsertDescription() {
Object desc = QuickfixReflectionUtils.createInsertDescription(objectBinding, "obj");
assertNotNull(desc);
}
public void testCreateChangeMethodSignatureProposal() throws Exception {
Object proposal = createChangeMethodSignatureProposal();
assertNotNull(proposal);
}
public void testCreateNewFieldProposal() {
Object proposal = createNewFieldProposal();
assertNotNull(proposal);
}
public void testCreateNewMethodProposal() {
Object proposal = createNewMethodProposal();
assertNotNull(proposal);
}
public void testCreateRemoveDescription() {
Object desc = QuickfixReflectionUtils.createRemoveDescription();
assertNotNull(desc);
}
}