Search in sources :

Example 1 with Tacos

use of spoon.test.generics.testclasses.Tacos in project spoon by INRIA.

the class GenericsTest method testIsGenericsMethod.

@Test
public void testIsGenericsMethod() throws Exception {
    CtType<Tacos> aTacos = buildNoClasspath(Tacos.class).Type().get(Tacos.class);
    CtTypeParameter typeParameter = aTacos.getFormalCtTypeParameters().get(0);
    assertTrue(typeParameter.isGenerics());
    assertTrue(typeParameter.getReference().isGenerics());
    CtTypeReference ctTypeReference = aTacos.getSuperInterfaces().toArray(new CtTypeReference[aTacos.getSuperInterfaces().size()])[0];
    assertFalse(aTacos.isGenerics());
    // this is a generic type reference spoon.test.generics.testclasses.ITacos<V>
    assertEquals("spoon.test.generics.testclasses.ITacos<V>", ctTypeReference.toString());
    assertTrue(ctTypeReference.isGenerics());
}
Also used : CtTypeParameter(spoon.reflect.declaration.CtTypeParameter) CtTypeReference(spoon.reflect.reference.CtTypeReference) Tacos(spoon.test.generics.testclasses.Tacos) MainTest(spoon.test.main.MainTest) Test(org.junit.Test)

Example 2 with Tacos

use of spoon.test.generics.testclasses.Tacos in project spoon by INRIA.

the class GenericsTest method testMethodTypingContextAdaptMethod.

@Test
public void testMethodTypingContextAdaptMethod() throws Exception {
    // core contracts of MethodTypingContext#adaptMethod
    Factory factory = build(new File("src/test/java/spoon/test/generics/testclasses"));
    CtClass<?> ctClassLunch = factory.Class().get(Lunch.class);
    // represents <C> void eatMe(A paramA, B paramB, C paramC){}
    CtMethod<?> trLunch_eatMe = ctClassLunch.filterChildren(new NamedElementFilter<>(CtMethod.class, "eatMe")).first();
    CtClass<?> ctClassWeddingLunch = factory.Class().get(WeddingLunch.class);
    ClassTypingContext ctcWeddingLunch = new ClassTypingContext(ctClassWeddingLunch);
    // we all analyze new methods
    final MethodTypingContext methodSTH = new MethodTypingContext().setClassTypingContext(ctcWeddingLunch);
    // contract: method can be adapted only using MethodTypingContext
    methodSTH.setMethod(trLunch_eatMe);
    CtMethod<?> adaptedLunchEatMe = (CtMethod<?>) methodSTH.getAdaptationScope();
    // contract: adapting of method declared in different scope, returns new method
    assertTrue(adaptedLunchEatMe != trLunch_eatMe);
    // check that new method is adapted correctly
    // is declared in correct class
    assertSame(ctClassWeddingLunch, adaptedLunchEatMe.getDeclaringType());
    // is not member of the same class (WeddingLunch)
    for (CtTypeMember typeMember : ctClassWeddingLunch.getTypeMembers()) {
        assertFalse(adaptedLunchEatMe == typeMember);
    }
    // the name is the same
    assertEquals("eatMe", adaptedLunchEatMe.getSimpleName());
    // it has the same number of of formal type parameters
    assertEquals(1, adaptedLunchEatMe.getFormalCtTypeParameters().size());
    assertEquals("C", adaptedLunchEatMe.getFormalCtTypeParameters().get(0).getQualifiedName());
    // parameters are correct
    assertEquals(3, adaptedLunchEatMe.getParameters().size());
    // "A paramA" becomes "X paramA" becomes Lunch%A corresponds to X in WeddingLunch
    assertEquals("X", adaptedLunchEatMe.getParameters().get(0).getType().getQualifiedName());
    // B paramB becomes Tacos becomes Lunch%B corresponds to Tacos in WeddingLunch (class WeddingLunch<X> extends CelebrationLunch<Tacos, Paella, X>)
    assertEquals(Tacos.class.getName(), adaptedLunchEatMe.getParameters().get(1).getType().getQualifiedName());
    // "C paramC" stays "C paramC"
    assertEquals("C", adaptedLunchEatMe.getParameters().get(2).getType().getQualifiedName());
    // contract: adapting of adapted method returns input method
    methodSTH.setMethod(adaptedLunchEatMe);
    assertSame(adaptedLunchEatMe, methodSTH.getAdaptationScope());
}
Also used : ClassTypingContext(spoon.support.visitor.ClassTypingContext) CtTypeMember(spoon.reflect.declaration.CtTypeMember) MethodTypingContext(spoon.support.visitor.MethodTypingContext) Tacos(spoon.test.generics.testclasses.Tacos) NamedElementFilter(spoon.reflect.visitor.filter.NamedElementFilter) ModelUtils.createFactory(spoon.testing.utils.ModelUtils.createFactory) Factory(spoon.reflect.factory.Factory) File(java.io.File) CtMethod(spoon.reflect.declaration.CtMethod) MainTest(spoon.test.main.MainTest) Test(org.junit.Test)

Example 3 with Tacos

use of spoon.test.generics.testclasses.Tacos in project spoon by INRIA.

the class GenericsTest method testGenericsInQualifiedNameInConstructorCall.

@Test
public void testGenericsInQualifiedNameInConstructorCall() throws Exception {
    final Launcher launcher = new Launcher();
    launcher.run(new String[] { "-i", "./src/test/java/spoon/test/generics/testclasses/", "-o", "./target/spooned/" });
    final CtClass<Tacos> aTacos = launcher.getFactory().Class().get(Tacos.class);
    final CtType<?> burritos = aTacos.getNestedType("Burritos");
    SortedList<CtConstructorCall> elements = new SortedList<CtConstructorCall>(new CtLineElementComparator());
    elements.addAll(burritos.getElements(new TypeFilter<>(CtConstructorCall.class)));
    assertEquals(3, elements.size());
    // Constructor call.
    assertEquals(0, elements.get(1).getExecutable().getType().getActualTypeArguments().size());
    assertNotNull(elements.get(1).getType().getDeclaringType());
    assertEquals("new Pozole()", elements.get(1).toString());
    assertEquals(2, elements.get(0).getExecutable().getType().getActualTypeArguments().size());
    assertNotNull(elements.get(0).getType().getDeclaringType());
    assertEquals("new Burritos<K, V>()", elements.get(0).toString());
    // New class.
    assertEquals(2, elements.get(2).getExecutable().getType().getActualTypeArguments().size());
    assertNotNull(elements.get(2).getType().getDeclaringType());
    assertEquals("new Burritos<K, V>() {}", elements.get(2).toString());
}
Also used : CtConstructorCall(spoon.reflect.code.CtConstructorCall) Tacos(spoon.test.generics.testclasses.Tacos) SortedList(spoon.support.util.SortedList) Launcher(spoon.Launcher) CtLineElementComparator(spoon.support.comparator.CtLineElementComparator) TypeFilter(spoon.reflect.visitor.filter.TypeFilter) ReferenceTypeFilter(spoon.reflect.visitor.filter.ReferenceTypeFilter) MainTest(spoon.test.main.MainTest) Test(org.junit.Test)

Example 4 with Tacos

use of spoon.test.generics.testclasses.Tacos in project spoon by INRIA.

the class GenericsTest method testTypeParameterReferenceAsActualTypeArgument.

@Test
public void testTypeParameterReferenceAsActualTypeArgument() throws Exception {
    CtType<Tacos> aTacos = buildNoClasspath(ClassThatDefinesANewTypeArgument.class).Type().get(ClassThatDefinesANewTypeArgument.class);
    CtTypeReference<?> typeRef = aTacos.getReference();
    assertSame(aTacos, typeRef.getDeclaration());
    CtTypeParameter typeParam = aTacos.getFormalCtTypeParameters().get(0);
    CtTypeParameterReference typeParamRef = typeParam.getReference();
    assertSame(typeParam, typeParamRef.getDeclaration());
    assertEquals("spoon.test.generics.ClassThatDefinesANewTypeArgument", typeRef.toString());
    // creating a reference to "ClassThatDefinesANewTypeArgument<T>"
    // this assignment changes parent of typeParamRef to TYPEREF
    typeRef.addActualTypeArgument(typeParamRef);
    assertEquals("spoon.test.generics.ClassThatDefinesANewTypeArgument<T>", typeRef.toString());
    // this does not change the declaration
    assertSame(aTacos, typeRef.getDeclaration());
    // stored typeParamRef is same like the added one, no clone - OK
    assertSame(typeParamRef, typeRef.getActualTypeArguments().get(0));
    // typeParamRef has got new parent
    assertSame(typeRef, typeParamRef.getParent());
    // null because without context
    assertEquals(null, typeParamRef.getDeclaration());
    assertEquals(typeParam, typeParamRef.getTypeParameterDeclaration());
    typeParamRef.setSimpleName("Y");
    assertEquals(typeParam, typeParamRef.getTypeParameterDeclaration());
}
Also used : CtTypeParameterReference(spoon.reflect.reference.CtTypeParameterReference) CtTypeParameter(spoon.reflect.declaration.CtTypeParameter) Tacos(spoon.test.generics.testclasses.Tacos) MainTest(spoon.test.main.MainTest) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)4 Tacos (spoon.test.generics.testclasses.Tacos)4 MainTest (spoon.test.main.MainTest)4 CtTypeParameter (spoon.reflect.declaration.CtTypeParameter)2 File (java.io.File)1 Launcher (spoon.Launcher)1 CtConstructorCall (spoon.reflect.code.CtConstructorCall)1 CtMethod (spoon.reflect.declaration.CtMethod)1 CtTypeMember (spoon.reflect.declaration.CtTypeMember)1 Factory (spoon.reflect.factory.Factory)1 CtTypeParameterReference (spoon.reflect.reference.CtTypeParameterReference)1 CtTypeReference (spoon.reflect.reference.CtTypeReference)1 NamedElementFilter (spoon.reflect.visitor.filter.NamedElementFilter)1 ReferenceTypeFilter (spoon.reflect.visitor.filter.ReferenceTypeFilter)1 TypeFilter (spoon.reflect.visitor.filter.TypeFilter)1 CtLineElementComparator (spoon.support.comparator.CtLineElementComparator)1 SortedList (spoon.support.util.SortedList)1 ClassTypingContext (spoon.support.visitor.ClassTypingContext)1 MethodTypingContext (spoon.support.visitor.MethodTypingContext)1 ModelUtils.createFactory (spoon.testing.utils.ModelUtils.createFactory)1