package com.vaadin.data.provider; import java.util.Optional; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import com.vaadin.data.provider.HierarchyMapper.TreeNode; public class HierarchyMapperTest { private HierarchyMapper mapper; @Before public void setup() { mapper = new HierarchyMapper(); } @Test public void testExpandCollapse_rootLevel_indexesUpdated() { mapper.reset(3); verifyRootLevel(0, 2); mapper.expand("1", 1, 3); verifyTreeTotalSize(6); verifyRootLevel(0, 5); verifyNodeExists("1", 2, 4); mapper.expand("0", 0, 3); verifyRootLevel(0, 8); verifyNodeExists("0", 1, 3); verifyNodeExists("1", 5, 7); verifyTreeTotalSize(9); mapper.collapse("0", 0); verifyRootLevel(0, 5); verifyNodeExists("1", 2, 4); verifyTreeTotalSize(6); verifyNoNodeExists("0"); } @Test public void testExpandCollapse_secondLevelLastNode_indexesUpdated() { mapper.reset(3); verifyRootLevel(0, 2); mapper.expand("1", 1, 3); verifyTreeTotalSize(6); verifyRootLevel(0, 5); verifyNodeExists("1", 2, 4); mapper.expand("0", 0, 3); verifyRootLevel(0, 8); verifyNodeExists("0", 1, 3); verifyNodeExists("1", 5, 7); verifyTreeTotalSize(9); mapper.expand("2", 3, 3); verifyRootLevel(0, 11); verifyNodeExists("0", 1, 6); verifyNodeExists("1", 8, 10); verifyNodeExists("2", 4, 6); verifyTreeTotalSize(12); mapper.collapse("2", 3); verifyRootLevel(0, 8); verifyNodeExists("0", 1, 3); verifyNodeExists("1", 5, 7); verifyNoNodeExists("2"); verifyTreeTotalSize(9); mapper.collapse("0", 0); verifyRootLevel(0, 5); verifyNodeExists("1", 2, 4); verifyNoNodeExists("0"); verifyTreeTotalSize(6); } @Test public void testCollapse_multipleLevels_wholeSubtreeDropped() { // expand hierarchy up to 3 level mapper.reset(5); verifyRootLevel(0, 4); mapper.expand("1", 2, 2); verifyRootLevel(0, 6); verifyNodeExists("1", 3, 4); verifyTreeTotalSize(7); mapper.expand("2", 3, 2); verifyRootLevel(0, 8); verifyNodeExists("1", 3, 6); verifyNodeExists("2", 4, 5); verifyTreeTotalSize(9); mapper.expand("3", 6, 2); verifyRootLevel(0, 10); verifyNodeExists("1", 3, 8); verifyNodeExists("2", 4, 5); verifyNodeExists("3", 7, 8); verifyTreeTotalSize(11); // collapse root level node mapper.collapse("1", 2); verifyRootLevel(0, 4); verifyNoNodeExists("1", "2", "3"); } private void verifyRootLevel(int start, int end) { verifyNode(start, end, mapper.getNodeForKey(null).get()); } private void verifyNodeExists(String key, int start, int end) { Optional<TreeNode> node = mapper.getNodeForKey(key); Assert.assertTrue("NO NODE FOUND FOR KEY: " + key, node.isPresent()); verifyNode(start, end, node.get()); } private void verifyNoNodeExists(String... nodeKeys) { for (String key : nodeKeys) { Assert.assertFalse("No node should exist for key " + key, mapper.getNodeForKey(key).isPresent()); } } private void verifyNode(int start, int end, TreeNode node) { Assert.assertEquals("Invalid start for node " + node, start, node.getStartIndex()); Assert.assertEquals("Invalid end for node " + node, end, node.getEndIndex()); } private void verifyTreeTotalSize(int size) { Assert.assertEquals("Invalid tree size", size, mapper.getTreeSize()); } }