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