package org.robobinding.util;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertThat;
import java.util.Queue;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
/**
*
* @since 1.0
* @version $Revision: 1.0 $
* @author Cheng Wei
*/
public class SearchableClassesTest {
private SearchableClasses searchableClasses;
@Before
public void setUp() {
searchableClasses = new SearchableClasses(Sets.<Class<?>> newHashSet(GrandparentClazz.class, GrandparentSuperInterface.class, Clazz.class,
ParentInterface.class));
}
@Test
public void whenFindNearestAssignableFromUnknownClazz_thenNullIsReturned() {
Class<?> foundClazz = searchableClasses.findNearestAssignableFrom(UnknownClazz.class);
assertThat(foundClazz, is(nullValue()));
}
@SuppressWarnings("rawtypes")
@Test
public void whenfindNearestAssignableFrom_thenNearestAssignableIsReturned() {
assertThat(searchableClasses.findNearestAssignableFrom(Clazz.class), sameInstance((Class) Clazz.class));
assertThat(searchableClasses.findNearestAssignableFrom(UnregisteredParentClazz.class), sameInstance((Class) GrandparentSuperInterface.class));
assertThat(searchableClasses.findNearestAssignableFrom(UnregisteredGrandparentInterface.class), sameInstance((Class) GrandparentSuperInterface.class));
}
@Test
public void whenFindAssignablesInOrderFromUnknownClazz_thenEmptyIsReturned() {
Queue<Class<?>> foundClasses = searchableClasses.findAssignablesInOrderFrom(UnknownClazz.class);
assertThat(foundClasses, hasSize(0));
}
@SuppressWarnings("unchecked")
@Test
public void whenFindAssignablesInOrderFromClazz_thenAssignablesIsReturnedInOrder() {
Queue<Class<?>> foundClasses = searchableClasses.findAssignablesInOrderFrom(Clazz.class);
Queue<Class<?>> expectedAssignablesInOrder = Lists.newLinkedList(Lists.newArrayList(Clazz.class, ParentInterface.class,
GrandparentSuperInterface.class, GrandparentClazz.class));
assertThat(foundClasses, equalTo(expectedAssignablesInOrder));
}
public static class UnknownClazz {
}
public static class Clazz extends UnregisteredParentClazz implements ParentInterface {
}
public interface ParentInterface extends UnregisteredParentSuperInterface {
}
public interface UnregisteredParentSuperInterface {
}
public static class UnregisteredParentClazz extends GrandparentClazz implements UnregisteredGrandparentInterface {
}
public interface UnregisteredGrandparentInterface extends GrandparentSuperInterface {
}
public interface GrandparentSuperInterface {
}
public static class GrandparentClazz {
}
}