// Copyright (c) 2003-present, Jodd Team (http://jodd.org)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
package jodd.petite;
import jodd.petite.fixtures.data.Biz;
import jodd.petite.fixtures.data.DefaultBiz;
import jodd.petite.fixtures.data.DefaultBizImpl;
import jodd.petite.meta.PetiteBean;
import jodd.petite.meta.PetiteInject;
import jodd.petite.scope.ProtoScope;
import jodd.petite.fixtures.tst.Boo;
import jodd.petite.fixtures.tst.Foo;
import jodd.petite.fixtures.tst.Zoo;
import org.junit.Test;
import static jodd.petite.meta.InitMethodInvocationStrategy.POST_INITIALIZE;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
public class MiscTest {
@Test
public void testOne() {
PetiteContainer pc = new PetiteContainer();
pc.registerPetiteBean(DefaultBizImpl.class, null, null, null, false);
assertEquals(1, pc.getTotalBeans());
Object bizI = pc.getBean("biz");
assertTrue(bizI instanceof Biz);
assertTrue(bizI instanceof DefaultBizImpl);
pc = new PetiteContainer();
pc.registerPetiteBean(DefaultBizImpl.class, null, null, null, false);
pc.registerPetiteBean(DefaultBiz.class, null, null, null, false); // override!
assertEquals(1, pc.getTotalBeans());
pc.registerPetiteBean(Foo.class, null, null, null, false);
pc.registerPetitePropertyInjectionPoint("biz", "foo", null);
pc.registerPetiteInitMethods("biz", POST_INITIALIZE, "init", "init2");
assertEquals(2, pc.getTotalBeans());
bizI = pc.getBean("biz");
assertTrue(bizI instanceof Biz);
assertFalse(bizI instanceof DefaultBizImpl);
assertTrue(bizI instanceof DefaultBiz);
assertNotNull(((DefaultBiz) bizI).getFoo());
assertEquals(2, ((DefaultBiz) bizI).initCount);
}
@Test
public void testTwo() {
PetiteContainer pc = new PetiteContainer();
pc.registerPetiteBean(DefaultBizImpl.class, null, null, null, false);
assertEquals(1, pc.getTotalBeans());
Object bizI = pc.getBean("biz");
assertTrue(bizI instanceof Biz);
assertFalse(bizI instanceof DefaultBiz);
assertTrue(bizI instanceof DefaultBizImpl);
//pc = new PetiteContainer(); // same container!!!
pc.registerPetiteBean(DefaultBiz.class, null, null, null, false); // override! instance will be removed from the scope
assertEquals(1, pc.getTotalBeans());
bizI = pc.getBean("biz");
assertTrue(bizI instanceof Biz);
assertFalse(bizI instanceof DefaultBizImpl);
assertTrue(bizI instanceof DefaultBiz);
}
@Test
public void testAdd() {
PetiteContainer pc = new PetiteContainer();
Foo foo = new Foo();
pc.addBean("foo", foo);
Foo foo2 = (Foo) pc.getBean("foo");
assertNotNull(foo2);
assertSame(foo, foo2);
}
@Test
public void testAdd2WithCircDep() {
Foo.instanceCounter = 0;
PetiteContainer pc = new PetiteContainer();
pc.registerPetiteBean(Foo.class, null, null, null, false);
pc.registerPetiteBean(Zoo.class, null, null, null, false);
Foo foo = (Foo) pc.getBean("foo");
Boo boo = new Boo();
assertNull(boo.getFoo());
pc.addBean("boo", boo, null);
assertNotNull(boo.getFoo());
assertSame(foo, boo.getFoo());
assertNotNull(boo.zoo);
Zoo zoo = (Zoo) pc.getBean("zoo");
assertNotNull(zoo.boo);
assertSame(zoo, boo.zoo); // circular dependency
assertSame(boo, zoo.boo);
Boo boo2 = (Boo) pc.getBean("boo");
assertNotNull(boo2);
assertSame(boo, boo2);
assertFalse(boo.orders.isEmpty());
assertEquals(6, boo.orders.size());
assertEquals("[first, second, third, init, beforeLast, last]", boo.orders.toString());
assertNotNull(boo2.getFoo());
assertSame(foo, boo2.getFoo());
assertEquals(1, boo2.getFoo().hello());
assertEquals(1, boo2.getFoo().getCounter());
pc.addBean("boo", boo);
boo2 = (Boo) pc.getBean("boo");
assertNotNull(boo2);
assertSame(boo, boo2);
assertNotNull(boo2.getFoo());
assertSame(foo, boo2.getFoo());
assertEquals(1, boo2.getFoo().hello());
assertEquals(2, boo2.getFoo().getCounter());
assertEquals(12, boo.orders.size()); // init methods are called again due to re-add
}
@Test
public void testNoAdd2WithCircDep() {
Foo.instanceCounter = 0;
PetiteContainer pc = new PetiteContainer();
pc.registerPetiteBean(Foo.class, null, null, null, false);
pc.registerPetiteBean(Zoo.class, null, null, null, false);
pc.registerPetiteBean(Boo.class, null, null, null, false);
Boo boo = (Boo) pc.getBean("boo");
Foo foo = (Foo) pc.getBean("foo");
Zoo zoo = (Zoo) pc.getBean("zoo");
assertNotNull(boo.getFoo());
assertSame(foo, boo.getFoo());
assertNotNull(zoo.boo);
assertSame(boo, zoo.boo);
assertSame(zoo, boo.zoo);
Boo boo2 = (Boo) pc.getBean("boo");
assertNotNull(boo2);
assertSame(boo, boo2);
assertFalse(boo.orders.isEmpty());
assertNotNull(boo2.getFoo());
assertSame(foo, boo2.getFoo());
assertEquals(1, boo2.getFoo().hello());
assertEquals(1, boo2.getFoo().getCounter());
assertEquals("[first, second, third, init, beforeLast, last]", boo.orders.toString());
}
public static class PetiteDemo {
static Integer getOne() {
return new Integer(123);
}
}
@Test
public void test243() {
PetiteContainer pc = new PetiteContainer();
new PetiteRegistry(pc).provider("provider").type(PetiteDemo.class).method("getOne").args().register();
}
@PetiteBean(scope = ProtoScope.class)
public static class BeanTwo {
}
@PetiteBean
public static class BeanOne {
BeanTwo ctor;
@PetiteInject
BeanTwo setter;
@PetiteInject
public BeanOne(BeanTwo bean) {
this.ctor = bean;
}
}
@Test
public void test244() {
PetiteContainer pc = new PetiteContainer();
pc.registerPetiteBean(BeanOne.class, null, null, null, false);
pc.registerPetiteBean(BeanTwo.class, null, null, null, false);
BeanOne petiteBean = pc.getBean(BeanOne.class);
assertTrue(petiteBean.ctor != petiteBean.setter);
}
}