001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *****************************************************************************/
008    package org.picocontainer.defaults;
009    
010    import java.util.ArrayList;
011    import java.util.HashSet;
012    import java.util.Iterator;
013    import java.util.List;
014    import java.util.Set;
015    
016    import junit.framework.TestCase;
017    
018    import org.picocontainer.ComponentAdapter;
019    import org.picocontainer.MutablePicoContainer;
020    import org.picocontainer.Parameter;
021    import org.picocontainer.PicoContainer;
022    import org.picocontainer.PicoVisitor;
023    
024    /**
025     * @author Michael Rimov
026     */
027    public class TraversalCheckingVisitorTestCase extends TestCase {
028    
029        private MutablePicoContainer pico;
030    
031        private MutablePicoContainer child;
032    
033        private ComponentAdapter parentAdapter;
034    
035        private ComponentAdapter childAdapter;
036    
037        protected void setUp() throws Exception {
038            super.setUp();
039    
040            pico = new DefaultPicoContainer();
041            parentAdapter = pico.registerComponent(new SetterInjectionComponentAdapter(StringBuffer.class, StringBuffer.class, null));
042    
043            child = pico.makeChildContainer();
044    
045            childAdapter = child.registerComponent(new ConstructorInjectionComponentAdapter(ArrayList.class, ArrayList.class,
046                new Parameter[] {
047                new ConstantParameter(new Integer(3))
048            }));
049        }
050    
051        protected void tearDown() throws Exception {
052            super.tearDown();
053            child = null;
054            pico = null;
055            parentAdapter = null;
056            childAdapter = null;
057        }
058    
059        public void testVisitComponentAdapter() {
060            final int numExpectedComponentAdapters = 2;
061            final List allAdapters = new ArrayList();
062    
063            Set knownAdapters = new HashSet();
064            knownAdapters.add(parentAdapter);
065            knownAdapters.add(childAdapter);
066    
067            PicoVisitor containerCollector = new TraversalCheckingVisitor() {
068                public void visitComponentAdapter(ComponentAdapter adapter) {
069                    super.visitComponentAdapter(adapter); //Calls checkTraversal for us.
070                    allAdapters.add(adapter);
071                }
072            };
073            containerCollector.traverse(pico);
074    
075            assertEquals(numExpectedComponentAdapters, allAdapters.size());
076    
077            for (Iterator i = allAdapters.iterator(); i.hasNext(); ) {
078                boolean knownAdapter = knownAdapters.remove(i.next());
079                assertTrue("Encountered unknown adapter in collection: " + allAdapters.toString(), knownAdapter);
080            }
081    
082            assertTrue("All adapters should match known adapters.", knownAdapters.size() == 0);
083        }
084    
085        public void testVisitContainer() {
086            final List allContainers = new ArrayList();
087            final int expectedNumberOfContainers = 2;
088    
089            PicoVisitor containerCollector = new TraversalCheckingVisitor() {
090                public void visitContainer(PicoContainer pico) {
091                    super.visitContainer(pico); //Calls checkTraversal for us.
092                    allContainers.add(pico);
093                }
094            };
095    
096            containerCollector.traverse(pico);
097    
098            assertTrue(allContainers.size() == expectedNumberOfContainers);
099    
100            Set knownContainers = new HashSet();
101            knownContainers.add(pico);
102            knownContainers.add(child);
103            for (Iterator i = allContainers.iterator(); i.hasNext(); ) {
104                PicoContainer oneContainer = (PicoContainer) i.next();
105                boolean knownContainer = knownContainers.remove(oneContainer);
106                assertTrue("Found a picocontainer that wasn't previously expected.", knownContainer);
107            }
108    
109            assertTrue("All containers must match what is returned by traversal.",
110                knownContainers.size() == 0);
111    
112        }
113    
114    
115        public void testVisitParameter() {
116            final List allParameters = new ArrayList();
117    
118            PicoVisitor containerCollector = new TraversalCheckingVisitor() {
119                public void visitParameter(Parameter param) {
120                    super.visitParameter(param); //Calls checkTraversal for us.
121                    allParameters.add(param);
122                }
123            };
124    
125            containerCollector.traverse(pico);
126    
127            assertTrue(allParameters.size() == 1);
128            assertTrue(allParameters.get(0) instanceof ConstantParameter);
129            assertTrue( ( (ConstantParameter) allParameters.get(0)).resolveInstance(null, null, null) instanceof Integer);
130            assertEquals(3, ( (Integer) ( (ConstantParameter) allParameters.get(0)).resolveInstance(null, null,
131                null)).intValue());
132        }
133    
134    }