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