Home | History | Annotate | Download | only in reflection
      1 package org.mockito.internal.util.reflection;
      2 
      3 import org.junit.Test;
      4 import org.mockitoutil.TestBase;
      5 
      6 import java.io.Serializable;
      7 import java.util.List;
      8 import java.util.Map;
      9 
     10 import static junit.framework.TestCase.assertEquals;
     11 import static org.mockito.internal.util.reflection.GenericTypeExtractor.genericTypeOf;
     12 
     13 public class GenericTypeExtractorTest extends TestBase {
     14 
     15     class Base<T> {}
     16     static class StaticBase<T> {}
     17     interface IBase<T> {}
     18     interface StaticIBase<T> {}
     19 
     20     class IntImpl extends Base<Integer> {}
     21     static class StaticIntImpl extends StaticBase<Integer> {}
     22     class NestedImpl extends Base<Base<String>> {}
     23     class NonGeneric extends Base {}
     24 
     25     class IIntImpl implements IBase<Integer>{}
     26     class INestedImpl implements IBase<IBase<String>>{}
     27     class INonGeneric implements IBase {}
     28     class Mixed extends Base<Integer> implements IBase<String> {}
     29 
     30     class Deeper extends IntImpl implements Serializable {}
     31     class EvenDeeper extends Deeper implements Cloneable {}
     32     interface Iface extends IBase<Integer> {}
     33     interface IDeeper extends Serializable, Iface, Cloneable {}
     34 
     35     interface Crazy extends Serializable, IDeeper, Cloneable {}
     36     class Crazier extends EvenDeeper implements Crazy {}
     37 
     38     @Test public void finds_generic_type() {
     39         assertEquals(Integer.class, genericTypeOf(IntImpl.class, Base.class, IBase.class));
     40         assertEquals(Integer.class, genericTypeOf(StaticIntImpl.class, StaticBase.class, IBase.class));
     41 
     42         assertEquals(Object.class, genericTypeOf(NestedImpl.class, Base.class, IBase.class));
     43         assertEquals(Object.class, genericTypeOf(NonGeneric.class, Base.class, IBase.class));
     44         assertEquals(Object.class, genericTypeOf(String.class, Base.class, IBase.class));
     45         assertEquals(Object.class, genericTypeOf(String.class, List.class, Map.class));
     46 
     47         assertEquals(String.class, genericTypeOf(new Base<String>() {}.getClass(), Base.class, IBase.class));
     48         assertEquals(String.class, genericTypeOf(new IBase<String>() {}.getClass(), Base.class, IBase.class));
     49         assertEquals(String.class, genericTypeOf(new StaticBase<String>() {}.getClass(), StaticBase.class, IBase.class));
     50         assertEquals(String.class, genericTypeOf(new StaticIBase<String>() {}.getClass(), Base.class, StaticIBase.class));
     51 
     52         assertEquals(Integer.class, genericTypeOf(Mixed.class, Base.class, IBase.class));
     53         assertEquals(Integer.class, genericTypeOf(IIntImpl.class, Base.class, IBase.class));
     54         assertEquals(Object.class, genericTypeOf(INestedImpl.class, Base.class, IBase.class));
     55         assertEquals(Object.class, genericTypeOf(INonGeneric.class, IBase.class, INonGeneric.class));
     56 
     57         assertEquals(Integer.class, genericTypeOf(Deeper.class, Base.class, IBase.class));
     58         assertEquals(Integer.class, genericTypeOf(EvenDeeper.class, Base.class, IBase.class));
     59         assertEquals(Integer.class, genericTypeOf(Iface.class, Base.class, IBase.class));
     60         assertEquals(Integer.class, genericTypeOf(IDeeper.class, Base.class, IBase.class));
     61         assertEquals(Integer.class, genericTypeOf(Crazy.class, Base.class, IBase.class));
     62         assertEquals(Integer.class, genericTypeOf(Crazier.class, Base.class, IBase.class));
     63     }
     64 }
     65