package com.vaadin.v7.tests.server.component.tree; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Test; import com.vaadin.v7.ui.Tree; import com.vaadin.v7.ui.Tree.CollapseEvent; import com.vaadin.v7.ui.Tree.CollapseListener; import com.vaadin.v7.ui.Tree.ExpandEvent; import com.vaadin.v7.ui.Tree.ExpandListener; public class ListenersTest implements ExpandListener, CollapseListener { private int expandCalled; private int collapseCalled; private Object lastExpanded; private Object lastCollapsed; @Before public void setUp() { expandCalled = 0; } @Test public void testExpandListener() { Tree tree = createTree(10, 20, false); tree.addListener((ExpandListener) this); List<Object> rootIds = new ArrayList<Object>(tree.rootItemIds()); assertEquals(10, rootIds.size()); assertEquals(10 + 10 * 20 + 10, tree.size()); // Expanding should send one expand event for the root item id tree.expandItem(rootIds.get(0)); assertEquals(1, expandCalled); assertEquals(rootIds.get(0), lastExpanded); // Expand should send one event for each expanded item id. // In this case root + child 4 expandCalled = 0; tree.expandItemsRecursively(rootIds.get(1)); assertEquals(2, expandCalled); List<Object> c = new ArrayList<Object>( tree.getChildren(rootIds.get(1))); assertEquals(c.get(4), lastExpanded); // Expanding an already expanded item should send no expand event expandCalled = 0; tree.expandItem(rootIds.get(0)); assertEquals(0, expandCalled); } /** * Creates a tree with "rootItems" roots, each with "children" children, * each with 1 child. * * @param rootItems * @param children * @param expand * @return */ private Tree createTree(int rootItems, int children, boolean expand) { Tree tree = new Tree(); for (int i = 0; i < rootItems; i++) { String rootId = "root " + i; tree.addItem(rootId); if (expand) { tree.expandItemsRecursively(rootId); } else { tree.collapseItemsRecursively(rootId); } for (int j = 0; j < children; j++) { String childId = "child " + i + "/" + j; tree.addItem(childId); tree.setParent(childId, rootId); tree.setChildrenAllowed(childId, false); if (j == 4) { tree.setChildrenAllowed(childId, true); Object grandChildId = tree.addItem(); tree.setParent(grandChildId, childId); tree.setChildrenAllowed(grandChildId, false); if (expand) { tree.expandItemsRecursively(childId); } else { tree.collapseItemsRecursively(childId); } } } } return tree; } @Test public void testCollapseListener() { Tree tree = createTree(7, 15, true); tree.addListener((CollapseListener) this); List<Object> rootIds = new ArrayList<Object>(tree.rootItemIds()); assertEquals(7, rootIds.size()); assertEquals(7 + 7 * 15 + 7, tree.size()); // Expanding should send one expand event for the root item id tree.collapseItem(rootIds.get(0)); assertEquals(1, collapseCalled); assertEquals(rootIds.get(0), lastCollapsed); // Collapse sends one event for each collapsed node. // In this case root + child 4 collapseCalled = 0; tree.collapseItemsRecursively(rootIds.get(1)); assertEquals(2, collapseCalled); List<Object> c = new ArrayList<Object>( tree.getChildren(rootIds.get(1))); assertEquals(c.get(4), lastCollapsed); // Collapsing an already expanded item should send no expand event collapseCalled = 0; tree.collapseItem(rootIds.get(0)); assertEquals(0, collapseCalled); } @Override public void nodeExpand(ExpandEvent event) { lastExpanded = event.getItemId(); expandCalled++; } @Override public void nodeCollapse(CollapseEvent event) { lastCollapsed = event.getItemId(); collapseCalled++; } }