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