blob: 9d88af893c6badfba8552457bbbc83e40810d4ed [file] [log] [blame]
/*******************************************************************************
* 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 junit.framework.TestCase;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.IBasicPropertyConstants;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.LabelProviderChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableTreeViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.viewers.ViewerSorter;
public abstract class StructuredViewerTest extends TestCase {
Display fDisplay;
Shell fShell;
StructuredViewer fViewer;
TestElement fRootElement;
public static class TestLabelFilter extends ViewerFilter {
public boolean select(Viewer viewer, Object parent, Object element) {
String label = ((TestElement) element).getLabel();
int count = label.indexOf("-");
if (count < 0)
return false;
String number = label.substring(count + 1);
return ((Integer.parseInt(number) % 2) == 0);
}
public boolean isFilterProperty(Object element, String property) {
return property.equals(IBasicPropertyConstants.P_TEXT);
}
};
public static class TestLabelSorter extends ViewerSorter {
public int compare(Viewer v, Object e1, Object e2) {
// put greater labels first
String name1 = ((TestElement) e1).getLabel();
String name2 = ((TestElement) e2).getLabel();
return name2.compareTo(name1);
}
public boolean isSorterProperty(Object element, String property) {
return property.equals(IBasicPropertyConstants.P_TEXT);
}
};
public static class TestLabelProvider extends LabelProvider {
public static String fgSuffix = "";
static Image fgImage = ImageDescriptor.createFromFile(TestLabelProvider.class, "images/java.gif").createImage();
public String getText(Object element) {
return providedString((TestElement) element);
}
public Image getImage(Object element) {
return fgImage;
}
public void setSuffix(String suffix) {
fgSuffix = suffix;
fireLabelProviderChanged(new LabelProviderChangedEvent(this));
}
};
public TestModel fModel;
public StructuredViewerTest(String name) {
super(name);
}
protected void assertSelectionEquals(String message, TestElement expected) {
ISelection selection = fViewer.getSelection();
assertTrue(selection instanceof StructuredSelection);
StructuredSelection expectedSelection = new StructuredSelection(expected);
assertEquals("selections", selection, expectedSelection);
}
protected void bulkChange(TestModelChange eventToFire) {
TestElement first = fRootElement.getFirstChild();
TestElement newElement = first.getContainer().basicAddChild();
fRootElement.basicDeleteChild(first);
fModel.fireModelChanged(eventToFire);
assertNotNull("new sibling is visible", fViewer.testFindItem(newElement));
assertNull("first child is not visible", fViewer.testFindItem(first));
}
/**
* Creates the viewer used by this test, under the given parent widget.
*/
protected abstract StructuredViewer createViewer(Composite parent);
protected abstract int getItemCount();
protected abstract String getItemText(int at);
/**
* Interacts with a test set up. Call this method from your
* test when you want to interactively experiment with a set up.
* The interaction terminates when the browser is closed.
*/
public void interact() {
Shell shell= fShell;
if (shell != null && !shell.isDisposed()) {
Display display= shell.getDisplay();
if (display != null) {
while (shell.isVisible())
display.readAndDispatch();
}
}
}
protected void openBrowser() {
fDisplay = Display.getCurrent();
if (fDisplay == null) {
fDisplay = new Display();
}
fShell = new Shell(fDisplay);
fShell.setSize(500, 500);
fShell.setLayout(new FillLayout());
fViewer = createViewer(fShell);
fViewer.setUseHashlookup(true);
fViewer.setInput(fRootElement);
fShell.open();
//processEvents();
}
public void processEvents() {
Shell shell = fShell;
if (shell != null && !shell.isDisposed()) {
Display display = shell.getDisplay();
if (display != null) {
while (display.readAndDispatch())
;
}
}
}
public static String providedString(String s) {
return s+"<rendered>"+TestLabelProvider.fgSuffix;
}
public static String providedString(TestElement element) {
return element.getID()+" "+element.getLabel()+"<rendered>"+TestLabelProvider.fgSuffix;
}
public void setUp() {
fRootElement= TestElement.createModel(3, 10);
fModel= fRootElement.getModel();
openBrowser();
}
/**
* Sleeps for the given duration and processes pending
* events. Call this method to temporarily suspend a test
* see the current state in the browser.
*/
void sleep(int d) {
processEvents();
try {
Thread.sleep(d*1000);
} catch(Exception e) {}
}
public void tearDown() {
processEvents();
fViewer = null;
if (fShell != null) {
fShell.dispose();
fShell = null;
}
// leave the display
fRootElement = null;
}
public void testClearSelection() {
TestElement first= fRootElement.getFirstChild();
StructuredSelection selection= new StructuredSelection(first);
fViewer.setSelection(selection);
fViewer.setSelection(new StructuredSelection());
ISelection result= fViewer.getSelection();
assertTrue(result.isEmpty());
}
public void testDeleteChild() {
TestElement first= fRootElement.getFirstChild();
TestElement first2= first.getFirstChild();
first.deleteChild(first2);
assertNull("first child is not visible", fViewer.testFindItem(first2));
}
public void testDeleteInput() {
TestElement first= fRootElement.getFirstChild();
TestElement firstfirst= first.getFirstChild();
fViewer.setInput(first);
fRootElement.deleteChild(first);
assertNull("first child is not visible", fViewer.testFindItem(firstfirst));
}
public void testDeleteSibling() {
TestElement first= fRootElement.getFirstChild();
assertNotNull("first child is visible", fViewer.testFindItem(first));
fRootElement.deleteChild(first);
assertNull("first child is not visible", fViewer.testFindItem(first));
}
public void testFilter() {
ViewerFilter filter= new TestLabelFilter();
fViewer.addFilter(filter);
assertTrue("filtered count", getItemCount() == 5);
fViewer.removeFilter(filter);
assertTrue("unfiltered count", getItemCount() == 10);
}
public void testInsertChild() {
TestElement first= fRootElement.getFirstChild();
TestElement newElement= first.addChild(TestModelChange.INSERT);
assertNull("new sibling is not visible", fViewer.testFindItem(newElement));
}
public void testInsertSibling() {
TestElement newElement= fRootElement.addChild(TestModelChange.INSERT);
assertNotNull("new sibling is visible", fViewer.testFindItem(newElement));
}
public void testInsertSiblingReveal() {
TestElement newElement= fRootElement.addChild(TestModelChange.INSERT | TestModelChange.REVEAL);
assertNotNull("new sibling is visible", fViewer.testFindItem(newElement));
}
public void testInsertSiblings() {
TestElement[] newElements = fRootElement.addChildren(TestModelChange.INSERT);
for (int i = 0; i < newElements.length; ++i)
assertNotNull("new siblings are visible", fViewer.testFindItem(newElements[i]));
}
public void testInsertSiblingSelectExpanded() {
TestElement newElement= fRootElement.addChild(TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT);
assertNotNull("new sibling is visible", fViewer.testFindItem(newElement));
assertSelectionEquals("new element is selected", newElement);
}
public void testInsertSiblingWithFilterFiltered() {
fViewer.addFilter(new TestLabelFilter());
TestElement newElement= new TestElement(fModel, fRootElement);
newElement.setLabel("name-111");
fRootElement.addChild(newElement,
new TestModelChange(TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT, fRootElement, newElement)
);
assertNull("new sibling is not visible", fViewer.testFindItem(newElement));
assertTrue(getItemCount() == 5);
}
public void testInsertSiblingWithFilterNotFiltered() {
fViewer.addFilter(new TestLabelFilter());
TestElement newElement= new TestElement(fModel, fRootElement);
newElement.setLabel("name-222");
fRootElement.addChild(newElement,
new TestModelChange(TestModelChange.INSERT | TestModelChange.REVEAL | TestModelChange.SELECT, fRootElement, newElement)
);
assertNotNull("new sibling is visible", fViewer.testFindItem(newElement));
assertTrue(getItemCount() == 6);
}
public void testInsertSiblingWithSorter() {
fViewer.setSorter(new TestLabelSorter());
TestElement newElement= new TestElement(fModel, fRootElement);
newElement.setLabel("name-9999");
fRootElement.addChild(newElement,
new TestModelChange(TestModelChange.INSERT |TestModelChange.REVEAL | TestModelChange.SELECT, fRootElement, newElement)
);
String newLabel= newElement.toString();
assertEquals("sorted first", newLabel, getItemText(0));
assertSelectionEquals("new element is selected", newElement);
}
public void testLabelProvider() {
// BUG: non-polymorphic behaviour
// if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
// return;
fViewer.setLabelProvider(new TestLabelProvider());
TestElement first= fRootElement.getFirstChild();
String newLabel= providedString(first);
assertEquals("rendered label", newLabel, getItemText(0));
}
public void testLabelProviderStateChange() {
// BUG: non-polymorphic behaviour
// if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
// return;
TestLabelProvider provider= new TestLabelProvider();
fViewer.setLabelProvider(provider);
provider.setSuffix("added suffix");
TestElement first= fRootElement.getFirstChild();
String newLabel= providedString(first);
assertEquals("rendered label", newLabel, getItemText(0));
}
public void testRename() {
TestElement first= fRootElement.getFirstChild();
String newLabel= first.getLabel()+" changed";
first.setLabel(newLabel);
assertEquals("changed label", first.getID()+" "+newLabel, getItemText(0));
}
public void testRenameWithFilter() {
fViewer.addFilter(new TestLabelFilter());
TestElement first= fRootElement.getFirstChild();
first.setLabel("name-1111"); // should disappear
assertNull("changed sibling is not visible", fViewer.testFindItem(first));
first.setLabel("name-2222"); // should reappear
fViewer.refresh();
assertNotNull("changed sibling is not visible", fViewer.testFindItem(first));
}
public void testRenameWithLabelProvider() {
if (fViewer instanceof TableViewer || fViewer instanceof TableTreeViewer)
return;
fViewer.setLabelProvider(new TestLabelProvider());
TestElement first= fRootElement.getFirstChild();
first.setLabel("changed name");
String newLabel= providedString(first);
assertEquals("rendered label", newLabel, getItemText(0));
}
public void testRenameWithSorter() {
fViewer.setSorter(new TestLabelSorter());
TestElement first= fRootElement.getFirstChild();
first.setLabel("name-9999");
String newElementLabel= first.toString();
assertEquals("sorted first", newElementLabel, getItemText(0));
}
public void testSetInput() {
TestElement first= fRootElement.getFirstChild();
TestElement firstfirst= first.getFirstChild();
fViewer.setInput(first);
assertNotNull("first child is visible", fViewer.testFindItem(firstfirst));
}
public void testSetSelection() {
TestElement first= fRootElement.getFirstChild();
StructuredSelection selection= new StructuredSelection(first);
fViewer.setSelection(selection);
IStructuredSelection result= (IStructuredSelection)fViewer.getSelection();
assertTrue(result.size() == 1);
assertTrue(result.getFirstElement() == first);
}
public void testSomeChildrenChanged() {
bulkChange(new TestModelChange(TestModelChange.STRUCTURE_CHANGE, fRootElement));
}
public void testSorter() {
TestElement first= fRootElement.getFirstChild();
TestElement last= fRootElement.getLastChild();
int size= fRootElement.getChildCount();
String firstLabel= first.toString();
String lastLabel= last.toString();
assertEquals("unsorted", firstLabel, getItemText(0));
assertEquals("unsorted", lastLabel, getItemText(size-1));
fViewer.setSorter(new TestLabelSorter());
assertEquals("reverse sorted", firstLabel, getItemText(size-1));
assertEquals("reverse sorted", lastLabel, getItemText(0));
fViewer.setSorter(null);
assertEquals("unsorted", firstLabel, getItemText(0));
assertEquals("unsorted", lastLabel, getItemText(size-1));
}
public void testWorldChanged() {
bulkChange(new TestModelChange(TestModelChange.STRUCTURE_CHANGE, null));
}
}