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    package org.picocontainer;
009    
010    import org.picocontainer.MutablePicoContainer;
011    import org.picocontainer.PicoContainer;
012    import org.picocontainer.PicoCompositionException;
013    import org.picocontainer.PicoVisitor;
014    import org.picocontainer.DefaultPicoContainer;
015    import org.picocontainer.visitors.VerifyingVisitor;
016    import org.picocontainer.visitors.AbstractPicoVisitor;
017    
018    import org.jmock.Mock;
019    import org.jmock.MockObjectTestCase;
020    
021    
022    /**
023     * Test general PicoVisitor behaviour.
024     * @author Jörg Schaible
025     */
026    public class PicoVisitorTestCase
027            extends MockObjectTestCase {
028    
029        public void testVisitorThatMustBeInvokedUsingTraverse() {
030            MutablePicoContainer pico = new DefaultPicoContainer();
031            try {
032                pico.accept(new VerifyingVisitor());
033                fail("PicoVisitorTraversalException expected");
034            } catch (AbstractPicoVisitor.PicoVisitorTraversalException e) {
035                assertTrue(e.getMessage().indexOf(VerifyingVisitor.class.getName()) >= 0);
036            }
037        }
038    
039        public static class UnusualNode {
040            boolean visited;
041    
042            public void accept(PicoVisitor visit) {
043                visited = true;
044            }
045        }
046    
047        public void testUnusualTraverseNode() {
048            UnusualNode node = new UnusualNode();
049            new VerifyingVisitor().traverse(node);
050            assertTrue(node.visited);
051        }
052    
053        public void testIllegalTraverseNode() {
054            try {
055                new VerifyingVisitor().traverse("Gosh!");
056                fail("IllegalArgumentException expected");
057            } catch (IllegalArgumentException e) {
058                assertTrue(e.getMessage().indexOf(String.class.getName()) >= 0);
059            }
060        }
061    
062        public void testThrownRuntimeExceptionIsUnwrapped() {
063            Mock mockPico = mock(PicoContainer.class);
064            PicoVisitor visitor = new VerifyingVisitor();
065            Error exception = new Error("junit");
066            mockPico.expects(once()).method("accept").with(same(visitor)).will(
067                    throwException(new PicoCompositionException("message", exception)));
068            try {
069                visitor.traverse(mockPico.proxy());
070                fail("PicoCompositionException expected");
071            } catch (RuntimeException e) {
072                assertEquals("message", e.getMessage());
073                assertSame(exception, e.getCause());
074            }
075        }
076    
077        public void testThrownErrorIsUnwrapped() {
078            Mock mockPico = mock(PicoContainer.class);
079            PicoVisitor visitor = new VerifyingVisitor();
080            Error error = new InternalError("junit");
081            mockPico.expects(once()).method("accept").with(same(visitor)).id("1");
082            mockPico.expects(once()).method("accept").with(same(visitor)).after("1").will(throwException(error));
083            visitor.traverse(mockPico.proxy());
084            try {
085                visitor.traverse(mockPico.proxy());
086                fail("UndeclaredThrowableException expected");
087            } catch(InternalError e) {
088                assertEquals("junit", e.getMessage());
089            }
090        }
091    }