package org.exoplatform.webui.core; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import junit.framework.TestCase; /** * @author <a href="trongtt@gmail.com">Trong Tran</a> * @version $Revision$ */ public class TestUIContainer extends TestCase { public void testHasChildren() { UIContainer container = new UIContainer(); assertNotNull(container.getChildren()); assertFalse(container.hasChildren()); container = createUIContainer(5); assertNotNull(container.getChildren()); assertTrue(container.hasChildren()); } public void testConcurrentModification() { UIContainer container = createUIContainer(5); List<String> list = new ArrayList<String>(); for (UIComponent c : container.getChildren()) { list.add(c.getId()); if (c.getId().equals("c2")) { assertNotNull(container.removeChildById("c4")); } } assertEquals(5, list.size()); assertTrue(list.contains("c4")); String[] remain = { "c1", "c2", "c3", "c5" }; assertChildren(remain, container); // Initialize a children list then set it to the container from outside List<UIComponent> children = new ArrayList<UIComponent>(); children.add(new MockUIComponent("c1")); children.add(new MockUIComponent("c2")); children.add(new MockUIComponent("c3")); container = new UIContainer(); container.setChildren(children); list.clear(); for (UIComponent c : container.getChildren()) { list.add(c.getId()); if (c.getId().equals("c2")) { container.addChild(new MockUIComponent("c_foo")); } } assertEquals(3, list.size()); assertFalse(list.contains("c_foo")); String[] remain1 = { "c1", "c2", "c3", "c_foo" }; assertChildren(remain1, container); } public void testMultiThreading() throws InterruptedException { int number = 10; final UIContainer container = createUIContainer(number); assertEquals(number, container.getChildren().size()); Thread t = new Thread(new Runnable() { @Override public void run() { container.addChild(new MockUIComponent("c_foo")); } }); Iterator<UIComponent> iterator = container.getChildren().iterator(); List<String> list = new ArrayList<String>(); boolean active = true; while (iterator.hasNext()) { if (active) { t.start(); active = false; } // Just loop through the list to do something list.add(iterator.next().getId()); Thread.sleep(5); } t.join(); assertEquals(number, list.size()); assertFalse(list.contains("c_foo")); assertEquals(number + 1, container.getChildren().size()); assertNotNull(container.getChildById("c_foo")); } private void assertChildren(String[] ids, UIContainer container) { assertEquals(ids.length, container.getChildren().size()); for (String id : ids) { assertNotNull(container.getChildById(id)); } } private UIContainer createUIContainer(int number) { UIContainer container = new UIContainer(); for (int i = 1; i <= number; i++) { container.addChild(new MockUIComponent("c" + i)); } return container; } }