package org.squirrelframework.foundation.component; import org.junit.After; import org.junit.Test; import org.squirrelframework.foundation.component.impl.ProgrammerImpl; import org.squirrelframework.foundation.component.impl.StudentImpl; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; public class ComponentProviderTest { @After public void tearDown() { SquirrelProvider.getInstance().clearRegistry(); } @Test public void testNewInstance() { Person p = SquirrelProvider.getInstance().newInstance(PersonImpl.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); } @Test public void testNewInstanceWithArg() { Person p = SquirrelProvider.getInstance().newInstance(PersonImpl.class, new Class[]{String.class}, new Object[]{"Henry"}); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); assertThat(p.getName(), equalTo("Henry")); } @Test public void testNewInterface() { Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); } @Test public void testOverrideImplClass() { SquirrelProvider.getInstance().register(PersonImpl.class, StudentImpl.class); Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); Person p2 = SquirrelProvider.getInstance().newInstance(PersonImpl.class); assertThat(p2, notNullValue()); assertThat(p2, instanceOf(StudentImpl.class)); SquirrelProvider.getInstance().unregister(PersonImpl.class); } @Test public void testNewInterfaceWithArg() { Person p = SquirrelProvider.getInstance().newInstance(Person.class, new Class[]{String.class}, new Object[]{"Henry"}); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); assertThat(p.getName(), equalTo("Henry")); } @Test public void testNewInterfaceWithImpl() { Student p = SquirrelProvider.getInstance().newInstance(Student.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(StudentImpl.class)); } @Test public void testRegisterAnotherImpl() { SquirrelProvider.getInstance().register(Person.class, StudentImpl.class); Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(StudentImpl.class)); SquirrelProvider.getInstance().unregister(Person.class); } @Test public void testRegisterAnotherInterface() { SquirrelProvider.getInstance().register(Person.class, Student.class); Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(StudentImpl.class)); SquirrelProvider.getInstance().unregister(Person.class); } @Test public void testImplUnregistrationRevertsToUsingDefaultImpl() { SquirrelProvider.getInstance().register(Person.class, StudentImpl.class); Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(StudentImpl.class)); SquirrelProvider.getInstance().unregister(Person.class); p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); } @Test public void testInterfaceUnregistrationRevertsToUsingDefaultImpl() { SquirrelProvider.getInstance().register(Person.class, Student.class); Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(StudentImpl.class)); SquirrelProvider.getInstance().unregister(Person.class); p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(PersonImpl.class)); } /** * I would not think this should be a supported use case but nevertheless it * failed because it only performed one additional lookup iteration on * finding an interface... */ @Test public void testRegisterInterfaceToInterface() { SquirrelProvider.getInstance().register(Person.class, Student.class); SquirrelProvider.getInstance().register(Student.class, Programmer.class); Person p = SquirrelProvider.getInstance().newInstance(Person.class); assertThat(p, notNullValue()); assertThat(p, instanceOf(ProgrammerImpl.class)); SquirrelProvider.getInstance().unregister(Person.class); } /** * Checks for cycles (maybe better to detect at registration time?) - should not get stack overflow error */ @Test(expected = IllegalStateException.class) public void testRegisterInterfaceToSameInterfaceDoesntRecurse() { SquirrelProvider.getInstance().register(Person.class, Student.class); SquirrelProvider.getInstance().register(Student.class, Person.class); SquirrelProvider.getInstance().newInstance(Person.class); } }