/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.reflection.impl;

import java.util.List;
import net.ranides.assira.generic.TypeToken;
import net.ranides.assira.reflection.IClass;
import org.junit.Test;
import static net.ranides.assira.junit.NewAssert.*;

/**
 *
 * @author Ranides Atterwim <ranides@gmail.com>
 */
public class AContextTest {
    
    public AContextTest() {
    }

    @Test
    public void testTypeVariable() {
        IClass<?> ic1 = new TypeToken<TValue<Float>>(){};
        
        assertEquals("[java.util.List<java.lang.Float>]", ic1.method("func1").get().arguments().types().toString());
        assertEquals("[java.util.List<? super E>]", ic1.method("func2").get().arguments().types().toString());
        assertEquals("[java.util.List<? extends E>]", ic1.method("func3").get().arguments().types().toString());
        


    }
    
    public static class TValue<E> {
        
        // mieliśmy bardzo dziwny błąd: jeśli parametr-generic miał argument o nazwie X (np List<X>) i nasza klasa też
        // to wpadaliśmy w rekurencję przy rozpoznawaniu typów wildcardów
        
        // btw: nawet jeśli nie było błędu (bo nazwy różne) to i tak źle nam te typy rozpoznawało
        // więc wyłączyliśmy "odgenericowywanie" dla wildcardów całkiem
        // ZWŁASZCZA, że wynik takiego czegoś i tak jest bezużyteczny programowo w obecnym API
        
        public void func1(List<E> param) { }
        
        public void func2(List<? super E> param) { }
        
        public void func3(List<? extends E> param) { }

        
    }
    
}
