001package org.picocontainer.behaviors;
002
003import org.junit.Test;
004import static org.junit.Assert.assertNotNull;
005import org.picocontainer.DefaultPicoContainer;
006import org.picocontainer.Characteristics;
007import org.picocontainer.ComponentAdapter;
008import org.picocontainer.containers.EmptyPicoContainer;
009import org.picocontainer.injectors.SetterInjection;
010import org.picocontainer.lifecycle.NullLifecycleStrategy;
011import org.picocontainer.testmodel.NullLifecycle;
012
013import static junit.framework.Assert.assertEquals;
014
015public 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}