public void testComplicatedLifecycleDependencyReinstall() throws Throwable
{
complicatedLifecycleDependencyReinstall();
ControllerContext context1 = assertInstall(0, "Name1");
ControllerContext context2 = assertInstall(1, "Name2");
ControllerContext context3 = assertInstall(2, "Name3");
ControllerContext context4 = assertInstall(3, "Name4");
ControllerContext context5 = assertInstall(4, "Name5");
SimpleBeanWithLifecycle bean1 = (SimpleBeanWithLifecycle) context1.getTarget();
assertNotNull(bean1);
SimpleBeanWithLifecycle bean2 = (SimpleBeanWithLifecycle) context2.getTarget();
assertNotNull(bean2);
SimpleBeanWithLifecycle bean3 = (SimpleBeanWithLifecycle) context3.getTarget();
assertNotNull(bean3);
SimpleBeanWithLifecycle bean4 = (SimpleBeanWithLifecycle) context4.getTarget();
assertNotNull(bean4);
SimpleBeanWithComplicatedLifecycle bean5 = (SimpleBeanWithComplicatedLifecycle) context5.getTarget();
assertNotNull(bean5);
assertEquals(1, bean1.createOrder);
assertEquals(2, bean1.startOrder);
assertEquals(3, bean2.createOrder);
assertEquals(4, bean2.startOrder);
assertEquals(5, bean3.createOrder);
assertEquals(6, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(9, bean5.createOrder);
assertEquals(10, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertTrue(bean2 == bean5.startBean);
assertNull(bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(-1, bean5.stopOrder);
assertEquals(-1, bean5.destroyOrder);
assertUninstall("Name1");
assertContext("Name2");
assertContext("Name3");
assertContext("Name4");
assertContext("Name5", ControllerState.CONFIGURED);
assertEquals(1, bean1.createOrder);
assertEquals(2, bean1.startOrder);
assertEquals(3, bean2.createOrder);
assertEquals(4, bean2.startOrder);
assertEquals(5, bean3.createOrder);
assertEquals(6, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(9, bean5.createOrder);
assertEquals(10, bean5.startOrder);
assertNull(bean5.createBean);
assertNull(bean5.startBean);
assertTrue(bean3 == bean5.stopBean);
assertTrue(bean4 == bean5.destroyBean);
assertEquals(13, bean1.stopOrder);
assertEquals(14, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(11, bean5.stopOrder);
assertEquals(12, bean5.destroyOrder);
context1 = assertInstall(0, "Name1");
bean1 = (SimpleBeanWithLifecycle) context1.getTarget();
assertNotNull(bean1);
assertContext("Name2");
assertContext("Name3");
assertContext("Name4");
assertContext("Name5");
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(3, bean2.createOrder);
assertEquals(4, bean2.startOrder);
assertEquals(5, bean3.createOrder);
assertEquals(6, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(17, bean5.createOrder);
assertEquals(18, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertTrue(bean2 == bean5.startBean);
assertNull(bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(11, bean5.stopOrder);
assertEquals(12, bean5.destroyOrder);
assertUninstall("Name2");
assertContext("Name1");
assertContext("Name3");
assertContext("Name4");
assertContext("Name5", ControllerState.CREATE);
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(3, bean2.createOrder);
assertEquals(4, bean2.startOrder);
assertEquals(5, bean3.createOrder);
assertEquals(6, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(17, bean5.createOrder);
assertEquals(18, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertNull(bean5.startBean);
assertTrue(bean3 == bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(20, bean2.stopOrder);
assertEquals(21, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(19, bean5.stopOrder);
assertEquals(12, bean5.destroyOrder);
context2 = assertInstall(1, "Name2");
bean2 = (SimpleBeanWithLifecycle) context2.getTarget();
assertNotNull(bean2);
assertContext("Name1");
assertContext("Name3");
assertContext("Name4");
assertContext("Name5");
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(22, bean2.createOrder);
assertEquals(23, bean2.startOrder);
assertEquals(5, bean3.createOrder);
assertEquals(6, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(17, bean5.createOrder);
assertEquals(24, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertTrue(bean2 == bean5.startBean);
assertNull(bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(19, bean5.stopOrder);
assertEquals(12, bean5.destroyOrder);
assertUninstall("Name3");
assertContext("Name1");
assertContext("Name2");
assertContext("Name4");
assertContext("Name5", ControllerState.CREATE);
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(22, bean2.createOrder);
assertEquals(23, bean2.startOrder);
assertEquals(5, bean3.createOrder);
assertEquals(6, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(17, bean5.createOrder);
assertEquals(24, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertNull(bean5.startBean);
assertTrue(bean3 == bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(26, bean3.stopOrder);
assertEquals(27, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(25, bean5.stopOrder);
assertEquals(12, bean5.destroyOrder);
context3 = assertInstall(2, "Name3");
bean3 = (SimpleBeanWithLifecycle) context3.getTarget();
assertNotNull(bean3);
assertContext("Name1");
assertContext("Name2");
assertContext("Name4");
assertContext("Name5");
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(22, bean2.createOrder);
assertEquals(23, bean2.startOrder);
assertEquals(28, bean3.createOrder);
assertEquals(29, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(17, bean5.createOrder);
assertEquals(30, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertTrue(bean2 == bean5.startBean);
assertNull(bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(25, bean5.stopOrder);
assertEquals(12, bean5.destroyOrder);
assertUninstall("Name4");
assertContext("Name1");
assertContext("Name2");
assertContext("Name3");
assertContext("Name5", ControllerState.CONFIGURED);
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(22, bean2.createOrder);
assertEquals(23, bean2.startOrder);
assertEquals(28, bean3.createOrder);
assertEquals(29, bean3.startOrder);
assertEquals(7, bean4.createOrder);
assertEquals(8, bean4.startOrder);
assertEquals(17, bean5.createOrder);
assertEquals(30, bean5.startOrder);
assertNull(bean5.createBean);
assertNull(bean5.startBean);
assertTrue(bean3 == bean5.stopBean);
assertTrue(bean4 == bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(33, bean4.stopOrder);
assertEquals(34, bean4.destroyOrder);
assertEquals(31, bean5.stopOrder);
assertEquals(32, bean5.destroyOrder);
context4 = assertInstall(3, "Name4");
bean4 = (SimpleBeanWithLifecycle) context4.getTarget();
assertNotNull(bean4);
assertContext("Name1");
assertContext("Name2");
assertContext("Name3");
assertContext("Name5");
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(22, bean2.createOrder);
assertEquals(23, bean2.startOrder);
assertEquals(28, bean3.createOrder);
assertEquals(29, bean3.startOrder);
assertEquals(35, bean4.createOrder);
assertEquals(36, bean4.startOrder);
assertEquals(37, bean5.createOrder);
assertEquals(38, bean5.startOrder);
assertTrue(bean1 == bean5.createBean);
assertTrue(bean2 == bean5.startBean);
assertNull(bean5.stopBean);
assertNull(bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(31, bean5.stopOrder);
assertEquals(32, bean5.destroyOrder);
assertUninstall("Name5");
assertContext("Name1");
assertContext("Name2");
assertContext("Name3");
assertContext("Name4");
assertEquals(15, bean1.createOrder);
assertEquals(16, bean1.startOrder);
assertEquals(22, bean2.createOrder);
assertEquals(23, bean2.startOrder);
assertEquals(28, bean3.createOrder);
assertEquals(29, bean3.startOrder);
assertEquals(35, bean4.createOrder);
assertEquals(36, bean4.startOrder);
assertEquals(37, bean5.createOrder);
assertEquals(38, bean5.startOrder);
assertNull(bean5.createBean);
assertNull(bean5.startBean);
assertTrue(bean3 == bean5.stopBean);
assertTrue(bean4 == bean5.destroyBean);
assertEquals(-1, bean1.stopOrder);
assertEquals(-1, bean1.destroyOrder);
assertEquals(-1, bean2.stopOrder);
assertEquals(-1, bean2.destroyOrder);
assertEquals(-1, bean3.stopOrder);
assertEquals(-1, bean3.destroyOrder);
assertEquals(-1, bean4.stopOrder);
assertEquals(-1, bean4.destroyOrder);
assertEquals(39, bean5.stopOrder);
assertEquals(40, bean5.destroyOrder);
context5 = assertInstall(4, "Name5");
bean5 = (SimpleBeanWithComplicatedLifecycle) context5.getTarget();
assertNotNull(bean5);
assertContext("Name1");
assertContext("Name2");
assertContext("Name3");
assertContext("Name4");