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 }