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.visitors;
009    
010    import java.util.ArrayList;
011    import java.util.HashSet;
012    import java.util.List;
013    import java.util.Set;
014    
015    import junit.framework.TestCase;
016    
017    import org.picocontainer.ComponentAdapter;
018    import org.picocontainer.MutablePicoContainer;
019    import org.picocontainer.Parameter;
020    import org.picocontainer.PicoContainer;
021    import org.picocontainer.PicoVisitor;
022    import org.picocontainer.DefaultPicoContainer;
023    import org.picocontainer.lifecycle.NullLifecycleStrategy;
024    import org.picocontainer.monitors.NullComponentMonitor;
025    import org.picocontainer.injectors.ConstructorInjector;
026    import org.picocontainer.parameters.ConstantParameter;
027    import org.picocontainer.visitors.TraversalCheckingVisitor;
028    import org.picocontainer.injectors.SetterInjector;
029    
030    /**
031     * @author Michael Rimov
032     */
033    public class TraversalCheckingVisitorTestCase extends TestCase {
034    
035        private MutablePicoContainer pico;
036    
037        private MutablePicoContainer child;
038    
039        private ComponentAdapter parentAdapter;
040    
041        private ComponentAdapter childAdapter;
042    
043        protected void setUp() throws Exception {
044            super.setUp();
045    
046            pico = new DefaultPicoContainer();
047            SetterInjector componentAdapter = new SetterInjector(StringBuffer.class, StringBuffer.class,
048                                                                 null, new NullComponentMonitor(), new NullLifecycleStrategy());
049            parentAdapter = pico.addAdapter(componentAdapter).getComponentAdapter(StringBuffer.class, null);
050            child = pico.makeChildContainer();
051            ConstructorInjector adapter = new ConstructorInjector(ArrayList.class, ArrayList.class, new Parameter[] {new ConstantParameter(3)}, new NullComponentMonitor(), new NullLifecycleStrategy());
052            childAdapter = child.addAdapter(adapter).getComponentAdapter(ArrayList.class, null);
053        }
054    
055        protected void tearDown() throws Exception {
056            super.tearDown();
057            child = null;
058            pico = null;
059            parentAdapter = null;
060            childAdapter = null;
061        }
062    
063        public void testVisitComponentAdapter() {
064            final int numExpectedComponentAdapters = 2;
065            final List<ComponentAdapter> allAdapters = new ArrayList<ComponentAdapter>();
066    
067            Set<ComponentAdapter> knownAdapters = new HashSet<ComponentAdapter>();
068            knownAdapters.add(parentAdapter);
069            knownAdapters.add(childAdapter);
070    
071            PicoVisitor containerCollector = new TraversalCheckingVisitor() {
072                public void visitComponentAdapter(ComponentAdapter adapter) {
073                    super.visitComponentAdapter(adapter); //Calls checkTraversal for us.
074                    allAdapters.add(adapter);
075                }
076            };
077            containerCollector.traverse(pico);
078    
079            assertEquals(numExpectedComponentAdapters, allAdapters.size());
080    
081            for (ComponentAdapter allAdapter : allAdapters) {
082                boolean knownAdapter = knownAdapters.remove(allAdapter);
083                assertTrue("Encountered unknown adapter in collection: " + allAdapters.toString(), knownAdapter);
084            }
085    
086            assertTrue("All adapters should match known adapters.", knownAdapters.size() == 0);
087        }
088    
089        public void testVisitContainer() {
090            final List<PicoContainer> allContainers = new ArrayList<PicoContainer>();
091            final int expectedNumberOfContainers = 2;
092    
093            PicoVisitor containerCollector = new TraversalCheckingVisitor() {
094                public void visitContainer(PicoContainer pico) {
095                    super.visitContainer(pico); //Calls checkTraversal for us.
096                    allContainers.add(pico);
097                }
098            };
099    
100            containerCollector.traverse(pico);
101    
102            assertTrue(allContainers.size() == expectedNumberOfContainers);
103    
104            Set<MutablePicoContainer> knownContainers = new HashSet<MutablePicoContainer>();
105            knownContainers.add(pico);
106            knownContainers.add(child);
107            for (PicoContainer oneContainer : allContainers) {
108                boolean knownContainer = knownContainers.remove(oneContainer);
109                assertTrue("Found a picocontainer that wasn't previously expected.", knownContainer);
110            }
111    
112            assertTrue("All containers must match what is returned by traversal.",
113                knownContainers.size() == 0);
114    
115        }
116    
117    
118        public void testVisitParameter() {
119            final List allParameters = new ArrayList();
120    
121            PicoVisitor containerCollector = new TraversalCheckingVisitor() {
122                public void visitParameter(Parameter param) {
123                    super.visitParameter(param); //Calls checkTraversal for us.
124                    allParameters.add(param);
125                }
126            };
127    
128            containerCollector.traverse(pico);
129    
130            assertTrue(allParameters.size() == 1);
131            assertTrue(allParameters.get(0) instanceof ConstantParameter);
132            assertTrue( ( (ConstantParameter) allParameters.get(0)).resolveInstance(null, null, null, null) instanceof Integer);
133            assertEquals(3, ( (Integer) ( (ConstantParameter) allParameters.get(0)).resolveInstance(null, null,
134                null, null)).intValue());
135        }
136    
137    }