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 }