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    import org.picocontainer.behaviors.AdaptingBehavior;
030    
031    
032    /**
033     * @author Paul Hammant
034     * @author Jörg Schaible
035     */
036    @RunWith(JMock.class)
037    public class ImmutablePicoContainerTestCase {
038    
039            private Mockery mockery = mockeryWithCountingNamingScheme();
040            
041        @Test public void testImmutingOfNullBarfs() {
042            try {
043                new ImmutablePicoContainer(null);
044                fail("Should have barfed");
045            } catch (NullPointerException e) {
046                // expected
047            }
048        }
049    
050        @Test public void testVisitingOfImmutableContainerWorks() {
051            final AdaptingInjection ai = new AdaptingInjection();
052            final DefaultPicoContainer pico = new DefaultPicoContainer(ai);
053            Object foo = new Object();
054            final ComponentAdapter componentAdapter = pico.addComponent(foo).getComponentAdapter(foo.getClass(), (NameBinding) null);
055    
056            final PicoVisitor fooVisitor = mockery.mock(PicoVisitor.class);
057            mockery.checking(new Expectations() {{
058                one(fooVisitor).visitContainer(with(same(pico)));
059                    one(fooVisitor).visitComponentFactory(with(same(ai)));
060                    one(fooVisitor).visitComponentAdapter(with(same(componentAdapter)));
061            }});
062            PicoContainer ipc = new ImmutablePicoContainer(pico);
063            ipc.accept(fooVisitor);
064        }
065    
066        @Test public void testProxyEquals() throws Exception {
067            DefaultPicoContainer pico = new DefaultPicoContainer();
068            PicoContainer ipc = new ImmutablePicoContainer(pico);
069            assertEquals(ipc, ipc);
070            assertEquals(ipc, new ImmutablePicoContainer(pico));
071        }
072    
073        @Test public void testHashCodeIsSame() throws Exception {
074            DefaultPicoContainer pico = new DefaultPicoContainer();
075            assertEquals(pico.hashCode(), new ImmutablePicoContainer(pico).hashCode());
076        }
077        
078        @Test public void testDoesNotEqualsToNull() {
079            DefaultPicoContainer pico = new DefaultPicoContainer();
080            PicoContainer ipc = new ImmutablePicoContainer(pico);
081            assertFalse(ipc.equals(null));
082        }
083    }