content: /**
   * 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 org.apache.aurora.common.inject;
  
  import java.lang.annotation.Annotation;
  import java.lang.annotation.Retention;
  import java.util.List;
  
  import javax.inject.Qualifier;
  
  import com.google.inject.AbstractModule;
  import com.google.inject.BindingAnnotation;
  import com.google.inject.Guice;
  import com.google.inject.Injector;
  import com.google.inject.Key;
  import com.google.inject.TypeLiteral;
  
  import org.junit.Assert;
  import org.junit.Test;
  
  import static java.lang.annotation.RetentionPolicy.RUNTIME;
  
  import static org.junit.Assert.assertEquals;
  import static org.junit.Assert.assertFalse;
  import static org.junit.Assert.assertTrue;
  import static org.junit.Assert.fail;
  
  public class BindingsTest {
  
    private static final TypeLiteral<List<String>> STRING_LIST = new TypeLiteral<List<String>>() { };
  
    @Retention(RUNTIME)
    @BindingAnnotation
    @interface BindKey { }
  
    @Retention(RUNTIME)
    @Qualifier
    @interface QualifierKey { }
  
    @Test
    public void testCheckBindingAnnotation() {
      Bindings.checkBindingAnnotation(BindKey.class);
  
      try {
        Bindings.checkBindingAnnotation((Class<? extends Annotation>) null);
        fail();
      } catch (NullPointerException e) {
        // expected
      }
  
      try {
        Bindings.checkBindingAnnotation(BindingAnnotation.class);
        fail();
      } catch (IllegalArgumentException e) {
        // expected
      }
    }
  
    public BindingsTest() {
      super();    //To change body of overridden methods use File | Settings | File Templates.
    }
  
    @Test
    public void testPlainKeyFactory() {
      Assert.assertEquals(Key.get(String.class), Bindings.KeyFactory.PLAIN.create(String.class));
      Assert.assertEquals(Key.get(STRING_LIST), Bindings.KeyFactory.PLAIN.create(STRING_LIST));
    }
  
    @Test
    public void testAnnotationTypeKeyFactory() {
      Bindings.KeyFactory factory = Bindings.annotatedKeyFactory(QualifierKey.class);
      assertEquals(Key.get(String.class, QualifierKey.class), factory.create(String.class));
      assertEquals(Key.get(STRING_LIST, QualifierKey.class), factory.create(STRING_LIST));
    }
  
    @Test
    public void testExposing() {
      Injector injector =
          Guice.createInjector(Bindings.exposing(Key.get(String.class),
              new AbstractModule() {
                @Override protected void configure() {
                  bind(String.class).toInstance("jake");
                  bind(Integer.class).toInstance(42);
                }
              }));
  
      assertTrue(injector.getBindings().containsKey(Key.get(String.class)));
      assertEquals("jake", injector.getInstance(String.class));
  
      assertFalse(injector.getBindings().containsKey(Key.get(Integer.class)));
    }
  }
  