@Test
public void testGenericParameterClass() {
class ClassA<S, I> {}
class ClassB<I, S, C extends Collection> extends ClassA<S, I> {}
class ClassC<S extends Comparable<String>, D, I> extends ClassB<I, S, Set<Long>> {}
class ClassD<I, D extends Comparable<Double>> extends ClassC<String, D, I> implements InterfaceB<D, I> {}
class ClassE extends ClassD<Integer, Double> {}
class ClassF<B, L> extends ClassE {}
class ClassG extends ClassF<Byte, Long> {}
final Class<?> classG = ClassG.class;
assertThat(RxViper.getGenericParameterClass(classG, ClassA.class, 1)).isNotSameAs(String.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassA.class, 0)).isSameAs(String.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassA.class, 1)).isSameAs(Integer.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassB.class, 0)).isSameAs(Integer.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassB.class, 1)).isSameAs(String.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassB.class, 2)).isSameAs(Set.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassC.class, 0)).isSameAs(String.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassC.class, 1)).isSameAs(Double.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassC.class, 2)).isSameAs(Integer.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassD.class, 0)).isSameAs(Integer.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassD.class, 1)).isSameAs(Double.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassF.class, 0)).isSameAs(Byte.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassF.class, 1)).isSameAs(Long.class);
assertThat(RxViper.getGenericParameterClass(classG, InterfaceA.class, 0)).isSameAs(Integer.class);
assertThat(RxViper.getGenericParameterClass(classG, InterfaceB.class, 0)).isSameAs(Double.class);
assertThat(RxViper.getGenericParameterClass(classG, InterfaceB.class, 1)).isSameAs(Integer.class);
thrown.expect(EmptyStackException.class);
assertThat(RxViper.getGenericParameterClass(classG, ClassE.class, 0)).isSameAs(Double.class);
}