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 static org.junit.Assert.assertEquals;
011 import static org.junit.Assert.assertSame;
012 import static org.junit.Assert.assertTrue;
013 import static org.junit.Assert.fail;
014 import static org.picocontainer.tck.MockFactory.mockeryWithCountingNamingScheme;
015
016 import org.jmock.Expectations;
017 import org.jmock.Mockery;
018 import org.jmock.Sequence;
019 import org.jmock.integration.junit4.JMock;
020 import org.junit.Test;
021 import org.junit.runner.RunWith;
022 import org.picocontainer.visitors.AbstractPicoVisitor;
023 import org.picocontainer.visitors.VerifyingVisitor;
024
025
026 /**
027 * Test general PicoVisitor behaviour.
028 * @author Jörg Schaible
029 * @author Mauro Talevi
030 */
031 @RunWith(JMock.class)
032 public class PicoVisitorTestCase {
033
034 private Mockery mockery = mockeryWithCountingNamingScheme();
035
036 @Test public void testVisitorThatMustBeInvokedUsingTraverse() {
037 MutablePicoContainer pico = new DefaultPicoContainer();
038 try {
039 pico.accept(new VerifyingVisitor());
040 fail("PicoVisitorTraversalException expected");
041 } catch (AbstractPicoVisitor.PicoVisitorTraversalException e) {
042 assertTrue(e.getMessage().indexOf(VerifyingVisitor.class.getName()) >= 0);
043 }
044 }
045
046 public static class UnusualNode {
047 boolean visited;
048
049 public void accept(PicoVisitor visit) {
050 visited = true;
051 }
052 }
053
054 @Test public void testUnusualTraverseNode() {
055 UnusualNode node = new UnusualNode();
056 new VerifyingVisitor().traverse(node);
057 assertTrue(node.visited);
058 }
059
060 @Test public void testIllegalTraverseNode() {
061 try {
062 new VerifyingVisitor().traverse("Gosh!");
063 fail("IllegalArgumentException expected");
064 } catch (IllegalArgumentException e) {
065 assertTrue(e.getMessage().indexOf(String.class.getName()) >= 0);
066 }
067 }
068
069 @Test public void testThrownRuntimeExceptionIsUnwrapped() {
070 final PicoContainer pico = mockery.mock(PicoContainer.class);
071 final PicoVisitor visitor = new VerifyingVisitor();
072 final Error exception = new Error("junit");
073 mockery.checking(new Expectations() {{
074 one(pico).accept(with(same(visitor)));
075 will(throwException(new PicoCompositionException("message", exception)));
076 }});
077 try {
078 visitor.traverse(pico);
079 fail("PicoCompositionException expected");
080 } catch (RuntimeException e) {
081 assertEquals("message", e.getMessage());
082 assertSame(exception, e.getCause());
083 }
084 }
085
086 @Test public void testThrownErrorIsUnwrapped() {
087 final PicoContainer pico = mockery.mock(PicoContainer.class);
088 final PicoVisitor visitor = new VerifyingVisitor();
089 final Error error = new InternalError("junit");
090 final Sequence sequence = mockery.sequence("accepting");
091 mockery.checking(new Expectations() {{
092 one(pico).accept(with(same(visitor))); inSequence(sequence);
093 one(pico).accept(with(same(visitor))); inSequence(sequence);
094 will(throwException(error));
095 }});
096 visitor.traverse(pico);
097 try {
098 visitor.traverse(pico);
099 fail("UndeclaredThrowableException expected");
100 } catch(InternalError e) {
101 assertEquals("junit", e.getMessage());
102 }
103 }
104 }