| /** |
| * Copyright (C) 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.inject.commands; |
| |
| import com.google.inject.AbstractModule; |
| import com.google.inject.Binder; |
| import com.google.inject.Guice; |
| import com.google.inject.Inject; |
| import com.google.inject.Injector; |
| import com.google.inject.Key; |
| import com.google.inject.Module; |
| import com.google.inject.Provider; |
| import com.google.inject.name.Names; |
| import java.util.List; |
| import junit.framework.TestCase; |
| |
| |
| /** |
| * @author jessewilson@google.com (Jesse Wilson) |
| */ |
| public class CommandRewriteTest extends TestCase { |
| |
| public void testRewriteBindings() { |
| // create a module the binds String.class and CharSequence.class |
| Module module = new AbstractModule() { |
| protected void configure() { |
| bind(String.class).toInstance("Pizza"); |
| bind(CharSequence.class).toInstance("Wine"); |
| } |
| }; |
| |
| // record the commands from that module |
| CommandRecorder commandRecorder = new CommandRecorder(new FutureInjector()); |
| List<Command> commands = commandRecorder.recordCommands(module); |
| |
| // create a rewriter that rewrites the binding to 'Wine' with a binding to 'Beer' |
| CommandReplayer rewriter = new CommandReplayer() { |
| @Override public <T> void replayBind(Binder binder, BindCommand<T> command) { |
| if ("Wine".equals(command.getTarget().get())) { |
| binder.bind(CharSequence.class).toInstance("Beer"); |
| } else { |
| super.replayBind(binder, command); |
| } |
| } |
| }; |
| |
| // create a module from the original list of commands and the rewriter |
| Module rewrittenModule = rewriter.createModule(commands); |
| |
| // it all works |
| Injector injector = Guice.createInjector(rewrittenModule); |
| assertEquals("Pizza", injector.getInstance(String.class)); |
| assertEquals("Beer", injector.getInstance(CharSequence.class)); |
| } |
| |
| public void testGetProviderAvailableAtInjectMembersTime() { |
| Module module = new AbstractModule() { |
| public void configure() { |
| final Provider<String> stringProvider = getProvider(String.class); |
| |
| bind(String.class).annotatedWith(Names.named("2")).toProvider(new Provider<String>() { |
| private String value; |
| |
| @Inject void initialize() { |
| value = stringProvider.get(); |
| } |
| |
| public String get() { |
| return value; |
| } |
| }); |
| |
| bind(String.class).toInstance("A"); |
| } |
| }; |
| |
| // the module works fine normally |
| Injector injector = Guice.createInjector(module); |
| assertEquals("A", injector.getInstance(Key.get(String.class, Names.named("2")))); |
| |
| // and it should also work fine if we rewrite it |
| FutureInjector futureInjector = new FutureInjector(); |
| List<Command> commands = new CommandRecorder(futureInjector).recordCommands(module); |
| Module replayed = new CommandReplayer().createModule(commands); |
| Injector replayedInjector = Guice.createInjector(replayed); |
| futureInjector.initialize(replayedInjector); |
| assertEquals("A", replayedInjector.getInstance(Key.get(String.class, Names.named("2")))); |
| } |
| } |