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                                                          *
009 *****************************************************************************/
010package org.picocontainer.behaviors;
011
012
013import static org.junit.Assert.assertEquals;
014import static org.junit.Assert.fail;
015
016import org.junit.Test;
017import org.picocontainer.Characteristics;
018import org.picocontainer.ComponentAdapter;
019import org.picocontainer.ComponentFactory;
020import org.picocontainer.DefaultPicoContainer;
021import static org.picocontainer.Characteristics.GUARD;
022import org.picocontainer.adapters.InstanceAdapter;
023import org.picocontainer.containers.EmptyPicoContainer;
024import org.picocontainer.injectors.ConstructorInjection;
025import org.picocontainer.injectors.ConstructorInjector;
026import org.picocontainer.lifecycle.NullLifecycleStrategy;
027import org.picocontainer.monitors.NullComponentMonitor;
028import org.picocontainer.tck.AbstractComponentFactoryTest;
029
030
031/**
032 * @author Paul Hammant
033 */
034public class GuardingTestCase extends AbstractComponentFactoryTest {
035
036    protected ComponentFactory createComponentFactory() {
037        return new Guarding().wrap(new ConstructorInjection());
038    }
039
040    @Test public void testAddComponentUsesGuardingBehavior() {
041        DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
042        pico.addComponent("guard", MyGuard.class);
043        pico.as(GUARD).addComponent("foo", String.class);
044        ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
045        assertEquals(Guarded.class, fooAdapter.getClass());
046        assertEquals(ConstructorInjector.class, ((AbstractBehavior) fooAdapter).getDelegate().getClass());
047        try {
048            String foo = (String) pico.getComponent("foo");
049            fail("should have barfed");
050        } catch (Exception e) {
051            assertEquals("not so fast", e.getMessage());
052        }
053    }
054
055    public static class MyGuard {
056        public MyGuard() {
057            throw new RuntimeException("not so fast");
058        }
059    }
060
061    @Test public void testAddComponentDoesNotUseGuardingBehaviorIfNoProperty() {
062        DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
063        pico.addComponent("guard", MyGuard.class);
064        pico.addComponent("foo", String.class);
065        ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
066        assertEquals(ConstructorInjector.class, fooAdapter.getClass());
067        String foo = (String) pico.getComponent("foo");
068    }
069
070    @Test public void testAddComponentUsesGuardingBehaviorWithCustomGuardKey() {
071        DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
072        pico.addComponent("my_guard", MyGuard.class);
073        pico.as(GUARD("my_guard")).addComponent("foo", String.class);
074        ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
075        assertEquals(Guarded.class, fooAdapter.getClass());
076        assertEquals(ConstructorInjector.class, fooAdapter.getDelegate().getClass());
077        try {
078            String foo = (String) pico.getComponent("foo");
079            fail("should have barfed");
080        } catch (Exception e) {
081            assertEquals("not so fast", e.getMessage());
082        }
083    }
084
085    @Test public void testAddComponentUsesGuardingBehaviorByAdapitveDefault() {
086        DefaultPicoContainer pico = new DefaultPicoContainer(new NullLifecycleStrategy(), new EmptyPicoContainer());
087        pico.addComponent("guard", MyGuard.class);
088        pico.as(GUARD).addComponent("foo", String.class);
089        ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
090        assertEquals(Guarded.class, fooAdapter.getClass());
091        assertEquals(ConstructorInjector.class, fooAdapter.getDelegate().getClass());
092        try {
093            String foo = (String) pico.getComponent("foo");
094            fail("should have barfed");
095        } catch (Exception e) {
096            assertEquals("not so fast", e.getMessage());
097        }
098    }
099
100}