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 *
009 *****************************************************************************/
010 package org.picocontainer.behaviors;
011
012 import static org.picocontainer.behaviors.Behaviors.caching;
013 import static org.picocontainer.behaviors.Behaviors.*;
014 import org.picocontainer.DefaultPicoContainer;
015 import org.picocontainer.PicoBuilder;
016 import org.picocontainer.MutablePicoContainer;
017 import org.picocontainer.lifecycle.NullLifecycleStrategy;
018 import org.picocontainer.monitors.NullComponentMonitor;
019 import org.picocontainer.injectors.ConstructorInjector;
020 import static org.picocontainer.Characteristics.*;
021
022 import junit.framework.TestCase;
023
024 public class AutomaticTestCase extends TestCase {
025
026 private static String MESSAGE =
027 "Foo was instantiated, even though it was not required to be given it was not depended on by anything looked up";
028
029 public static class Foo {
030 public Foo(StringBuilder sb) {
031 sb.append(MESSAGE);
032 }
033 }
034
035 public static class Bar {
036 }
037
038 public void testAutomaticBehavior() {
039 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automatic()));
040 pico.addComponent(StringBuilder.class);
041 pico.addComponent(Foo.class);
042 pico.addComponent(Bar.class);
043 pico.start();
044 assertNotNull(pico.getComponent(Bar.class));
045 StringBuilder sb = pico.getComponent(StringBuilder.class);
046 assertEquals(MESSAGE, sb.toString());
047 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
048 }
049
050 public void testAutomaticBehaviorViaAdapter() {
051 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new Automatic()));
052 pico.addComponent(StringBuilder.class);
053 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
054 pico.addComponent(Bar.class);
055 pico.start();
056 assertNotNull(pico.getComponent(Bar.class));
057 StringBuilder sb = pico.getComponent(StringBuilder.class);
058 assertEquals(MESSAGE, sb.toString());
059 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
060 }
061
062 public void testNonAutomaticBehaviorAsContrastToTheAbove() {
063 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching());
064 pico.addComponent(StringBuilder.class);
065 pico.addComponent(Foo.class);
066 pico.addComponent(Bar.class);
067 pico.start();
068 assertNotNull(pico.getComponent(Bar.class));
069 StringBuilder sb = pico.getComponent(StringBuilder.class);
070 assertEquals("", sb.toString());
071 }
072
073 public void testNonAutomaticBehaviorAsContrastToTheAboveViaAdapter() {
074 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching());
075 pico.addComponent(StringBuilder.class);
076 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
077 pico.addComponent(Bar.class);
078 pico.start();
079 assertNotNull(pico.getComponent(Bar.class));
080 StringBuilder sb = pico.getComponent(StringBuilder.class);
081 assertEquals("", sb.toString());
082 }
083
084 public void testAutomaticBehaviorByBuilder() {
085 MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build();
086 pico.addComponent(StringBuilder.class);
087 pico.addComponent(Foo.class);
088 pico.addComponent(Bar.class);
089 pico.start();
090 assertNotNull(pico.getComponent(Bar.class));
091 StringBuilder sb = pico.getComponent(StringBuilder.class);
092 assertEquals(MESSAGE, sb.toString());
093 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
094 }
095
096 public void testAutomaticBehaviorByBuilderViaAdapter() {
097 MutablePicoContainer pico = new PicoBuilder().withCaching().withAutomatic().build();
098 pico.addComponent(StringBuilder.class);
099 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
100 pico.addComponent(Bar.class);
101 pico.start();
102 assertNotNull(pico.getComponent(Bar.class));
103 StringBuilder sb = pico.getComponent(StringBuilder.class);
104 assertEquals(MESSAGE, sb.toString());
105 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
106 }
107
108 public void testAutomaticBehaviorByBuilderADifferentWay() {
109 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
110 pico.addComponent(StringBuilder.class);
111 pico.addComponent(Foo.class);
112 pico.addComponent(Bar.class);
113 pico.start();
114 assertNotNull(pico.getComponent(Bar.class));
115 StringBuilder sb = pico.getComponent(StringBuilder.class);
116 assertEquals(MESSAGE, sb.toString());
117 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
118 }
119
120 public void testAutomaticBehaviorByBuilderADifferentWayViaAdapter() {
121 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
122 pico.addComponent(StringBuilder.class);
123 pico.addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
124 pico.addComponent(Bar.class);
125 pico.start();
126 assertNotNull(pico.getComponent(Bar.class));
127 StringBuilder sb = pico.getComponent(StringBuilder.class);
128 assertEquals(MESSAGE, sb.toString());
129 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
130 }
131
132 public void testAutomaticBehaviorWorksForAdaptiveBehaviorToo() {
133 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
134 pico.addComponent(StringBuilder.class);
135 pico.as(AUTOMATIC).addComponent(Foo.class);
136 pico.addComponent(Bar.class);
137 pico.start();
138 assertNotNull(pico.getComponent(Bar.class));
139 StringBuilder sb = pico.getComponent(StringBuilder.class);
140 assertEquals(MESSAGE, sb.toString());
141 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
142 }
143
144 public void testAutomaticBehaviorWorksForAdaptiveBehaviorTooViaAdapter() {
145 MutablePicoContainer pico = new PicoBuilder().withBehaviors(caching(), automatic()).build();
146 pico.addComponent(StringBuilder.class);
147 pico.as(AUTOMATIC).addAdapter(new ConstructorInjector(Foo.class, Foo.class, null, new NullComponentMonitor(), new NullLifecycleStrategy()));
148 pico.addComponent(Bar.class);
149 pico.start();
150 assertNotNull(pico.getComponent(Bar.class));
151 StringBuilder sb = pico.getComponent(StringBuilder.class);
152 assertEquals(MESSAGE, sb.toString());
153 assertEquals("Cached:Automated:ConstructorInjector-class org.picocontainer.behaviors.AutomaticTestCase$Foo", pico.getComponentAdapter(Foo.class).toString());
154 }
155
156 }