/***************************************************************************
* 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;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.Collection;
import net.usikkert.kouinject.beandata.BeanData;
import net.usikkert.kouinject.beandata.BeanKey;
import net.usikkert.kouinject.beandata.InjectionPoint;
import net.usikkert.kouinject.testbeans.scanned.CarBean;
import net.usikkert.kouinject.testbeans.scanned.FieldBean;
import net.usikkert.kouinject.testbeans.scanned.HelloBean;
import net.usikkert.kouinject.testbeans.scanned.SetterBean;
import net.usikkert.kouinject.testbeans.scanned.profile.LocalArchiveBean;
import net.usikkert.kouinject.testbeans.scanned.profile.RemoteArchiveBean;
import net.usikkert.kouinject.testbeans.scanned.qualifier.GreenBean;
import org.junit.Before;
import org.junit.Test;
/**
* Test of {@link BeanDataMap}.
*
* @author Christian Ihle
*/
public class BeanDataMapTest {
private BeanDataMap map;
@Before
public void createBeanDataMap() {
map = new BeanDataMap();
}
@Test
public void addBeanDataShouldPutTheBeanInTheMap() {
assertEquals(0, map.size());
map.addBeanData(createBeanData(Object.class));
assertEquals(1, map.size());
}
@Test(expected = IllegalArgumentException.class)
public void addBeanDataShouldFailToAddTheSameBeanTwice() {
assertEquals(0, map.size());
final BeanData beanData = createBeanData(Object.class);
map.addBeanData(beanData);
map.addBeanData(beanData);
}
@Test
public void addBeanDataShouldAcceptSeveralDifferentBeans() {
assertEquals(0, map.size());
map.addBeanData(createBeanData(SetterBean.class));
assertEquals(1, map.size());
map.addBeanData(createBeanData(FieldBean.class));
assertEquals(2, map.size());
map.addBeanData(createBeanData(HelloBean.class));
assertEquals(3, map.size());
}
@Test
public void addBeanDataShouldHandleAddingDataForBeansWithInheritanceRegardlessOfOrder1() {
assertEquals(0, map.size());
map.addBeanData(createBeanData(LocalArchiveBean.class));
map.addBeanData(createBeanData(RemoteArchiveBean.class));
assertEquals(2, map.size());
}
@Test
public void addBeanDataShouldHandleAddingDataForBeansWithInheritanceRegardlessOfOrder2() {
assertEquals(0, map.size());
map.addBeanData(createBeanData(RemoteArchiveBean.class));
map.addBeanData(createBeanData(LocalArchiveBean.class));
assertEquals(2, map.size());
}
@Test
public void getBeanDataShouldFindTheCorrectBeanData() {
addTestBeans();
final BeanKey setterBeanKey = new BeanKey(SetterBean.class);
final BeanData setterBean = map.getBeanData(setterBeanKey);
assertNotNull(setterBean);
assertTrue(setterBean.getBeanKey().equals(setterBeanKey));
final BeanKey fieldBeanKey = new BeanKey(FieldBean.class);
final BeanData fieldBean = map.getBeanData(fieldBeanKey);
assertNotNull(fieldBean);
assertTrue(fieldBean.getBeanKey().equals(fieldBeanKey));
final BeanKey helloBeanKey = new BeanKey(HelloBean.class);
final BeanData helloBean = map.getBeanData(helloBeanKey);
assertNotNull(helloBean);
assertTrue(helloBean.getBeanKey().equals(helloBeanKey));
final BeanKey greenBeanKey = new BeanKey(GreenBean.class, "Green");
final BeanData greenBean = map.getBeanData(greenBeanKey);
assertNotNull(greenBean);
assertTrue(greenBean.getBeanKey().equals(greenBeanKey));
}
@Test(expected = IllegalArgumentException.class)
public void getBeanDataShouldFailIfNoMatchFound() {
addTestBeans();
map.getBeanData(new BeanKey(CarBean.class));
}
@Test(expected = IllegalStateException.class)
public void getBeanDataShouldFailIfTooManyMatches() {
addTestBeans();
map.getBeanData(new BeanKey(Object.class));
}
@Test
public void getBeanDataShouldHandleGettingSubclassWhenSuperclassAlsoAvailable() {
map.addBeanData(createBeanData(LocalArchiveBean.class));
map.addBeanData(createBeanData(RemoteArchiveBean.class));
final BeanKey beanKey = new BeanKey(RemoteArchiveBean.class);
final BeanData beanData = map.getBeanData(beanKey);
assertNotNull(beanData);
assertTrue(beanData.getBeanKey().equals(beanKey));
}
@Test(expected = IllegalStateException.class)
public void getBeanDataShouldFailToGetSuperclassWhenSubclassAlsoAvailable() {
map.addBeanData(createBeanData(LocalArchiveBean.class));
map.addBeanData(createBeanData(RemoteArchiveBean.class));
final BeanKey beanKey = new BeanKey(LocalArchiveBean.class);
map.getBeanData(beanKey);
}
@Test
public void containsBeanDataShouldDetectAddedBeanData() {
addTestBeans();
assertTrue(map.containsBeanData(new BeanKey(SetterBean.class)));
assertTrue(map.containsBeanData(new BeanKey(FieldBean.class)));
assertTrue(map.containsBeanData(new BeanKey(HelloBean.class)));
assertTrue(map.containsBeanData(new BeanKey(GreenBean.class, "Green")));
}
@Test
public void containsBeanDataShouldHandleMissingBeanData() {
addTestBeans();
assertFalse(map.containsBeanData(new BeanKey(CarBean.class)));
}
@Test
public void findBeanKeysWithoutQualifierShouldReturnBeansWithoutQualifier() {
addTestBeans();
final Collection<BeanKey> beanKeys = map.findBeanKeys(new BeanKey(Object.class));
assertNotNull(beanKeys);
assertEquals(3, beanKeys.size());
assertTrue(beanKeys.contains(new BeanKey(SetterBean.class)));
assertTrue(beanKeys.contains(new BeanKey(FieldBean.class)));
assertTrue(beanKeys.contains(new BeanKey(HelloBean.class)));
}
@Test
public void findBeanKeysWithQualifierShouldReturnBeansWithQualifier() {
addTestBeans();
final Collection<BeanKey> beanKeys = map.findBeanKeys(new BeanKey(Object.class, "Green"));
assertNotNull(beanKeys);
assertEquals(1, beanKeys.size());
assertTrue(beanKeys.contains(new BeanKey(GreenBean.class, "Green")));
}
@Test
public void findBeanKeysShouldHandleNoMatches() {
addTestBeans();
final Collection<BeanKey> beanKeys = map.findBeanKeys(new BeanKey(CarBean.class));
assertNotNull(beanKeys);
assertEquals(0, beanKeys.size());
}
private void addTestBeans() {
map.addBeanData(createBeanData(SetterBean.class));
map.addBeanData(createBeanData(FieldBean.class));
map.addBeanData(createBeanData(HelloBean.class));
map.addBeanData(createBeanData(GreenBean.class, "Green"));
}
private BeanData createBeanData(final Class<?> beanClass) {
return createBeanData(beanClass, null);
}
private BeanData createBeanData(final Class<?> beanClass, final String qualifier) {
return new BeanData(new BeanKey(beanClass, qualifier), null, new ArrayList<InjectionPoint>(), false);
}
}