blob: 7c0ac8e2beb201bfc3ab5f18432e111b03f7585b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 Wind River Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Wind River Systems - initial API and implementation
*******************************************************************************/
package org.eclipe.debug.tests.viewer.model;
import junit.framework.Assert;
import junit.framework.TestCase;
import org.eclipe.debug.tests.viewer.model.TestModel.TestElement;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.debug.internal.ui.viewers.model.ITreeModelContentProviderTarget;
import org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.ModelDelta;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeSelection;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
/**
* Tests that verify that the viewer property retrieves all the content
* from the model.
*
* @since 3.6
*/
abstract public class LazyTests extends TestCase implements ITestModelUpdatesListenerConstants {
Display fDisplay;
Shell fShell;
ITreeModelViewer fViewer;
TestModelUpdatesListener fListener;
public LazyTests(String name) {
super(name);
}
/**
* @throws java.lang.Exception
*/
protected void setUp() throws Exception {
fDisplay = PlatformUI.getWorkbench().getDisplay();
fShell = new Shell(fDisplay/*, SWT.ON_TOP | SWT.SHELL_TRIM*/);
fShell.setMaximized(true);
fShell.setLayout(new FillLayout());
fViewer = createViewer(fDisplay, fShell);
fListener = new TestModelUpdatesListener(fViewer, true, true);
fShell.open ();
}
abstract protected ITreeModelContentProviderTarget createViewer(Display display, Shell shell);
/**
* @throws java.lang.Exception
*/
protected void tearDown() throws Exception {
fListener.dispose();
fViewer.getPresentationContext().dispose();
// Close the shell and exit.
fShell.close();
while (!fShell.isDisposed()) if (!fDisplay.readAndDispatch ()) fDisplay.sleep ();
}
protected void runTest() throws Throwable {
try {
super.runTest();
} catch (Throwable t) {
throw new ExecutionException("Test failed: " + t.getMessage() + "\n fListener = " + fListener.toString(), t);
}
}
/**
* Creates a model in the pattern of:
*
* root
* 1
* 1.1
* 1.2
* 1.3
* ...
* 1.(size)
*/
private TestModel largeSubtreeModel(int size) {
TestModel model = new TestModel();
TestElement[] children = new TestElement[size];
for (int i = 0; i < size; i++) {
children[i] = new TestElement(model, "1." + i, new TestElement[0]);
}
TestElement element = new TestElement(model, "1", children);
model.setRoot(new TestElement(model, "root", new TestElement[] { element }));
return model;
}
/**
* Test to make sure that if an element is expanded its children are
* not automatically materialized.
* (bug 305739 and bug 304277)
*/
public void testExpandLargeSubTree() {
// Create test model with lots of children.
TestModel model = largeSubtreeModel(1000);
// NOTE: WE ARE NOT EXPANDING ANY CHILDREN
// Populate initial view content
fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, true);
fViewer.setInput(model.getRootElement());
while (!fListener.isFinished(ALL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep ();
// Create delta to expand the "1" element.
TestElement rootElement = model.getRootElement();
ModelDelta rootDelta = new ModelDelta(rootElement, IModelDelta.NO_CHANGE);
ModelDelta expandDelta = model.getBaseDelta(rootDelta);
TestElement expandElement = rootElement.getChildren()[0];
expandDelta.addNode(expandElement, 0, IModelDelta.EXPAND, expandElement.getChildren().length);
// Add first 250 elements as acceptable to materialize
fListener.reset();
fListener.setFailOnRedundantUpdates(true);
TreePath expandElementPath = model.findElement("1");
fListener.addChildreCountUpdate(expandElementPath);
fListener.addLabelUpdate(expandElementPath); // TODO: not sure why label is updated upon expand?
for (int i = 0; i < 250; i++) {
fListener.addChildreUpdate(expandElementPath, i);
TreePath childPath = expandElementPath.createChildPath(expandElement.getChildren()[i]);
fListener.addLabelUpdate(childPath);
fListener.addHasChildrenUpdate(childPath);
}
model.postDelta(rootDelta);
while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE | LABEL_UPDATES_COMPLETE))
if (!fDisplay.readAndDispatch ()) fDisplay.sleep ();
}
/**
* Test to make sure that if an element that is previously selected, is
* then selected and replaced, that no extra elements are retrieved.
* (bug 304277 comment #24, and bug 305739 comment #9).
*/
public void testReplaceAndSelectInSubTreeTree() {
// Create test model with lots of children.
TestModel model = largeSubtreeModel(1000);
// Expand all children
fViewer.setAutoExpandLevel(-1);
// Populate initial view content, watch for all updates but only wait
// for the content update sequence to finish (elements off screen will
// not be updated).
// TODO: child count for element 1 is updated multiple times.
fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, true);
fViewer.setInput(model.getRootElement());
while (!fListener.isFinished(CONTENT_UPDATES_COMPLETE | LABEL_UPDATES_COMPLETE)) if (!fDisplay.readAndDispatch ()) fDisplay.sleep ();
// Set selection so that the initial selection is not empty
fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("1.0")} ));
// Create delta to select the "1" element.
TestElement rootElement = model.getRootElement();
ModelDelta rootDelta = new ModelDelta(rootElement, IModelDelta.NO_CHANGE);
ModelDelta baseDelta = model.getBaseDelta(rootDelta);
TestElement _1Element = rootElement.getChildren()[0];
ModelDelta _1Delta = baseDelta.addNode(_1Element, 0, IModelDelta.NO_CHANGE, _1Element.getChildren().length);
// Add the delta to select the "1.1" element.
TestElement _1_0_newElement = new TestElement(model, "1.0 - new", new TestElement[0]);
TreePath _1ElementPath = model.findElement("1");
model.replaceElementChild(_1ElementPath, 0, _1_0_newElement);
_1Delta.addNode(_1_0_newElement, 0, IModelDelta.SELECT);
// Add element label update and post the delta
fListener.reset();
fListener.setFailOnRedundantUpdates(true);
TreePath _1_0_newElementPath = model.findElement("1.0 - new");
fListener.addLabelUpdate(_1_0_newElementPath);
model.postDelta(rootDelta);
while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | LABEL_UPDATES_COMPLETE))
if (!fDisplay.readAndDispatch ()) fDisplay.sleep ();
Assert.assertEquals(((IStructuredSelection)fViewer.getSelection()).getFirstElement(), _1_0_newElement);
}
}