001 package org.picocontainer.doc.advanced; 002 003 import junit.framework.TestCase; 004 005 import org.picocontainer.MutablePicoContainer; 006 import org.picocontainer.Parameter; 007 import org.picocontainer.defaults.CollectionComponentParameter; 008 import org.picocontainer.defaults.ComponentParameter; 009 import org.picocontainer.defaults.DefaultPicoContainer; 010 011 import java.util.Collection; 012 import java.util.HashSet; 013 import java.util.LinkedList; 014 import java.util.Set; 015 016 017 /** 018 * @author Jörg Schaible 019 * @version $Revision: 1796 $ 020 */ 021 public class CollectionsTestCase 022 extends TestCase 023 implements CollectionDemoClasses { 024 private MutablePicoContainer pico; 025 026 protected void setUp() throws Exception { 027 pico = new DefaultPicoContainer(); 028 } 029 030 // START SNIPPET: bowl 031 032 public static class Bowl { 033 private final LinkedList fishes; 034 private final Collection cods; 035 036 public Bowl(LinkedList fishes, Collection cods) { 037 this.fishes = fishes; 038 this.cods = cods; 039 } 040 041 public Collection getFishes() { 042 return fishes; 043 } 044 045 public Collection getCods() { 046 return cods; 047 } 048 } 049 050 // END SNIPPET: bowl 051 052 public void testShouldCreateBowlWithFishCollection() { 053 054 // START SNIPPET: usage 055 056 pico.registerComponentImplementation(Shark.class); 057 pico.registerComponentImplementation(Cod.class); 058 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 059 new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false)}); 060 // END SNIPPET: usage 061 062 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class); 063 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class); 064 Bowl bowl = (Bowl) pico.getComponentInstanceOfType(Bowl.class); 065 066 Collection fishes = bowl.getFishes(); 067 assertEquals(2, fishes.size()); 068 assertTrue(fishes.contains(shark)); 069 assertTrue(fishes.contains(cod)); 070 071 Collection cods = bowl.getCods(); 072 assertEquals(1, cods.size()); 073 assertTrue(cods.contains(cod)); 074 } 075 076 public void testShouldCreateBowlWithFishesOnly() { 077 078 // START SNIPPET: directUsage 079 080 final Set set = new HashSet(); 081 pico.registerComponentImplementation(Shark.class); 082 pico.registerComponentImplementation(Cod.class); 083 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 084 new ComponentParameter(Fish.class, false), new ComponentParameter(Cod.class, false)}); 085 pico.registerComponentInstance(set); 086 087 Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class); 088 // END SNIPPET: directUsage 089 090 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class); 091 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class); 092 093 // START SNIPPET: directDemo 094 095 Collection cods = bowl.getCods(); 096 assertEquals(0, cods.size()); 097 assertSame(set, cods); 098 099 Collection fishes = bowl.getFishes(); 100 assertEquals(2, fishes.size()); 101 // END SNIPPET: directDemo 102 103 assertTrue(fishes.contains(cod)); 104 assertTrue(fishes.contains(shark)); 105 } 106 107 public void testShouldCreateBowlWithFishCollectionAnyway() { 108 109 // START SNIPPET: ensureCollection 110 111 pico.registerComponentImplementation(Shark.class); 112 pico.registerComponentImplementation(Cod.class); 113 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 114 new CollectionComponentParameter(Fish.class, false), new CollectionComponentParameter(Cod.class, false)}); 115 // This component will match both arguments of Bowl's constructor 116 pico.registerComponentInstance(new LinkedList()); 117 118 Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class); 119 // END SNIPPET: ensureCollection 120 121 Shark shark = (Shark) pico.getComponentInstanceOfType(Shark.class); 122 Cod cod = (Cod) pico.getComponentInstanceOfType(Cod.class); 123 124 Collection fishes = bowl.getFishes(); 125 assertEquals(2, fishes.size()); 126 Collection cods = bowl.getCods(); 127 assertEquals(1, cods.size()); 128 129 assertTrue(fishes.contains(shark)); 130 assertTrue(fishes.contains(cod)); 131 assertTrue(cods.contains(cod)); 132 } 133 134 public void testShouldCreateBowlWithNoFishAtAll() { 135 136 // START SNIPPET: emptyCollection 137 138 pico.registerComponentImplementation(Bowl.class, Bowl.class, new Parameter[]{ 139 new ComponentParameter(Fish.class, true), new ComponentParameter(Cod.class, true)}); 140 141 Bowl bowl = (Bowl) pico.getComponentInstance(Bowl.class); 142 // END SNIPPET: emptyCollection 143 144 Collection fishes = bowl.getFishes(); 145 assertEquals(0, fishes.size()); 146 Collection cods = bowl.getCods(); 147 assertEquals(0, cods.size()); 148 } 149 }