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 }