1 8 9 package org.picocontainer.gems.constraints; 10 11 import org.picocontainer.MutablePicoContainer; 12 import org.picocontainer.PicoVisitor; 13 import org.picocontainer.defaults.AmbiguousComponentResolutionException; 14 import org.picocontainer.defaults.DefaultPicoContainer; 15 import org.picocontainer.testmodel.AlternativeTouchable; 16 import org.picocontainer.testmodel.DecoratedTouchable; 17 import org.picocontainer.testmodel.DependsOnTouchable; 18 import org.picocontainer.testmodel.SimpleTouchable; 19 import org.picocontainer.testmodel.Touchable; 20 21 import org.jmock.Mock; 22 import org.jmock.MockObjectTestCase; 23 24 31 public class ConstraintsTestCase extends MockObjectTestCase { 32 33 MutablePicoContainer container; 34 35 protected void setUp() throws Exception { 36 super.setUp(); 37 38 container = new DefaultPicoContainer(); 39 container.registerComponentImplementation(SimpleTouchable.class); 40 container.registerComponentImplementation(DecoratedTouchable.class); 41 container.registerComponentImplementation(AlternativeTouchable.class); 42 container.registerComponentImplementation(DependsOnTouchable.class); 43 } 44 45 public void testIsKeyConstraint() { 46 Constraint c = new IsKey(SimpleTouchable.class); 47 48 Object object = c.resolveInstance(container, 49 container.getComponentAdapter(DependsOnTouchable.class), 50 Touchable.class); 51 assertEquals(SimpleTouchable.class, object.getClass()); 52 } 53 54 public void testIsTypeConstraint() { 55 Constraint c = new IsType(AlternativeTouchable.class); 56 57 Object object = c.resolveInstance(container, 58 container.getComponentAdapter(DependsOnTouchable.class), 59 Touchable.class); 60 assertEquals(AlternativeTouchable.class, object.getClass()); 61 } 62 63 public void testIsKeyTypeConstraint() { 64 container.registerComponentImplementation("Simple", SimpleTouchable.class); 65 container.registerComponentImplementation(new Integer (5), SimpleTouchable.class); 66 container.registerComponentImplementation(Boolean.TRUE, SimpleTouchable.class); 67 Touchable t = (Touchable) container.getComponentInstance(Boolean.TRUE); 68 69 Constraint c = new IsKeyType(Boolean .class); 70 71 assertSame(t, c.resolveInstance(container, 72 container.getComponentAdapter(DependsOnTouchable.class), 73 Touchable.class)); 74 } 75 76 public void testConstraintTooBroadThrowsAmbiguityException() { 77 Constraint c = new IsType(Touchable.class); 78 79 try { 80 c.resolveInstance(container, 81 container.getComponentAdapter(DependsOnTouchable.class), 82 Touchable.class); 83 fail("did not throw ambiguous resolution exception"); 84 } catch (AmbiguousComponentResolutionException acre) { 85 } 87 } 88 89 public void testFindCandidateConstraintsExcludingOneImplementation() { 90 Constraint c = 91 new CollectionConstraint( 92 new And(new IsType(Touchable.class), 93 new Not(new IsType(DecoratedTouchable.class)))); 94 Touchable[] touchables = (Touchable[]) c.resolveInstance(container, 95 container.getComponentAdapter(DependsOnTouchable.class), 96 Touchable[].class); 97 assertEquals(2, touchables.length); 98 for (int i = 0; i < touchables.length; i++) { 99 assertFalse(touchables[i] instanceof DecoratedTouchable); 100 } 101 } 102 103 public void testCollectionChildIdVisitedBreadthFirst() { 104 Mock mockVisior = mock(PicoVisitor.class); 105 PicoVisitor visitor = (PicoVisitor) mockVisior.proxy(); 106 107 Mock mockC1 = mock(Constraint.class, "constraint 1"); 108 Constraint c1 = (Constraint) mockC1.proxy(); 109 110 Constraint c = new CollectionConstraint(c1); 111 112 mockVisior.expects(once()).method("visitParameter") 113 .with(same(c)).id("v"); 114 mockC1.expects(once()).method("accept") 115 .with(same(visitor)).after(mockVisior, "v"); 116 117 c.accept(visitor); 118 } 119 } 120 | Popular Tags |