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