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.defaults;
012    
013    import org.picocontainer.ComponentAdapter;
014    import org.picocontainer.PicoContainer;
015    import org.picocontainer.PicoVisitor;
016    
017    import org.jmock.Mock;
018    import org.jmock.MockObjectTestCase;
019    
020    
021    /**
022     * @author Paul Hammant
023     * @author Jörg Schaible
024     */
025    public class ImmutablePicoContainerProxyFactoryTest extends MockObjectTestCase {
026    
027        public void testImmutingOfNullBarfs() {
028            try {
029                ImmutablePicoContainerProxyFactory.newProxyInstance(null);
030                fail("Should have barfed");
031            } catch (NullPointerException e) {
032                // expected
033            }
034        }
035    
036        public void testLifecylceBarfs() {
037            Mock mockPicoContainer = mock(PicoContainer.class);
038            PicoContainer ipc = ImmutablePicoContainerProxyFactory.newProxyInstance((PicoContainer)mockPicoContainer
039                    .proxy());
040            try {
041                ipc.start();
042                fail("should have barfed");
043            } catch (UnsupportedOperationException e) {
044                // expected
045            }
046            try {
047                ipc.stop();
048                fail("should have barfed");
049            } catch (UnsupportedOperationException e) {
050                // expected
051            }
052            try {
053                ipc.dispose();
054                fail("should have barfed");
055            } catch (UnsupportedOperationException e) {
056                // expected
057            }
058        }
059    
060        public void testVisitingOfImmutableContainerWorks() {
061            DefaultPicoContainer pico = new DefaultPicoContainer();
062            Object foo = new Object();
063            ComponentAdapter componentAdapter = pico.registerComponentInstance(foo);
064    
065            Mock fooVisitor = new Mock(PicoVisitor.class);
066            fooVisitor.expects(once()).method("visitContainer").with(same(pico));
067            fooVisitor.expects(once()).method("visitComponentAdapter").with(same(componentAdapter));
068    
069            PicoContainer ipc = ImmutablePicoContainerProxyFactory.newProxyInstance(pico);
070            ipc.accept((PicoVisitor)fooVisitor.proxy());
071        }
072    
073        public void testProxyEquals() throws Exception {
074            DefaultPicoContainer pico = new DefaultPicoContainer();
075            PicoContainer ipc = ImmutablePicoContainerProxyFactory.newProxyInstance(pico);
076            assertEquals(ipc, ipc);
077            assertEquals(ipc, ImmutablePicoContainerProxyFactory.newProxyInstance(pico));
078        }
079    
080        public void testHashCodeIsSame() throws Exception {
081            DefaultPicoContainer pico = new DefaultPicoContainer();
082            PicoContainer ipc = ImmutablePicoContainerProxyFactory.newProxyInstance(pico);
083            assertEquals(ipc.hashCode(), ImmutablePicoContainerProxyFactory.newProxyInstance(pico).hashCode());
084        }
085        
086        public void testDoesNotEqualsToNull() {
087            DefaultPicoContainer pico = new DefaultPicoContainer();
088            PicoContainer ipc = ImmutablePicoContainerProxyFactory.newProxyInstance(pico);
089            assertFalse(ipc.equals(null));
090        }
091    }