/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.inject.client.generics; import com.google.gwt.core.client.GWT; import com.google.gwt.inject.client.AbstractGinModule; import com.google.gwt.inject.client.GinModules; import com.google.gwt.inject.client.Ginjector; import com.google.gwt.inject.client.NoGinModules; import com.google.gwt.junit.client.GWTTestCase; import com.google.inject.Inject; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * Some tests for bindings using generics. */ public class GenericsTest extends GWTTestCase { public void testKeyAndProviderGenerics() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); // Shows we could bind from generic key to another generic key List<Integer> list = ginjector.getListOfInteger(); assertNotNull(list); // And that we can use a provider method to return generics LinkedList<Integer> linkedList = ginjector.getLinkedListOfInteger(); assertSame(list, linkedList); assertEquals(2, list.size()); // Need to use Integer.valueOf to force boxing to resolve overload assertEquals(Integer.valueOf(10), list.get(0)); assertEquals(Integer.valueOf(20), list.get(1)); } public void testTypeLiteralBinding() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); List<String> list = ginjector.getListOfString(); assertNotNull(list); assertTrue(list instanceof ArrayList); } // Testing http://code.google.com/p/google-gin/issues/detail?id=54. public void testInheritedTypeParameters() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); Parameterized<String> parameterized = ginjector.getParameterized(); assertEquals("foo", parameterized.getFoo()); } public void testInheritedTypeParametersInner() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); Parameterized.InnerParameterized<Integer> parameterized = ginjector.getInnerParameterized(); assertEquals(3, (int) parameterized.getValue()); } public void testComplicateParameterized() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); Parameterized.ComplicatedParameterized<String, Parameterized.StringComparator, Map<String, Parameterized.StringComparator>> complicatedParameterized = ginjector.getComplicatedParameterized(); assertSame(ginjector.getStringComparatorMap(), complicatedParameterized.getValue()); } public void testSuperWildcards() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); List<? super String> list = ginjector.getSuperStringList(); assertTrue(list.contains("Hello")); } public void testNestedWildcard() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); ginjector.getWildcardList(); } // Testing http://code.google.com/p/google-gin/issues/detail?id=136 public void testJsniGenerics() { GenericsGinjector ginjector = GWT.create(GenericsGinjector.class); ginjector.getInjectedWithGeneric(); } public void testWildcardParametrized() { WildcardGinjector ginjector = GWT.create(WildcardGinjector.class); ginjector.getBusinessObject(); } // This is illegal in Guice (as it should be) but for that reason difficult to test here. public void testWildcardParametrized_injectType() { // FancyWildcardGinjector ginjector = GWT.create(FancyWildcardGinjector.class); // ginjector.getBusinessObject(); } public String getModuleName() { return "com.google.gwt.inject.InjectTest"; } static class ValueObject<T> { private T value; public T getValue() { return value; } public void setValue(T value) { this.value = value; } } static class InjectedValueObject<T> extends ValueObject<T> { @Override @Inject public void setValue(T value) { super.setValue(value); } } static class BusinessObject { final ValueObject<?> value; @Inject public BusinessObject(ValueObject<?> value) { this.value = value; } } @NoGinModules interface WildcardGinjector extends Ginjector { BusinessObject getBusinessObject(); } @GinModules(FancyWildcardModule.class) interface FancyWildcardGinjector extends WildcardGinjector {} static class FancyWildcardModule extends AbstractGinModule { @Override protected void configure() { bind(ValueObject.class).to(InjectedValueObject.class); } } }