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));
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
120 /**
121 * {@inheritDoc}
122 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#getComponentAdapterType()
123 */
124 protected Class getComponentAdapterType() {
125 return InstanceAdapter.class;
126 }
127
128 /**
129 * {@inheritDoc}
130 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#getComponentAdapterNature()
131 */
132 protected int getComponentAdapterNature() {
133 return super.getComponentAdapterNature() & ~(RESOLVING | VERIFYING | INSTANTIATING );
134 }
135
136 /**
137 * {@inheritDoc}
138 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_verifyWithoutDependencyWorks(org.picocontainer.MutablePicoContainer)
139 */
140 protected ComponentAdapter prepDEF_verifyWithoutDependencyWorks(MutablePicoContainer picoContainer) {
141 return new InstanceAdapter("foo", "bar", new NullLifecycleStrategy(),
142 new NullComponentMonitor());
143 }
144
145 /**
146 * {@inheritDoc}
147 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_verifyDoesNotInstantiate(org.picocontainer.MutablePicoContainer)
148 */
149 protected ComponentAdapter prepDEF_verifyDoesNotInstantiate(
150 MutablePicoContainer picoContainer) {
151 return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
152 new NullComponentMonitor());
153 }
154
155 /**
156 * {@inheritDoc}
157 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepDEF_visitable()
158 */
159 protected ComponentAdapter prepDEF_visitable() {
160 return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
161 new NullComponentMonitor());
162 }
163
164 /**
165 * {@inheritDoc}
166 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepSER_isSerializable(org.picocontainer.MutablePicoContainer)
167 */
168 protected ComponentAdapter prepSER_isSerializable(MutablePicoContainer picoContainer) {
169 return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
170 new NullComponentMonitor());
171 }
172
173 /**
174 * {@inheritDoc}
175 * @see org.picocontainer.tck.AbstractComponentAdapterTestCase#prepSER_isXStreamSerializable(org.picocontainer.MutablePicoContainer)
176 */
177 protected ComponentAdapter prepSER_isXStreamSerializable(MutablePicoContainer picoContainer) {
178 return new InstanceAdapter("Key", 4711, new NullLifecycleStrategy(),
179 new NullComponentMonitor());
180 }
181
182 }