1 10 package tests.jfun.yan; 11 12 import java.util.HashMap ; 13 import java.util.Map ; 14 15 import junit.framework.TestCase; 16 import junit.framework.TestSuite; 17 import jfun.yan.*; 18 import jfun.yan.containers.DefaultContainer; 19 20 import tests.jfun.yan.tck.BaseContainerTestCase; 21 import tests.jfun.yan.testmodel.AlternativeTouchable; 22 import tests.jfun.yan.testmodel.DependsOnTouchable; 23 import tests.jfun.yan.testmodel.SimpleTouchable; 24 import tests.jfun.yan.testmodel.Touchable; 25 26 32 public class ChildContainerTestCase extends BaseNonSingletonContainerTestCase { 33 public static void main(String [] args){ 34 Utils.runTest(suite()); 35 } 36 private static TestSuite suite(){ 37 return new TestSuite(ChildContainerTestCase.class); 38 } 39 protected Container getContainerImpl(){ 40 return new DefaultContainer().inherit(new jfun.yan.containers.SingletonProxyContainer()); 41 } 42 public void testParentContainerWithComponentWithEqualKeyShouldBeShadowedByChild() throws Exception { 43 DefaultContainer parent = new DefaultContainer(); 44 Container child = new DefaultContainer().inherit(parent); 45 46 parent.registerConstructor("key", AlternativeTouchable.class); 47 child.registerConstructor("key", SimpleTouchable.class); 48 child.registerConstructor(DependsOnTouchable.class); 49 50 DependsOnTouchable dot = (DependsOnTouchable) child.getInstanceOfType(DependsOnTouchable.class); 51 assertEquals(SimpleTouchable.class, dot.getTouchable().getClass()); 52 } 53 65 66 public void testParentComponentRegisteredAsClassShouldBePreffered() throws Exception { 67 DefaultContainer parent = new DefaultContainer(); 68 Container child = new DefaultContainer().inherit(parent); 69 70 parent.registerConstructor(Touchable.class, AlternativeTouchable.class); 71 child.registerConstructor("key", SimpleTouchable.class); 72 child.registerConstructor(DependsOnTouchable.class); 73 74 DependsOnTouchable dot = (DependsOnTouchable) child.getInstanceOfType(DependsOnTouchable.class); 75 assertEquals(AlternativeTouchable.class, dot.getTouchable().getClass()); 76 } 77 78 public void testResolveFromParentByType() { 79 Container parent = new DefaultContainer(); 80 parent.registerConstructor(Touchable.class, SimpleTouchable.class); 81 82 Container child = new DefaultContainer().inherit(parent); 83 child.registerConstructor(DependsOnTouchable.class); 84 85 assertNotNull(child.getInstance(DependsOnTouchable.class)); 86 } 87 88 public void testResolveFromParentByKey() { 89 Container parent = new DefaultContainer(); 90 parent.registerConstructor(Touchable.class, SimpleTouchable.class); 91 92 Container child = new DefaultContainer().inherit(parent); 93 child.registerComponent(Components.ctor(DependsOnTouchable.class). 94 withArguments(new Creator[]{Components.useType(Touchable.class)})); 95 99 assertNotNull(child.getInstance(DependsOnTouchable.class)); 100 } 101 102 public void testResolveFromGrandParentByType() { 103 Container grandParent = new DefaultContainer(); 104 grandParent.registerConstructor(Touchable.class, SimpleTouchable.class); 105 106 Container parent = new DefaultContainer().inherit(grandParent); 107 108 Container child = new DefaultContainer().inherit(parent); 109 child.registerConstructor(DependsOnTouchable.class); 110 111 assertNotNull(child.getInstance(DependsOnTouchable.class)); 112 } 113 114 public void testResolveFromGrandParentByKey() { 115 Container grandParent = new DefaultContainer(); 116 grandParent.registerConstructor(Touchable.class, SimpleTouchable.class); 117 118 Container parent = new DefaultContainer().inherit(grandParent); 119 120 Container child = new DefaultContainer().inherit(parent); 121 child.registerComponent(Components.ctor(DependsOnTouchable.class) 122 .withArguments(new Creator[]{Components.useType(Touchable.class)})); 123 child.verify(); 124 parent.verify(); 125 129 assertNotNull(child.getInstance(DependsOnTouchable.class)); 130 } 131 public static final class Y{ 132 private static final Y singleton = new Y(); 133 private Y(){}; 134 public static Y instance(){return singleton;} 135 } 136 public static final class X{ 137 private final Y y; 138 public X(Y y){ 139 this.y = y; 140 } 141 public boolean equals(Object obj){ 142 if(obj instanceof X){ 143 final X other = (X)obj; 144 return y.equals(other.y); 145 } 146 else return false; 147 } 148 } 149 150 public void testUnregisterOnlyAffectsChild() 151 throws Exception { 152 final Container parent = new DefaultContainer(); 153 final Container child = new DefaultContainer(); 154 final Container cc = child.inherit(parent); 155 cc.registerConstructor(HashMap .class, (Class [])null); 156 assertNull(parent.getComponent(HashMap .class)); 157 cc.verify(); 158 parent.registerValue(new Character ('a')); 159 assertTrue(cc.getComponent(Character .class)!=null); 160 cc.verify(); 161 parent.registerValue("parent"); 162 child.registerValue("child"); 163 cc.verify(); 164 assertEquals("child", cc.getInstance(String .class)); 165 assertEquals("child", child.getInstance(String .class)); 166 cc.unregisterComponent(String .class); 167 cc.verify(); 168 assertEquals("parent", cc.getInstance(String .class)); 169 assertEquals("parent", cc.getInstanceOfType(String .class)); 170 assertEquals(1, cc.getInstancesOfType(String .class).size()); 171 child.registerComponent(Components.ctor(X.class) 172 .withArgument(0, Components.static_method(Y.class, "instance"))); 173 assertEquals(4, cc.getInstances().size()); 174 cc.verify(); 175 final Object [] expecting = new Object []{ 176 "child", "parent", new Character ('a'), new HashMap (), 177 Y.instance(), new X(Y.instance())}; 178 194 cc.verify(); 195 cc.registerComponent(Components.value("proxy").proxy().proxy(CharSequence .class)); 196 cc.verify(); 197 assertEquals("proxy", ""+cc.getInstanceOfType(CharSequence .class)); 198 assertEquals("proxy", ""+child.getInstanceOfType(CharSequence .class)); 199 204 cc.registerComponent("target", Components.method(this, "f1")); 205 cc.verify(); 206 assertEquals(new Integer (1), cc.getInstance("target")); 207 final Map props = new HashMap (); 208 props.put("map", Components.useType(Map .class)); 209 cc.registerComponent("target2", 210 Components.bean(F1.class) 211 .withProperties(props)); 212 final F1 f = (F1)cc.getInstanceOfType(F1.class); 213 assertEquals("parent", f.getName()); 214 assertEquals(new HashMap (), f.getMap()); 215 } 216 public int f1(String name, Map map){ 217 return 1; 218 } 219 public static class F1{ 220 private String name; 221 private Map map; 222 223 public Map getMap() { 224 return map; 225 } 226 public void setMap(Map map) { 227 this.map = map; 228 } 229 public String getName() { 230 return name; 231 } 232 public void setName(String name) { 233 this.name = name; 234 } 235 } 236 } 237 | Popular Tags |