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    }