package com.googlecode.gwt.test.gin; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.rpc.AsyncCallback; import com.googlecode.gwt.test.GwtTestTest; import com.googlecode.gwt.test.gin.Injectors.*; import com.googlecode.gwt.test.rpc.RemoteServiceCreateHandler; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Fail.fail; public class GInjectorCreateHandlerTest extends GwtTestTest { @Before public void beforeGinjectorCreateHandler() { addGwtCreateHandler(new GInjectorCreateHandler()); addGwtCreateHandler(new RemoteServiceCreateHandler() { @Override protected Object findService(Class<?> remoteServiceClass, String remoteServiceRelativePath) { if (Service.class.equals(remoteServiceClass)) { return new ServiceImpl(); } else if (SomeService.class.equals(remoteServiceClass)) { return new SomeServiceImpl(); } return null; } }); } @Test public void shouldBindAndServe() { // Given Gin1Injector injector1 = GWT.create(Gin1Injector.class); // When Virtual v = injector1.virtual(); // Then assertThat(v.getClass()).isEqualTo(Impl.class); assertThat(injector1.virtual()).isSameAs(v); } @Test public void shouldFallbackToGwtCreate() { // Given Gin2Injector injector2 = GWT.create(Gin2Injector.class); // When Virtual virtual = injector2.virtual(); SomeServiceAsync service = injector2.service(); // Then assertThat(virtual.getClass()).isEqualTo(Impl2.class); assertThat(injector2.virtual()).isNotSameAs(virtual); assertThat(service).isNotNull(); } @Test public void shouldInstanciateAsyncProvider() { Gin8Injector injector8 = GWT.create(Gin8Injector.class); // When injector8.classWithAsyncProvider().onSuccess(new AsyncCallback<Impl2>() { public void onFailure(Throwable caught) { fail("should not fail", caught); } public void onSuccess(Impl2 result) { assertThat(result.messages.myName()).isEqualTo("this is junit"); } }); } // FIXME : we have to make Assisted injection work.. @Ignore @Test public void shouldInstanciateClassWithAssistedInjection() { // Given Gin9Injector injector9 = GWT.create(Gin9Injector.class); // When ClassWithAssistedInjection o = injector9.assistedInjectFactory().newClassWithAssistedInjection( "my assisted string"); // Then assertThat(o.assistedString).isEqualTo("my assisted string"); assertThat(o.virtual).isInstanceOf(Impl2.class); } @Test public void shouldInstanciateSingletonOnce() { // Given Gin5Injector injector5 = GWT.create(Gin5Injector.class); // When Impl impl = injector5.singletonImpl(); Virtual virtual = injector5.singletonVirtual(); // Then assertThat(virtual).isSameAs(impl); } @Test public void shouldInstanciateUsingProvidesMethod() { // Given Gin6Injector injector6 = GWT.create(Gin6Injector.class); // When Impl3 wrapper = injector6.wrapper(); // Then assertThat(wrapper.wrapped).isEqualTo(injector6.singletonImpl()); } @Test public void shouldInstantiateComplexObjectGraphs() { // Given Gin2Injector injector2 = GWT.create(Gin2Injector.class); // When VirtualMore more = injector2.virtualMore(); // Then assertThat(more.getClass()).isEqualTo(ImplMore.class); } @Test public void shouldInstantiateConcreteComplexObjectGraphs() { // Given Gin3Injector injector3 = GWT.create(Gin3Injector.class); // When ImplMore more = injector3.implMore(); // Then assertThat(more.core.getClass()).isEqualTo(Impl2.class); assertThat(((Impl2) more.core).messages).isNotNull(); } @Test public void shouldInstantiateEeagerSingleton() { // Given Gin7Injector injector7 = GWT.create(Gin7Injector.class); // When Impl2 impl2 = injector7.eagerSingleton(); // Then assertThat(impl2).isNotNull(); assertThat(impl2.messages).isNotNull(); } /** * This is the use case that needs to hold. <code><pre> * class Animal { * <p> * @Inject Animal (Provider<Sound> soundProvider) { } } </pre></code> */ @SuppressWarnings("unused") @Test public void shouldInstantiateObjectGraphsContainingProviders() { Gin4Injector injector4 = GWT.create(Gin4Injector.class); Virtual virtual = injector4.virtual(); } }