001    package org.picocontainer.containers;
002    
003    import org.picocontainer.DefaultPicoContainer;
004    import org.picocontainer.PicoContainer;
005    import org.picocontainer.ComponentMonitor;
006    import org.picocontainer.ComponentAdapter;
007    import org.picocontainer.NameBinding;
008    import org.picocontainer.PicoVisitor;
009    import static org.picocontainer.tck.MockFactory.mockeryWithCountingNamingScheme;
010    import org.picocontainer.monitors.NullComponentMonitor;
011    import static org.junit.Assert.assertNotNull;
012    import static org.junit.Assert.assertTrue;
013    import static org.junit.Assert.assertEquals;
014    import static org.junit.Assert.assertNull;
015    import org.junit.Test;
016    import org.junit.Before;
017    import org.junit.runner.RunWith;
018    import org.jmock.integration.junit4.JMock;
019    import org.jmock.Mockery;
020    
021    import java.util.HashMap;
022    import java.util.Map;
023    import java.util.Collections;
024    import java.util.Set;
025    import java.util.HashSet;
026    import java.util.concurrent.ConcurrentMap;
027    import java.util.concurrent.ConcurrentHashMap;
028    import java.lang.reflect.Constructor;
029    import java.lang.annotation.Annotation;
030    
031    @RunWith(JMock.class)
032    public 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    }