001    package org.picocontainer.monitors;
002    
003    import junit.framework.TestCase;
004    import org.jmock.Expectations;
005    import org.jmock.Mockery;
006    import org.jmock.integration.junit4.JMock;
007    import org.junit.Test;
008    import org.junit.runner.RunWith;
009    import org.picocontainer.*;
010    
011    import static org.picocontainer.Characteristics.USE_NAMES;
012    import static org.picocontainer.tck.MockFactory.mockeryWithCountingNamingScheme;
013    
014    import org.picocontainer.composers.RegexComposer;
015    
016    import java.lang.reflect.Constructor;
017    import java.util.List;
018    import java.util.ArrayList;
019    
020    @RunWith(JMock.class)
021    public class RegexComposerTestCase extends TestCase {
022    
023        private Mockery mockery = mockeryWithCountingNamingScheme();
024    
025        @Test
026        public void regexWorksInGetComponentCalls() {
027            MutablePicoContainer pico = new DefaultPicoContainer(new ComposingMonitor(new RegexComposer()));
028            pico.addComponent("apple1", "Braeburn");
029            pico.addComponent("apple2", "Granny Smith");
030            pico.addComponent("plum", "Victoria");
031    
032            List apples = (List) pico.getComponent("apple[1-9]");
033            assertEquals("[Braeburn, Granny Smith]", apples.toString());
034        }
035    
036        @Test
037        public void canReturningDifferentListsForDifferentComposers() {
038            MutablePicoContainer pico = new DefaultPicoContainer(
039                    new ComposingMonitor(new RegexComposer("apple[1-9]", "apples"), new RegexComposer("plum*", "plums")));
040            pico.addComponent("apple1", "Braeburn")
041                    .addComponent("apple2", "Granny Smith")
042                    .addComponent("plumV", "Victoria");
043            pico.as(USE_NAMES).addComponent(NeedsApples.class)
044                    .as(USE_NAMES).addComponent(NeedsPlums.class);
045    
046            assertEquals("[Braeburn, Granny Smith]", pico.getComponent(NeedsApples.class).apples.toString());
047    
048            assertEquals("[Victoria]", pico.getComponent(NeedsPlums.class).plums.toString());
049        }
050    
051        @Test
052        public void nonMatchingCanFallThroughToAnotherComponentMonitor() throws NoSuchMethodException {
053    
054            final List<String> apples = new ArrayList<String>();
055            apples.add("Cox's");
056    
057            final ComponentMonitor fallThru = mockery.mock(ComponentMonitor.class);
058            mockery.checking(new Expectations() {{
059                one(fallThru).noComponentFound(with(any(MutablePicoContainer.class)), with(same(List.class)));
060                will(returnValue(null));
061                one(fallThru).noComponentFound(with(any(MutablePicoContainer.class)), with(equal("apples")));
062                will(returnValue(apples));
063                one(fallThru).instantiating(with(any(MutablePicoContainer.class)), with(any(ComponentAdapter.class)), with(any(Constructor.class)));
064                will(returnValue(NeedsApples.class.getConstructor(List.class)));
065                one(fallThru).instantiated(with(any(MutablePicoContainer.class)), with(any(ComponentAdapter.class)), with(any(Constructor.class)), with(any(NeedsApples.class)), with(any(Object[].class)), with(any(int.class)));
066            }});
067    
068            final MutablePicoContainer pico = new DefaultPicoContainer(new ComposingMonitor(fallThru, new RegexComposer("qqq[1-9]", "qqq")));
069            pico.addComponent("apple1", "Braeburn")
070                    .addComponent("integer", 1)
071                    .addComponent("apple2", "Granny Smith")
072                    .addComponent("plum", "Victoria");
073    
074            pico.as(USE_NAMES).addComponent(NeedsApples.class);
075    
076            assertEquals("[Cox's]", pico.getComponent(NeedsApples.class).apples.toString());
077        }
078    
079        public static class NeedsApples {
080            private List<String> apples;
081    
082            public NeedsApples(List<String> apples) {
083                this.apples = apples;
084            }
085        }
086    
087        public static class NeedsPlums {
088            private List<String> plums;
089    
090            public NeedsPlums(List<String> plums) {
091                this.plums = plums;
092            }
093        }
094    
095    
096    }