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 }