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