package com.fluentinterface;
import com.fluentinterface.builder.Builder;
import com.fluentinterface.domain.Person;
import org.junit.Test;
import java.io.Serializable;
import static com.fluentinterface.ReflectionBuilder.implementationFor;
import static org.hamcrest.Matchers.typeCompatibleWith;
import static org.junit.Assert.*;
public class ReflectionBuilderTest {
@Test
public void shouldImplyBuiltClassFromSingleBuilderInterface() {
ReflectionBuilder<PersonBuilder> reflectionBuilder = implementationFor(PersonBuilder.class);
assertThat(reflectionBuilder.getBuiltClass(), typeCompatibleWith(Person.class));
}
@Test
public void shouldImplyBuiltClassFromMultipleBuilderInterface() {
ReflectionBuilder<PersonWithAnotherInterfaceBuilder> reflectionBuilder = implementationFor(PersonWithAnotherInterfaceBuilder.class);
assertThat(reflectionBuilder.getBuiltClass(), typeCompatibleWith(Person.class));
}
@Test(expected = IllegalStateException.class)
public void shouldNotImplyBuiltClassFromNoInterfaceAtAll() {
ReflectionBuilder<DefinitelyNotABuilder> reflectionBuilder = implementationFor(DefinitelyNotABuilder.class);
reflectionBuilder.getBuiltClass();
}
@Test(expected = IllegalStateException.class)
public void shouldNotImplyBuiltClassFromMultipleNonBuilderInterfaces() {
ReflectionBuilder<NotABuilder> reflectionBuilder = implementationFor(NotABuilder.class);
reflectionBuilder.getBuiltClass();
}
private interface PersonBuilder extends Builder<Person> {}
private interface PersonWithAnotherInterfaceBuilder extends Serializable, Builder<Person> {}
private interface NotABuilder extends Serializable, Comparable {}
private interface DefinitelyNotABuilder {}
}