/***************************************************************************
* Copyright 2009-2012 by Christian Ihle *
* kontakt@usikkert.net *
* *
* This file is part of KouInject. *
* *
* KouInject is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version. *
* *
* KouInject is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with KouInject. *
* If not, see <http://www.gnu.org/licenses/>. *
***************************************************************************/
package net.usikkert.kouinject.beandata;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.usikkert.kouinject.generics.TypeLiteral;
import net.usikkert.kouinject.testbeans.scanned.HelloBean;
import net.usikkert.kouinject.testbeans.scanned.qualifier.ColorBean;
import net.usikkert.kouinject.testbeans.scanned.qualifier.GreenBean;
import net.usikkert.kouinject.testbeans.scanned.qualifier.RedBean;
import net.usikkert.kouinject.testbeans.scanned.qualifier.YellowBean;
import org.junit.Test;
/**
* Test of {@link BeanKey}.
*
* @author Christian Ihle
*/
public class BeanKeyTest {
@Test
public void equalsAndHashcodeShouldBeTrueForSameObject() {
final BeanKey green = new BeanKey(GreenBean.class, "green");
final BeanKey green2 = green;
assertSame(green, green2);
assertTrue(green.equals(green2));
assertTrue(green2.equals(green));
assertTrue(green.hashCode() == green2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeTrueForSameBeanClassAndSameQualifier() {
final BeanKey green = new BeanKey(GreenBean.class, "green");
final BeanKey green2 = new BeanKey(GreenBean.class, "green");
assertTrue(green.equals(green2));
assertTrue(green2.equals(green));
assertTrue(green.hashCode() == green2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeTrueForSameBeanClassAndSameQualifierWithDifferentCase() {
final BeanKey green = new BeanKey(GreenBean.class, "GreEn");
final BeanKey green2 = new BeanKey(GreenBean.class, "gReen");
assertTrue(green.equals(green2));
assertTrue(green2.equals(green));
assertTrue(green.hashCode() == green2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeTrueForSameBeanClassAndNullQualifier() {
final BeanKey green = new BeanKey(GreenBean.class);
final BeanKey green2 = new BeanKey(GreenBean.class);
assertTrue(green.equals(green2));
assertTrue(green2.equals(green));
assertTrue(green.hashCode() == green2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForDifferentClasses() {
final BeanKey green = new BeanKey(GreenBean.class);
final Object object = new Object();
assertFalse(green.equals(object));
assertFalse(object.equals(green));
assertFalse(green.hashCode() == object.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForNull() {
final BeanKey green = new BeanKey(GreenBean.class);
assertFalse(green.equals(null));
}
@Test
public void equalsAndHashcodeShouldBeFalseForDifferentBeanClasses() {
final BeanKey green = new BeanKey(GreenBean.class);
final BeanKey yellow = new BeanKey(YellowBean.class);
assertFalse(green.equals(yellow));
assertFalse(yellow.equals(green));
assertFalse(green.hashCode() == yellow.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForSameBeanClassWithDifferentQualifier() {
final BeanKey green = new BeanKey(GreenBean.class, "green1");
final BeanKey green2 = new BeanKey(GreenBean.class, "green2");
assertFalse(green.equals(green2));
assertFalse(green2.equals(green));
assertFalse(green.hashCode() == green2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForSameBeanClassWithOneNullQualifier() {
final BeanKey green = new BeanKey(GreenBean.class, "green");
final BeanKey green2 = new BeanKey(GreenBean.class);
assertFalse(green.equals(green2));
assertFalse(green2.equals(green));
assertFalse(green.hashCode() == green2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeTrueForTheSameBeanType() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
assertTrue(helloBeanKey1.equals(helloBeanKey2));
assertTrue(helloBeanKey2.equals(helloBeanKey1));
assertTrue(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeTrueForTheSameBeanTypeWithTheSameQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "hello");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "hello");
assertTrue(helloBeanKey1.equals(helloBeanKey2));
assertTrue(helloBeanKey2.equals(helloBeanKey1));
assertTrue(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForTheSameBeanTypeWithDifferentQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "hello");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "hi");
assertFalse(helloBeanKey1.equals(helloBeanKey2));
assertFalse(helloBeanKey2.equals(helloBeanKey1));
assertFalse(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForTheSameBeanTypeWithOneNullQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "hi");
assertFalse(helloBeanKey1.equals(helloBeanKey2));
assertFalse(helloBeanKey2.equals(helloBeanKey1));
assertFalse(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForDifferentBeanType() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<ArrayList<HelloBean>>() {});
assertFalse(helloBeanKey1.equals(helloBeanKey2));
assertFalse(helloBeanKey2.equals(helloBeanKey1));
assertFalse(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForDifferentBeanSubType() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<RedBean>>() {});
assertFalse(helloBeanKey1.equals(helloBeanKey2));
assertFalse(helloBeanKey2.equals(helloBeanKey1));
assertFalse(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void equalsAndHashcodeShouldBeFalseForDifferentBeanSubTypeWithEqualQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "hello");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<RedBean>>() {}, "hello");
assertFalse(helloBeanKey1.equals(helloBeanKey2));
assertFalse(helloBeanKey2.equals(helloBeanKey1));
assertFalse(helloBeanKey1.hashCode() == helloBeanKey2.hashCode());
}
@Test
public void canInjectShouldBeFalseForNull() {
final BeanKey green = new BeanKey(GreenBean.class);
assertFalse(green.canInject(null));
assertFalse(green.canInjectFromFactory(null));
}
@Test
public void canInjectShouldAcceptSameClassAndSuperClassWhenNoQualifier() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
final BeanKey theColorBean = new BeanKey(ColorBean.class);
final BeanKey theObjectBean = new BeanKey(Object.class);
final BeanKey theColorField = new BeanKey(ColorBean.class);
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectShouldOnlyAcceptSameClassWhenNoQualifierEvenIfBeansHaveQualifier() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "green");
final BeanKey theColorBean = new BeanKey(ColorBean.class, "colorfull");
final BeanKey theObjectBean = new BeanKey(Object.class, "dull");
final BeanKey theColorField = new BeanKey(ColorBean.class);
assertFalse(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertFalse(theColorField.canInjectFromFactory(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectShouldAcceptSuperClassWhenQualifierMatch() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "green");
final BeanKey theColorBean = new BeanKey(ColorBean.class);
final BeanKey theObjectBean = new BeanKey(Object.class);
final BeanKey theColorField = new BeanKey(ColorBean.class, "green");
assertTrue(theColorField.canInject(theGreenBean));
assertFalse(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
assertFalse(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectShouldAcceptSameClassWhenQualifierMatch() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
final BeanKey theColorBean = new BeanKey(ColorBean.class, "green");
final BeanKey theObjectBean = new BeanKey(Object.class);
final BeanKey theColorField = new BeanKey(ColorBean.class, "green");
assertFalse(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertFalse(theColorField.canInjectFromFactory(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectShouldAcceptSameClassWhenQualifierMatchWithDifferentCase() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
final BeanKey theColorBean = new BeanKey(ColorBean.class, "greeN");
final BeanKey theObjectBean = new BeanKey(Object.class);
final BeanKey theColorField = new BeanKey(ColorBean.class, "Green");
assertFalse(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertFalse(theColorField.canInjectFromFactory(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectShouldDenyBeansThatMatchWithClassIfQualifierIsMissing() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
final BeanKey theColorBean = new BeanKey(ColorBean.class);
final BeanKey theObjectBean = new BeanKey(Object.class);
final BeanKey theColorField = new BeanKey(ColorBean.class, "red");
assertFalse(theColorField.canInject(theGreenBean));
assertFalse(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertFalse(theColorField.canInjectFromFactory(theGreenBean));
assertFalse(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectShouldDenyBeansThatMatchWithClassIfQualifierIsDifferent() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "green");
final BeanKey theColorBean = new BeanKey(ColorBean.class, "colorfull");
final BeanKey theObjectBean = new BeanKey(Object.class, "dull");
final BeanKey theColorField = new BeanKey(ColorBean.class, "red");
assertFalse(theColorField.canInject(theGreenBean));
assertFalse(theColorField.canInject(theColorBean));
assertFalse(theColorField.canInject(theObjectBean));
assertFalse(theColorField.canInjectFromFactory(theGreenBean));
assertFalse(theColorField.canInjectFromFactory(theColorBean));
assertFalse(theColorField.canInjectFromFactory(theObjectBean));
}
@Test
public void canInjectSubclassWhenNoQualifiers() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
final BeanKey theColorField = new BeanKey(ColorBean.class);
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void canInjectSubclassWhenSameQualifiers() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "green");
final BeanKey theColorField = new BeanKey(ColorBean.class, "green");
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void canInjectSubclassWhenFieldHasAnyQualifierAndBeanHasNone() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
final BeanKey theColorField = new BeanKey(ColorBean.class, "any");
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void canInjectSubclassWhenFieldHasAnyQualifierAndBeanHasOtherQualifier() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "green");
final BeanKey theColorField = new BeanKey(ColorBean.class, "any");
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void cantInjectSubclassWhenBeanHasAnyQualifierAndFieldHasNoneExceptIfFactory() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "any");
final BeanKey theColorField = new BeanKey(ColorBean.class);
assertFalse(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void cantInjectSubclassWhenBeanHasAnyQualifierAndFieldHasOtherQualifierExceptIfFactory() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "any");
final BeanKey theColorField = new BeanKey(ColorBean.class, "green");
assertFalse(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void canInjectEqualArrays() {
final BeanKey bean1 = new BeanKey(HelloBean[].class);
final BeanKey bean2 = new BeanKey(HelloBean[].class);
assertTrue(bean1.canInject(bean2));
assertTrue(bean1.canInjectFromFactory(bean2));
}
@Test
public void canInjectSubclassArray() {
final BeanKey theGreenBean = new BeanKey(GreenBean[].class);
final BeanKey theColorField = new BeanKey(ColorBean[].class);
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
assertFalse(theGreenBean.canInject(theColorField));
assertFalse(theGreenBean.canInjectFromFactory(theColorField));
}
@Test
public void cantInjectDifferentArrays() {
final BeanKey bean1 = new BeanKey(HelloBean[].class);
final BeanKey bean2 = new BeanKey(GreenBean[].class);
assertFalse(bean1.canInject(bean2));
assertFalse(bean1.canInjectFromFactory(bean2));
assertFalse(bean2.canInject(bean1));
assertFalse(bean2.canInjectFromFactory(bean1));
}
@Test
public void canInjectMatchingArraysWithEqualQualifier() {
final BeanKey theGreenBean = new BeanKey(GreenBean[].class, "green");
final BeanKey theColorField = new BeanKey(ColorBean[].class, "green");
assertTrue(theColorField.canInject(theGreenBean));
assertTrue(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void cantInjectMatchingArraysWithWrongQualifier() {
final BeanKey theGreenBean = new BeanKey(GreenBean[].class, "green");
final BeanKey theColorField = new BeanKey(ColorBean[].class, "red");
assertFalse(theColorField.canInject(theGreenBean));
assertFalse(theColorField.canInjectFromFactory(theGreenBean));
}
@Test
public void canInjectShouldReturnTrueForEqualTypes() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
}
@Test
public void canInjectShouldReturnTrueForEqualTypesWhenThisHasNoQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "other");
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
assertFalse(helloBeanKey2.canInject(helloBeanKey1));
assertFalse(helloBeanKey2.canInjectFromFactory(helloBeanKey1));
}
@Test
public void canInjectShouldReturnTrueForEqualTypesWithSameQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "qualifier");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "qualifier");
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
}
@Test
public void canInjectShouldReturnTrueForEqualTypesWithAnyQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "any");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "other");
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
assertFalse(helloBeanKey2.canInject(helloBeanKey1));
// Special treatment when injecting from factory with @Any
assertTrue(helloBeanKey2.canInjectFromFactory(helloBeanKey1));
}
@Test
public void canInjectShouldReturnFalseForEqualTypesWithDifferentQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "one");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "two");
assertFalse(helloBeanKey1.canInject(helloBeanKey2));
assertFalse(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
assertFalse(helloBeanKey2.canInject(helloBeanKey1));
assertFalse(helloBeanKey2.canInjectFromFactory(helloBeanKey1));
}
@Test
public void canInjectShouldReturnTrueForTypesThatInherit() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<ArrayList<HelloBean>>() {});
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
assertFalse(helloBeanKey2.canInject(helloBeanKey1));
assertFalse(helloBeanKey2.canInjectFromFactory(helloBeanKey1));
}
@Test
public void canInjectShouldReturnTrueForTypesThatInheritWithSameQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "qualifier");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<ArrayList<HelloBean>>() {}, "qualifier");
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
assertFalse(helloBeanKey2.canInject(helloBeanKey1));
assertFalse(helloBeanKey2.canInjectFromFactory(helloBeanKey1));
}
@Test
public void canInjectShouldReturnTrueForTypesThatInheritWithAnyQualifier() {
final BeanKey helloBeanKey1 = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "any");
final BeanKey helloBeanKey2 = new BeanKey(new TypeLiteral<ArrayList<HelloBean>>() {}, "other");
assertTrue(helloBeanKey1.canInject(helloBeanKey2));
assertTrue(helloBeanKey1.canInjectFromFactory(helloBeanKey2));
assertFalse(helloBeanKey2.canInject(helloBeanKey1));
assertFalse(helloBeanKey2.canInjectFromFactory(helloBeanKey1));
}
@Test
public void canInjectShouldReturnFalseForDifferentSubTypes() {
final BeanKey helloBeanKey = new BeanKey(new TypeLiteral<List<HelloBean>>() {});
final BeanKey redBeanKey = new BeanKey(new TypeLiteral<List<RedBean>>() {});
assertFalse(redBeanKey.canInject(helloBeanKey));
assertFalse(redBeanKey.canInjectFromFactory(helloBeanKey));
assertFalse(helloBeanKey.canInject(redBeanKey));
assertFalse(helloBeanKey.canInjectFromFactory(redBeanKey));
}
@Test
public void canInjectShouldReturnFalseForDifferentSubTypesWithTheSameQualifier() {
final BeanKey helloBeanKey = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "qualifier");
final BeanKey redBeanKey = new BeanKey(new TypeLiteral<List<RedBean>>() {}, "qualifier");
assertFalse(redBeanKey.canInject(helloBeanKey));
assertFalse(redBeanKey.canInjectFromFactory(helloBeanKey));
assertFalse(helloBeanKey.canInject(redBeanKey));
assertFalse(helloBeanKey.canInjectFromFactory(redBeanKey));
}
@Test
public void canInjectShouldReturnFalseForDifferentSubTypesWithTheAnyQualifier() {
final BeanKey helloBeanKey = new BeanKey(new TypeLiteral<List<HelloBean>>() {}, "any");
final BeanKey redBeanKey = new BeanKey(new TypeLiteral<List<RedBean>>() {}, "any");
assertFalse(redBeanKey.canInject(helloBeanKey));
assertFalse(redBeanKey.canInjectFromFactory(helloBeanKey));
assertFalse(helloBeanKey.canInject(redBeanKey));
assertFalse(helloBeanKey.canInjectFromFactory(redBeanKey));
}
@Test
public void hasTheAnyQualifierShouldReturnFalseOnNull() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class);
assertNull(theGreenBean.getQualifier());
assertFalse(theGreenBean.hasTheAnyQualifier());
}
@Test
public void hasTheAnyQualifierShouldReturnFalseWhenNotAny() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "green");
assertEquals("green", theGreenBean.getQualifier());
assertFalse(theGreenBean.hasTheAnyQualifier());
}
@Test
public void hasTheAnyQualifierShouldReturnTrueWhenAny() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "any");
assertEquals("any", theGreenBean.getQualifier());
assertTrue(theGreenBean.hasTheAnyQualifier());
final BeanKey theColorBean = new BeanKey(ColorBean.class, "ANY");
assertEquals("ANY", theColorBean.getQualifier());
assertTrue(theColorBean.hasTheAnyQualifier());
}
@Test
public void defaultBeanKey() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "none");
assertFalse(theGreenBean.isProvider());
assertFalse(theGreenBean.isCollection());
assertFalse(theGreenBean.isCollectionProvider());
assertTrue(theGreenBean.isBeanForCreation());
}
@Test(expected = UnsupportedOperationException.class)
public void defaultBeanKeyShouldFailToGetActualBeanKey() {
final BeanKey theGreenBean = new BeanKey(GreenBean.class, "none");
theGreenBean.getActualBeanKey();
}
@Test
public void providerBeanKey() {
final TypeLiteral<GreenBean> greenBean = new TypeLiteral<GreenBean>() {};
final BeanKey theGreenBean = new ProviderBeanKey(greenBean, "none");
assertTrue(theGreenBean.isProvider());
assertFalse(theGreenBean.isCollection());
assertFalse(theGreenBean.isCollectionProvider());
assertFalse(theGreenBean.isBeanForCreation());
}
@Test(expected = UnsupportedOperationException.class)
public void providerBeanKeyShouldFailToGetActualBeanKey() {
final TypeLiteral<GreenBean> greenBean = new TypeLiteral<GreenBean>() {};
final BeanKey theGreenBean = new ProviderBeanKey(greenBean, "none");
theGreenBean.getActualBeanKey();
}
@Test
public void collectionBeanKey() {
final TypeLiteral<Collection<GreenBean>> greenBeanCollection = new TypeLiteral<Collection<GreenBean>>() {};
final TypeLiteral<GreenBean> greenBean = new TypeLiteral<GreenBean>() {};
final BeanKey theGreenBean = new CollectionBeanKey(greenBeanCollection, greenBean, "none");
assertFalse(theGreenBean.isProvider());
assertTrue(theGreenBean.isCollection());
assertFalse(theGreenBean.isCollectionProvider());
assertFalse(theGreenBean.isBeanForCreation());
}
@Test
public void collectionBeanKeyShouldReturnActualBeanKey() {
final TypeLiteral<Collection<GreenBean>> greenBeanCollection = new TypeLiteral<Collection<GreenBean>>() {};
final TypeLiteral<GreenBean> greenBean = new TypeLiteral<GreenBean>() {};
final BeanKey theGreenBean = new CollectionBeanKey(greenBeanCollection, greenBean, "none");
final BeanKey actualBeanKey = theGreenBean.getActualBeanKey();
assertNotNull(actualBeanKey);
assertEquals(greenBeanCollection.getGenericType(), actualBeanKey.getBeanType());
assertEquals(greenBeanCollection.getGenericClass(), actualBeanKey.getBeanClass());
assertEquals("none", actualBeanKey.getQualifier());
}
@Test
public void collectionProviderBeanKey() {
final TypeLiteral<GreenBean> greenBean = new TypeLiteral<GreenBean>() {};
final BeanKey theGreenBean = new CollectionProviderBeanKey(greenBean, "none");
assertFalse(theGreenBean.isProvider());
assertFalse(theGreenBean.isCollection());
assertTrue(theGreenBean.isCollectionProvider());
assertFalse(theGreenBean.isBeanForCreation());
}
@Test(expected = UnsupportedOperationException.class)
public void collectionProviderBeanKeyShouldFailToGetActualBeanKey() {
final TypeLiteral<GreenBean> greenBean = new TypeLiteral<GreenBean>() {};
final BeanKey theGreenBean = new CollectionProviderBeanKey(greenBean, "none");
theGreenBean.getActualBeanKey();
}
@Test
public void getBeanTypeShouldReturnClassWhenUsedWithConstructorForClass() {
final BeanKey beanKey = new BeanKey(String.class);
assertEquals(String.class, beanKey.getBeanClass());
assertEquals(String.class, beanKey.getBeanType());
}
@Test
public void getBeanTypeShouldReturnClassWhenUsedWithConstructorForClassAndQualifier() {
final BeanKey beanKey = new BeanKey(String.class, "q");
assertEquals(String.class, beanKey.getBeanClass());
assertEquals(String.class, beanKey.getBeanType());
}
@Test
public void constructorWithTypeShouldSetTypeAndClass() {
final TypeLiteral<List<String>> beanType = new TypeLiteral<List<String>>() {};
final BeanKey beanKey = new BeanKey(beanType);
assertSame(beanType.getGenericClass(), beanKey.getBeanClass());
assertSame(beanType.getGenericType(), beanKey.getBeanType());
}
@Test
public void constructorWithTypeAndQualifierShouldSetTypeAndClassAndQualifier() {
final TypeLiteral<List<String>> beanType = new TypeLiteral<List<String>>() {};
final BeanKey beanKey = new BeanKey(beanType, "q");
assertSame(beanType.getGenericClass(), beanKey.getBeanClass());
assertSame(beanType.getGenericType(), beanKey.getBeanType());
assertEquals("q", beanKey.getQualifier());
}
@Test
public void constructorWithTypeAndQualifierShouldSetTypeAndClassAndQualifierForProvider() {
final TypeLiteral<List<String>> beanType = new TypeLiteral<List<String>>() {};
final BeanKey beanKey = new ProviderBeanKey(beanType, "q");
assertSame(beanType.getGenericClass(), beanKey.getBeanClass());
assertSame(beanType.getGenericType(), beanKey.getBeanType());
assertEquals("q", beanKey.getQualifier());
}
@Test
public void constructorWithTypeAndQualifierShouldSetTypeAndClassAndQualifierForCollection() {
final TypeLiteral<Collection<String>> collectionBeanType = new TypeLiteral<Collection<String>>() {};
final TypeLiteral<String> beanType = new TypeLiteral<String>() {};
final BeanKey beanKey = new CollectionBeanKey(collectionBeanType, beanType, "q");
assertSame(beanType.getGenericClass(), beanKey.getBeanClass());
assertSame(beanType.getGenericType(), beanKey.getBeanType());
assertEquals("q", beanKey.getQualifier());
}
@Test
public void constructorWithTypeAndQualifierShouldSetTypeAndClassAndQualifierForCollectionProvider() {
final TypeLiteral<List<String>> beanType = new TypeLiteral<List<String>>() {};
final BeanKey beanKey = new CollectionProviderBeanKey(beanType, "q");
assertSame(beanType.getGenericClass(), beanKey.getBeanClass());
assertSame(beanType.getGenericType(), beanKey.getBeanType());
assertEquals("q", beanKey.getQualifier());
}
}