| /******************************************************************************* |
| * Copyright (c) 2000, 2003 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Common Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/cpl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jface.tests.viewers; |
| |
| |
| import org.eclipse.swt.widgets.Item; |
| import org.eclipse.swt.widgets.Widget; |
| |
| import org.eclipse.jface.viewers.AbstractTreeViewer; |
| |
| public abstract class AbstractTreeViewerTest extends StructuredItemViewerTest { |
| |
| AbstractTreeViewer fTreeViewer; |
| |
| public AbstractTreeViewerTest(String name) { |
| super(name); |
| } |
| protected void assertEqualsArray(String s, Object[] a1, Object[] a2) { |
| int s1= a1.length; |
| int s2= a2.length; |
| assertTrue(s, s1 == s2); |
| for (int i= 0; i < s1; i++) { |
| assertEquals(s, a1[i], a2[i]); |
| } |
| } |
| protected abstract int getItemCount(TestElement element); //was IElement |
| public void testBulkExpand() { |
| // navigate |
| TestElement first = fRootElement.getFirstChild(); |
| TestElement first2 = first.getFirstChild(); |
| TestElement last = fRootElement.getLastChild(); |
| |
| // expand a few nodes |
| fTreeViewer.expandToLevel(first, 2); |
| fTreeViewer.expandToLevel(first2, 2); |
| fTreeViewer.expandToLevel(last, 2); |
| |
| // get expand state |
| Object[] list1 = fTreeViewer.getExpandedElements(); |
| |
| // flush viewer |
| fViewer.setInput(fRootElement); |
| |
| // restore old expand state |
| fTreeViewer.collapseAll(); |
| fTreeViewer.expandToLevel(first, 2); |
| fTreeViewer.expandToLevel(first2, 2); |
| fTreeViewer.expandToLevel(last, 2); |
| |
| Object[] list2 = fTreeViewer.getExpandedElements(); |
| |
| assertEqualsArray("old and new expand state are the same", list1, list2); |
| } |
| public void testDeleteChildExpanded() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement first2= first.getFirstChild(); |
| fTreeViewer.expandToLevel(first2,0); |
| |
| assertNotNull("first child is visible", fViewer.testFindItem(first2)); |
| first.deleteChild(first2); |
| assertNull("first child is not visible", fViewer.testFindItem(first2)); |
| } |
| public void testDeleteChildren() { |
| TestElement first= fRootElement.getFirstChild(); |
| first.deleteChildren(); |
| assertTrue("no children", getItemCount(first) == 0); |
| } |
| public void testDeleteChildrenExpanded() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement first2= first.getFirstChild(); |
| fTreeViewer.expandToLevel(first2,0); |
| assertNotNull("first child is visible", fViewer.testFindItem(first2)); |
| |
| first.deleteChildren(); |
| assertTrue("no children", getItemCount(first) == 0); |
| } |
| public void testExpand() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement first2= first.getFirstChild(); |
| assertNull("first child is not visible", fViewer.testFindItem(first2)); |
| fTreeViewer.expandToLevel(first2,0); |
| assertNotNull("first child is visible", fViewer.testFindItem(first2)); |
| } |
| public void testExpandElement() { |
| TestElement first = fRootElement.getFirstChild(); |
| TestElement first2 = first.getFirstChild(); |
| TestElement first3 = first2.getFirstChild(); |
| fTreeViewer.expandToLevel(first3, 0); |
| assertNotNull("first3 is visible", fViewer.testFindItem(first3)); |
| assertNotNull("first2 is visible", fViewer.testFindItem(first2)); |
| } |
| public void testExpandToLevel() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement first2= first.getFirstChild(); |
| fTreeViewer.expandToLevel(2); |
| assertNotNull("first2 is visible", fViewer.testFindItem(first2)); |
| } |
| public void testFilterExpanded() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement first2= first.getFirstChild(); |
| fTreeViewer.expandToLevel(first2,0); |
| |
| fTreeViewer.addFilter(new TestLabelFilter()); |
| assertTrue("filtered count", getItemCount() == 5); |
| } |
| public void testInsertChildReveal() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement newElement= first.addChild(TestModelChange.INSERT | TestModelChange.REVEAL); |
| assertNotNull("new sibling is visible", fViewer.testFindItem(newElement)); |
| } |
| public void testInsertChildRevealSelect() { |
| TestElement last= fRootElement.getLastChild(); |
| TestElement newElement= last.addChild(TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT); |
| assertNotNull("new sibling is visible", fViewer.testFindItem(newElement)); |
| assertSelectionEquals("new element is selected", newElement); |
| } |
| public void testInsertChildRevealSelectExpanded() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement newElement= first.addChild(TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT); |
| assertNotNull("new sibling is visible", fViewer.testFindItem(newElement)); |
| assertSelectionEquals("new element is selected", newElement); |
| } |
| /** |
| * Regression test for 1GDN0PX: ITPUI:WIN2000 - SEVERE - AssertionFailure when expanding Navigator |
| * Problem was: |
| * - before addition, parent item had no children, and was expanded |
| * - after addition, during refresh(), updatePlus() added dummy node even though parent item was expanded |
| * - in updateChildren, it wasn't handling a dummy node |
| */ |
| public void testRefreshWithAddedChildren() { |
| TestElement parent = fRootElement.addChild(TestModelChange.INSERT); |
| TestElement child = parent.addChild(TestModelChange.INSERT); |
| ((AbstractTreeViewer) fViewer).setExpandedState(parent, true); |
| parent.deleteChild(child); |
| child = parent.addChild(TestModelChange.STRUCTURE_CHANGE); |
| assertNotNull("new child is visible", fViewer.testFindItem(child)); |
| } |
| /** |
| * Regression test for 1GBDB5A: ITPUI:WINNT - Exception in AbstractTreeViewer update. |
| * Problem was: |
| * node has child A |
| * node gets duplicate child A |
| * viewer is refreshed rather than using add for new A |
| * AbstractTreeViewer.updateChildren(...) was not properly handling it |
| */ |
| public void testRefreshWithDuplicateChild() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement newElement= (TestElement) first.clone(); |
| fRootElement.addChild(newElement, new TestModelChange(TestModelChange.STRUCTURE_CHANGE, fRootElement)); |
| assertNotNull("new sibling is visible", fViewer.testFindItem(newElement)); |
| } |
| |
| /** |
| * Regression test for Bug 3840 [Viewers] free expansion of jar happening when deleting projects (1GEV2FL) |
| * Problem was: |
| * - node has children A and B |
| * - A is expanded, B is not |
| * - A gets deleted |
| * - B gets expanded because it reused A's item |
| */ |
| public void testRefreshWithReusedItems() { |
| // TestElement a= fRootElement.getFirstChild(); |
| // TestElement aa= a.getChildAt(0); |
| // TestElement ab= a.getChildAt(1); |
| // fTreeViewer.expandToLevel(aa, 1); |
| // List expandedBefore = Arrays.asList(fTreeViewer.getExpandedElements()); |
| // assertTrue(expandedBefore.contains(a)); |
| // assertTrue(expandedBefore.contains(aa)); |
| // assertFalse(expandedBefore.contains(ab)); |
| // a.deleteChild(aa, new TestModelChange(TestModelChange.STRUCTURE_CHANGE, a)); |
| // List expandedAfter = Arrays.asList(fTreeViewer.getExpandedElements()); |
| // assertFalse(expandedAfter.contains(ab)); |
| } |
| |
| public void testRenameChildElement() { |
| TestElement first= fRootElement.getFirstChild(); |
| TestElement first2= first.getFirstChild(); |
| fTreeViewer.expandToLevel(first2,0); |
| assertNotNull("first child is visible", fViewer.testFindItem(first2)); |
| |
| String newLabel= first2.getLabel()+" changed"; |
| first2.setLabel(newLabel); |
| Widget widget= fViewer.testFindItem(first2); |
| assertTrue(widget instanceof Item); |
| assertEquals("changed label", first2.getID()+" "+newLabel, ((Item)widget).getText()); |
| } |
| |
| /** |
| * Regression test for Bug 26698 [Viewers] stack overflow during debug session, causing IDE to crash |
| * Problem was: |
| * - node A has child A |
| * - setExpanded with A in the list caused an infinite recursion |
| */ |
| public void testSetExpandedWithCycle() { |
| TestElement first= fRootElement.getFirstChild(); |
| first.addChild(first, new TestModelChange(TestModelChange.INSERT, first, first)); |
| fTreeViewer.setExpandedElements(new Object[] { first }); |
| |
| } |
| } |