/*
* Copyright 2011 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.privatefactory;
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.PrivateGinModule;
import com.google.gwt.inject.client.assistedinject.GinFactoryModuleBuilder;
import com.google.gwt.junit.client.GWTTestCase;
import com.google.inject.Exposed;
import com.google.inject.Inject;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.assistedinject.Assisted;
import javax.inject.Named;
public class PrivateFactoryTest extends GWTTestCase {
public void testFactoryInParent_Exposed() throws Exception {
PrivateFactoryInParentGinjector ginjector = GWT.create(PrivateFactoryInParentGinjector.class);
Widget fooWidget = ginjector.getWidgetFactory().createWidget("foo");
Widget barWidget = ginjector.getWidgetFactory().createWidget("bar");
assertSame(fooWidget.part, barWidget.part);
assertEquals("foo", fooWidget.name);
assertEquals("bar", barWidget.name);
}
public void testFactoryInChild() throws Exception {
PrivateFactoryInChildGinjector ginjector = GWT.create(PrivateFactoryInChildGinjector.class);
Widget banana = ginjector.getBananaWidget();
Widget orange = ginjector.getOrangeWidget();
WidgetPair pair = ginjector.getWidgetPair();
assertEquals("banana", banana.name);
assertEquals("orange", orange.name);
assertSame(banana, pair.banana);
assertSame(orange, pair.orange);
}
interface Part {}
// Each Part depends on the factory so that we can verify that (1) the lies are correctly
// installed and (2) the factories are installed early enough to be depended on.
static class PartA implements Part {
@Inject public PartA(WidgetFactory factory) {}
}
static class PartB implements Part {
@Inject public PartB(WidgetFactory factory) {}
}
static class Widget {
Part part;
String name;
@Inject
public Widget(Part part, @Assisted String name) {
this.part = part;
this.name = name;
}
}
interface WidgetFactory {
Widget createWidget(String name);
}
static class WidgetPair {
Widget banana;
Widget orange;
WidgetPair(Widget banana, Widget orange) {
this.banana = banana;
this.orange = orange;
}
}
@GinModules({ParentWithFactoryModule.class, ChildWithoutFactoryModule.class})
interface PrivateFactoryInParentGinjector extends Ginjector {
WidgetFactory getWidgetFactory();
}
@GinModules({ParentWithoutFactoryModule.class, ChildWithFactoryModule.class})
interface PrivateFactoryInChildGinjector extends Ginjector {
@Named("banana") Widget getBananaWidget();
@Named("orange") Widget getOrangeWidget();
WidgetPair getWidgetPair();
}
static class ParentWithFactoryModule extends AbstractGinModule {
@Override
protected void configure() {
install(new GinFactoryModuleBuilder().build(WidgetFactory.class));
}
}
static class ChildWithoutFactoryModule extends PrivateGinModule {
@Override
protected void configure() {
bind(Part.class).to(PartA.class).in(Singleton.class);
expose(Part.class);
}
}
static class ParentWithoutFactoryModule extends AbstractGinModule {
@Override
protected void configure() {
install(new OtherChildModule());
}
@Provides @Named("banana") @Singleton
Widget provideBananaWidget(WidgetFactory factory) {
return factory.createWidget("banana");
}
}
static class ChildWithFactoryModule extends PrivateGinModule {
@Override
protected void configure() {
install(new GinFactoryModuleBuilder().build(WidgetFactory.class));
expose(WidgetFactory.class);
}
@Provides @Named("orange") @Singleton @Exposed
Widget provideOrangeWidget(WidgetFactory factory) {
return factory.createWidget("orange");
}
}
static class OtherChildModule extends PrivateGinModule {
@Override
protected void configure() {
bind(Part.class).to(PartB.class);
expose(Part.class);
}
@Provides @Exposed
WidgetPair provideWidgetPair(@Named("banana") Widget banana, @Named("orange") Widget orange) {
return new WidgetPair(banana, orange);
}
}
public String getModuleName() {
return "com.google.gwt.inject.InjectTest";
}
}