001package org.picocontainer.containers;
002
003import org.picocontainer.DefaultPicoContainer;
004import org.picocontainer.PicoContainer;
005import org.picocontainer.ComponentMonitor;
006import org.picocontainer.ComponentAdapter;
007import org.picocontainer.NameBinding;
008import org.picocontainer.PicoVisitor;
009import static org.picocontainer.tck.MockFactory.mockeryWithCountingNamingScheme;
010import org.picocontainer.monitors.NullComponentMonitor;
011import static org.junit.Assert.assertNotNull;
012import static org.junit.Assert.assertTrue;
013import static org.junit.Assert.assertEquals;
014import static org.junit.Assert.assertNull;
015import org.junit.Test;
016import org.junit.Before;
017import org.junit.runner.RunWith;
018import org.jmock.integration.junit4.JMock;
019import org.jmock.Mockery;
020
021import java.util.HashMap;
022import java.util.Map;
023import java.util.Collections;
024import java.util.Set;
025import java.util.HashSet;
026import java.util.concurrent.ConcurrentMap;
027import java.util.concurrent.ConcurrentHashMap;
028import java.lang.reflect.Constructor;
029import java.lang.annotation.Annotation;
030
031@RunWith(JMock.class)
032public class CompositePicoContainerTestCase {
033
034    private Mockery mockery = mockeryWithCountingNamingScheme();
035    private DefaultPicoContainer one;
036    private DefaultPicoContainer two;
037    private PicoContainer composite;
038
039    @Before
040    public void setup() {
041        one = new DefaultPicoContainer();
042        one.addComponent(Map.class, HashMap.class);
043        two = new DefaultPicoContainer();
044        two.addComponent(Map.class, ConcurrentHashMap.class);
045        composite = new CompositePicoContainer(one, two);
046    }
047
048    @Test
049    public void testTypeCanBePrioritizedFromFirstInCompositeList() {
050        Map map = composite.getComponent(Map.class);
051        assertNotNull(map);
052        assertTrue(map instanceof HashMap);
053    }
054
055    @Test
056    public void testTypeCanBeFoundInSecondInCompositeList() {
057        one.removeComponent(Map.class);
058        Map map = composite.getComponent(Map.class);
059        assertNotNull(map);
060        assertTrue(map instanceof ConcurrentHashMap);
061    }
062
063    @Test
064    public void testTypeMissingFromAllReportedAsMissing() {
065        Set set = composite.getComponent(Set.class);
066        assertNull(set);
067    }
068
069
070    @Test
071    public void testTypeAndIntoCanBePrioritizedFromFirstInCompositeList() {
072        Map map = (Map) composite.getComponent(Map.class, Object.class);
073        assertNotNull(map);
074        assertTrue(map instanceof HashMap);
075    }
076
077    @Test
078    public void testTypeAndIntoCanBeFoundInSecondInCompositeList() {
079        one.removeComponent(Map.class);
080        Map map = (Map) composite.getComponent(Map.class, Object.class);
081        assertNotNull(map);
082        assertTrue(map instanceof ConcurrentMap);
083    }
084
085    @Test
086    public void testTypeAndIntoMissingFromAllReportedAsMissing() {
087        Set set = (Set) composite.getComponent(Set.class, Object.class);
088        assertNull(set);
089    }
090
091
092    @Test
093    public void testPlainObjectCanBePrioritizedFromFirstInCompositeList() {
094        one.removeComponent(Map.class);
095        one.addComponent("one", HashMap.class);
096        Map map = (Map) composite.getComponent("one");
097        assertNotNull(map);
098        assertTrue(map instanceof HashMap);
099    }
100
101    @Test
102    public void testPlainObjectCanBeFoundInSecondInCompositeList() {
103        one.removeComponent(Map.class);
104        two.removeComponent(Map.class);
105        two.addComponent("two", ConcurrentHashMap.class);
106        Map map = (Map) composite.getComponent("two");
107        assertNotNull(map);
108        assertTrue(map instanceof ConcurrentHashMap);
109    }
110
111    @Test
112    public void testPlainObjectMissingFromAllReportedAsMissing() {
113        Object o = composite.getComponent("three");
114        assertNull(o);
115    }
116
117    @Test
118    public void testPlainObjectCanBePrioritizedFromFirstInCompositeListGivingAdapter() {
119        one.removeComponent(Map.class);
120        one.addComponent("one", HashMap.class);
121        ComponentAdapter mapAdapter = composite.getComponentAdapter("one");
122        assertNotNull(mapAdapter);
123        assertEquals(HashMap.class, mapAdapter.getComponentImplementation());
124    }
125
126    @Test
127    public void testPlainObjectCanBeFoundInSecondInCompositeListGivingAdapter() {
128        one.removeComponent(Map.class);
129        two.removeComponent(Map.class);
130        two.addComponent("two", ConcurrentHashMap.class);
131        ComponentAdapter mapAdapter = composite.getComponentAdapter("two");
132        assertNotNull(mapAdapter);
133        assertEquals(ConcurrentHashMap.class, mapAdapter.getComponentImplementation());
134    }
135
136    @Test
137    public void testTypedAndNameBoundObjectCanBePrioritizedFromFirstInCompositeListGivingAdapter() {
138        ComponentAdapter<Map> mapAdapter = composite.getComponentAdapter(Map.class, (NameBinding) null);
139        assertNotNull(mapAdapter);
140        assertEquals(HashMap.class, mapAdapter.getComponentImplementation());
141    }
142
143    @Test
144    public void testTypedAndAnnotationBoundObjectCanBePrioritizedFromFirstInCompositeListGivingAdapter() {
145        ComponentAdapter<Map> mapAdapter = composite.getComponentAdapter(Map.class, (Class<? extends Annotation>) null);
146        assertNotNull(mapAdapter);
147        assertEquals(HashMap.class, mapAdapter.getComponentImplementation());
148    }
149
150    @Test
151    public void testOtherMethodsReturnNothing() {
152        assertEquals(Collections.EMPTY_LIST, composite.getComponents());
153        assertEquals(Collections.EMPTY_LIST, composite.getComponents(Map.class));
154        assertEquals(Collections.EMPTY_LIST, composite.getComponentAdapters());
155        assertEquals(Collections.EMPTY_LIST, composite.getComponentAdapters(Map.class));
156        assertEquals(Collections.EMPTY_LIST, composite.getComponentAdapters(Map.class, null));
157        assertNull(composite.getParent());
158
159        final PicoVisitor visitor = mockery.mock(PicoVisitor.class);
160        composite.accept(visitor);
161        // nothing called proven by JMock.
162
163   }
164
165}