package spoon.reflect.declaration;
import static org.junit.Assert.assertEquals;
import static spoon.testing.utils.ModelUtils.build;
import java.util.Set;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import spoon.reflect.declaration.testclasses.ExtendsObject;
import spoon.reflect.declaration.testclasses.Subclass;
import spoon.reflect.declaration.testclasses.Subinterface;
import spoon.reflect.declaration.testclasses.TestInterface;
import spoon.reflect.factory.Factory;
import spoon.reflect.reference.CtTypeReference;
public class CtTypeInformationTest {
private Factory factory;
@Before
public void setUp() throws Exception {
factory = build(ExtendsObject.class, Subclass.class, Subinterface.class, TestInterface.class);
}
@Test
public void testGetSuperclass() throws Exception {
final CtType<?> extendObject = this.factory.Type().get(ExtendsObject.class);
// only 1 method directly in this class
Assert.assertEquals(1, extendObject.getMethods().size());
// + 48 of ArrayList (in library)
// + 12 of java.lang.Object
Assert.assertEquals(1+12+48, extendObject.getAllMethods().size());
final CtType<?> subClass = this.factory.Type().get(Subclass.class);
assertEquals(2, subClass.getMethods().size());
assertEquals(61+2, subClass.getAllMethods().size());
CtTypeReference<?> superclass = subClass.getSuperclass();
Assert.assertEquals(ExtendsObject.class.getName(), superclass.getQualifiedName());
Assert.assertEquals(ExtendsObject.class.getName(), superclass.getQualifiedName());
Assert.assertNotNull(superclass.getSuperclass());
// test superclass of interface type reference
Set<CtTypeReference<?>> superInterfaces = subClass.getSuperInterfaces();
Assert.assertEquals(1, superInterfaces.size());
CtTypeReference<?> superinterface = superInterfaces.iterator().next();
Assert.assertEquals(Subinterface.class.getName(), superinterface.getQualifiedName());
Assert.assertNull(superinterface.getSuperclass());
// test superclass of interface
final CtType<?> type2 = this.factory.Type().get(Subinterface.class);
Assert.assertNull(type2.getSuperclass());
// the interface abstract method and the implementation method have the same signature
CtMethod<?> fooConcrete = subClass.getMethodsByName("foo").get(0);
CtMethod<?> fooAbstract = type2.getMethodsByName("foo").get(0);
assertEquals(fooConcrete.getSignature(), fooAbstract.getSignature());
// yet they are different AST node
Assert.assertNotEquals(fooConcrete, fooAbstract);
assertEquals(subClass.getMethodsByName("foo").get(0).getSignature(),
type2.getMethodsByName("foo").get(0).getSignature());
}
}