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