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 }