package com.google.inject;

import junit.framework.TestCase;
import java.util.logging.Logger;

import com.google.inject.spi.ProviderInstanceBinding;
import com.google.inject.name.Names;

/**
 * Test built-in injection of loggers.
 *
 * @author jessewilson
 */
public class LoggerInjectionTest extends TestCase {

  @Inject Logger logger;

  public void testLoggerWithMember() {
    Injector injector = Guice.createInjector();
    injector.injectMembers(this);
    assertEquals("com.google.inject.LoggerInjectionTest", logger.getName());
  }
  
  public void testLoggerWithoutMember() {
    Injector injector = Guice.createInjector();
    assertNull(injector.getInstance(Logger.class).getName());
    assertNull(injector.getProvider(Logger.class).get().getName());
    assertNull(injector.getBinding(Logger.class).getProvider().get().getName());
    assertNull(((ProviderInstanceBinding<Logger>) injector.getBinding(Logger.class))
        .getProviderInstance().get().getName());
    assertEquals("Provider<Logger>", injector.getProvider(Logger.class).toString());
  }

  public void testCanBindAnnotatedLogger() {
    Injector injector = Guice.createInjector(new AbstractModule() {
      protected void configure() {
        bind(Logger.class)
            .annotatedWith(Names.named("anonymous"))
            .toInstance(Logger.getAnonymousLogger());
      }
    });

    assertNull(injector.getInstance(Key.get(Logger.class, Names.named("anonymous"))).getName());
  }
  
  public void testCannotBindLogger() {
    try {
      Guice.createInjector(new AbstractModule() {
        protected void configure() {
          bind(Logger.class).toInstance(Logger.getAnonymousLogger());
        }
      });
      fail();
    } catch (CreationException expected) {
      assertTrue(expected.getMessage().contains(
          "A binding to java.util.logging.Logger was already configured"));
    }
  }
}
