/* * Copyright 2008 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.method; import com.google.gwt.core.client.GWT; import com.google.gwt.inject.client.AbstractGinModule; import com.google.gwt.inject.client.CreationException; 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 com.google.inject.Provides; import com.google.inject.name.Named; import com.google.inject.name.Names; public class MethodInjectTest extends GWTTestCase { public void testSimpleInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); assertEquals(ShapeGinModule.WIDTH, injector.getRectangle().getWidth()); assertEquals(ShapeGinModule.WIDTH, injector.getJigsaw().getRectangle().getWidth()); } public void testPrivateInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); Rectangle rectangle = injector.getRectangle(); assertEquals(ShapeGinModule.HEIGHT, rectangle.getHeight()); } public void testSuperInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); assertEquals(ShapeGinModule.HEIGHT, injector.getThinRectangle().getHeight()); assertEquals(ShapeGinModule.HEIGHT, injector.getJigsaw().getThinRectangle().getHeight()); } public void testInnerClassInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); assertEquals(ShapeGinModule.COLOR, injector.getBorder().getColor()); assertEquals(ShapeGinModule.COLOR, injector.getJigsaw().getBorder().getColor()); } public void testOverrideInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); assertOverrideInject(injector.getSquare()); assertOverrideInject(injector.getJigsaw().getSquare()); } public void testInterfaceInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); assertInterfaceInject(injector.getCircle()); assertInterfaceInject(injector.getJigsaw().getCircle()); } public void testMemberInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); Rectangle rectangle = new Rectangle(); assertEquals(0, rectangle.getHeight()); injector.injectMembers(rectangle); assertEquals(ShapeGinModule.WIDTH, rectangle.getWidth()); } public void testSubclassMemberInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); Square square = new Square(); assertEquals(0, square.getHeight()); // Note that this will be filled as if it were a plain rectangle! injector.injectMembers(square); assertEquals(ShapeGinModule.HEIGHT, square.getHeight()); assertEquals(0, square.getOtherHeight()); injector.injectSquare(square); assertEquals(ShapeGinModule.OTHER_HEIGHT, square.getOtherHeight()); } public void testStaticMethodInjectOnPrivateClass() { GWT.create(StaticMethodInjectOnPrivateClassGinjector.class); } public void testMemberInjectWithForwarding() { ForwardingGinjector ginjector = GWT.create(ForwardingGinjector.class); Forwarding forwarded = ginjector.getForwarding(); Forwarding forwarding = new Forwarding(); ginjector.injectMembers(forwarding); assertEquals("red", forwarding.value); assertEquals("blue", forwarded.value); } public void testNoArgsInject() { ShapeGinjector injector = GWT.create(ShapeGinjector.class); Triangle triangle = injector.getTriangle(); assertEquals(ShapeGinModule.WIDTH, triangle.getWidth()); assertTrue(triangle.isMethodInitialized()); } public void testThrowingConstructor() { DangerousGinjector ginjector = GWT.create(DangerousGinjector.class); try { ginjector.getDangerous(); fail("Expected CreationException."); } catch (CreationException expected) { // Good. } } public void testThrowingMethod() { DangerousGinjector ginjector = GWT.create(DangerousGinjector.class); try { ginjector.getVeryDangerous(); fail("Expected CreationException."); } catch (CreationException expected) { // Good. } } public void testSecretThrowingMethod() { DangerousGinjector ginjector = GWT.create(DangerousGinjector.class); try { ginjector.getHiddenDanger(); fail("Expected CreationException."); } catch (CreationException expected) { // Good. } } public void testUnsafeNativeLong() { LongInjector injector = GWT.create(LongInjector.class); assertEquals(3, injector.getLong()); assertEquals(5, injector.getHexagon().getValue()); } public String getModuleName() { return "com.google.gwt.inject.InjectTest"; } private void assertOverrideInject(Square square) { assertEquals(ShapeGinModule.HEIGHT, square.getHeight()); assertEquals(0, square.getWidth()); assertEquals(ShapeGinModule.OTHER_HEIGHT, square.getOtherHeight()); assertEquals(ShapeGinModule.OTHER_WIDTH, square.getOtherWidth()); } private void assertInterfaceInject(Circle circle) { assertNotNull(circle.getColor()); assertEquals(ShapeGinModule.COLOR, circle.getColor()); } @NoGinModules interface DangerousGinjector extends Ginjector { Dangerous getDangerous(); VeryDangerous getVeryDangerous(); HiddenDanger getHiddenDanger(); } public static class Dangerous { @Inject public Dangerous() throws Exception { throw new Exception("test"); } } public static class VeryDangerous { @Inject public void boom() throws Exception { throw new Exception("test"); } } public static class HiddenDanger { @Inject private HiddenDanger() throws Exception { throw new Exception("test"); } } private static class StaticMethodInjectOnPrivateClass { @Inject public static void injectPublic() { } @Inject static void injectPackagePrivate() { } @Inject private static void injectPrivate() { } } static class StaticMethodInjectOnPrivateClassModule extends AbstractGinModule { @Override protected void configure() { requestStaticInjection(StaticMethodInjectOnPrivateClass.class); } } @GinModules(StaticMethodInjectOnPrivateClassModule.class) interface StaticMethodInjectOnPrivateClassGinjector extends Ginjector{ } @GinModules(ForwardingModule.class) interface ForwardingGinjector extends Ginjector { Forwarding getForwarding(); void injectMembers(Forwarding forwarding); } static class ForwardingModule extends AbstractGinModule { @Override protected void configure() { bind(Forwarding.class).to(Forwarded.class); bindConstant().annotatedWith(Names.named("blue")).to("blue"); bindConstant().annotatedWith(Names.named("red")).to("red"); } } static class Forwarding { String value = ""; @Inject public void setValue(@Named("red") String value) { this.value = value; } } static class Forwarded extends Forwarding { @Inject @Override public void setValue(@Named("blue") String value) { this.value = value; } } @GinModules(LongModule.class) interface LongInjector extends Ginjector { Hexagon getHexagon(); long getLong(); } static class LongModule extends AbstractGinModule { @Override protected void configure() { bindConstant().annotatedWith(Names.named("foo")).to(5L); } @Provides private long provideLong() { return 3L; } } }