001 package org.picocontainer.behaviors;
002
003 import org.junit.Test;
004 import static org.junit.Assert.assertNotNull;
005 import org.picocontainer.DefaultPicoContainer;
006 import org.picocontainer.Characteristics;
007 import org.picocontainer.ComponentAdapter;
008 import org.picocontainer.containers.EmptyPicoContainer;
009 import org.picocontainer.injectors.SetterInjection;
010 import org.picocontainer.lifecycle.NullLifecycleStrategy;
011 import org.picocontainer.testmodel.NullLifecycle;
012
013 import static junit.framework.Assert.assertEquals;
014
015 public class CircularTestCase {
016
017 public static interface IFish {
018 IWater getWater();
019 }
020 public static class Fish implements IFish {
021 IWater water;
022
023 public void setWater(IWater water) {
024 this.water = water;
025 }
026
027 public IWater getWater() {
028 return water;
029 }
030 }
031
032 public static interface IWater {
033 IFish getFish();
034
035 }
036 public static class Water implements IWater {
037 IFish fish;
038
039 public void setFish(IFish fish) {
040 this.fish = fish;
041 }
042
043 public IFish getFish() {
044 return fish;
045 }
046 }
047
048 @Test
049 public void circularIsPossibleWithACharacteristic() {
050 DefaultPicoContainer pico = new DefaultPicoContainer(new Caching().wrap(new SetterInjection()));
051 pico.as(Characteristics.ENABLE_CIRCULAR).addComponent(IFish.class, Fish.class);
052 pico.addComponent(IWater.class, Water.class);
053 IWater water = pico.getComponent(IWater.class);
054 IFish fish = pico.getComponent(IFish.class);
055 assertNotNull(water.getFish());
056 assertNotNull(fish.getWater());
057 }
058
059 @Test
060 public void enableCircularCharacteristicIsRedundantForImplementationHiding() {
061 DefaultPicoContainer pico = new DefaultPicoContainer(new ImplementationHiding().wrap(new SetterInjection()), new NullLifecycleStrategy(), new EmptyPicoContainer());
062 pico.addComponent(IFish.class, Fish.class);
063 pico.addComponent(IWater.class, Water.class);
064 IWater water = pico.getComponent(IWater.class);
065 IFish fish = pico.getComponent(IFish.class);
066 assertNotNull(water.getFish());
067 assertNotNull(fish.getWater());
068
069 ComponentAdapter<?> ca = pico.getComponentAdapter(IFish.class);
070 assertEquals("Hidden:SetterInjector-" + IFish.class,ca.toString());
071
072 }
073
074
075 }