package com.perunlabs.testinjector.util;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static org.assertj.core.api.Assertions.assertThat;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.util.List;
import org.junit.Test;
import com.google.inject.BindingAnnotation;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.TypeLiteral;
import com.google.inject.name.Named;
import com.google.inject.name.Names;
public class KeysTest {
@Test
public void key_of_string_field() throws Exception {
Field field = field("stringField");
assertThat(Keys.keyOf(field)).isEqualTo(Key.get(String.class));
}
String stringField;
@Test
public void key_of_list_of_strings_field() throws Exception {
Field field = field("listOfStrings");
assertThat(Keys.keyOf(field)).isEqualTo(Key.get(new TypeLiteral<List<String>>() {}));
}
List<String> listOfStrings;
@Test
public void key_of_annotated_string_field() throws Exception {
Field field = field("annotatedStringField");
assertThat(Keys.keyOf(field)).isEqualTo(Key.get(String.class, Names.named("abc")));
}
@Named("abc")
String annotatedStringField;
@Test(expected = MoreThanOneBindingAnnotationException.class)
public void double_annotated_fields_are_not_allowed() throws Exception {
Keys.keyOf(field("doubleAnnotatedStringField"));
}
@Named("abc")
@MyBindingAnnotation
String doubleAnnotatedStringField;
// provider
@Test
public void string_key_provided_by_field() throws Exception {
Field field = field("stringProviderField");
assertThat(Keys.keyProvidedBy(field)).isEqualTo(Key.get(String.class));
}
Provider<String> stringProviderField;
@Test
public void list_of_strings_provided_by_field() throws Exception {
Field field = field("listOfStringsProviderField");
assertThat(Keys.keyProvidedBy(field)).isEqualTo(Key.get(new TypeLiteral<List<String>>() {}));
}
Provider<List<String>> listOfStringsProviderField;
@Test
public void annotated_string_provided_by_field() throws Exception {
Field field = field("annotatedStringProviderField");
assertThat(Keys.keyProvidedBy(field)).isEqualTo(Key.get(String.class, Names.named("abc")));
}
@Named("abc")
Provider<String> annotatedStringProviderField;
@Test(expected = MoreThanOneBindingAnnotationException.class)
public void double_annotated_provider_fields_are_not_allowed() throws Exception {
Keys.keyProvidedBy(field("doubleAnnotatedStringProviderField"));
}
@Named("abc")
@MyBindingAnnotation
Provider<String> doubleAnnotatedStringProviderField;
@Retention(RUNTIME)
@Target({ FIELD, METHOD, PARAMETER, TYPE })
@BindingAnnotation
@interface MyBindingAnnotation {}
private static Field field(String name) throws NoSuchFieldException {
return KeysTest.class.getDeclaredField(name);
}
}