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     * Original code by Joerg Schaible                                           *
009     *****************************************************************************/
010    package org.picocontainer.adapters;
011    
012    
013    import static org.junit.Assert.assertEquals;
014    import static org.junit.Assert.assertSame;
015    import static org.junit.Assert.fail;
016    
017    import java.util.Map;
018    
019    import org.junit.Test;
020    import org.picocontainer.ComponentAdapter;
021    import org.picocontainer.DefaultPicoContainer;
022    import org.picocontainer.Disposable;
023    import org.picocontainer.MutablePicoContainer;
024    import org.picocontainer.PicoContainer;
025    import org.picocontainer.Startable;
026    import org.picocontainer.lifecycle.NullLifecycleStrategy;
027    import org.picocontainer.lifecycle.StartableLifecycleStrategy;
028    import org.picocontainer.monitors.NullComponentMonitor;
029    import org.picocontainer.tck.AbstractComponentAdapterTest;
030    import org.picocontainer.testmodel.NullLifecycle;
031    import org.picocontainer.testmodel.SimpleTouchable;
032    import org.picocontainer.testmodel.Touchable;
033    
034    
035    /**
036     * Test the InstanceAdapter.
037     * 
038     * @author Jörg Schaible
039     */
040    public final class InstanceAdapterTestCase extends AbstractComponentAdapterTest {
041    
042        @Test public void testComponentAdapterReturnsSame() {
043            final Touchable touchable = new SimpleTouchable();
044            final ComponentAdapter componentAdapter = new InstanceAdapter(Touchable.class, touchable, new NullLifecycleStrategy(),
045                                                                            new NullComponentMonitor());
046            assertSame(touchable, componentAdapter.getComponentInstance(null, null));
047        }
048    
049        @Test public void testDefaultLifecycleStrategy() {
050            LifecycleComponent component = new LifecycleComponent();
051            InstanceAdapter adapter =
052                new InstanceAdapter(LifecycleComponent.class, component, new StartableLifecycleStrategy(new NullComponentMonitor()),
053                                                                            new NullComponentMonitor());
054            PicoContainer pico = new DefaultPicoContainer();
055            adapter.start(pico);
056            adapter.stop(pico);
057            adapter.dispose(pico);
058            assertEquals("start>stop>dispose>", component.buffer.toString());
059            adapter.start(component);
060            adapter.stop(component);
061            adapter.dispose(component);
062            assertEquals("start>stop>dispose>start>stop>dispose>", component.buffer.toString());
063        }
064    
065        private static final class LifecycleComponent implements Startable, Disposable {
066            final StringBuffer buffer = new StringBuffer();
067    
068            public void start() {
069                buffer.append("start>");
070            }
071    
072            public void stop() {
073                buffer.append("stop>");
074            }
075    
076            public void dispose() {
077                buffer.append("dispose>");
078            }
079        }
080    
081        @Test public void testCustomLifecycleCanBeInjected() {
082            NullLifecycle component = new NullLifecycle();
083            RecordingLifecycleStrategy strategy = new RecordingLifecycleStrategy(new StringBuffer());
084            InstanceAdapter adapter = new InstanceAdapter(NullLifecycle.class, component, strategy, new NullComponentMonitor());
085            PicoContainer pico = new DefaultPicoContainer();
086            adapter.start(pico);
087            adapter.stop(pico);
088            adapter.dispose(pico);
089            assertEquals("<start<stop<dispose", strategy.recording());
090            adapter.start(component);
091            adapter.stop(component);
092            adapter.dispose(component);
093            assertEquals("<start<stop<dispose<start<stop<dispose", strategy.recording());
094        }
095    
096        @Test public void testComponentAdapterCanIgnoreLifecycle() {
097            final Touchable touchable = new SimpleTouchable();
098            InstanceAdapter adapter = new InstanceAdapter(Touchable.class, touchable, new NullLifecycleStrategy(),
099                                                                            new NullComponentMonitor());
100            PicoContainer pico = new DefaultPicoContainer();
101            adapter.start(pico);
102            adapter.stop(pico);
103            adapter.dispose(pico);
104            adapter.start(touchable);
105            adapter.stop(touchable);
106            adapter.dispose(touchable);
107        }
108    
109        @Test public void testGuardAgainstNullInstance() {
110            try {
111                new InstanceAdapter(Map.class, null, new NullLifecycleStrategy(),
112                                                                            new NullComponentMonitor());
113                fail("should have barfed");
114            } catch (NullPointerException e) {
115                assertEquals("componentInstance cannot be null", e.getMessage());
116            }
117        }
118        
119        @Test
120        public void testFindAdapterOfType() {
121            ComponentAdapter adapter = new InstanceAdapter("test", "test");
122            assertEquals(adapter, adapter.findAdapterOfType(InstanceAdapter.class));
123        }
124    
125    
126        /**
127         * {@inheritDoc}
128         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#getComponentAdapterType()
129         */
130        protected Class getComponentAdapterType() {
131            return InstanceAdapter.class;
132        }
133    
134        /**
135         * {@inheritDoc}
136         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#getComponentAdapterNature()
137         */
138        protected int getComponentAdapterNature() {
139            return super.getComponentAdapterNature() & ~(RESOLVING | VERIFYING | INSTANTIATING );
140        }
141    
142        /**
143         * {@inheritDoc}
144         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_verifyWithoutDependencyWorks(org.picocontainer.MutablePicoContainer)
145         */
146        protected ComponentAdapter prepDEF_verifyWithoutDependencyWorks(MutablePicoContainer picoContainer) {
147            return new InstanceAdapter("foo", "bar", new NullLifecycleStrategy(),
148                                                                            new NullComponentMonitor());
149        }
150    
151        /**
152         * {@inheritDoc}
153         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_verifyDoesNotInstantiate(org.picocontainer.MutablePicoContainer)
154         */
155        protected ComponentAdapter prepDEF_verifyDoesNotInstantiate(
156                MutablePicoContainer picoContainer) {
157            return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
158                                                                            new NullComponentMonitor());
159        }
160    
161        /**
162         * {@inheritDoc}
163         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_visitable()
164         */
165        protected ComponentAdapter prepDEF_visitable() {
166            return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
167                                                                            new NullComponentMonitor());
168        }
169    
170        /**
171         * {@inheritDoc}
172         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepSER_isSerializable(org.picocontainer.MutablePicoContainer)
173         */
174        protected ComponentAdapter prepSER_isSerializable(MutablePicoContainer picoContainer) {
175            return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
176                                                                            new NullComponentMonitor());
177        }
178    
179        /**
180         * {@inheritDoc}
181         * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepSER_isXStreamSerializable(org.picocontainer.MutablePicoContainer)
182         */
183        protected ComponentAdapter prepSER_isXStreamSerializable(MutablePicoContainer picoContainer) {
184            return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
185                                                                            new NullComponentMonitor());
186        }
187    
188    }