001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by Paul Hammant                                             *
009     *****************************************************************************/
010    
011    package org.picocontainer.containers;
012    
013    import static org.junit.Assert.assertEquals;
014    import static org.junit.Assert.assertFalse;
015    import static org.junit.Assert.fail;
016    import static org.picocontainer.tck.MockFactory.mockeryWithCountingNamingScheme;
017    
018    import org.jmock.Expectations;
019    import org.jmock.Mockery;
020    import org.jmock.integration.junit4.JMock;
021    import org.junit.Test;
022    import org.junit.runner.RunWith;
023    import org.picocontainer.ComponentAdapter;
024    import org.picocontainer.DefaultPicoContainer;
025    import org.picocontainer.NameBinding;
026    import org.picocontainer.PicoContainer;
027    import org.picocontainer.PicoVisitor;
028    import org.picocontainer.injectors.AdaptingInjection;
029    
030    
031    /**
032     * @author Paul Hammant
033     * @author Jörg Schaible
034     */
035    @RunWith(JMock.class)
036    public class ImmutablePicoContainerTestCase {
037    
038            private Mockery mockery = mockeryWithCountingNamingScheme();
039            
040        @Test public void testImmutingOfNullBarfs() {
041            try {
042                new ImmutablePicoContainer(null);
043                fail("Should have barfed");
044            } catch (NullPointerException e) {
045                // expected
046            }
047        }
048    
049        @Test public void testVisitingOfImmutableContainerWorks() {
050            final AdaptingInjection ai = new AdaptingInjection();
051            final DefaultPicoContainer pico = new DefaultPicoContainer(ai);
052            Object foo = new Object();
053            final ComponentAdapter componentAdapter = pico.addComponent(foo).getComponentAdapter(foo.getClass(), (NameBinding) null);
054    
055            final PicoVisitor fooVisitor = mockery.mock(PicoVisitor.class);
056            mockery.checking(new Expectations() {{
057                one(fooVisitor).visitContainer(with(same(pico))); will(returnValue(true));
058                    one(fooVisitor).visitComponentFactory(with(same(ai)));
059                    one(fooVisitor).visitComponentAdapter(with(same(componentAdapter)));
060            }});
061            PicoContainer ipc = new ImmutablePicoContainer(pico);
062            ipc.accept(fooVisitor);
063        }
064    
065        @Test public void testProxyEquals() throws Exception {
066            DefaultPicoContainer pico = new DefaultPicoContainer();
067            PicoContainer ipc = new ImmutablePicoContainer(pico);
068            assertEquals(ipc, ipc);
069            assertEquals(ipc, new ImmutablePicoContainer(pico));
070        }
071    
072        @Test public void testHashCodeIsSame() throws Exception {
073            DefaultPicoContainer pico = new DefaultPicoContainer();
074            assertEquals(pico.hashCode(), new ImmutablePicoContainer(pico).hashCode());
075        }
076        
077        @Test public void testDoesNotEqualsToNull() {
078            DefaultPicoContainer pico = new DefaultPicoContainer();
079            PicoContainer ipc = new ImmutablePicoContainer(pico);
080            assertFalse(ipc.equals(null));
081        }
082    }