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