diff options
Diffstat (limited to 'org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model')
38 files changed, 3924 insertions, 3924 deletions
diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/CheckTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/CheckTests.java index 07a142007..287a72393 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/CheckTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/CheckTests.java @@ -29,9 +29,9 @@ import org.eclipse.jface.viewers.TreePath; */ abstract public class CheckTests extends AbstractViewerModelTest { - public CheckTests(String name) { - super(name); - } + public CheckTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { @@ -39,43 +39,43 @@ abstract public class CheckTests extends AbstractViewerModelTest { } public void testSimpleSingleLevel() throws Exception { - // Create the model with test data - TestModel model = TestModel.simpleSingleLevel(); + // Create the model with test data + TestModel model = TestModel.simpleSingleLevel(); - // Make sure that all elements are expanded - fViewer.setAutoExpandLevel(-1); + // Make sure that all elements are expanded + fViewer.setAutoExpandLevel(-1); - // Create the agent which forces the tree to populate - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + // Create the agent which forces the tree to populate + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - // Create the listener which determines when the view is finished updating. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener which determines when the view is finished updating. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the viewer input (and trigger updates). - fViewer.setInput(model.getRootElement()); + // Set the viewer input (and trigger updates). + fViewer.setInput(model.getRootElement()); - // Wait for the updates to complete. + // Wait for the updates to complete. waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testSimpleMultiLevel() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleMultiLevel(); + fViewer.setAutoExpandLevel(-1); - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - fViewer.setInput(model.getRootElement()); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } - // TODO: no idea how to trigger a toggle event on an item + // TODO: no idea how to trigger a toggle event on an item // public void testCheckReceiver() { // // Initial setup // TestModel model = TestModel.simpleSingleLevel(); @@ -106,28 +106,28 @@ abstract public class CheckTests extends AbstractViewerModelTest { // } public void testUpdateCheck() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - TestElement element = model.getRootElement().getChildren()[0]; + // Update the model + TestElement element = model.getRootElement().getChildren()[0]; - TreePath elementPath = new TreePath(new Object[] { element }); - ModelDelta delta = model.setElementChecked(elementPath, false, false); + TreePath elementPath = new TreePath(new Object[] { element }); + ModelDelta delta = model.setElementChecked(elementPath, false, false); - fListener.reset(elementPath, element, -1, true, false); - model.postDelta(delta); + fListener.reset(elementPath, element, -1, true, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(ITestModelUpdatesListenerConstants.LABEL_COMPLETE | ITestModelUpdatesListenerConstants.MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ChildrenUpdateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ChildrenUpdateTests.java index b7e310b3c..fb293ebfa 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ChildrenUpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ChildrenUpdateTests.java @@ -76,33 +76,33 @@ public class ChildrenUpdateTests extends AbstractDebugTest { public void removeModelChangedListener(IModelChangedListener listener) {} @Override public void removeLabelUpdateListener(ILabelUpdateListener listener) {} - @Override + @Override public void addViewerUpdateListener(IViewerUpdateListener listener) {} - @Override + @Override public void addStateUpdateListener(IStateUpdateListener listener) {} - @Override + @Override public void addModelChangedListener(IModelChangedListener listener) {} - @Override + @Override public void addLabelUpdateListener(ILabelUpdateListener listener) {} - @Override + @Override public void update(Object element) {} - @Override + @Override public void setHasChildren(Object elementOrTreePath, boolean hasChildren) {} - @Override + @Override public void setExpandedState(Object elementOrTreePath, boolean expanded) {} - @Override + @Override public void setChildCount(Object elementOrTreePath, int count) {} - @Override + @Override public void reveal(TreePath path, int index) {} - @Override + @Override public void replace(Object parentOrTreePath, int index, Object element) {} - @Override + @Override public void remove(Object parentOrTreePath, int index) {} - @Override + @Override public void remove(Object elementOrTreePath) {} - @Override + @Override public void refresh() {} - @Override + @Override public void refresh(Object element) {} @Override @@ -171,10 +171,10 @@ public class ChildrenUpdateTests extends AbstractDebugTest { return null; } - @Override + @Override public boolean getHasChildren(Object elementOrTreePath) { - return false; - } + return false; + } @Override public int getChildCount(TreePath path) { @@ -194,37 +194,37 @@ public class ChildrenUpdateTests extends AbstractDebugTest { public void autoExpand(TreePath elementPath) { } - @Override + @Override public boolean getElementChildrenRealized(TreePath parentPath) { - return false; - } + return false; + } - @Override + @Override public boolean getElementChecked(TreePath path) { - return false; - } + return false; + } - @Override + @Override public boolean getElementGrayed(TreePath path) { - return false; - } + return false; + } - @Override + @Override public void setElementChecked(TreePath path, boolean checked, boolean grayed) { - } + } - @Override + @Override public TreePath[] getElementPaths(Object element) { - return null; - } - @Override + return null; + } + @Override public void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images, - FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) { - } - @Override + FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) { + } + @Override public String[] getVisibleColumns() { - return null; - } + return null; + } }; } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ColumnPresentationTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ColumnPresentationTests.java index b202e5838..92d3c131b 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ColumnPresentationTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ColumnPresentationTests.java @@ -67,20 +67,20 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM void createViewer() { fDisplay = PlatformUI.getWorkbench().getDisplay(); - fShell = new Shell(fDisplay); - fShell.setSize(800, 600); + fShell = new Shell(fDisplay); + fShell.setSize(800, 600); fShell.setLayout(new FillLayout()); fViewer = new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - fViewer.getTree().addControlListener(new ControlListener() { - @Override + fViewer.getTree().addControlListener(new ControlListener() { + @Override public void controlResized(ControlEvent e) { - fResized = true; - } + fResized = true; + } - @Override + @Override public void controlMoved(ControlEvent e) { - } - }); + } + }); fListener = new TestModelUpdatesListener(fViewer, false, false); fShell.open(); TestUtil.processUIEvents(); @@ -104,15 +104,15 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM protected String[] columnIds; MyColumnPresentation() { - this (makeDefaultColumnIds()); - } + this (makeDefaultColumnIds()); + } static String[] makeDefaultColumnIds() { - String[] columnIds = new String[5]; - for (int i = 0; i < columnIds.length; i++) { + String[] columnIds = new String[5]; + for (int i = 0; i < columnIds.length; i++) { columnIds[i] = "ColumnId_" + i; //$NON-NLS-1$ - } - return columnIds; + } + return columnIds; } MyColumnPresentation(String[] columnIds) { @@ -150,10 +150,10 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM @Override public String getHeader(String id) { - if (Arrays.asList(columnIds).indexOf(id) != -1) { - return id; - } - return null; + if (Arrays.asList(columnIds).indexOf(id) != -1) { + return id; + } + return null; } @Override @@ -262,7 +262,7 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM * in InternalTreeModelViewer. */ public void testInitialColumnAverageWidth() throws Exception { - fResized = false; + fResized = false; MyColumnPresentation colPre = new MyColumnPresentation(); makeModel(colPre, "m1"); //$NON-NLS-1$ @@ -271,9 +271,9 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM int treeWidth = tree.getSize().x; int avgWidth = treeWidth / columns.length; - // Resizing the tree invalidates the test. + // Resizing the tree invalidates the test. if (fResized) { - return; + return; } for (int i = 0; i < columns.length - 1; i++) { @@ -281,8 +281,8 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM } // Checking of the width of the last column is not reliable. // I.e. it's handled differenty on different platforms. - //int remainder = treeWidth % columns.length; - //assertEquals(avgWidth + remainder, columns[columns.length - 1].getWidth()); + //int remainder = treeWidth % columns.length; + //assertEquals(avgWidth + remainder, columns[columns.length - 1].getWidth()); } /** @@ -291,22 +291,22 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM * the IColumnPresentation2 implementation. */ public void testInitialColumnWidth() throws Exception { - fResized = false; + fResized = false; - MyColumnPresentation2 colPre = new MyColumnPresentation2(); + MyColumnPresentation2 colPre = new MyColumnPresentation2(); makeModel(colPre, "m2"); //$NON-NLS-1$ Tree tree = fViewer.getTree(); TreeColumn[] columns = tree.getColumns(); - // Resizing the tree invalidates the test. + // Resizing the tree invalidates the test. if (fResized) { - return; + return; } for (int i = 0; i < columns.length; i++) { int width = colPre.repliedWidths[i]; if (width != -1) { - assertEquals(width, columns[i].getWidth()); + assertEquals(width, columns[i].getWidth()); } } } @@ -392,36 +392,36 @@ public class ColumnPresentationTests extends AbstractDebugTest implements ITestM } /** - * In this test: verify that tree viewer can handle the column presentation changing - * its available column IDs between runs (bug 360015). - */ + * In this test: verify that tree viewer can handle the column presentation changing + * its available column IDs between runs (bug 360015). + */ public void testChangedColumnIds() throws Exception { - MyColumnPresentation colPre = new MyColumnPresentation(); + MyColumnPresentation colPre = new MyColumnPresentation(); makeModel(colPre, "m1"); //$NON-NLS-1$ - TreeColumn[] columns = fViewer.getTree().getColumns(); - // Select visible columns - fViewer.setVisibleColumns(new String[] { colPre.columnIds[0] }); + TreeColumn[] columns = fViewer.getTree().getColumns(); + // Select visible columns + fViewer.setVisibleColumns(new String[] { colPre.columnIds[0] }); TestUtil.processUIEvents(); waitWhile(t -> fViewer.getTree().getColumns().length != 1, createColumnsErrorMessage()); - // get InternalTreeModelViewer to rebuild columns due to change of - // model and presentation - first set to another model and column - // presentation, then switch to a model with original presentation. + // get InternalTreeModelViewer to rebuild columns due to change of + // model and presentation - first set to another model and column + // presentation, then switch to a model with original presentation. makeModel(new MyColumnPresentation2(), "m2"); //$NON-NLS-1$ - String[] newColumnIds = MyColumnPresentation.makeDefaultColumnIds(); + String[] newColumnIds = MyColumnPresentation.makeDefaultColumnIds(); newColumnIds[0] = "new_column_id"; //$NON-NLS-1$ - colPre = new MyColumnPresentation(newColumnIds); + colPre = new MyColumnPresentation(newColumnIds); makeModel(colPre, "m3"); //$NON-NLS-1$ - // verify user resized widths are used instead of the initial widths from IColumnPresentation2 - columns = fViewer.getTree().getColumns(); - for (int i = 0; i < columns.length; i++) { - assertEquals(newColumnIds[i], columns[i].getText()); - } - } + // verify user resized widths are used instead of the initial widths from IColumnPresentation2 + columns = fViewer.getTree().getColumns(); + for (int i = 0; i < columns.length; i++) { + assertEquals(newColumnIds[i], columns[i].getText()); + } + } private Function<AbstractDebugTest, String> createColumnsErrorMessage() { return t -> "Unexpected columns number: " + fViewer.getTree().getColumns().length; diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ContentTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ContentTests.java index 01f93cbdc..64a38b7fa 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ContentTests.java @@ -50,111 +50,111 @@ abstract public class ContentTests extends AbstractViewerModelTest implements IT } public void testSimpleSingleLevel() throws Exception { - // Create the model with test data - TestModel model = TestModel.simpleSingleLevel(); + // Create the model with test data + TestModel model = TestModel.simpleSingleLevel(); - // Make sure that all elements are expanded - fViewer.setAutoExpandLevel(-1); + // Make sure that all elements are expanded + fViewer.setAutoExpandLevel(-1); - // Create the agent which forces the tree to populate - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + // Create the agent which forces the tree to populate + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - // Create the listener which determines when the view is finished updating. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); + // Create the listener which determines when the view is finished updating. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); - // Set the viewer input (and trigger updates). - fViewer.setInput(model.getRootElement()); + // Set the viewer input (and trigger updates). + fViewer.setInput(model.getRootElement()); - // Wait for the updates to complete. + // Wait for the updates to complete. waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); - } + assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); + } public void testSimpleMultiLevel() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleMultiLevel(); + fViewer.setAutoExpandLevel(-1); - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); - fViewer.setInput(model.getRootElement()); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 3) ); - } + assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 3) ); + } - /** - * Modified test model that optionally captures (i.e. doesn't compete) - * udpates after filling in their data. - */ - class TestModelWithCapturedUpdates extends TestModel { + /** + * Modified test model that optionally captures (i.e. doesn't compete) + * udpates after filling in their data. + */ + class TestModelWithCapturedUpdates extends TestModel { - boolean fCaptureLabelUpdates = false; - boolean fCaptureChildrenUpdates = false; + boolean fCaptureLabelUpdates = false; + boolean fCaptureChildrenUpdates = false; List<IViewerUpdate> fCapturedUpdates = Collections.synchronizedList(new ArrayList<IViewerUpdate>()); - @Override + @Override public void update(IChildrenUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - TestElement element = (TestElement)updates[i].getElement(); - int endOffset = updates[i].getOffset() + updates[i].getLength(); - for (int j = updates[i].getOffset(); j < endOffset; j++) { - if (j < element.getChildren().length) { - updates[i].setChild(element.getChildren()[j], j); - } - } - if (fCaptureChildrenUpdates) { - fCapturedUpdates.add(updates[i]); - } else { - updates[i].done(); - } - } - } - - @Override + for (int i = 0; i < updates.length; i++) { + TestElement element = (TestElement)updates[i].getElement(); + int endOffset = updates[i].getOffset() + updates[i].getLength(); + for (int j = updates[i].getOffset(); j < endOffset; j++) { + if (j < element.getChildren().length) { + updates[i].setChild(element.getChildren()[j], j); + } + } + if (fCaptureChildrenUpdates) { + fCapturedUpdates.add(updates[i]); + } else { + updates[i].done(); + } + } + } + + @Override public void update(ILabelUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - TestElement element = (TestElement)updates[i].getElement(); - updates[i].setLabel(element.getLabel(), 0); - if (updates[i] instanceof ICheckUpdate && - Boolean.TRUE.equals(updates[i].getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK))) - { - ((ICheckUpdate)updates[i]).setChecked(element.getChecked(), element.getGrayed()); - } - if (fCaptureLabelUpdates) { - fCapturedUpdates.add(updates[i]); - } else { - updates[i].done(); - } - } - } - } - - /** - * Test to make sure that label provider cancels stale updates and doesn't - * use data from stale updates to populate the viewer.<br> - * See bug 210027 - */ + for (int i = 0; i < updates.length; i++) { + TestElement element = (TestElement)updates[i].getElement(); + updates[i].setLabel(element.getLabel(), 0); + if (updates[i] instanceof ICheckUpdate && + Boolean.TRUE.equals(updates[i].getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK))) + { + ((ICheckUpdate)updates[i]).setChecked(element.getChecked(), element.getGrayed()); + } + if (fCaptureLabelUpdates) { + fCapturedUpdates.add(updates[i]); + } else { + updates[i].done(); + } + } + } + } + + /** + * Test to make sure that label provider cancels stale updates and doesn't + * use data from stale updates to populate the viewer.<br> + * See bug 210027 + */ public void testLabelUpdatesCompletedOutOfSequence1() throws Exception { - TestModelWithCapturedUpdates model = new TestModelWithCapturedUpdates(); - model.fCaptureLabelUpdates = true; + TestModelWithCapturedUpdates model = new TestModelWithCapturedUpdates(); + model.fCaptureLabelUpdates = true; model.setRoot(new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "2", new TestElement[0]), //$NON-NLS-1$ - }) ); + }) ); - // Set input into the view to update it, but block children updates. - // Wait for view to start retrieving content. - fViewer.setInput(model.getRootElement()); + // Set input into the view to update it, but block children updates. + // Wait for view to start retrieving content. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> model.fCapturedUpdates.size() < model.getRootElement().fChildren.length, createModelErrorMessage(model)); @@ -164,145 +164,145 @@ abstract public class ContentTests extends AbstractViewerModelTest implements IT // // Change the model and run another update set. model.getElement(model.findElement("1")).setLabelAppendix(" - changed"); //$NON-NLS-1$ //$NON-NLS-2$ model.getElement(model.findElement("2")).setLabelAppendix(" - changed"); //$NON-NLS-1$ //$NON-NLS-2$ - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> model.fCapturedUpdates.size() < model.getRootElement().fChildren.length, createModelErrorMessage(model)); - // Complete the second set of children updates - for (int i = 0; i < model.fCapturedUpdates.size(); i++) { - ((ILabelUpdate)model.fCapturedUpdates.get(i)).done(); - } + // Complete the second set of children updates + for (int i = 0; i < model.fCapturedUpdates.size(); i++) { + ((ILabelUpdate)model.fCapturedUpdates.get(i)).done(); + } - // Then complete the first set. - for (int i = 0; i < firstUpdates.size(); i++) { - ILabelUpdate capturedUpdate = (ILabelUpdate)firstUpdates.get(i); - assertTrue(capturedUpdate.isCanceled()); - capturedUpdate.done(); - } + // Then complete the first set. + for (int i = 0; i < firstUpdates.size(); i++) { + ILabelUpdate capturedUpdate = (ILabelUpdate)firstUpdates.get(i); + assertTrue(capturedUpdate.isCanceled()); + capturedUpdate.done(); + } waitWhile(t -> !fListener.isFinished(CHILDREN_UPDATES), createListenerErrorMessage()); - // Check viewer data - model.validateData(fViewer, TreePath.EMPTY); - } + // Check viewer data + model.validateData(fViewer, TreePath.EMPTY); + } private Function<AbstractDebugTest, String> createModelErrorMessage(TestModelWithCapturedUpdates model) { return t -> "Unxexpected model state: captured updates: " + model.fCapturedUpdates + ", root children: " + Arrays.toString(model.getRootElement().fChildren); } - /** - * Test to make sure that label provider cancels stale updates and doesn't - * use data from stale updates to populate the viewer.<br> - * This version of the test changes the elements in the view, and not just - * the elements' labels. In this case, the view should still cancel stale - * updates.<br> - * See bug 210027 - */ + /** + * Test to make sure that label provider cancels stale updates and doesn't + * use data from stale updates to populate the viewer.<br> + * This version of the test changes the elements in the view, and not just + * the elements' labels. In this case, the view should still cancel stale + * updates.<br> + * See bug 210027 + */ public void testLabelUpdatesCompletedOutOfSequence2() throws Exception { - TestModelWithCapturedUpdates model = new TestModelWithCapturedUpdates(); - model.fCaptureLabelUpdates = true; + TestModelWithCapturedUpdates model = new TestModelWithCapturedUpdates(); + model.fCaptureLabelUpdates = true; model.setRoot(new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "2", new TestElement[0]), //$NON-NLS-1$ - }) ); + }) ); - // Set input into the view to update it, but block children updates. - // Wait for view to start retrieving content. - fViewer.setInput(model.getRootElement()); + // Set input into the view to update it, but block children updates. + // Wait for view to start retrieving content. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> model.fCapturedUpdates.size() < model.getRootElement().fChildren.length, createModelErrorMessage(model)); List<IViewerUpdate> firstUpdates = model.fCapturedUpdates; model.fCapturedUpdates = Collections.synchronizedList(new ArrayList<IViewerUpdate>(2)); - // Change the model and run another update set. + // Change the model and run another update set. model.setElementChildren(TreePath.EMPTY, new TestElement[] { new TestElement(model, "1-new", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "2-new", new TestElement[0]), //$NON-NLS-1$ - }); + }); fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> model.fCapturedUpdates.size() < model.getRootElement().fChildren.length, createModelErrorMessage(model)); - // Complete the second set of children updates - for (int i = 0; i < model.fCapturedUpdates.size(); i++) { - ((ILabelUpdate)model.fCapturedUpdates.get(i)).done(); - } + // Complete the second set of children updates + for (int i = 0; i < model.fCapturedUpdates.size(); i++) { + ((ILabelUpdate)model.fCapturedUpdates.get(i)).done(); + } - // Then complete the first set. - for (int i = 0; i < firstUpdates.size(); i++) { - ILabelUpdate capturedUpdate = (ILabelUpdate)firstUpdates.get(i); - assertTrue(capturedUpdate.isCanceled()); - capturedUpdate.done(); - } + // Then complete the first set. + for (int i = 0; i < firstUpdates.size(); i++) { + ILabelUpdate capturedUpdate = (ILabelUpdate)firstUpdates.get(i); + assertTrue(capturedUpdate.isCanceled()); + capturedUpdate.done(); + } waitWhile(t -> !fListener.isFinished(CHILDREN_UPDATES), createListenerErrorMessage()); - // Check viewer data - model.validateData(fViewer, TreePath.EMPTY); - } - - /** - * Test to make sure that content provider cancels stale updates and doesn't - * use data from stale updates to populate the viewer.<br> - * Note: this test is disabled because currently the viewer will not issue - * a new update for an until the previous update is completed. This is even - * if the previous update is canceled. If this behavior is changed at some - * point, then this test should be re-enabled.<br> - * See bug 210027 - */ + // Check viewer data + model.validateData(fViewer, TreePath.EMPTY); + } + + /** + * Test to make sure that content provider cancels stale updates and doesn't + * use data from stale updates to populate the viewer.<br> + * Note: this test is disabled because currently the viewer will not issue + * a new update for an until the previous update is completed. This is even + * if the previous update is canceled. If this behavior is changed at some + * point, then this test should be re-enabled.<br> + * See bug 210027 + */ public void _x_testChildrenUpdatesCompletedOutOfSequence() throws Exception { - TestModelWithCapturedUpdates model = new TestModelWithCapturedUpdates(); - model.fCaptureChildrenUpdates = true; + TestModelWithCapturedUpdates model = new TestModelWithCapturedUpdates(); + model.fCaptureChildrenUpdates = true; model.setRoot(new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "2", new TestElement[0]), //$NON-NLS-1$ - }) ); + }) ); - // Set input into the view to update it, but block children updates. - // Wait for view to start retrieving content. - fViewer.setInput(model.getRootElement()); + // Set input into the view to update it, but block children updates. + // Wait for view to start retrieving content. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !areCapturedChildrenUpdatesComplete(model.fCapturedUpdates, model.getRootElement().fChildren.length), createModelErrorMessage(model)); - IChildrenUpdate[] firstUpdates = model.fCapturedUpdates.toArray(new IChildrenUpdate[0]); - model.fCapturedUpdates.clear(); + IChildrenUpdate[] firstUpdates = model.fCapturedUpdates.toArray(new IChildrenUpdate[0]); + model.fCapturedUpdates.clear(); - // Change the model and run another update set. - model.setElementChildren(TreePath.EMPTY, new TestElement[] { + // Change the model and run another update set. + model.setElementChildren(TreePath.EMPTY, new TestElement[] { new TestElement(model, "1-new", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "2-new", new TestElement[0]), //$NON-NLS-1$ - }); - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + }); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !areCapturedChildrenUpdatesComplete(model.fCapturedUpdates, model.getRootElement().fChildren.length), createModelErrorMessage(model)); - // Complete the second set of children updates - for (int i = 0; i < model.fCapturedUpdates.size(); i++) { - ((IChildrenUpdate)model.fCapturedUpdates.get(i)).done(); - } + // Complete the second set of children updates + for (int i = 0; i < model.fCapturedUpdates.size(); i++) { + ((IChildrenUpdate)model.fCapturedUpdates.get(i)).done(); + } - // Then complete the first set. - for (int i = 0; i < firstUpdates.length; i++) { - firstUpdates[i].done(); - } + // Then complete the first set. + for (int i = 0; i < firstUpdates.length; i++) { + firstUpdates[i].done(); + } waitWhile(t -> !fListener.isFinished(CHILDREN_UPDATES), createListenerErrorMessage()); - // Check viewer data - model.validateData(fViewer, TreePath.EMPTY); - } + // Check viewer data + model.validateData(fViewer, TreePath.EMPTY); + } private boolean areCapturedChildrenUpdatesComplete(List<IViewerUpdate> capturedUpdates, int childCount) { List<Integer> expectedChildren = new ArrayList<>(); - for (int i = 0; i < childCount; i++) { - expectedChildren.add(Integer.valueOf(i)); - } - IChildrenUpdate[] updates = capturedUpdates.toArray(new IChildrenUpdate[0]); - for (int i = 0; i < updates.length; i++) { - for (int j = 0; j < updates[i].getLength(); j++) { - expectedChildren.remove( Integer.valueOf(updates[i].getOffset() + j) ); - } - } - return expectedChildren.isEmpty(); - } + for (int i = 0; i < childCount; i++) { + expectedChildren.add(Integer.valueOf(i)); + } + IChildrenUpdate[] updates = capturedUpdates.toArray(new IChildrenUpdate[0]); + for (int i = 0; i < updates.length; i++) { + for (int j = 0; j < updates[i].getLength(); j++) { + expectedChildren.remove( Integer.valueOf(updates[i].getOffset() + j) ); + } + } + return expectedChildren.isEmpty(); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DeltaTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DeltaTests.java index 63b9d8860..e6c25d01e 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/DeltaTests.java @@ -31,9 +31,9 @@ import org.eclipse.jface.viewers.TreePath; */ abstract public class DeltaTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public DeltaTests(String name) { - super(name); - } + public DeltaTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { @@ -41,656 +41,656 @@ abstract public class DeltaTests extends AbstractViewerModelTest implements ITes } public void testUpdateLabel() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - TestElement element = model.getRootElement().getChildren()[0]; - TreePath elementPath = new TreePath(new Object[] { element }); + // Update the model + TestElement element = model.getRootElement().getChildren()[0]; + TreePath elementPath = new TreePath(new Object[] { element }); ModelDelta delta = model.appendElementLabel(elementPath, "-modified"); //$NON-NLS-1$ - fListener.reset(elementPath, element, -1, true, false); - model.postDelta(delta); + fListener.reset(elementPath, element, -1, true, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(LABEL_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testRefreshStruct() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - TestElement element = model.getRootElement().getChildren()[0]; - TreePath elementPath = new TreePath(new Object[] { element }); - TestElement[] newChildren = new TestElement[] { + // Update the model + TestElement element = model.getRootElement().getChildren()[0]; + TreePath elementPath = new TreePath(new Object[] { element }); + TestElement[] newChildren = new TestElement[] { new TestElement(model, "1.1 - new", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "1.2 - new", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "1.3 - new", new TestElement[0]), //$NON-NLS-1$ - }; - ModelDelta delta = model.setElementChildren(elementPath, newChildren); + }; + ModelDelta delta = model.setElementChildren(elementPath, newChildren); - fListener.reset(elementPath, element, -1, true, false); - model.postDelta(delta); + fListener.reset(elementPath, element, -1, true, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testRefreshStruct2() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleMultiLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); String prefix = "new - "; //$NON-NLS-1$ - model.setElementChildren(TreePath.EMPTY, new TestElement[] { + model.setElementChildren(TreePath.EMPTY, new TestElement[] { new TestElement(model, prefix + "1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "2", true, false, new TestElement[] { //$NON-NLS-1$ new TestElement(model, prefix + "2.1", true, true, new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "2.2", false, true, new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "2.3", true, false, new TestElement[0]), //$NON-NLS-1$ - }), + }), new TestElement(model, prefix + "3", new TestElement[] { //$NON-NLS-1$ new TestElement(model, prefix + "3.1", new TestElement[] { //$NON-NLS-1$ new TestElement(model, prefix + "3.1.1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "3.1.2", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "3.1.3", new TestElement[0]), //$NON-NLS-1$ - }), + }), new TestElement(model, prefix + "3.2", new TestElement[] { //$NON-NLS-1$ new TestElement(model, prefix + "3.2.1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "3.2.2", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "3.2.3", new TestElement[0]), //$NON-NLS-1$ - }), + }), new TestElement(model, prefix + "3.3", new TestElement[] { //$NON-NLS-1$ new TestElement(model, prefix + "3.3.1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "3.3.2", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, prefix + "3.3.3", new TestElement[0]), //$NON-NLS-1$ - }), - }) - }); + }), + }) + }); - TestElement element = model.getRootElement(); - fListener.reset(TreePath.EMPTY, element, -1, false, false); + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testRefreshCoalesceStruct() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - - // Create a single level model and add a single child to each element. - TestModel model = TestModel.simpleSingleLevel(); - TestElement[] rootChildren = model.getRootElement().getChildren(); - for (int i = 0; i < rootChildren.length; i++) { - model.setElementChildren( - new TreePath(new Object[] { rootChildren[i]} ), + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + + // Create a single level model and add a single child to each element. + TestModel model = TestModel.simpleSingleLevel(); + TestElement[] rootChildren = model.getRootElement().getChildren(); + for (int i = 0; i < rootChildren.length; i++) { + model.setElementChildren( + new TreePath(new Object[] { rootChildren[i]} ), new TestElement[] { new TestElement(model, i + ".1", new TestElement[0]) }); //$NON-NLS-1$ - } + } - fViewer.setAutoExpandLevel(-1); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); - } + model.validateData(fViewer, TreePath.EMPTY); + assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); + } public void testInsert() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model + // Update the model TestElement element = new TestElement(model, "7", new TestElement[0]); //$NON-NLS-1$ - TreePath elementPath = new TreePath(new Object[] { element }); - ModelDelta delta = model.insertElementChild(TreePath.EMPTY, 6, element); - - // Insert causes the update of element's data, label and children. - // TODO: update of element's data after insert seems redundant - // but it's probably not a big inefficiency - fListener.reset(); - fListener.addChildreUpdate(TreePath.EMPTY, 6); - fListener.addHasChildrenUpdate(elementPath); - fListener.addLabelUpdate(elementPath); - // TODO: redundant label updates on insert! - fListener.setFailOnRedundantUpdates(false); - model.postDelta(delta); + TreePath elementPath = new TreePath(new Object[] { element }); + ModelDelta delta = model.insertElementChild(TreePath.EMPTY, 6, element); + + // Insert causes the update of element's data, label and children. + // TODO: update of element's data after insert seems redundant + // but it's probably not a big inefficiency + fListener.reset(); + fListener.addChildreUpdate(TreePath.EMPTY, 6); + fListener.addHasChildrenUpdate(elementPath); + fListener.addLabelUpdate(elementPath); + // TODO: redundant label updates on insert! + fListener.setFailOnRedundantUpdates(false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } - /** - * This test checks that insert and select delta flags are processed in correct order: - * insert then select. - */ + /** + * This test checks that insert and select delta flags are processed in correct order: + * insert then select. + */ public void testInsertAndSelect() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - // Insert two new elements at once + // Update the model + // Insert two new elements at once TestElement element0 = new TestElement(model, "00", new TestElement[] {}); //$NON-NLS-1$ TestElement element1 = new TestElement(model, "01", new TestElement[] {}); //$NON-NLS-1$ - TreePath elementPath0 = new TreePath(new Object[] { element0 }); - TreePath elementPath1 = new TreePath(new Object[] { element1 }); - ModelDelta rootDelta = model.insertElementChild(TreePath.EMPTY, 0, element0); - rootDelta = model.insertElementChild(rootDelta, TreePath.EMPTY, 1, element1); + TreePath elementPath0 = new TreePath(new Object[] { element0 }); + TreePath elementPath1 = new TreePath(new Object[] { element1 }); + ModelDelta rootDelta = model.insertElementChild(TreePath.EMPTY, 0, element0); + rootDelta = model.insertElementChild(rootDelta, TreePath.EMPTY, 1, element1); - // Set the select flag on the first added node. - ModelDelta delta0 = rootDelta.getChildDelta(element0); - delta0.setFlags(delta0.getFlags() | IModelDelta.SELECT); + // Set the select flag on the first added node. + ModelDelta delta0 = rootDelta.getChildDelta(element0); + delta0.setFlags(delta0.getFlags() | IModelDelta.SELECT); - fListener.reset(); - fListener.addHasChildrenUpdate(elementPath0); - fListener.addHasChildrenUpdate(elementPath1); - fListener.addLabelUpdate(elementPath0); - fListener.addLabelUpdate(elementPath1); + fListener.reset(); + fListener.addHasChildrenUpdate(elementPath0); + fListener.addHasChildrenUpdate(elementPath1); + fListener.addLabelUpdate(elementPath0); + fListener.addLabelUpdate(elementPath1); - // TODO: list full set of expected updates. - fListener.setFailOnRedundantUpdates(false); + // TODO: list full set of expected updates. + fListener.setFailOnRedundantUpdates(false); - model.postDelta(rootDelta); + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } - /** - * This test checks that insert and remove deltas are processed in correct order: - * remove deltas are processed first then insert deltas. - */ + /** + * This test checks that insert and remove deltas are processed in correct order: + * remove deltas are processed first then insert deltas. + */ public void testInsertAndRemove() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - fViewer.setInput(model.getRootElement()); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - // Remove one element then insert a new one - IModelDelta removeDelta = model.removeElementChild(TreePath.EMPTY, 3).getChildDeltas()[0]; + // Update the model + // Remove one element then insert a new one + IModelDelta removeDelta = model.removeElementChild(TreePath.EMPTY, 3).getChildDeltas()[0]; - // Insert new elements at once + // Insert new elements at once TestElement element = new TestElement(model, "00", new TestElement[] {}); //$NON-NLS-1$ - TreePath elementPath = new TreePath(new Object[] { element }); - IModelDelta insertDelta = model.insertElementChild(TreePath.EMPTY, 1, element).getChildDeltas()[0]; + TreePath elementPath = new TreePath(new Object[] { element }); + IModelDelta insertDelta = model.insertElementChild(TreePath.EMPTY, 1, element).getChildDeltas()[0]; - // Create a combined delta where the insert child delta is first and the remove child delta is second. - ModelDelta combinedDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE, 0, model.getRootElement().getChildren().length); - combinedDelta.addNode(insertDelta.getElement(), insertDelta.getIndex(), insertDelta.getFlags(), insertDelta.getChildCount()); - combinedDelta.addNode(removeDelta.getElement(), removeDelta.getIndex(), removeDelta.getFlags(), removeDelta.getChildCount()); + // Create a combined delta where the insert child delta is first and the remove child delta is second. + ModelDelta combinedDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE, 0, model.getRootElement().getChildren().length); + combinedDelta.addNode(insertDelta.getElement(), insertDelta.getIndex(), insertDelta.getFlags(), insertDelta.getChildCount()); + combinedDelta.addNode(removeDelta.getElement(), removeDelta.getIndex(), removeDelta.getFlags(), removeDelta.getChildCount()); - // Set the select flag on the first added node. - fListener.reset(); - fListener.addHasChildrenUpdate(elementPath); - fListener.addLabelUpdate(elementPath); + // Set the select flag on the first added node. + fListener.reset(); + fListener.addHasChildrenUpdate(elementPath); + fListener.addLabelUpdate(elementPath); - // TODO: list full set of expected updates. - fListener.setFailOnRedundantUpdates(false); + // TODO: list full set of expected updates. + fListener.setFailOnRedundantUpdates(false); - model.postDelta(combinedDelta); + model.postDelta(combinedDelta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testAddElement() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model + // Update the model TestElement element = new TestElement(model, "7", new TestElement[0]); //$NON-NLS-1$ - TreePath elementPath = new TreePath(new Object[] { element }); - ModelDelta delta = model.addElementChild(TreePath.EMPTY, null, 6, element); - - // Add causes the update of parent child count and element's children. - fListener.reset(elementPath, element, -1, true, false); - fListener.addChildreUpdate(TreePath.EMPTY, 6); - // TODO: redundant updates on add! - fListener.setFailOnRedundantUpdates(false); - model.postDelta(delta); + TreePath elementPath = new TreePath(new Object[] { element }); + ModelDelta delta = model.addElementChild(TreePath.EMPTY, null, 6, element); + + // Add causes the update of parent child count and element's children. + fListener.reset(elementPath, element, -1, true, false); + fListener.addChildreUpdate(TreePath.EMPTY, 6); + // TODO: redundant updates on add! + fListener.setFailOnRedundantUpdates(false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } - // This test currently fails. When (if) bug 311442 gets address we should re-enable it. + // This test currently fails. When (if) bug 311442 gets address we should re-enable it. public void _x_testAddUnexpandedElement() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Turn off auto-expansion - fViewer.setAutoExpandLevel(0); + // Turn off auto-expansion + fViewer.setAutoExpandLevel(0); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - // Update the model + // Update the model TreePath parentPath = model.findElement("1"); //$NON-NLS-1$ ModelDelta rootDelta = model.addElementChild(parentPath, null, 0, new TestElement(model, "1.1", new TestElement[0])); //$NON-NLS-1$ model.addElementChild(parentPath, rootDelta, 1, new TestElement(model, "1.2", new TestElement[0])); //$NON-NLS-1$ model.addElementChild(parentPath, rootDelta, 2, new TestElement(model, "1.3", new TestElement[0])); //$NON-NLS-1$ model.addElementChild(parentPath, rootDelta, 3, new TestElement(model, "1.4", new TestElement[0])); //$NON-NLS-1$ - // Add causes the update of parent child count and element's children. - fListener.reset(); - fListener.setFailOnRedundantUpdates(false); - model.postDelta(rootDelta); + // Add causes the update of parent child count and element's children. + fListener.reset(); + fListener.setFailOnRedundantUpdates(false); + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Update the elements that were added. - fListener.reset(); - fListener.addUpdates(fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); - rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); + // Update the elements that were added. + fListener.reset(); + fListener.addUpdates(fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); model.getElementDelta(rootDelta, model.findElement("1.1"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ model.getElementDelta(rootDelta, model.findElement("1.2"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ model.getElementDelta(rootDelta, model.findElement("1.3"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ model.getElementDelta(rootDelta, model.findElement("1.4"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ - model.postDelta(rootDelta); + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); - fViewer.expandToLevel(parentPath, 1); + fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); + fViewer.expandToLevel(parentPath, 1); waitWhile(t -> fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, parentPath); - } + model.validateData(fViewer, parentPath); + } public void _x_testRefreshUnexpandedElementsChildren() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Turn off auto-expansion - fViewer.setAutoExpandLevel(0); + // Turn off auto-expansion + fViewer.setAutoExpandLevel(0); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - // Expand elment "2" + // Expand elment "2" TreePath parentPath = model.findElement("2"); //$NON-NLS-1$ - fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); - fViewer.expandToLevel(parentPath, 1); + fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); + fViewer.expandToLevel(parentPath, 1); waitWhile(t -> fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Collapse back element "2" - fViewer.setExpandedState(parentPath, false); + // Collapse back element "2" + fViewer.setExpandedState(parentPath, false); - // Update the children of element "2". - fListener.reset(); - fListener.addUpdates(fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); - ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); + // Update the children of element "2". + fListener.reset(); + fListener.addUpdates(fViewer, TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); model.getElementDelta(rootDelta, model.findElement("2.1"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ model.getElementDelta(rootDelta, model.findElement("2.2"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ model.getElementDelta(rootDelta, model.findElement("2.3"), true).setFlags(IModelDelta.CONTENT); //$NON-NLS-1$ - model.postDelta(rootDelta); + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Expand back element "2" - fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); - fViewer.expandToLevel(parentPath, 1); + // Expand back element "2" + fListener.reset(parentPath, model.getElement(parentPath), 1, false, true); + fViewer.expandToLevel(parentPath, 1); waitWhile(t -> fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, parentPath, true); - } + model.validateData(fViewer, parentPath, true); + } public void testRemove() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - ModelDelta delta = model.removeElementChild(TreePath.EMPTY, 5); + // Update the model + ModelDelta delta = model.removeElementChild(TreePath.EMPTY, 5); - // Remove delta should generate no new updates, but we still need to wait for the event to - // be processed. - fListener.reset(); - model.postDelta(delta); + // Remove delta should generate no new updates, but we still need to wait for the event to + // be processed. + fListener.reset(); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testExpandAndSelect() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); - - // Create the delta - fListener.reset(); - // TODO Investigate: there seem to be unnecessary updates being issued - // by the viewer. These include the updates that are commented out: - // For now disable checking for extra updates. - fListener.setFailOnRedundantUpdates(false); - TestElement element = model.getRootElement(); - TreePath path_root = TreePath.EMPTY; - ModelDelta delta= new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); - ModelDelta deltaRoot = delta; - element = element.getChildren()[2]; - TreePath path_root_3 = path_root.createChildPath(element); - delta = delta.addNode(element, 2, IModelDelta.EXPAND, element.fChildren.length); - fListener.addChildreUpdate(path_root_3, 0); - TreePath path_root_3_1 = path_root_3.createChildPath(element.getChildren()[0]); - fListener.addHasChildrenUpdate(path_root_3_1); - fListener.addLabelUpdate(path_root_3_1); - TreePath path_root_3_3 = path_root_3.createChildPath(element.getChildren()[2]); - fListener.addHasChildrenUpdate(path_root_3_3); - fListener.addLabelUpdate(path_root_3_3); - //TODO unnecessary update: fListener.addChildreUpdate(path1, 1); - fListener.addChildreUpdate(path_root_3, 2); - element = element.getChildren()[1]; - TreePath path_root_3_2 = path_root_3.createChildPath(element); - delta = delta.addNode(element, 1, IModelDelta.EXPAND, element.fChildren.length); - fListener.addLabelUpdate(path_root_3_2); - TreePath path_root_3_2_1 = path_root_3_2.createChildPath(element.getChildren()[0]); - fListener.addHasChildrenUpdate(path_root_3_2_1); - fListener.addLabelUpdate(path_root_3_2_1); - TreePath path_root_3_2_3 = path_root_3_2.createChildPath(element.getChildren()[2]); - fListener.addHasChildrenUpdate(path_root_3_2_3); - fListener.addLabelUpdate(path_root_3_2_3); - // TODO unnecessary update: fListener.addChildreCountUpdate(path2); - fListener.addChildreUpdate(path_root_3_2, 0); - // TODO unnecessary update: fListener.addChildreUpdate(path2, 1); - fListener.addChildreUpdate(path_root_3_2, 2); - element = element.getChildren()[1]; - TreePath path_root_3_2_2 = path_root_3_2.createChildPath(element); - delta = delta.addNode(element, 1, IModelDelta.SELECT, element.fChildren.length); - fListener.addLabelUpdate(path_root_3_2_2); - fListener.addHasChildrenUpdate(path_root_3_2_2); - - // Validate the expansion state BEFORE posting the delta. - - IInternalTreeModelViewer contentProviderViewer = fViewer; - assertFalse(contentProviderViewer.getExpandedState(path_root_3)); - assertFalse(contentProviderViewer.getExpandedState(path_root_3_2)); - assertFalse(contentProviderViewer.getExpandedState(path_root_3_2_2)); - - model.postDelta(deltaRoot); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Create the delta + fListener.reset(); + // TODO Investigate: there seem to be unnecessary updates being issued + // by the viewer. These include the updates that are commented out: + // For now disable checking for extra updates. + fListener.setFailOnRedundantUpdates(false); + TestElement element = model.getRootElement(); + TreePath path_root = TreePath.EMPTY; + ModelDelta delta= new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); + ModelDelta deltaRoot = delta; + element = element.getChildren()[2]; + TreePath path_root_3 = path_root.createChildPath(element); + delta = delta.addNode(element, 2, IModelDelta.EXPAND, element.fChildren.length); + fListener.addChildreUpdate(path_root_3, 0); + TreePath path_root_3_1 = path_root_3.createChildPath(element.getChildren()[0]); + fListener.addHasChildrenUpdate(path_root_3_1); + fListener.addLabelUpdate(path_root_3_1); + TreePath path_root_3_3 = path_root_3.createChildPath(element.getChildren()[2]); + fListener.addHasChildrenUpdate(path_root_3_3); + fListener.addLabelUpdate(path_root_3_3); + //TODO unnecessary update: fListener.addChildreUpdate(path1, 1); + fListener.addChildreUpdate(path_root_3, 2); + element = element.getChildren()[1]; + TreePath path_root_3_2 = path_root_3.createChildPath(element); + delta = delta.addNode(element, 1, IModelDelta.EXPAND, element.fChildren.length); + fListener.addLabelUpdate(path_root_3_2); + TreePath path_root_3_2_1 = path_root_3_2.createChildPath(element.getChildren()[0]); + fListener.addHasChildrenUpdate(path_root_3_2_1); + fListener.addLabelUpdate(path_root_3_2_1); + TreePath path_root_3_2_3 = path_root_3_2.createChildPath(element.getChildren()[2]); + fListener.addHasChildrenUpdate(path_root_3_2_3); + fListener.addLabelUpdate(path_root_3_2_3); + // TODO unnecessary update: fListener.addChildreCountUpdate(path2); + fListener.addChildreUpdate(path_root_3_2, 0); + // TODO unnecessary update: fListener.addChildreUpdate(path2, 1); + fListener.addChildreUpdate(path_root_3_2, 2); + element = element.getChildren()[1]; + TreePath path_root_3_2_2 = path_root_3_2.createChildPath(element); + delta = delta.addNode(element, 1, IModelDelta.SELECT, element.fChildren.length); + fListener.addLabelUpdate(path_root_3_2_2); + fListener.addHasChildrenUpdate(path_root_3_2_2); + + // Validate the expansion state BEFORE posting the delta. + + IInternalTreeModelViewer contentProviderViewer = fViewer; + assertFalse(contentProviderViewer.getExpandedState(path_root_3)); + assertFalse(contentProviderViewer.getExpandedState(path_root_3_2)); + assertFalse(contentProviderViewer.getExpandedState(path_root_3_2_2)); + + model.postDelta(deltaRoot); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Validate the expansion state AFTER posting the delta. - assertTrue(contentProviderViewer.getExpandedState(path_root_3)); - assertTrue(contentProviderViewer.getExpandedState(path_root_3_2)); - assertFalse(contentProviderViewer.getExpandedState(path_root_3_2_2)); + // Validate the expansion state AFTER posting the delta. + assertTrue(contentProviderViewer.getExpandedState(path_root_3)); + assertTrue(contentProviderViewer.getExpandedState(path_root_3_2)); + assertFalse(contentProviderViewer.getExpandedState(path_root_3_2_2)); - // Verify selection - ISelection selection = fViewer.getSelection(); - if (selection instanceof ITreeSelection) { + // Verify selection + ISelection selection = fViewer.getSelection(); + if (selection instanceof ITreeSelection) { List<TreePath> selectionPathsList = Arrays.asList(((ITreeSelection) selection).getPaths()); - assertTrue(selectionPathsList.contains(path_root_3_2_2)); - } else { + assertTrue(selectionPathsList.contains(path_root_3_2_2)); + } else { fail("Not a tree selection"); //$NON-NLS-1$ - } - } + } + } - /** - * This test verifies that expand and select updates are being ignored. - */ + /** + * This test verifies that expand and select updates are being ignored. + */ public void testExpandAndSelect_simple() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); - - // Create the delta - fListener.reset(); - // TODO Investigate: there seem to be unnecessary updates being issued - // by the viewer. These include the updates that are commented out: - // For now disable checking for extra updates. - fListener.setFailOnRedundantUpdates(false); - TestElement element = model.getRootElement(); - TreePath path_root = TreePath.EMPTY; - ModelDelta delta= new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); - ModelDelta deltaRoot = delta; - element = element.getChildren()[2]; - TreePath path_root_3 = path_root.createChildPath(element); - delta.addNode(element, 2, IModelDelta.SELECT | IModelDelta.EXPAND, element.fChildren.length); - - // Validate the expansion state BEFORE posting the delta. - - IInternalTreeModelViewer contentProviderViewer = fViewer; - assertFalse(contentProviderViewer.getExpandedState(path_root_3)); - - model.postDelta(deltaRoot); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Create the delta + fListener.reset(); + // TODO Investigate: there seem to be unnecessary updates being issued + // by the viewer. These include the updates that are commented out: + // For now disable checking for extra updates. + fListener.setFailOnRedundantUpdates(false); + TestElement element = model.getRootElement(); + TreePath path_root = TreePath.EMPTY; + ModelDelta delta= new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); + ModelDelta deltaRoot = delta; + element = element.getChildren()[2]; + TreePath path_root_3 = path_root.createChildPath(element); + delta.addNode(element, 2, IModelDelta.SELECT | IModelDelta.EXPAND, element.fChildren.length); + + // Validate the expansion state BEFORE posting the delta. + + IInternalTreeModelViewer contentProviderViewer = fViewer; + assertFalse(contentProviderViewer.getExpandedState(path_root_3)); + + model.postDelta(deltaRoot); TestUtil.processUIEvents(); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Validate the expansion state AFTER posting the delta. - assertTrue(contentProviderViewer.getExpandedState(path_root_3)); + // Validate the expansion state AFTER posting the delta. + assertTrue(contentProviderViewer.getExpandedState(path_root_3)); - // Verify selection - ISelection selection = fViewer.getSelection(); - if (selection instanceof ITreeSelection) { + // Verify selection + ISelection selection = fViewer.getSelection(); + if (selection instanceof ITreeSelection) { List<TreePath> selectionPathsList = Arrays.asList(((ITreeSelection) selection).getPaths()); - assertTrue(selectionPathsList.contains(path_root_3)); - } else { + assertTrue(selectionPathsList.contains(path_root_3)); + } else { fail("Not a tree selection"); //$NON-NLS-1$ - } - } + } + } public void testCompositeModelRefreshStruct() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.compositeMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.compositeMultiLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - // TODO: redundant updates on install deltas - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + // TODO: redundant updates on install deltas + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Update the model + // Update the model TreePath m4_2_1Path = model.findElement("m4.2.1"); //$NON-NLS-1$ - TestElement m4_2_1 = model.getElement(m4_2_1Path); - TestModel m4 = m4_2_1.getModel(); - TestElement[] newChildren = new TestElement[] { + TestElement m4_2_1 = model.getElement(m4_2_1Path); + TestModel m4 = m4_2_1.getModel(); + TestElement[] newChildren = new TestElement[] { new TestElement(m4, "4.2.1.new-1", new TestElement[0]), //$NON-NLS-1$ new TestElement(m4, "4.2.1.new-2", new TestElement[0]), //$NON-NLS-1$ new TestElement(m4, "4.2.1.new-3", new TestElement[0]), //$NON-NLS-1$ - }; + }; - ModelDelta delta = m4.setElementChildren(m4_2_1Path, newChildren); + ModelDelta delta = m4.setElementChildren(m4_2_1Path, newChildren); - fListener.reset(m4_2_1Path, m4_2_1, -1, true, false); - model.postDelta(delta); + fListener.reset(m4_2_1Path, m4_2_1, -1, true, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testCompositeModelAddElement() throws Exception { - TestModel model = TestModel.compositeMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.compositeMultiLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - // TODO: redundant updates on install deltas - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + // TODO: redundant updates on install deltas + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); TreePath m3_1Path = model.findElement("m3.1"); //$NON-NLS-1$ - TestElement m3_1 = model.getElement(m3_1Path); - TestModel m3 = m3_1.getModel(); + TestElement m3_1 = model.getElement(m3_1Path); + TestModel m3 = m3_1.getModel(); TestElement m3_1_new = new TestElement(m3, "m3.1-new", new TestElement[0]); //$NON-NLS-1$ - TreePath m3_1_newPath = m3_1Path.createChildPath(m3_1_new); - ModelDelta delta = m3.addElementChild(m3_1Path, null, 0, m3_1_new); + TreePath m3_1_newPath = m3_1Path.createChildPath(m3_1_new); + ModelDelta delta = m3.addElementChild(m3_1Path, null, 0, m3_1_new); - fListener.reset(m3_1_newPath, m3_1_new, -1, true, false); - fListener.addChildreUpdate(m3_1Path, 0); - fListener.setFailOnRedundantUpdates(false); + fListener.reset(m3_1_newPath, m3_1_new, -1, true, false); + fListener.addChildreUpdate(m3_1Path, 0); + fListener.setFailOnRedundantUpdates(false); - m3.postDelta(delta); + m3.postDelta(delta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } public void testBug292322() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Update the model: remove one child of an un-expanded element, then - // make sure that the number of children is correct. + // Update the model: remove one child of an un-expanded element, then + // make sure that the number of children is correct. TreePath parentPath = model.findElement("2"); //$NON-NLS-1$ - TestElement parentElement = model.getElement(parentPath); - ModelDelta delta = model.removeElementChild(parentPath, 0); + TestElement parentElement = model.getElement(parentPath); + ModelDelta delta = model.removeElementChild(parentPath, 0); - // Update the viewer - fListener.reset(parentPath, parentElement, 0, false, false); - //fListener.addChildreCountUpdate(parentPath); - model.postDelta(delta); + // Update the viewer + fListener.reset(parentPath, parentElement, 0, false, false); + //fListener.addChildreCountUpdate(parentPath); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_COMPLETE), createListenerErrorMessage()); - // Validate the viewer data. - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate the viewer data. + model.validateData(fViewer, TreePath.EMPTY, true); - // Update the model: remove the remaining children and make sure that - // the element children are updated to false. - model.removeElementChild(parentPath, 0); + // Update the model: remove the remaining children and make sure that + // the element children are updated to false. + model.removeElementChild(parentPath, 0); - // Update the viewer - fListener.reset(parentPath, parentElement, 0, false, false); - model.postDelta(delta); + // Update the viewer + fListener.reset(parentPath, parentElement, 0, false, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_COMPLETE), createListenerErrorMessage()); - // Validate the viewer data. - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate the viewer data. + model.validateData(fViewer, TreePath.EMPTY, true); - // Update the model: remove the remaining children and make sure that - // the element children are updated to false. - model.removeElementChild(parentPath, 0); + // Update the model: remove the remaining children and make sure that + // the element children are updated to false. + model.removeElementChild(parentPath, 0); - // Update the viewer - fListener.reset(parentPath, parentElement, 0, false, false); - model.postDelta(delta); + // Update the viewer + fListener.reset(parentPath, parentElement, 0, false, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_COMPLETE), createListenerErrorMessage()); - // Validate the viewer data. - model.validateData(fViewer, TreePath.EMPTY, true); - } + // Validate the viewer data. + model.validateData(fViewer, TreePath.EMPTY, true); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/FilterTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/FilterTests.java index b4928569c..fb958178a 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/FilterTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/FilterTests.java @@ -37,326 +37,326 @@ import org.eclipse.jface.viewers.ViewerFilter; */ abstract public class FilterTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public FilterTests(String name) { - super(name); - } + public FilterTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, true, true); } - protected IInternalTreeModelViewer getInternalViewer() { - return fViewer; - } + protected IInternalTreeModelViewer getInternalViewer() { + return fViewer; + } - class TestViewerFilter extends ViewerFilter { + class TestViewerFilter extends ViewerFilter { - Pattern fPattern; - TestViewerFilter(String pattern) { - fPattern = Pattern.compile(pattern); - } + Pattern fPattern; + TestViewerFilter(String pattern) { + fPattern = Pattern.compile(pattern); + } - @Override + @Override public boolean select(Viewer viewer, Object parentElement, Object element) { - if (element instanceof TestElement) { - TestElement te = (TestElement)element; - return !fPattern.matcher(te.getLabel()).find(); - } - - return true; - } - } - - class TestTMVFilter extends TreeModelViewerFilter { - Pattern fPattern; - Object fParentElement; - TestTMVFilter(String pattern, Object parentElement) { - fPattern = Pattern.compile(pattern); - fParentElement = parentElement; - } - - @Override + if (element instanceof TestElement) { + TestElement te = (TestElement)element; + return !fPattern.matcher(te.getLabel()).find(); + } + + return true; + } + } + + class TestTMVFilter extends TreeModelViewerFilter { + Pattern fPattern; + Object fParentElement; + TestTMVFilter(String pattern, Object parentElement) { + fPattern = Pattern.compile(pattern); + fParentElement = parentElement; + } + + @Override public boolean isApplicable(ITreeModelViewer viewer, Object parentElement) { - if (fParentElement != null) { - return fParentElement.equals(parentElement); - } + if (fParentElement != null) { + return fParentElement.equals(parentElement); + } - return true; - } + return true; + } - @Override + @Override public boolean select(Viewer viewer, Object parentElement, Object element) { - if (element instanceof TestElement) { - TestElement te = (TestElement)element; - return !fPattern.matcher(te.getLabel()).find(); - } + if (element instanceof TestElement) { + TestElement te = (TestElement)element; + return !fPattern.matcher(te.getLabel()).find(); + } - return true; - } - } + return true; + } + } public void testSimpleSingleLevel() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); + TestModel model = TestModel.simpleSingleLevel(); doTestSimpleLevel(model, new ViewerFilter[] { new TestViewerFilter("2") }); //$NON-NLS-1$ - } + } public void testSimpleSingleLevelWithTMVFilter() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); + TestModel model = TestModel.simpleSingleLevel(); doTestSimpleLevel(model, new ViewerFilter[] { new TestTMVFilter("2", model.getRootElement()) }); //$NON-NLS-1$ - } + } public void testSimpleSingleLevelWithMixedFilters() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); + TestModel model = TestModel.simpleSingleLevel(); doTestSimpleLevel(model, new ViewerFilter[] { new TestTMVFilter("2", model.getRootElement()), new TestViewerFilter("1") }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } public void testSimpleMultiLevel() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); doTestSimpleLevel(model, new ViewerFilter[] { new TestViewerFilter(".1"), new TestViewerFilter(".2") }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } public void testSimpleMultiLevelWithTMVFilter() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); doTestSimpleLevel(model, new ViewerFilter[] { new TestTMVFilter(".1", null), new TestTMVFilter(".2", null) }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } public void testSimpleMultiLevelWithMixedFilters() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); doTestSimpleLevel(model, new ViewerFilter[] { new TestViewerFilter(".1"), new TestTMVFilter(".2", null) }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } private void doTestSimpleLevel(TestModel model, ViewerFilter[] filters) throws Exception { - // Make sure that all elements are expanded - fViewer.setAutoExpandLevel(-1); + // Make sure that all elements are expanded + fViewer.setAutoExpandLevel(-1); - fViewer.setFilters(filters); + fViewer.setFilters(filters); - // Create the listener which determines when the view is finished updating. - // fListener.reset(TreePath.EMPTY, model.getRootElement(), filters, -1, false, false); - fListener.reset(TreePath.EMPTY, model.getRootElement(), filters, -1, true, true); + // Create the listener which determines when the view is finished updating. + // fListener.reset(TreePath.EMPTY, model.getRootElement(), filters, -1, false, false); + fListener.reset(TreePath.EMPTY, model.getRootElement(), filters, -1, true, true); - // Set the viewer input (and trigger updates). - fViewer.setInput(model.getRootElement()); + // Set the viewer input (and trigger updates). + fViewer.setInput(model.getRootElement()); - // Wait for the updates to complete. + // Wait for the updates to complete. waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, false, filters); - } + model.validateData(fViewer, TreePath.EMPTY, false, filters); + } public void testLargeSingleLevel() throws Exception { doTestLargeSingleLevel(new ViewerFilter[] { new TestViewerFilter("2") }); //$NON-NLS-1$ - } + } public void testLargeSingleLevelWithTMVFilter() throws Exception { doTestLargeSingleLevel(new ViewerFilter[] { new TestTMVFilter("2", null) }); //$NON-NLS-1$ - } + } private void doTestLargeSingleLevel(ViewerFilter[] filters) throws Exception { - TestModel model = new TestModel(); + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 3000, "model.")); //$NON-NLS-1$ - // Set filters - fViewer.setFilters(filters); + // Set filters + fViewer.setFilters(filters); - fListener.setFailOnRedundantUpdates(false); - //fListener.setFailOnMultipleLabelUpdateSequences(false); - fListener.reset(); + fListener.setFailOnRedundantUpdates(false); + //fListener.setFailOnMultipleLabelUpdateSequences(false); + fListener.reset(); - fViewer.setInput(model.getRootElement()); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - } + } - /** - * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. - * Fire REPLACE delta. - */ + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire REPLACE delta. + */ public void testReplacedUnrealizedFilteredElement() throws Exception { doTestReplacedUnrealizedFilteredElement(new ViewerFilter[] { new TestViewerFilter("2") }); //$NON-NLS-1$ - } + } - /** - * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. - * Fire REPLACE delta. - */ + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire REPLACE delta. + */ public void testReplacedUnrealizedFilteredElementWithTMVFilter() throws Exception { doTestReplacedUnrealizedFilteredElement(new ViewerFilter[] { new TestTMVFilter("2", null) }); //$NON-NLS-1$ - } + } private void doTestReplacedUnrealizedFilteredElement(ViewerFilter[] filters) throws Exception { - // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). - TestModel model = new TestModel(); + // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 300, "model.")); //$NON-NLS-1$ - fViewer.setFilters(filters); + fViewer.setFilters(filters); - fListener.setFailOnRedundantUpdates(false); - fListener.reset(); + fListener.setFailOnRedundantUpdates(false); + fListener.reset(); - // Populate the view (all elements containing a "2" will be filtered out. - fViewer.setInput(model.getRootElement()); + // Populate the view (all elements containing a "2" will be filtered out. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Switch out element "201" which is filtered out, with a "replaced element" which should NOT be - // filtered out. + // Switch out element "201" which is filtered out, with a "replaced element" which should NOT be + // filtered out. TestElement replacedElement = new TestElement(model, "replaced element", new TestElement[0]); //$NON-NLS-1$ - IModelDelta replaceDelta = model.replaceElementChild(TreePath.EMPTY, 200, replacedElement); - fListener.reset(); - model.postDelta(replaceDelta); + IModelDelta replaceDelta = model.replaceElementChild(TreePath.EMPTY, 200, replacedElement); + fListener.reset(); + model.postDelta(replaceDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Reposition the viewer to make element 100 the top element, making the replaced element visible. - fListener.reset(); - fViewer.reveal(TreePath.EMPTY, 150); + // Reposition the viewer to make element 100 the top element, making the replaced element visible. + fListener.reset(); + fViewer.reveal(TreePath.EMPTY, 150); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Verify that the replaced element is in viewer now (i.e. it's not filtered out. - TreePath[] replacedElementPaths = fViewer.getElementPaths(replacedElement); - assertTrue(replacedElementPaths.length != 0); - } + // Verify that the replaced element is in viewer now (i.e. it's not filtered out. + TreePath[] replacedElementPaths = fViewer.getElementPaths(replacedElement); + assertTrue(replacedElementPaths.length != 0); + } public void testRefreshUnrealizedFilteredElement() throws Exception { doTestRefreshUnrealizedFilteredElement(new ViewerFilter[] { new TestViewerFilter("2") }); //$NON-NLS-1$ - } + } public void testRefreshUnrealizedFilteredElementWithTMVFilter() throws Exception { doTestRefreshUnrealizedFilteredElement(new ViewerFilter[] { new TestTMVFilter("2", null) }); //$NON-NLS-1$ - } + } - /** - * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. - * Fire CONTENT delta on parent. - */ + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire CONTENT delta on parent. + */ private void doTestRefreshUnrealizedFilteredElement(ViewerFilter[] filters) throws Exception { - // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). - TestModel model = new TestModel(); + // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, 300, "model.")); //$NON-NLS-1$ - fViewer.setFilters(filters); + fViewer.setFilters(filters); - fListener.setFailOnRedundantUpdates(false); - fListener.reset(); + fListener.setFailOnRedundantUpdates(false); + fListener.reset(); - // Populate the view (all elements containing a "2" will be filtered out. - fViewer.setInput(model.getRootElement()); + // Populate the view (all elements containing a "2" will be filtered out. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Switch out element "201" which is filtered out, with a "replaced element" which should NOT be - // filtered out. + // Switch out element "201" which is filtered out, with a "replaced element" which should NOT be + // filtered out. TestElement replacedElement = new TestElement(model, "replaced element", new TestElement[0]); //$NON-NLS-1$ - model.replaceElementChild(TreePath.EMPTY, 200, replacedElement); - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + model.replaceElementChild(TreePath.EMPTY, 200, replacedElement); + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Reposition the viewer to make element 100 the top element, making the replaced element visible. - fListener.reset(); - fViewer.reveal(TreePath.EMPTY, 150); + // Reposition the viewer to make element 100 the top element, making the replaced element visible. + fListener.reset(); + fViewer.reveal(TreePath.EMPTY, 150); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Verify that the replaced element is in viewer now (i.e. it's not filtered out. - TreePath[] replacedElementPaths = fViewer.getElementPaths(replacedElement); - assertTrue(replacedElementPaths.length != 0); - } + // Verify that the replaced element is in viewer now (i.e. it's not filtered out. + TreePath[] replacedElementPaths = fViewer.getElementPaths(replacedElement); + assertTrue(replacedElementPaths.length != 0); + } public void testRefreshToUnfilterElements() throws Exception { doTestRefreshToUnfilterElements(new ViewerFilter[] { new TestViewerFilter(".1"), new TestViewerFilter(".2") }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } public void testRefreshToUnfilterElementsWithTMVFilter() throws Exception { doTestRefreshToUnfilterElements(new ViewerFilter[] { new TestTMVFilter(".1", null), new TestTMVFilter(".2", null) }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } public void testRefreshToUnfilterElementsWithMixedFilters() throws Exception { doTestRefreshToUnfilterElements(new ViewerFilter[] { new TestViewerFilter(".1"), new TestTMVFilter(".2", null) }); //$NON-NLS-1$ //$NON-NLS-2$ - } + } - /** - * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. - * Fire CONTENT delta on parent. - */ + /** + * Replace an element that is not visible but filtered out. With an element that is NOT filtered out. + * Fire CONTENT delta on parent. + */ private void doTestRefreshToUnfilterElements(ViewerFilter[] filters) throws Exception { ViewerFilter[] filters1 = filters; - // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). - TestModel model = TestModel.simpleMultiLevel(); + // Populate a view with a large model (only first 100 elements will be visible in virtual viewer). + TestModel model = TestModel.simpleMultiLevel(); - fViewer.setFilters(filters); + fViewer.setFilters(filters); - fListener.setFailOnRedundantUpdates(false); - fListener.reset(); + fListener.setFailOnRedundantUpdates(false); + fListener.reset(); - // Make sure that all elements are expanded - fViewer.setAutoExpandLevel(-1); + // Make sure that all elements are expanded + fViewer.setAutoExpandLevel(-1); - // Populate the view (all elements containing a "2" will be filtered out. - fViewer.setInput(model.getRootElement()); + // Populate the view (all elements containing a "2" will be filtered out. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Turn off filters and refresh. + // Turn off filters and refresh. filters1 = new ViewerFilter[0]; fViewer.setFilters(filters1); - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); model.validateData(fViewer, TreePath.EMPTY, false, filters1); - } + } public void testPreserveExpandedOnMultLevelContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = StateTests.alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = StateTests.alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - StateTests.expandAlternateElements(fListener, model, true); + StateTests.expandAlternateElements(fListener, model, true); - // Set a selection in view - // Set a selection in view - TreeSelection originalSelection = new TreeSelection( + // Set a selection in view + // Set a selection in view + TreeSelection originalSelection = new TreeSelection( new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findElement("6") }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - fViewer.setSelection(originalSelection); - assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + fViewer.setSelection(originalSelection); + assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Set a filter to remove element "1" + // Set a filter to remove element "1" ViewerFilter[] filters = new ViewerFilter[] { new TestViewerFilter("^1$") }; //$NON-NLS-1$ - fViewer.setFilters(filters); + fViewer.setFilters(filters); - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), filters, -1, ALL_UPDATES_COMPLETE); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), filters, -1, ALL_UPDATES_COMPLETE); - // Post the refresh delta - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Post the refresh delta + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true, filters); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true, filters); assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -364,24 +364,24 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Note: in past it was observed sub-optimal coalescing in this test due - // to scattered update requests from viewer. - assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); + // Note: in past it was observed sub-optimal coalescing in this test due + // to scattered update requests from viewer. + assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 6) ); - // Clear the filter, to re-add the element - filters = new ViewerFilter[0]; - fViewer.setFilters(filters); + // Clear the filter, to re-add the element + filters = new ViewerFilter[0]; + fViewer.setFilters(filters); - // Refresh again to get the filtered element back - fListener.reset(); - fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), filters, -1, ALL_UPDATES_COMPLETE); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh again to get the filtered element back + fListener.reset(); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), filters, -1, ALL_UPDATES_COMPLETE); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true, filters); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true, filters); assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -389,8 +389,8 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + assertTrue( StateTests.areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java index d195e59fd..332723b61 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/ITestModelUpdatesListenerConstants.java @@ -20,35 +20,35 @@ package org.eclipse.debug.tests.viewer.model; */ public interface ITestModelUpdatesListenerConstants { - int LABEL_SEQUENCE_COMPLETE = 0X00000001; - int CONTENT_SEQUENCE_COMPLETE = 0X00000002; - int CONTENT_SEQUENCE_STARTED = 0X00020000; - int LABEL_UPDATES = 0X00000004; - int LABEL_SEQUENCE_STARTED = 0X00040000; - int HAS_CHILDREN_UPDATES = 0X00000008; - int HAS_CHILDREN_UPDATES_STARTED = 0X00080000; - int CHILD_COUNT_UPDATES = 0X00000010; - int CHILD_COUNT_UPDATES_STARTED = 0X00100000; - int CHILDREN_UPDATES = 0X00000020; - int CHILDREN_UPDATES_STARTED = 0X00200000; - int CHILDREN_UPDATES_RUNNING = 0X00400000; - int MODEL_CHANGED_COMPLETE = 0X00000040; - int MODEL_PROXIES_INSTALLED = 0X00000080; - int STATE_SAVE_COMPLETE = 0X00000100; - int STATE_SAVE_STARTED = 0X01000000; - int STATE_RESTORE_COMPLETE = 0X00000200; - int STATE_RESTORE_STARTED = 0X02000000; - int STATE_UPDATES = 0X00000400; - int STATE_UPDATES_STARTED = 0X04000000; + int LABEL_SEQUENCE_COMPLETE = 0X00000001; + int CONTENT_SEQUENCE_COMPLETE = 0X00000002; + int CONTENT_SEQUENCE_STARTED = 0X00020000; + int LABEL_UPDATES = 0X00000004; + int LABEL_SEQUENCE_STARTED = 0X00040000; + int HAS_CHILDREN_UPDATES = 0X00000008; + int HAS_CHILDREN_UPDATES_STARTED = 0X00080000; + int CHILD_COUNT_UPDATES = 0X00000010; + int CHILD_COUNT_UPDATES_STARTED = 0X00100000; + int CHILDREN_UPDATES = 0X00000020; + int CHILDREN_UPDATES_STARTED = 0X00200000; + int CHILDREN_UPDATES_RUNNING = 0X00400000; + int MODEL_CHANGED_COMPLETE = 0X00000040; + int MODEL_PROXIES_INSTALLED = 0X00000080; + int STATE_SAVE_COMPLETE = 0X00000100; + int STATE_SAVE_STARTED = 0X01000000; + int STATE_RESTORE_COMPLETE = 0X00000200; + int STATE_RESTORE_STARTED = 0X02000000; + int STATE_UPDATES = 0X00000400; + int STATE_UPDATES_STARTED = 0X04000000; - int VIEWER_UPDATES_RUNNING = 0X00001000; - int LABEL_UPDATES_RUNNING = 0X00002000; + int VIEWER_UPDATES_RUNNING = 0X00001000; + int LABEL_UPDATES_RUNNING = 0X00002000; - int ALL_VIEWER_UPDATES_STARTED = HAS_CHILDREN_UPDATES_STARTED | CHILD_COUNT_UPDATES_STARTED | CHILDREN_UPDATES_STARTED; + int ALL_VIEWER_UPDATES_STARTED = HAS_CHILDREN_UPDATES_STARTED | CHILD_COUNT_UPDATES_STARTED | CHILDREN_UPDATES_STARTED; - int LABEL_COMPLETE = LABEL_SEQUENCE_COMPLETE | LABEL_UPDATES | LABEL_UPDATES_RUNNING; - int CONTENT_COMPLETE = - CONTENT_SEQUENCE_COMPLETE | HAS_CHILDREN_UPDATES | CHILD_COUNT_UPDATES | CHILDREN_UPDATES | VIEWER_UPDATES_RUNNING; + int LABEL_COMPLETE = LABEL_SEQUENCE_COMPLETE | LABEL_UPDATES | LABEL_UPDATES_RUNNING; + int CONTENT_COMPLETE = + CONTENT_SEQUENCE_COMPLETE | HAS_CHILDREN_UPDATES | CHILD_COUNT_UPDATES | CHILDREN_UPDATES | VIEWER_UPDATES_RUNNING; - int ALL_UPDATES_COMPLETE = LABEL_COMPLETE | CONTENT_COMPLETE | MODEL_PROXIES_INSTALLED | LABEL_UPDATES_RUNNING | VIEWER_UPDATES_RUNNING; + int ALL_UPDATES_COMPLETE = LABEL_COMPLETE | CONTENT_COMPLETE | MODEL_PROXIES_INSTALLED | LABEL_UPDATES_RUNNING | VIEWER_UPDATES_RUNNING; } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerCheckTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerCheckTests.java index c596da581..21e849d19 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerCheckTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerCheckTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerCheckTests extends CheckTests { - public JFaceViewerCheckTests(String name) { - super(name); - } + public JFaceViewerCheckTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL | SWT.CHECK, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerContentTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerContentTests.java index 85b8f32ca..53feebda2 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerContentTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerContentTests extends ContentTests { - public JFaceViewerContentTests(String name) { - super(name); - } + public JFaceViewerContentTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerDeltaTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerDeltaTests.java index 356c20a46..5bfa72a37 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerDeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerDeltaTests.java @@ -26,19 +26,19 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerDeltaTests extends DeltaTests { - public JFaceViewerDeltaTests(String name) { - super(name); - } + public JFaceViewerDeltaTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } - /** - * TODO: remove this method when bug 292322 gets fixed in TreeViewer - */ - @Override + /** + * TODO: remove this method when bug 292322 gets fixed in TreeViewer + */ + @Override public void testBug292322() { - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerFilterTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerFilterTests.java index e4d8d8d6a..e120aa4c9 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerFilterTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerFilterTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerFilterTests extends FilterTests { - public JFaceViewerFilterTests(String name) { - super(name); - } + public JFaceViewerFilterTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL | SWT.MULTI, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerLazyTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerLazyTests.java index 271c9f2a3..9d042f74b 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerLazyTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerLazyTests.java @@ -25,12 +25,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerLazyTests extends LazyTests { - public JFaceViewerLazyTests(String name) { - super(name); - } + public JFaceViewerLazyTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPerformanceTests.java index 9a855265d..ed4b6815f 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPerformanceTests.java @@ -25,17 +25,17 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerPerformanceTests extends PerformanceTests { - public JFaceViewerPerformanceTests(String name) { - super(name); - } + public JFaceViewerPerformanceTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } - @Override + @Override protected int getTestModelDepth() { - return 5; - } + return 5; + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPopupTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPopupTests.java index 221e68def..eda0e22a3 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPopupTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerPopupTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerPopupTests extends PopupTests { - public JFaceViewerPopupTests(String name) { - super(name); - } + public JFaceViewerPopupTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell, int style) { return new TreeModelViewer(fShell, SWT.VIRTUAL | style, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerSelectionTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerSelectionTests.java index e60f5cadb..b520b9b31 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerSelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerSelectionTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerSelectionTests extends SelectionTests { - public JFaceViewerSelectionTests(String name) { - super(name); - } + public JFaceViewerSelectionTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerStateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerStateTests.java index 46e1fd6b2..ef8b08746 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerStateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerStateTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerStateTests extends StateTests { - public JFaceViewerStateTests(String name) { - super(name); - } + public JFaceViewerStateTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL | SWT.MULTI, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerTopIndexTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerTopIndexTests.java index 05415e6c2..d0ffc8645 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerTopIndexTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerTopIndexTests.java @@ -35,9 +35,9 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerTopIndexTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public JFaceViewerTopIndexTests(String name) { - super(name); - } + public JFaceViewerTopIndexTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { @@ -46,445 +46,445 @@ public class JFaceViewerTopIndexTests extends AbstractViewerModelTest implements protected final TreeModelViewer getCTargetViewer() { return (TreeModelViewer) fViewer; - } - - /** - * @param display the display - * @param shell the shell - * @return the new viewer - */ - @Override + } + + /** + * @param display the display + * @param shell the shell + * @return the new viewer + */ + @Override protected TreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL | SWT.MULTI, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } - /** - * Restore REVEAL on simple model with elements without children. - * - */ + /** + * Restore REVEAL on simple model with elements without children. + * + */ public void testRestoreTopIndex() throws Exception { TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - TestModel model = new TestModel(); + TestModel model = new TestModel(); - TestElement[] elements = new TestElement[8]; - for (int i = 0; i < elements.length; i++) { - String text = Integer.toString(i + 1); - // elements don't have children - elements[i] = - new TestElement(model, text, new TestElement[0] ); + TestElement[] elements = new TestElement[8]; + for (int i = 0; i < elements.length; i++) { + String text = Integer.toString(i + 1); + // elements don't have children + elements[i] = + new TestElement(model, text, new TestElement[0] ); - } + } model.setRoot(new TestElement(model, "root", elements)); //$NON-NLS-1$ - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Stop forcing view updates. - autopopulateAgent.dispose(); + // Stop forcing view updates. + autopopulateAgent.dispose(); - // scroll to the 5th element - int indexRevealElem = 4; - getCTargetViewer().reveal(TreePath.EMPTY, indexRevealElem); + // scroll to the 5th element + int indexRevealElem = 4; + getCTargetViewer().reveal(TreePath.EMPTY, indexRevealElem); TestUtil.processUIEvents(); - final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); + final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", originalTopPath); //$NON-NLS-1$ - // Bug 116105: On a Mac the reveal call is not reliable. Use the viewer returned path instead. - // assertEquals(elements[indexRevealElem], originalTopPath.getLastSegment()); + // Bug 116105: On a Mac the reveal call is not reliable. Use the viewer returned path instead. + // assertEquals(elements[indexRevealElem], originalTopPath.getLastSegment()); - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(true, false); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); + fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - // Set the viewer input back to the model to trigger RESTORE operation. - fListener.reset(false, false); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model to trigger RESTORE operation. + fListener.reset(false, false); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); TestUtil.processUIEvents(); - // check if REVEAL was restored OK - final TreePath topPath = getCTargetViewer().getTopElementPath(); + // check if REVEAL was restored OK + final TreePath topPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", topPath); //$NON-NLS-1$ - TreePathWrapper.assertEqual(originalTopPath, topPath); - } - - /** - * Restore REVEAL when having also to restore an expanded element - * that is just above the REVEAL element. - * - * See bug 324100 - */ + TreePathWrapper.assertEqual(originalTopPath, topPath); + } + + /** + * Restore REVEAL when having also to restore an expanded element + * that is just above the REVEAL element. + * + * See bug 324100 + */ public void testRestoreTopAndExpand() throws Exception { TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - TestModel model = new TestModel(); + TestModel model = new TestModel(); - TestElement[] elements = new TestElement[10]; - for (int i = 0; i < elements.length; i++) { - String text = Integer.toString(i + 1); - // first element has 2 children - if (i == 0) { - elements[i] = - new TestElement(model, text, new TestElement[] { + TestElement[] elements = new TestElement[10]; + for (int i = 0; i < elements.length; i++) { + String text = Integer.toString(i + 1); + // first element has 2 children + if (i == 0) { + elements[i] = + new TestElement(model, text, new TestElement[] { new TestElement(model, text + ".1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, text + ".2", new TestElement[0]) //$NON-NLS-1$ - }); - } else { - // rest of elements don't have children - elements[i] = - new TestElement(model, text, new TestElement[0] ); - } - - } + }); + } else { + // rest of elements don't have children + elements[i] = + new TestElement(model, text, new TestElement[0] ); + } + + } model.setRoot(new TestElement(model, "root", elements)); //$NON-NLS-1$ - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); - - // Expand first element - fListener.reset(); - fListener.setFailOnRedundantUpdates(false); - int indexFirstElem = 0; - TestElement firstElem = elements[indexFirstElem]; - ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - ModelDelta delta = model.getBaseDelta(rootDelta); - TreePath firstElemPath = model.findElement(firstElem.getLabel()); - fListener.addUpdates( - firstElemPath, firstElem, 1, - CHILD_COUNT_UPDATES | CHILDREN_UPDATES ); - delta.addNode(firstElem, indexFirstElem, IModelDelta.EXPAND, firstElem.getChildren().length); - - model.postDelta(rootDelta); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Expand first element + fListener.reset(); + fListener.setFailOnRedundantUpdates(false); + int indexFirstElem = 0; + TestElement firstElem = elements[indexFirstElem]; + ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + ModelDelta delta = model.getBaseDelta(rootDelta); + TreePath firstElemPath = model.findElement(firstElem.getLabel()); + fListener.addUpdates( + firstElemPath, firstElem, 1, + CHILD_COUNT_UPDATES | CHILDREN_UPDATES ); + delta.addNode(firstElem, indexFirstElem, IModelDelta.EXPAND, firstElem.getChildren().length); + + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Validate that the first node is expanded - assertTrue(getCTargetViewer().getExpandedState(firstElemPath) == true); + // Validate that the first node is expanded + assertTrue(getCTargetViewer().getExpandedState(firstElemPath) == true); - // Stop forcing view updates. - autopopulateAgent.dispose(); + // Stop forcing view updates. + autopopulateAgent.dispose(); - // scroll to the 2nd element - getCTargetViewer().reveal(TreePath.EMPTY, 1); + // scroll to the 2nd element + getCTargetViewer().reveal(TreePath.EMPTY, 1); TestUtil.processUIEvents(); - final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); + final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", originalTopPath); //$NON-NLS-1$ - // Bug 116105: On a Mac the reveal call is not reliable. Use the viewer returned path instead. - //assertEquals(elements[1], originalTopPath.getLastSegment()); + // Bug 116105: On a Mac the reveal call is not reliable. Use the viewer returned path instead. + //assertEquals(elements[1], originalTopPath.getLastSegment()); - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(true, false); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); + fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE), createListenerErrorMessage()); - // Set the viewer input back to the model - fListener.reset(false, false); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model + fListener.reset(false, false); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); TestUtil.processUIEvents(); - // check if REVEAL was restored OK - final TreePath topPath = getCTargetViewer().getTopElementPath(); + // check if REVEAL was restored OK + final TreePath topPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", topPath); //$NON-NLS-1$ - TreePathWrapper.assertEqual(originalTopPath, topPath); - } - - /** - * Restore REVEAL when this operation triggers restoring of an expanded - * element. - * - * See bug 324100 - */ + TreePathWrapper.assertEqual(originalTopPath, topPath); + } + + /** + * Restore REVEAL when this operation triggers restoring of an expanded + * element. + * + * See bug 324100 + */ public void testRestoreTopTriggersExpand() throws Exception { TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - TestModel model = new TestModel(); + TestModel model = new TestModel(); - TestElement[] elements = new TestElement[10]; - for (int i = 0; i < elements.length; i++) { - String text = Integer.toString(i + 1); - // last element has 2 children - if (i == elements.length - 1) { - elements[i] = - new TestElement(model, text, new TestElement[] { + TestElement[] elements = new TestElement[10]; + for (int i = 0; i < elements.length; i++) { + String text = Integer.toString(i + 1); + // last element has 2 children + if (i == elements.length - 1) { + elements[i] = + new TestElement(model, text, new TestElement[] { new TestElement(model, text + ".1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, text + ".2", new TestElement[0]) //$NON-NLS-1$ - }); - } else { - // rest of elements don't have children - elements[i] = - new TestElement(model, text, new TestElement[0] ); - } + }); + } else { + // rest of elements don't have children + elements[i] = + new TestElement(model, text, new TestElement[0] ); + } - } + } - fViewer.setAutoExpandLevel(-1); + fViewer.setAutoExpandLevel(-1); model.setRoot(new TestElement(model, "root", elements)); //$NON-NLS-1$ - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - int indexLastElem = elements.length-1; - TestElement lastElem = elements[indexLastElem]; - TreePath lastElemePath = model.findElement(lastElem.getLabel()); + int indexLastElem = elements.length-1; + TestElement lastElem = elements[indexLastElem]; + TreePath lastElemePath = model.findElement(lastElem.getLabel()); - // Validate that the last node is expanded - assertTrue(getCTargetViewer().getExpandedState(lastElemePath) == true); + // Validate that the last node is expanded + assertTrue(getCTargetViewer().getExpandedState(lastElemePath) == true); - // Stop forcing view updates. - fViewer.setAutoExpandLevel(0); - autopopulateAgent.dispose(); + // Stop forcing view updates. + fViewer.setAutoExpandLevel(0); + autopopulateAgent.dispose(); - // scroll to the element before last element - getCTargetViewer().reveal(TreePath.EMPTY, indexLastElem-1); + // scroll to the element before last element + getCTargetViewer().reveal(TreePath.EMPTY, indexLastElem-1); TestUtil.processUIEvents(); - final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); + final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", originalTopPath); //$NON-NLS-1$ - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(true, false); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); + fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - // Set the viewer input back to the model. - fListener.reset(false, false); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. + fListener.reset(false, false); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); TestUtil.processUIEvents(); - // check if REVEAL was restored OK - final TreePath topPath = getCTargetViewer().getTopElementPath(); + // check if REVEAL was restored OK + final TreePath topPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", topPath); //$NON-NLS-1$ - TreePathWrapper.assertEqual(originalTopPath, topPath); - } - - /** - * Test for bug 326965.<br> - * This test verifies that canceling a reveal pending state delta is - * properly handled when a new reveal delta is received from the model. - */ + TreePathWrapper.assertEqual(originalTopPath, topPath); + } + + /** + * Test for bug 326965.<br> + * This test verifies that canceling a reveal pending state delta is + * properly handled when a new reveal delta is received from the model. + */ public void testRestoreRevealAfterRevealCancel() throws Exception { TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Stop autopopulating the view. - autopopulateAgent.dispose(); + // Stop autopopulating the view. + autopopulateAgent.dispose(); - // Set top index of view to element "3" and wait for view to repaint. - getCTargetViewer().reveal(TreePath.EMPTY, 2); + // Set top index of view to element "3" and wait for view to repaint. + getCTargetViewer().reveal(TreePath.EMPTY, 2); TestUtil.processUIEvents(); - // Trigger save of state. - fListener.reset(); - fViewer.setInput(null); - while (!fListener.isFinished(STATE_SAVE_COMPLETE)) { + // Trigger save of state. + fListener.reset(); + fViewer.setInput(null); + while (!fListener.isFinished(STATE_SAVE_COMPLETE)) { Thread.sleep(0); } - // Set input back to root element. - // Note: Wait only for the processing of the delta and the start of state restore, not for all updates - fListener.reset(); + // Set input back to root element. + // Note: Wait only for the processing of the delta and the start of state restore, not for all updates + fListener.reset(); TreePath elementPath = model.findElement("3"); //$NON-NLS-1$ - fListener.addUpdates(fViewer, elementPath, model.getElement(elementPath), 1, STATE_UPDATES); - fViewer.setInput(model.getRootElement()); + fListener.addUpdates(fViewer, elementPath, model.getElement(elementPath), 1, STATE_UPDATES); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - // Update the viewer with new selection delta to something new in the view + // Update the viewer with new selection delta to something new in the view ModelDelta revealDelta = model.makeElementDelta(model.findElement("2.1"), IModelDelta.REVEAL); //$NON-NLS-1$ - // Wait for the second model delta to process - fListener.reset(); - model.postDelta(revealDelta); + // Wait for the second model delta to process + fListener.reset(); + model.postDelta(revealDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Clear view then reset it again. - fListener.reset(); - fViewer.setInput(null); - while (!fListener.isFinished(STATE_SAVE_COMPLETE)) { + // Clear view then reset it again. + fListener.reset(); + fViewer.setInput(null); + while (!fListener.isFinished(STATE_SAVE_COMPLETE)) { Thread.sleep(0); } autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - fViewer.setInput(model.getRootElement()); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - autopopulateAgent.dispose(); - } - - /** - * Test for bug 326965.<br> - * This test verifies that canceling a reveal pending state delta is - * properly handled when a new reveal delta is received from the model. - */ + autopopulateAgent.dispose(); + } + + /** + * Test for bug 326965.<br> + * This test verifies that canceling a reveal pending state delta is + * properly handled when a new reveal delta is received from the model. + */ public void testRestoreRevealAfterRevealCancel2() throws Exception { - if (Platform.getOS().equals(Platform.OS_MACOSX)) { - // skip this test on Mac - see bug 327557 - return; - } + if (Platform.getOS().equals(Platform.OS_MACOSX)) { + // skip this test on Mac - see bug 327557 + return; + } TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Stop auto-populating and auto-expanding the view. - fViewer.setAutoExpandLevel(0); - autopopulateAgent.dispose(); + // Stop auto-populating and auto-expanding the view. + fViewer.setAutoExpandLevel(0); + autopopulateAgent.dispose(); - // Set top index of view to element "3" and wait for view to repaint. - getCTargetViewer().reveal(TreePath.EMPTY, 2); + // Set top index of view to element "3" and wait for view to repaint. + getCTargetViewer().reveal(TreePath.EMPTY, 2); TestUtil.processUIEvents(); - // Trigger save of state. - fListener.reset(); - fViewer.setInput(null); - while (!fListener.isFinished(STATE_SAVE_COMPLETE)) { + // Trigger save of state. + fListener.reset(); + fViewer.setInput(null); + while (!fListener.isFinished(STATE_SAVE_COMPLETE)) { Thread.sleep(0); } - // Set input back to root element. - // Note: Wait only for the processing of the delta and the start of state restore, not for all updates - fListener.reset(); + // Set input back to root element. + // Note: Wait only for the processing of the delta and the start of state restore, not for all updates + fListener.reset(); TreePath elementPath = model.findElement("2"); //$NON-NLS-1$ - fListener.addUpdates(fViewer, elementPath, model.getElement(elementPath), 1, STATE_UPDATES | CHILDREN_UPDATES | LABEL_UPDATES); + fListener.addUpdates(fViewer, elementPath, model.getElement(elementPath), 1, STATE_UPDATES | CHILDREN_UPDATES | LABEL_UPDATES); elementPath = model.findElement("3"); //$NON-NLS-1$ - fListener.addUpdates(fViewer, elementPath, model.getElement(elementPath), 0, STATE_UPDATES); - fViewer.setInput(model.getRootElement()); + fListener.addUpdates(fViewer, elementPath, model.getElement(elementPath), 0, STATE_UPDATES); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(STATE_UPDATES), createListenerErrorMessage()); - // Update the viewer with new selection delta to something new in the view + // Update the viewer with new selection delta to something new in the view TreePath pathToBeRevealed = model.findElement("2.1"); //$NON-NLS-1$ - ModelDelta revealDelta = model.makeElementDelta(pathToBeRevealed, IModelDelta.REVEAL); - revealDelta.accept(new IModelDeltaVisitor() { + ModelDelta revealDelta = model.makeElementDelta(pathToBeRevealed, IModelDelta.REVEAL); + revealDelta.accept(new IModelDeltaVisitor() { - @Override + @Override public boolean visit(IModelDelta delta, int depth) { - ((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.EXPAND); - return true; - } - }); + ((ModelDelta)delta).setFlags(delta.getFlags() | IModelDelta.EXPAND); + return true; + } + }); - // Wait for the second model delta to process - model.postDelta(revealDelta); + // Wait for the second model delta to process + model.postDelta(revealDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_UPDATES | LABEL_UPDATES), createListenerErrorMessage()); - // check if REVEAL was triggered by the delta and not by the - // state restore operation - TreePath topPath = getCTargetViewer().getTopElementPath(); + // check if REVEAL was triggered by the delta and not by the + // state restore operation + TreePath topPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", topPath); //$NON-NLS-1$ - TreePathWrapper.assertEqual(pathToBeRevealed, topPath); - } + TreePathWrapper.assertEqual(pathToBeRevealed, topPath); + } - /** - * Restore REVEAL when having also to restore an expanded element - * that is just above the REVEAL element. - * - * See bug 324100 - */ + /** + * Restore REVEAL when having also to restore an expanded element + * that is just above the REVEAL element. + * + * See bug 324100 + */ public void testRestoreDeepTreeAndReveal() throws Exception { TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(getCTargetViewer()); - TestModel model = TestModel.simpleDeepMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleDeepMultiLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Stop forcing view updates. - autopopulateAgent.dispose(); + // Stop forcing view updates. + autopopulateAgent.dispose(); - // Scroll down to the last part of the tree. + // Scroll down to the last part of the tree. getCTargetViewer().reveal(model.findElement("3.6.3.16.16.16.16.16"), 1); //$NON-NLS-1$ TestUtil.processUIEvents(); - final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); + final TreePath originalTopPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", originalTopPath); //$NON-NLS-1$ - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(true, false); - fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); + fListener.addStateUpdates(getCTargetViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE), createListenerErrorMessage()); - // Set the viewer input back to the model - fListener.reset(false, false); - fListener.addUpdates(getCTargetViewer(), originalTopPath, (TestElement)originalTopPath.getLastSegment(), 0, STATE_UPDATES); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model + fListener.reset(false, false); + fListener.addUpdates(getCTargetViewer(), originalTopPath, (TestElement)originalTopPath.getLastSegment(), 0, STATE_UPDATES); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(STATE_UPDATES | CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); TestUtil.processUIEvents(); - // check if REVEAL was restored OK - final TreePath topPath = getCTargetViewer().getTopElementPath(); + // check if REVEAL was restored OK + final TreePath topPath = getCTargetViewer().getTopElementPath(); assertNotNull("Top item should not be null!", topPath); //$NON-NLS-1$ - TreePathWrapper.assertEqual(originalTopPath, topPath); + TreePathWrapper.assertEqual(originalTopPath, topPath); - } + } /** * This test verifies that a revealed node does not get scrolled away due to diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerUpdateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerUpdateTests.java index 67193e40d..4a1d39f9e 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerUpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/JFaceViewerUpdateTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class JFaceViewerUpdateTests extends UpdateTests { - public JFaceViewerUpdateTests(String name) { - super(name); - } + public JFaceViewerUpdateTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new TreeModelViewer(fShell, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/LazyTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/LazyTests.java index d874b6625..2819182c2 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/LazyTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/LazyTests.java @@ -30,187 +30,187 @@ import org.eclipse.jface.viewers.TreeSelection; */ abstract public class LazyTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public LazyTests(String name) { - super(name); - } + public LazyTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, true, true); } - /** - * 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++) { + /** + * 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]); //$NON-NLS-1$ - } + } TestElement element = new TestElement(model, "1", children); //$NON-NLS-1$ model.setRoot(new TestElement(model, "root", new TestElement[] { element })); //$NON-NLS-1$ - return model; - } + return model; + } - /** - * Test to make sure that if an element is expanded its children are - * not automatically materialized. - * (bug 305739 and bug 304277) - */ + /** + * Test to make sure that if an element is expanded its children are + * not automatically materialized. + * (bug 305739 and bug 304277) + */ public void testExpandLargeSubTree() throws Exception { - // Create test model with lots of children. - TestModel model = largeSubtreeModel(1000); + // Create test model with lots of children. + TestModel model = largeSubtreeModel(1000); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Populate initial view content - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, true); - fViewer.setInput(model.getRootElement()); + // Populate initial view content + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, true); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // 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); + // 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); + // Add first 250 elements as acceptable to materialize + fListener.reset(); + fListener.setFailOnRedundantUpdates(true); TreePath expandElementPath = model.findElement("1"); //$NON-NLS-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); + 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); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE | LABEL_SEQUENCE_COMPLETE), createListenerErrorMessage()); - } + } - /** - * 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). - */ + /** + * 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() throws Exception { - // 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(); - fListener.setFailOnMultipleModelUpdateSequences(true); - fListener.setFailOnRedundantUpdates(false); - fViewer.setInput(model.getRootElement()); + // 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(); + fListener.setFailOnMultipleModelUpdateSequences(true); + fListener.setFailOnRedundantUpdates(false); + fViewer.setInput(model.getRootElement()); fListener.addLabelUpdate(model.findElement("1.0")); //$NON-NLS-1$ waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_COMPLETE), createListenerErrorMessage()); - // Set selection so that the initial selection is not empty + // Set selection so that the initial selection is not empty fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("1.0") })); //$NON-NLS-1$ - // 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); + // 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. + // Add the delta to select the "1.1" element. TestElement _1_0_newElement = new TestElement(model, "1.0 - new", new TestElement[0]); //$NON-NLS-1$ TreePath _1ElementPath = model.findElement("1"); //$NON-NLS-1$ - model.replaceElementChild(_1ElementPath, 0, _1_0_newElement); - _1Delta.addNode(_1_0_newElement, 0, IModelDelta.SELECT); + 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); + // Add element label update and post the delta + fListener.reset(); + fListener.setFailOnRedundantUpdates(true); TreePath _1_0_newElementPath = model.findElement("1.0 - new"); //$NON-NLS-1$ - fListener.addLabelUpdate(_1_0_newElementPath); - model.postDelta(rootDelta); + fListener.addLabelUpdate(_1_0_newElementPath); + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | LABEL_COMPLETE), createListenerErrorMessage()); - assertEquals(((IStructuredSelection)fViewer.getSelection()).getFirstElement(), _1_0_newElement); - } + assertEquals(((IStructuredSelection)fViewer.getSelection()).getFirstElement(), _1_0_newElement); + } - /** - */ + /** + */ public void testContentRefresh() throws Exception { - // Create test model with lots of children. - TestModel model = largeSubtreeModel(1000); + // Create test model with lots of children. + TestModel model = largeSubtreeModel(1000); - // Expand children all - fViewer.setAutoExpandLevel(-1); + // Expand children all + fViewer.setAutoExpandLevel(-1); - // Populate initial view content - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); - fViewer.setInput(model.getRootElement()); + // Populate initial view content + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, true); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Turn off autoexpand - fViewer.setAutoExpandLevel(0); + // Turn off autoexpand + fViewer.setAutoExpandLevel(0); - // Reposition the viewer to middle of list - fListener.reset(); - fListener.setFailOnRedundantUpdates(false); + // Reposition the viewer to middle of list + fListener.reset(); + fListener.setFailOnRedundantUpdates(false); fViewer.reveal(model.findElement("1"), 500); //$NON-NLS-1$ waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Create delta to refresh 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.CONTENT, expandElement.getChildren().length); - - // Rinse and repeast. The refresh in bug 335734 is only triggered - // only on the second time. - for (int repeatCount = 0; repeatCount < 3; repeatCount++) { - // Add first 250 elements (after element 500) as acceptable to materialize - fListener.reset(); - fListener.setFailOnRedundantUpdates(true); + // Create delta to refresh 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.CONTENT, expandElement.getChildren().length); + + // Rinse and repeast. The refresh in bug 335734 is only triggered + // only on the second time. + for (int repeatCount = 0; repeatCount < 3; repeatCount++) { + // Add first 250 elements (after element 500) as acceptable to materialize + fListener.reset(); + fListener.setFailOnRedundantUpdates(true); TreePath refreshElementPath = model.findElement("1"); //$NON-NLS-1$ - fListener.addRedundantExceptionChildCount(refreshElementPath); - fListener.addRedundantExceptionLabel(refreshElementPath); - fListener.addChildreUpdate(TreePath.EMPTY, 0); - fListener.addHasChildrenUpdate(refreshElementPath); - fListener.addChildreCountUpdate(refreshElementPath); - fListener.addLabelUpdate(refreshElementPath); // TODO: not sure why label is updated upon expand? - for (int i = 499; i < 750; i++) { - fListener.addChildreUpdate(refreshElementPath, i); - TreePath childPath = refreshElementPath.createChildPath(expandElement.getChildren()[i]); - fListener.addLabelUpdate(childPath); - fListener.addHasChildrenUpdate(childPath); - } - model.postDelta(rootDelta); - - while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE)) { + fListener.addRedundantExceptionChildCount(refreshElementPath); + fListener.addRedundantExceptionLabel(refreshElementPath); + fListener.addChildreUpdate(TreePath.EMPTY, 0); + fListener.addHasChildrenUpdate(refreshElementPath); + fListener.addChildreCountUpdate(refreshElementPath); + fListener.addLabelUpdate(refreshElementPath); // TODO: not sure why label is updated upon expand? + for (int i = 499; i < 750; i++) { + fListener.addChildreUpdate(refreshElementPath, i); + TreePath childPath = refreshElementPath.createChildPath(expandElement.getChildren()[i]); + fListener.addLabelUpdate(childPath); + fListener.addHasChildrenUpdate(childPath); + } + model.postDelta(rootDelta); + + while (!fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE)) { if (!fDisplay.readAndDispatch ()) { Thread.sleep(0); } } - } - } + } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PerformanceTests.java index df7de31e3..148291e7e 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PerformanceTests.java @@ -32,11 +32,11 @@ abstract public class PerformanceTests extends AbstractViewerModelTest implement protected VisibleVirtualItemValidator fVirtualItemValidator; - public PerformanceTests(String name) { - super(name); - } + public PerformanceTests(String name) { + super(name); + } - @Override + @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, false, false); } @@ -45,287 +45,287 @@ abstract public class PerformanceTests extends AbstractViewerModelTest implement protected void setUp() throws Exception { super.setUp(); fVirtualItemValidator = new VisibleVirtualItemValidator(0, Integer.MAX_VALUE); - } + } - /** - * Depth (size) of the test model to be used in the tests. This number allows - * the jface based tests to use a small enough model to fit on the screen, and - * for the virtual viewer to exercise the content provider to a greater extent. - */ - abstract protected int getTestModelDepth(); + /** + * Depth (size) of the test model to be used in the tests. This number allows + * the jface based tests to use a small enough model to fit on the screen, and + * for the virtual viewer to exercise the content provider to a greater extent. + */ + abstract protected int getTestModelDepth(); public void testRefreshStruct() throws Exception { - TestModel model = new TestModel(); + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements(model, getTestModelDepth(), "model.")); //$NON-NLS-1$ - fViewer.setAutoExpandLevel(-1); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - Performance perf = Performance.getDefault(); - PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); - try { - for (int i = 0; i < 10; i++) { - // Update the model + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 10; i++) { + // Update the model model.setAllAppendix(" - pass " + i); //$NON-NLS-1$ - TestElement element = model.getRootElement(); - fListener.reset(TreePath.EMPTY, element, -1, false, false); + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); - meter.start(); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - meter.stop(); - System.gc(); - } - - meter.commit(); - perf.assertPerformance(meter); - } finally { - meter.dispose(); - } - } + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + } public void testRefreshStruct2() throws Exception { - TestModel model = new TestModel(); + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements2(model, new int[] { 2, 3000, 1 }, "model.")); //$NON-NLS-1$ - fViewer.setAutoExpandLevel(2); - // Create the listener - //fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - fListener.reset(); + fViewer.setAutoExpandLevel(2); + // Create the listener + //fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + fListener.reset(); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - fVirtualItemValidator.setVisibleRange(0, 50); + fVirtualItemValidator.setVisibleRange(0, 50); - Performance perf = Performance.getDefault(); - PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); - try { - for (int i = 0; i < 100; i++) { - // Update the model + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model model.setAllAppendix(" - pass " + i); //$NON-NLS-1$ - TestElement element = model.getRootElement(); - //fListener.reset(TreePath.EMPTY, element, -1, false, false); - fListener.reset(); + TestElement element = model.getRootElement(); + //fListener.reset(TreePath.EMPTY, element, -1, false, false); + fListener.reset(); - meter.start(); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - meter.stop(); - System.gc(); - } - - meter.commit(); - perf.assertPerformance(meter); - } finally { - meter.dispose(); - } - } + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + } public void testRefreshStructReplaceElements() throws Exception { - TestModel model = new TestModel(); + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements(model, getTestModelDepth(), "model.")); //$NON-NLS-1$ - fViewer.setAutoExpandLevel(-1); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - Performance perf = Performance.getDefault(); - PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); - try { - for (int i = 0; i < 100; i++) { - // Update the model + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model model.setElementChildren(TreePath.EMPTY, TestModel.makeMultiLevelElements(model, getTestModelDepth(), "pass " + i + ".")); //$NON-NLS-1$ //$NON-NLS-2$ - TestElement element = model.getRootElement(); - fListener.reset(TreePath.EMPTY, element, -1, false, false); + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); - meter.start(); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - meter.stop(); - System.gc(); - } - - meter.commit(); - perf.assertPerformance(meter); - } finally { - meter.dispose(); - } - } + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + } public void testRefreshList() throws Exception { - TestModel model = new TestModel(); + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ - int numElements = (int)Math.pow(2, getTestModelDepth()); + int numElements = (int)Math.pow(2, getTestModelDepth()); model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, numElements, "model.")); //$NON-NLS-1$ - fViewer.setAutoExpandLevel(-1); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - Performance perf = Performance.getDefault(); - PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); - try { - for (int i = 0; i < 100; i++) { - // Update the model + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model model.setAllAppendix(" - pass " + i); //$NON-NLS-1$ - TestElement element = model.getRootElement(); - fListener.reset(TreePath.EMPTY, element, -1, false, false); + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); - meter.start(); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - meter.stop(); - System.gc(); - } - - meter.commit(); - perf.assertPerformance(meter); - } finally { - meter.dispose(); - } - } + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + } public void testSaveAndRestore() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // expand all elements - fViewer.setAutoExpandLevel(-1); + // expand all elements + fViewer.setAutoExpandLevel(-1); - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Set a selection in view + // Set a selection in view fViewer.setSelection(new TreeSelection(model.findElement("3.2.3"))); //$NON-NLS-1$ - // Turn off the auto-expand now since we want to text the auto-expand logic - fViewer.setAutoExpandLevel(-1); + // Turn off the auto-expand now since we want to text the auto-expand logic + fViewer.setAutoExpandLevel(-1); - Performance perf = Performance.getDefault(); - PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); - try { - for (int i = 0; i < 100; i++) { - // Update the model + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model model.setAllAppendix(" - pass " + i); //$NON-NLS-1$ - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(true, false); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); - meter.start(); - fViewer.setInput(null); + meter.start(); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE), createListenerErrorMessage()); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - // TODO: add state updates somehow? - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // TODO: add state updates somehow? + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - meter.stop(); - System.gc(); - } + meter.stop(); + System.gc(); + } - meter.commit(); - perf.assertPerformance(meter); - } finally { - meter.dispose(); - } + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } - } + } public void testRefreshListFiltered() throws Exception { - TestModel model = new TestModel(); + TestModel model = new TestModel(); model.setRoot(new TestElement(model, "root", new TestElement[0])); //$NON-NLS-1$ - int numElements = (int)Math.pow(2, getTestModelDepth()); + int numElements = (int)Math.pow(2, getTestModelDepth()); model.setElementChildren(TreePath.EMPTY, TestModel.makeSingleLevelModelElements(model, numElements, "model.")); //$NON-NLS-1$ - fViewer.setAutoExpandLevel(-1); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - fViewer.addFilter(new ViewerFilter() { - @Override + fViewer.addFilter(new ViewerFilter() { + @Override public boolean select(Viewer viewer, Object parentElement, Object element) { - if (element instanceof TestElement) { - String id = ((TestElement)element).getID(); + if (element instanceof TestElement) { + String id = ((TestElement)element).getID(); if (id.startsWith("model.")) { //$NON-NLS-1$ id = id.substring("model.".length()); //$NON-NLS-1$ - } - if (id.length() >= 2 && (id.charAt(1) == '1' || id.charAt(1) == '3' || id.charAt(1) == '5' || id.charAt(1) == '7' || id.charAt(1) == '9')) { - return false; - } - } - return true; - } - }); - - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + } + if (id.length() >= 2 && (id.charAt(1) == '1' || id.charAt(1) == '3' || id.charAt(1) == '5' || id.charAt(1) == '7' || id.charAt(1) == '9')) { + return false; + } + } + return true; + } + }); + + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - Performance perf = Performance.getDefault(); - PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); - try { - for (int i = 0; i < 100; i++) { - // Update the model + Performance perf = Performance.getDefault(); + PerformanceMeter meter = perf.createPerformanceMeter(perf.getDefaultScenarioId(this)); + try { + for (int i = 0; i < 100; i++) { + // Update the model model.setAllAppendix(" - pass " + i); //$NON-NLS-1$ - TestElement element = model.getRootElement(); - fListener.reset(TreePath.EMPTY, element, -1, false, false); + TestElement element = model.getRootElement(); + fListener.reset(TreePath.EMPTY, element, -1, false, false); - meter.start(); - model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); + meter.start(); + model.postDelta(new ModelDelta(element, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - meter.stop(); - System.gc(); - } - - meter.commit(); - perf.assertPerformance(meter); - } finally { - meter.dispose(); - } - } + meter.stop(); + System.gc(); + } + + meter.commit(); + perf.assertPerformance(meter); + } finally { + meter.dispose(); + } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PopupTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PopupTests.java index 08a44ebcb..d37b2f8b3 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PopupTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PopupTests.java @@ -40,18 +40,18 @@ import org.eclipse.swt.widgets.Shell; */ abstract public class PopupTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public PopupTests(String name) { - super(name); - } + public PopupTests(String name) { + super(name); + } - @Override + @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, false, false); } - protected IInternalTreeModelViewer getCTargetViewer() { - return fViewer; - } + protected IInternalTreeModelViewer getCTargetViewer() { + return fViewer; + } @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { @@ -60,152 +60,152 @@ abstract public class PopupTests extends AbstractViewerModelTest implements ITes abstract protected IInternalTreeModelViewer createViewer(Display display, Shell shell, int style); - /** - * This test verifies that content updates are still being performed. - */ + /** + * This test verifies that content updates are still being performed. + */ public void testRefreshStruct() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - TestElement element = model.getRootElement().getChildren()[0]; - TreePath elementPath = new TreePath(new Object[] { element }); - TestElement[] newChildren = new TestElement[] { + // Update the model + TestElement element = model.getRootElement().getChildren()[0]; + TreePath elementPath = new TreePath(new Object[] { element }); + TestElement[] newChildren = new TestElement[] { new TestElement(model, "1.1 - new", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "1.2 - new", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "1.3 - new", new TestElement[0]), //$NON-NLS-1$ - }; - ModelDelta delta = model.setElementChildren(elementPath, newChildren); + }; + ModelDelta delta = model.setElementChildren(elementPath, newChildren); - fListener.reset(elementPath, element, -1, true, false); - model.postDelta(delta); + fListener.reset(elementPath, element, -1, true, false); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } - /** - * This test verifies that expand and select updates are being ignored. - */ + /** + * This test verifies that expand and select updates are being ignored. + */ public void testExpandAndSelect() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); - - // Create the delta - fListener.reset(); - // TODO Investigate: there seem to be unnecessary updates being issued - // by the viewer. These include the updates that are commented out: - // For now disable checking for extra updates. - fListener.setFailOnRedundantUpdates(false); - TestElement element = model.getRootElement(); - TreePath path_root = TreePath.EMPTY; - ModelDelta delta= new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); - ModelDelta deltaRoot = delta; - element = element.getChildren()[2]; - TreePath path_root_3 = path_root.createChildPath(element); - delta.addNode(element, 2, IModelDelta.SELECT | IModelDelta.EXPAND, element.fChildren.length); - - // Validate the expansion state BEFORE posting the delta. - - IInternalTreeModelViewer contentProviderViewer = fViewer; - assertFalse(contentProviderViewer.getExpandedState(path_root_3)); - - model.postDelta(deltaRoot); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Create the delta + fListener.reset(); + // TODO Investigate: there seem to be unnecessary updates being issued + // by the viewer. These include the updates that are commented out: + // For now disable checking for extra updates. + fListener.setFailOnRedundantUpdates(false); + TestElement element = model.getRootElement(); + TreePath path_root = TreePath.EMPTY; + ModelDelta delta= new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); + ModelDelta deltaRoot = delta; + element = element.getChildren()[2]; + TreePath path_root_3 = path_root.createChildPath(element); + delta.addNode(element, 2, IModelDelta.SELECT | IModelDelta.EXPAND, element.fChildren.length); + + // Validate the expansion state BEFORE posting the delta. + + IInternalTreeModelViewer contentProviderViewer = fViewer; + assertFalse(contentProviderViewer.getExpandedState(path_root_3)); + + model.postDelta(deltaRoot); TestUtil.processUIEvents(); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE) && (fListener.isFinished(CONTENT_SEQUENCE_STARTED) || !fListener.isFinished(CONTENT_SEQUENCE_STARTED) && !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE)), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Validate the expansion state AFTER posting the delta. - assertFalse(contentProviderViewer.getExpandedState(path_root_3)); + // Validate the expansion state AFTER posting the delta. + assertFalse(contentProviderViewer.getExpandedState(path_root_3)); - // Verify selection - ISelection selection = fViewer.getSelection(); - if (selection instanceof ITreeSelection) { + // Verify selection + ISelection selection = fViewer.getSelection(); + if (selection instanceof ITreeSelection) { List<TreePath> selectionPathsList = Arrays.asList(((ITreeSelection) selection).getPaths()); - assertFalse(selectionPathsList.contains(path_root_3)); - } else { + assertFalse(selectionPathsList.contains(path_root_3)); + } else { fail("Not a tree selection"); //$NON-NLS-1$ - } - } + } + } public void testPreserveExpandedOnSubTreeContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener, - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener, + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Turn off auto-expansion - fViewer.setAutoExpandLevel(0); + // Turn off auto-expansion + fViewer.setAutoExpandLevel(0); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("3.3.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); + fViewer.setSelection(originalSelection); - // Update the model + // Update the model model.addElementChild(model.findElement("3"), null, 0, new TestElement(model, "3.0 - new", new TestElement[0])); //$NON-NLS-1$ //$NON-NLS-2$ - // Create the delta for element "3" with content update. + // Create the delta for element "3" with content update. TreePath elementPath = model.findElement("3"); //$NON-NLS-1$ - ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - ModelDelta elementDelta = model.getElementDelta(rootDelta, elementPath, true); - elementDelta.setFlags(IModelDelta.CONTENT); + ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + ModelDelta elementDelta = model.getElementDelta(rootDelta, elementPath, true); + elementDelta.setFlags(IModelDelta.CONTENT); - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - fListener.addUpdates(getCTargetViewer(), elementPath, model.getElement(elementPath), -1, ALL_UPDATES_COMPLETE); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getCTargetViewer(), elementPath, model.getElement(elementPath), -1, ALL_UPDATES_COMPLETE); - // Post the sub-tree update - model.postDelta(rootDelta); + // Post the sub-tree update + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getCTargetViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ - // On windows, getExpandedState() may return true for an element with no children: - // assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.0 - new")) == false); + // On windows, getExpandedState() may return true for an element with no children: + // assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.0 - new")) == false); assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.2")) == true); //$NON-NLS-1$ assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.3")) == true); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } - private boolean areTreeSelectionsEqual(ITreeSelection sel1, ITreeSelection sel2) { + private boolean areTreeSelectionsEqual(ITreeSelection sel1, ITreeSelection sel2) { Set<TreePath> sel1Set = new HashSet<>(); - sel1Set.addAll( Arrays.asList(sel1.getPaths()) ); + sel1Set.addAll( Arrays.asList(sel1.getPaths()) ); Set<TreePath> sel2Set = new HashSet<>(); - sel2Set.addAll( Arrays.asList(sel2.getPaths()) ); + sel2Set.addAll( Arrays.asList(sel2.getPaths()) ); - return sel1Set.equals(sel2Set); - } + return sel1Set.equals(sel2Set); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PresentationContextTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PresentationContextTests.java index fa6f7f15d..901d62105 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PresentationContextTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/PresentationContextTests.java @@ -27,14 +27,14 @@ import org.eclipse.ui.XMLMemento; */ public class PresentationContextTests extends AbstractDebugTest { - public PresentationContextTests(String name) { - super(name); - } + public PresentationContextTests(String name) { + super(name); + } - /** - * Tests saving and restoring presentation context properties. - */ - public void testSaveRestore () { + /** + * Tests saving and restoring presentation context properties. + */ + public void testSaveRestore () { PresentationContext context = new PresentationContext("test"); //$NON-NLS-1$ context.setProperty("string", "string"); //$NON-NLS-1$ //$NON-NLS-2$ context.setProperty("integer", Integer.valueOf(1)); //$NON-NLS-1$ @@ -42,15 +42,15 @@ public class PresentationContextTests extends AbstractDebugTest { context.setProperty("persistable", ResourcesPlugin.getWorkspace().getRoot().getAdapter(IPersistableElement.class)); //$NON-NLS-1$ final XMLMemento memento = XMLMemento.createWriteRoot("TEST"); //$NON-NLS-1$ - context.saveProperites(memento); + context.saveProperites(memento); context = new PresentationContext("test"); //$NON-NLS-1$ - context.initProperties(memento); + context.initProperties(memento); assertEquals("Wrong value restored", "string", context.getProperty("string")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ assertEquals("Wrong value restored", Integer.valueOf(1), context.getProperty("integer")); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("Wrong value restored", Boolean.TRUE, context.getProperty("boolean")); //$NON-NLS-1$ //$NON-NLS-2$ assertEquals("Wrong value restored", ResourcesPlugin.getWorkspace().getRoot(), context.getProperty("persistable")); //$NON-NLS-1$ //$NON-NLS-2$ - context.dispose(); - } + context.dispose(); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/SelectionTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/SelectionTests.java index 56230cc4c..e73e9c96f 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/SelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/SelectionTests.java @@ -33,212 +33,212 @@ import org.eclipse.jface.viewers.TreeSelection; */ abstract public class SelectionTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public SelectionTests(String name) { - super(name); - } + public SelectionTests(String name) { + super(name); + } - @Override + @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, false, false); } - private static class SelectionListener implements ISelectionChangedListener { + private static class SelectionListener implements ISelectionChangedListener { private final List<SelectionChangedEvent> fEvents = new ArrayList<>(1); - @Override + @Override public void selectionChanged(SelectionChangedEvent event) { - fEvents.add(event); - } - } + fEvents.add(event); + } + } private TestModel makeMultiLevelModel() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); - fViewer.setAutoExpandLevel(-1); - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - fViewer.setInput(model.getRootElement()); + TestModel model = TestModel.simpleMultiLevel(); + fViewer.setAutoExpandLevel(-1); + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - return model; - } - - /** - * In this test: - * - set selection to an element deep in the model - * - verify that selection chagned listener is called - * - verify that the selection is in the viewer is correct - */ + model.validateData(fViewer, TreePath.EMPTY); + return model; + } + + /** + * In this test: + * - set selection to an element deep in the model + * - verify that selection chagned listener is called + * - verify that the selection is in the viewer is correct + */ public void testSimpleSetSelection() throws Exception { - // Create the model and populate the view. - TestModel model = makeMultiLevelModel(); + // Create the model and populate the view. + TestModel model = makeMultiLevelModel(); - // Create a selection object to the deepest part of the tree. - SelectionListener listener = new SelectionListener(); - fViewer.addSelectionChangedListener(listener); + // Create a selection object to the deepest part of the tree. + SelectionListener listener = new SelectionListener(); + fViewer.addSelectionChangedListener(listener); - // Set the selection and verify that the listener is called. + // Set the selection and verify that the listener is called. TreeSelection selection = new TreeSelection(model.findElement("3.3.3")); //$NON-NLS-1$ - fViewer.setSelection(selection, true, false); - assertTrue(listener.fEvents.size() == 1); - - // Check that the new selection is what was requested. - ISelection viewerSelection = fViewer.getSelection(); - assertEquals(selection, viewerSelection); - } - - /** - * In this test verify that selection policy can prevent selection - * from being set and verify that a FORCE flag can override the selection - * policy. - */ + fViewer.setSelection(selection, true, false); + assertTrue(listener.fEvents.size() == 1); + + // Check that the new selection is what was requested. + ISelection viewerSelection = fViewer.getSelection(); + assertEquals(selection, viewerSelection); + } + + /** + * In this test verify that selection policy can prevent selection + * from being set and verify that a FORCE flag can override the selection + * policy. + */ public void testSelectionPolicy() throws Exception { - // Create the model and populate the view. - final TestModel model = makeMultiLevelModel(); + // Create the model and populate the view. + final TestModel model = makeMultiLevelModel(); - // Set the selection and verify it. + // Set the selection and verify it. TreeSelection selection_3_3_3 = new TreeSelection(model.findElement("3.3.3")); //$NON-NLS-1$ - fViewer.setSelection(selection_3_3_3, true, false); - assertEquals(selection_3_3_3, fViewer.getSelection()); + fViewer.setSelection(selection_3_3_3, true, false); + assertEquals(selection_3_3_3, fViewer.getSelection()); - model.setSelectionPolicy(new IModelSelectionPolicy() { + model.setSelectionPolicy(new IModelSelectionPolicy() { - @Override + @Override public ISelection replaceInvalidSelection(ISelection invalidSelection, ISelection newSelection) { - return null; - } + return null; + } - @Override + @Override public boolean overrides(ISelection existing, ISelection candidate, IPresentationContext context) { - return false; - } + return false; + } - @Override + @Override public boolean isSticky(ISelection selection, IPresentationContext context) { - return true; - } + return true; + } - @Override + @Override public boolean contains(ISelection selection, IPresentationContext context) { - return true; - } - }); + return true; + } + }); - // Attempt to change selection and verify that old selection is still valid. + // Attempt to change selection and verify that old selection is still valid. TreeSelection selection_3_3_1 = new TreeSelection(model.findElement("3.3.1")); //$NON-NLS-1$ - fViewer.setSelection(selection_3_3_1, true, false); - assertEquals(selection_3_3_3, fViewer.getSelection()); + fViewer.setSelection(selection_3_3_1, true, false); + assertEquals(selection_3_3_3, fViewer.getSelection()); - // Now attempt to *force* selection and verify that new selection was set. - fViewer.setSelection(selection_3_3_1, true, true); - assertEquals(selection_3_3_1, fViewer.getSelection()); + // Now attempt to *force* selection and verify that new selection was set. + fViewer.setSelection(selection_3_3_1, true, true); + assertEquals(selection_3_3_1, fViewer.getSelection()); - // Create the an update delta to attempt to change selection back to - // 3.3.3 and verify that selection did not get overriden. + // Create the an update delta to attempt to change selection back to + // 3.3.3 and verify that selection did not get overriden. TreePath path_3_3_3 = model.findElement("3.3.3"); //$NON-NLS-1$ - ModelDelta baseDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - ModelDelta delta_3_3_3 = model.getElementDelta(baseDelta, path_3_3_3, false); - delta_3_3_3.setFlags(IModelDelta.SELECT); - fViewer.updateViewer(baseDelta); + ModelDelta baseDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + ModelDelta delta_3_3_3 = model.getElementDelta(baseDelta, path_3_3_3, false); + delta_3_3_3.setFlags(IModelDelta.SELECT); + fViewer.updateViewer(baseDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - assertEquals(selection_3_3_1, fViewer.getSelection()); + assertEquals(selection_3_3_1, fViewer.getSelection()); - // Add the *force* flag to the selection delta and update viewer again. - // Verify that selection did change. - delta_3_3_3.setFlags(IModelDelta.SELECT | IModelDelta.FORCE); - fViewer.updateViewer(baseDelta); + // Add the *force* flag to the selection delta and update viewer again. + // Verify that selection did change. + delta_3_3_3.setFlags(IModelDelta.SELECT | IModelDelta.FORCE); + fViewer.updateViewer(baseDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - assertEquals(selection_3_3_3, fViewer.getSelection()); - } + assertEquals(selection_3_3_3, fViewer.getSelection()); + } - /** - * In this test: - * - set a seleciton to an element - * - then remove that element - * - update the view with remove delta - * -> The selection should be re-set to empty. - */ + /** + * In this test: + * - set a seleciton to an element + * - then remove that element + * - update the view with remove delta + * -> The selection should be re-set to empty. + */ public void testSelectRemove() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - // Create the model and populate the view. - TestModel model = makeMultiLevelModel(); + // Create the model and populate the view. + TestModel model = makeMultiLevelModel(); - // Create a selection object to the deepest part of the tree. + // Create a selection object to the deepest part of the tree. TreePath elementPath = model.findElement("3.3.3"); //$NON-NLS-1$ - TreeSelection selection = new TreeSelection(elementPath); + TreeSelection selection = new TreeSelection(elementPath); - // Set the selection. - fViewer.setSelection(selection, true, false); + // Set the selection. + fViewer.setSelection(selection, true, false); - // Remove the element + // Remove the element TreePath removePath = model.findElement("3"); //$NON-NLS-1$ - TreePath parentPath = removePath.getParentPath(); - int removeIndex = model.getElement(parentPath).indexOf( model.getElement(removePath) ); - ModelDelta delta = model.removeElementChild(removePath.getParentPath(), removeIndex); - - // Configure a selection listener - SelectionListener listener = new SelectionListener(); - fViewer.addSelectionChangedListener(listener); - - // Reset the listener and update the viewer. With a remove - // delta only wait for the delta to be processed. - fListener.reset(); - model.postDelta(delta); + TreePath parentPath = removePath.getParentPath(); + int removeIndex = model.getElement(parentPath).indexOf( model.getElement(removePath) ); + ModelDelta delta = model.removeElementChild(removePath.getParentPath(), removeIndex); + + // Configure a selection listener + SelectionListener listener = new SelectionListener(); + fViewer.addSelectionChangedListener(listener); + + // Reset the listener and update the viewer. With a remove + // delta only wait for the delta to be processed. + fListener.reset(); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(ITestModelUpdatesListenerConstants.MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Check to make sure the selection was made - //assertTrue(listener.fEvents.size() == 1); + // Check to make sure the selection was made + //assertTrue(listener.fEvents.size() == 1); - // Check that the new selection is empty - ISelection viewerSelection = fViewer.getSelection(); - assertTrue(viewerSelection.isEmpty()); - } + // Check that the new selection is empty + ISelection viewerSelection = fViewer.getSelection(); + assertTrue(viewerSelection.isEmpty()); + } - /** - * In this test: - * - set a selection to an element - * - then remove that element - * - then refresh the view. - * -> The selection should be re-set to empty. - */ + /** + * In this test: + * - set a selection to an element + * - then remove that element + * - then refresh the view. + * -> The selection should be re-set to empty. + */ public void testSelectRemoveRefreshStruct() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - // Create the model and populate the view. - TestModel model = makeMultiLevelModel(); + // Create the model and populate the view. + TestModel model = makeMultiLevelModel(); - // Create a selection object to the deepest part of the tree. + // Create a selection object to the deepest part of the tree. TreePath elementPath = model.findElement("3.3.3"); //$NON-NLS-1$ - TreeSelection selection = new TreeSelection(elementPath); + TreeSelection selection = new TreeSelection(elementPath); - // Set the selection. - fViewer.setSelection(selection, true, false); + // Set the selection. + fViewer.setSelection(selection, true, false); - // Remove the element + // Remove the element TreePath removePath = model.findElement("3"); //$NON-NLS-1$ - TreePath parentPath = removePath.getParentPath(); - int removeIndex = model.getElement(parentPath).indexOf( model.getElement(removePath) ); - model.removeElementChild(removePath.getParentPath(), removeIndex); + TreePath parentPath = removePath.getParentPath(); + int removeIndex = model.getElement(parentPath).indexOf( model.getElement(removePath) ); + model.removeElementChild(removePath.getParentPath(), removeIndex); - // Configure a selection listener - SelectionListener listener = new SelectionListener(); - fViewer.addSelectionChangedListener(listener); + // Configure a selection listener + SelectionListener listener = new SelectionListener(); + fViewer.addSelectionChangedListener(listener); - // Reset the listener to ignore redundant updates. When elements are removed - // the viewer may still request updates for those elements. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Reset the listener to ignore redundant updates. When elements are removed + // the viewer may still request updates for those elements. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Refresh the viewer - model.postDelta( new ModelDelta(model.getRootElement(), IModelDelta.CONTENT) ); + // Refresh the viewer + model.postDelta( new ModelDelta(model.getRootElement(), IModelDelta.CONTENT) ); waitWhile(t -> !fListener.isFinished(ITestModelUpdatesListenerConstants.ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Check to make sure the selection was made - // Commented out until JFace bug 219887 is fixed. - //assertTrue(listener.fEvents.size() == 1); + // Check to make sure the selection was made + // Commented out until JFace bug 219887 is fixed. + //assertTrue(listener.fEvents.size() == 1); - // Check that the new selection is empty - ISelection viewerSelection = fViewer.getSelection(); - assertTrue(viewerSelection.isEmpty()); - } + // Check that the new selection is empty + ISelection viewerSelection = fViewer.getSelection(); + assertTrue(viewerSelection.isEmpty()); + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/StateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/StateTests.java index aed68f6ad..5e858848f 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/StateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/StateTests.java @@ -35,208 +35,208 @@ import org.eclipse.jface.viewers.TreeSelection; */ abstract public class StateTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public StateTests(String name) { - super(name); - } + public StateTests(String name) { + super(name); + } - @Override + @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, false, false); } - protected IInternalTreeModelViewer getInternalViewer() { - return fViewer; - } + protected IInternalTreeModelViewer getInternalViewer() { + return fViewer; + } public void testUpdateViewer() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + TestModel model = TestModel.simpleMultiLevel(); - // Create the listener - fListener.reset(); - fListener.addChildreUpdate(TreePath.EMPTY, 0); - fListener.addChildreUpdate(TreePath.EMPTY, 1); - fListener.addChildreUpdate(TreePath.EMPTY, 2); + // Create the listener + fListener.reset(); + fListener.addChildreUpdate(TreePath.EMPTY, 0); + fListener.addChildreUpdate(TreePath.EMPTY, 1); + fListener.addChildreUpdate(TreePath.EMPTY, 2); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); - - // Create the update delta - TestElement element = model.getRootElement(); - TreePath path0 = TreePath.EMPTY; - ModelDelta delta = new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); - ModelDelta updateDelta = delta; - element = element.getChildren()[2]; - TreePath path1 = path0.createChildPath(element); - delta = delta.addNode(element, 2, IModelDelta.EXPAND, element.fChildren.length); - element = element.getChildren()[1]; - TreePath path2 = path1.createChildPath(element); - delta = delta.addNode(element, 1, IModelDelta.EXPAND, element.fChildren.length); - element = element.getChildren()[1]; - TreePath path3 = path2.createChildPath(element); - delta = delta.addNode(element, 1, IModelDelta.SELECT); - - fListener.reset(false, false); - - fListener.addChildreUpdate(path0, 2); - fListener.addHasChildrenUpdate(path1); - fListener.addChildreCountUpdate(path1); - fListener.addLabelUpdate(path1); - fListener.addChildreUpdate(path1, 1); - fListener.addHasChildrenUpdate(path2); - fListener.addChildreCountUpdate(path2); - fListener.addLabelUpdate(path2); - fListener.addHasChildrenUpdate(path2); - fListener.addChildreCountUpdate(path2); - fListener.addChildreUpdate(path2, 1); - fListener.addHasChildrenUpdate(path3); - fListener.addLabelUpdate(path3); - - fViewer.updateViewer(updateDelta); + model.validateData(fViewer, TreePath.EMPTY, true); + + // Create the update delta + TestElement element = model.getRootElement(); + TreePath path0 = TreePath.EMPTY; + ModelDelta delta = new ModelDelta(model.getRootElement(), -1, IModelDelta.EXPAND, element.getChildren().length); + ModelDelta updateDelta = delta; + element = element.getChildren()[2]; + TreePath path1 = path0.createChildPath(element); + delta = delta.addNode(element, 2, IModelDelta.EXPAND, element.fChildren.length); + element = element.getChildren()[1]; + TreePath path2 = path1.createChildPath(element); + delta = delta.addNode(element, 1, IModelDelta.EXPAND, element.fChildren.length); + element = element.getChildren()[1]; + TreePath path3 = path2.createChildPath(element); + delta = delta.addNode(element, 1, IModelDelta.SELECT); + + fListener.reset(false, false); + + fListener.addChildreUpdate(path0, 2); + fListener.addHasChildrenUpdate(path1); + fListener.addChildreCountUpdate(path1); + fListener.addLabelUpdate(path1); + fListener.addChildreUpdate(path1, 1); + fListener.addHasChildrenUpdate(path2); + fListener.addChildreCountUpdate(path2); + fListener.addLabelUpdate(path2); + fListener.addHasChildrenUpdate(path2); + fListener.addChildreCountUpdate(path2); + fListener.addChildreUpdate(path2, 1); + fListener.addHasChildrenUpdate(path3); + fListener.addLabelUpdate(path3); + + fViewer.updateViewer(updateDelta); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | LABEL_UPDATES), createListenerErrorMessage()); - // Extract the new state from viewer - ModelDelta savedDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(path0, savedDelta, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the new state from viewer + ModelDelta savedDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(path0, savedDelta, IModelDelta.EXPAND | IModelDelta.SELECT); - if (!deltaMatches(updateDelta, savedDelta) ) { + if (!deltaMatches(updateDelta, savedDelta) ) { fail("Expected:\n" + updateDelta.toString() + "\nGot:\n" + savedDelta); //$NON-NLS-1$ //$NON-NLS-2$ - } - } - - boolean deltaMatches(ModelDelta requested, ModelDelta received) { - if ( requested.getElement().equals(received.getElement()) && - requested.getFlags() == received.getFlags() && - ( requested.getChildCount() == -1 || requested.getChildCount() == received.getChildCount() )&& - ( requested.getIndex() == -1 || requested.getIndex() == received.getIndex()) && - ((requested.getReplacementElement() != null && requested.getReplacementElement().equals(received.getReplacementElement())) || - (requested.getReplacementElement() == null && received.getReplacementElement() == null)) && - requested.getChildDeltas().length == received.getChildDeltas().length) - { - for (int i = 0; i < requested.getChildDeltas().length; i++) { - ModelDelta requestedChildDelta = (ModelDelta)requested.getChildDeltas()[i]; - ModelDelta receivedChildDelta = received.getChildDelta(requestedChildDelta.getElement()); - if ( receivedChildDelta == null || !deltaMatches(requestedChildDelta, receivedChildDelta) ) { - return false; - } - } - return true; - } - return false; - } - - /** - * Creates a model in the pattern of: - * - * root - * 1 - * 1.1 - * 1.1.1 - * 2 - * 2.1 - * 2.1.1 - * 3 - * 3.1 - * 3.1.1 - * ... - * (size) - * (size).1 - * (size).1.1 - */ - static TestModel alternatingSubsreesModel(int size) { - TestModel model = new TestModel(); - - TestElement[] elements = new TestElement[size]; - for (int i = 0; i < size; i++) { - String text = Integer.toString(i + 1); - elements[i] = - new TestElement(model, text, new TestElement[] { + } + } + + boolean deltaMatches(ModelDelta requested, ModelDelta received) { + if ( requested.getElement().equals(received.getElement()) && + requested.getFlags() == received.getFlags() && + ( requested.getChildCount() == -1 || requested.getChildCount() == received.getChildCount() )&& + ( requested.getIndex() == -1 || requested.getIndex() == received.getIndex()) && + ((requested.getReplacementElement() != null && requested.getReplacementElement().equals(received.getReplacementElement())) || + (requested.getReplacementElement() == null && received.getReplacementElement() == null)) && + requested.getChildDeltas().length == received.getChildDeltas().length) + { + for (int i = 0; i < requested.getChildDeltas().length; i++) { + ModelDelta requestedChildDelta = (ModelDelta)requested.getChildDeltas()[i]; + ModelDelta receivedChildDelta = received.getChildDelta(requestedChildDelta.getElement()); + if ( receivedChildDelta == null || !deltaMatches(requestedChildDelta, receivedChildDelta) ) { + return false; + } + } + return true; + } + return false; + } + + /** + * Creates a model in the pattern of: + * + * root + * 1 + * 1.1 + * 1.1.1 + * 2 + * 2.1 + * 2.1.1 + * 3 + * 3.1 + * 3.1.1 + * ... + * (size) + * (size).1 + * (size).1.1 + */ + static TestModel alternatingSubsreesModel(int size) { + TestModel model = new TestModel(); + + TestElement[] elements = new TestElement[size]; + for (int i = 0; i < size; i++) { + String text = Integer.toString(i + 1); + elements[i] = + new TestElement(model, text, new TestElement[] { new TestElement(model, text + ".1", new TestElement[] { //$NON-NLS-1$ new TestElement(model, text + ".1.1", new TestElement[0]) //$NON-NLS-1$ - }) - }); - } + }) + }); + } model.setRoot(new TestElement(model, "root", elements)); //$NON-NLS-1$ - return model; - } + return model; + } - static boolean areTreeSelectionsEqual(ITreeSelection sel1, ITreeSelection sel2) { + static boolean areTreeSelectionsEqual(ITreeSelection sel1, ITreeSelection sel2) { Set<TreePath> sel1Set = new HashSet<>(); - sel1Set.addAll( Arrays.asList(sel1.getPaths()) ); + sel1Set.addAll( Arrays.asList(sel1.getPaths()) ); Set<TreePath> sel2Set = new HashSet<>(); - sel2Set.addAll( Arrays.asList(sel2.getPaths()) ); + sel2Set.addAll( Arrays.asList(sel2.getPaths()) ); - return sel1Set.equals(sel2Set); - } + return sel1Set.equals(sel2Set); + } static void expandAlternateElements(TestModelUpdatesListener listener, TestModel model, boolean waitForAllUpdates) throws Exception { - listener.reset(); - listener.setFailOnRedundantUpdates(false); - - TestElement rootElement = model.getRootElement(); - TestElement[] children = rootElement.getChildren(); - ModelDelta rootDelta = new ModelDelta(rootElement, IModelDelta.NO_CHANGE); - ModelDelta expandDelta = model.getBaseDelta(rootDelta); - for (int i = 0; i < children.length; i++) { - // Expand only odd children - if (i % 2 == 1) { - continue; - } - - // Expand the element and the first child of each sub-element - TestElement element = children[i]; - ModelDelta delta = expandDelta; - int index = i; - while (element.getChildren().length != 0) { - TreePath elementPath = model.findElement(element.getLabel()); - listener.addUpdates( - elementPath, element, 1, - CHILD_COUNT_UPDATES | (waitForAllUpdates ? CHILDREN_UPDATES : 0) ); - delta = delta.addNode(element, index, IModelDelta.EXPAND, element.getChildren().length); - element = element.getChildren()[0]; - index = 0; - } - } - model.postDelta(rootDelta); + listener.reset(); + listener.setFailOnRedundantUpdates(false); + + TestElement rootElement = model.getRootElement(); + TestElement[] children = rootElement.getChildren(); + ModelDelta rootDelta = new ModelDelta(rootElement, IModelDelta.NO_CHANGE); + ModelDelta expandDelta = model.getBaseDelta(rootDelta); + for (int i = 0; i < children.length; i++) { + // Expand only odd children + if (i % 2 == 1) { + continue; + } + + // Expand the element and the first child of each sub-element + TestElement element = children[i]; + ModelDelta delta = expandDelta; + int index = i; + while (element.getChildren().length != 0) { + TreePath elementPath = model.findElement(element.getLabel()); + listener.addUpdates( + elementPath, element, 1, + CHILD_COUNT_UPDATES | (waitForAllUpdates ? CHILDREN_UPDATES : 0) ); + delta = delta.addNode(element, index, IModelDelta.EXPAND, element.getChildren().length); + element = element.getChildren()[0]; + index = 0; + } + } + model.postDelta(rootDelta); TestUtil.waitWhile(t -> !listener.isFinished(CONTENT_SEQUENCE_COMPLETE | MODEL_CHANGED_COMPLETE), null, 30000, t -> "Listener not finished: " + listener); - } + } public void testPreserveExpandedOnRemove() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(fListener, model, true); + expandAlternateElements(fListener, model, true); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); + fViewer.setSelection(originalSelection); - // Update the model - ModelDelta delta = model.removeElementChild(TreePath.EMPTY, 0); + // Update the model + ModelDelta delta = model.removeElementChild(TreePath.EMPTY, 0); - // Remove delta should not generate any new updates - fListener.reset(); - model.postDelta(delta); + // Remove delta should not generate any new updates + fListener.reset(); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -244,42 +244,42 @@ abstract public class StateTests extends AbstractViewerModelTest implements ITes assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } public void testPreserveExpandedOnInsert() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(fListener, model, true); + expandAlternateElements(fListener, model, true); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); + fViewer.setSelection(originalSelection); - // Update the model + // Update the model ModelDelta delta = model.insertElementChild(TreePath.EMPTY, 0, new TestElement(model, "0 - new", new TestElement[0])); //$NON-NLS-1$ - // Insert delta should generate updates only for the new element + // Insert delta should generate updates only for the new element TreePath path = model.findElement("0 - new"); //$NON-NLS-1$ - // Note: redundant label updates on insert. - fListener.reset(path, (TestElement)path.getLastSegment(), 0, false, false); - fListener.addChildreUpdate(TreePath.EMPTY, 0); - model.postDelta(delta); + // Note: redundant label updates on insert. + fListener.reset(path, (TestElement)path.getLastSegment(), 0, false, false); + fListener.addChildreUpdate(TreePath.EMPTY, 0); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getInternalViewer().getExpandedState(model.findElement("1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("1.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ @@ -289,50 +289,50 @@ abstract public class StateTests extends AbstractViewerModelTest implements ITes assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } public void testPreserveExpandedOnMultLevelContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(fListener, model, true); + expandAlternateElements(fListener, model, true); - // Set a selection in view - // Set a selection in view - TreeSelection originalSelection = new TreeSelection( + // Set a selection in view + // Set a selection in view + TreeSelection originalSelection = new TreeSelection( new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findElement("6") }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - fViewer.setSelection(originalSelection); - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + fViewer.setSelection(originalSelection); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Update the model - model.removeElementChild(TreePath.EMPTY, 0); + // Update the model + model.removeElementChild(TreePath.EMPTY, 0); - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); - // Create the delta which has nodes with CONTENT flag set at multiple levels. - ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); + // Create the delta which has nodes with CONTENT flag set at multiple levels. + ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.CONTENT); ModelDelta elementDelta = model.getElementDelta(rootDelta, model.findElement("3.1.1"), true); //$NON-NLS-1$ - elementDelta.setFlags(IModelDelta.CONTENT); + elementDelta.setFlags(IModelDelta.CONTENT); - // Post the multi-content update delta - model.postDelta(rootDelta); + // Post the multi-content update delta + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -340,101 +340,101 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Note: in past it was observed sub-optimal coalescing in this test due - // to scattered update requests from viewer. - assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 5) ); - } + // Note: in past it was observed sub-optimal coalescing in this test due + // to scattered update requests from viewer. + assertTrue( fListener.checkCoalesced(TreePath.EMPTY, 0, 5) ); + } public void testPreserveExpandedOnSubTreeContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener, - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener, + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Turn off auto-expansion - fViewer.setAutoExpandLevel(0); + // Turn off auto-expansion + fViewer.setAutoExpandLevel(0); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("3.3.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); + fViewer.setSelection(originalSelection); - // Update the model + // Update the model model.addElementChild(model.findElement("3"), null, 0, new TestElement(model, "3.0 - new", new TestElement[0])); //$NON-NLS-1$ //$NON-NLS-2$ - // Create the delta for element "3" with content update. + // Create the delta for element "3" with content update. TreePath elementPath = model.findElement("3"); //$NON-NLS-1$ - ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - ModelDelta elementDelta = model.getElementDelta(rootDelta, elementPath, true); - elementDelta.setFlags(IModelDelta.CONTENT); + ModelDelta rootDelta = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + ModelDelta elementDelta = model.getElementDelta(rootDelta, elementPath, true); + elementDelta.setFlags(IModelDelta.CONTENT); - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - fListener.addUpdates(getInternalViewer(), elementPath, model.getElement(elementPath), -1, ALL_UPDATES_COMPLETE); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getInternalViewer(), elementPath, model.getElement(elementPath), -1, ALL_UPDATES_COMPLETE); - // Post the sub-tree update - model.postDelta(rootDelta); + // Post the sub-tree update + model.postDelta(rootDelta); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ - // On windows, getExpandedState() may return true for an element with no children: - // assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.0 - new")) == false); + // On windows, getExpandedState() may return true for an element with no children: + // assertTrue(getCTargetViewer().getExpandedState(model.findElement("3.0 - new")) == false); assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.2")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.3")) == true); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } public void testPreserveExpandedOnContentStress() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - expandAlternateElements(fListener, model, true); + expandAlternateElements(fListener, model, true); - // Set a selection in view + // Set a selection in view // TreeSelection originalSelection = new TreeSelection( // new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findElement("6") }); TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - - // Run this test ten times as we've seen intermittent failures related - // to timing in it. - for (int i = 0; i < 10; i++) { - // Update the model - model.removeElementChild(TreePath.EMPTY, 0); - - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + fViewer.setSelection(originalSelection); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + + // Run this test ten times as we've seen intermittent failures related + // to timing in it. + for (int i = 0; i < 10; i++) { + // Update the model + model.removeElementChild(TreePath.EMPTY, 0); + + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -442,19 +442,19 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Update the model again + // Update the model again model.addElementChild(TreePath.EMPTY, null, 0, new TestElement(model, "1", new TestElement[0])); //$NON-NLS-1$ - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + fListener.addUpdates(getInternalViewer(), TreePath.EMPTY, model.getRootElement(), -1, ALL_UPDATES_COMPLETE); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data - model.validateData(fViewer, TreePath.EMPTY, true); + // Validate data + model.validateData(fViewer, TreePath.EMPTY, true); assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -462,40 +462,40 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } - } + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } + } public void testPreserveLargeModelOnContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(100); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(100); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(); + // Create the listener, only check the first level + fListener.reset(); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - expandAlternateElements(fListener, model, false); + expandAlternateElements(fListener, model, false); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + fViewer.setSelection(originalSelection); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Update the model - model.removeElementChild(TreePath.EMPTY, 0); + // Update the model + model.removeElementChild(TreePath.EMPTY, 0); - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Validate data + // Validate data assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -503,17 +503,17 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Update the model again + // Update the model again model.addElementChild(TreePath.EMPTY, null, 0, new TestElement(model, "1", new TestElement[0])); //$NON-NLS-1$ - // Note: Re-expanding nodes causes redundant updates. - fListener.reset(false, false); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Note: Re-expanding nodes causes redundant updates. + fListener.reset(false, false); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Validate data + // Validate data assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ @@ -521,88 +521,88 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } - - /** - * This test verifies that if the model selects a new element - * following a content refresh, the state restore logic will - * not override the selection requested by the model. - */ + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } + + /** + * This test verifies that if the model selects a new element + * following a content refresh, the state restore logic will + * not override the selection requested by the model. + */ public void testPreserveSelectionDeltaAfterContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Set a selection in view + // Set a selection in view fViewer.setSelection(new TreeSelection(model.findElement("3.1.1"))); //$NON-NLS-1$ - // Reset the listener (ignore redundant updates) - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Reset the listener (ignore redundant updates) + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Refresh content. - // Note: Wait only for the processing of the delta, not for all updates - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh content. + // Note: Wait only for the processing of the delta, not for all updates + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Update the viewer with new selection delta to something new in the view + // Update the viewer with new selection delta to something new in the view ModelDelta selectDelta = model.makeElementDelta(model.findElement("2.1"), IModelDelta.SELECT); //$NON-NLS-1$ - // Wait for the second model delta to process - fListener.resetModelChanged(); - model.postDelta(selectDelta); + // Wait for the second model delta to process + fListener.resetModelChanged(); + model.postDelta(selectDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Wait for all the updates to complete (note: we're not resetting the listener. - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Wait for all the updates to complete (note: we're not resetting the listener. + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Check to make sure that the state restore didn't change the selection. + // Check to make sure that the state restore didn't change the selection. assertEquals(new TreeSelection(model.findElement("2.1")), fViewer.getSelection()); //$NON-NLS-1$ - } + } public void testPreserveCollapseDeltaAfterContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Turn off auto-expand - fViewer.setAutoExpandLevel(0); + // Turn off auto-expand + fViewer.setAutoExpandLevel(0); - // Reset the listener (ignore redundant updates) - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Reset the listener (ignore redundant updates) + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Refresh content. - // Note: Wait only for the processing of the delta, not for all updates - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh content. + // Note: Wait only for the processing of the delta, not for all updates + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Update the viewer to collapse an element + // Update the viewer to collapse an element ModelDelta collapseDelta = model.makeElementDelta(model.findElement("3.1"), IModelDelta.COLLAPSE); //$NON-NLS-1$ - // Remove updates for the collapsed element from listener, because they - // will never happen if the element remains collapsed. - fListener.resetModelChanged(); + // Remove updates for the collapsed element from listener, because they + // will never happen if the element remains collapsed. + fListener.resetModelChanged(); fListener.removeLabelUpdate(model.findElement("3.1.1")); //$NON-NLS-1$ fListener.removeLabelUpdate(model.findElement("3.1.2")); //$NON-NLS-1$ fListener.removeLabelUpdate(model.findElement("3.1.3")); //$NON-NLS-1$ @@ -614,284 +614,284 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle fListener.removeChildrenUpdate(model.findElement("3.1"), 1); //$NON-NLS-1$ fListener.removeChildrenUpdate(model.findElement("3.1"), 2); //$NON-NLS-1$ - // Wait for the second model delta to process - model.postDelta(collapseDelta); + // Wait for the second model delta to process + model.postDelta(collapseDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Wait for all the updates to complete (note: we're not resetting the listener. - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Wait for all the updates to complete (note: we're not resetting the listener. + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Check to make sure that the state restore didn't change the selection. + // Check to make sure that the state restore didn't change the selection. assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == false); //$NON-NLS-1$ - } + } public void testPreserveExpandDeltaAfterContent() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // Note: Do not auto-expand! + // Note: Do not auto-expand! - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Reset the listener (ignore redundant updates) - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // Reset the listener (ignore redundant updates) + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - // Refresh content. - // Note: Wait only for the processing of the delta, not for all updates - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh content. + // Note: Wait only for the processing of the delta, not for all updates + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Update the viewer to expand an element + // Update the viewer to expand an element ModelDelta expandDelta = model.makeElementDelta(model.findElement("3.1"), IModelDelta.EXPAND); //$NON-NLS-1$ - // Wait for the second model delta to process - fListener.resetModelChanged(); - model.postDelta(expandDelta); + // Wait for the second model delta to process + fListener.resetModelChanged(); + model.postDelta(expandDelta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Wait for all the updates to complete (note: we're not resetting the listener. - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Wait for all the updates to complete (note: we're not resetting the listener. + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Check to make sure that the state restore didn't change the selection. + // Check to make sure that the state restore didn't change the selection. assertTrue(getInternalViewer().getExpandedState(model.findElement("3.1")) == true); //$NON-NLS-1$ - } + } public void testSaveAndRestore1() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Expand some, but not all elements - expandAlternateElements(fListener, model, true); + // Expand some, but not all elements + expandAlternateElements(fListener, model, true); - // Set a selection in view + // Set a selection in view fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("5.1"), model.findElement("5.1.1"), model.findElement("6.1.1") })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(false, false); - fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(false, false); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - // TODO: add state updates somehow? - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // TODO: add state updates somehow? + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - // Extract the restored state from viewer - ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the restored state from viewer + ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); - if (!deltaMatches(originalState, restoredState)) { + if (!deltaMatches(originalState, restoredState)) { fail("Expected:\n" + originalState.toString() + "\nGot:\n" + restoredState); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + } + } public void testSaveAndRestore2() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // expand all elements - fViewer.setAutoExpandLevel(-1); + // expand all elements + fViewer.setAutoExpandLevel(-1); - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Set a selection in view + // Set a selection in view fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("3.2"), model.findElement("3.2.1"), model.findElement("2") })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ fViewer.setSelection(new TreeSelection(model.findElement("3.2.3"))); //$NON-NLS-1$ - // Turn off the auto-expand now since we want to text the auto-expand logic - fViewer.setAutoExpandLevel(-1); + // Turn off the auto-expand now since we want to text the auto-expand logic + fViewer.setAutoExpandLevel(-1); - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(true, false); - fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(true, false); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - // TODO: add state updates somehow? - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // TODO: add state updates somehow? + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - // Extract the restored state from viewer - ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the restored state from viewer + ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); - if (!deltaMatches(originalState, restoredState)) { + if (!deltaMatches(originalState, restoredState)) { fail("Expected:\n" + originalState.toString() + "\nGot:\n" + restoredState); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + } + } public void testSaveAndRestoreInputInstance() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Expand some, but not all elements - expandAlternateElements(fListener, model, true); + // Expand some, but not all elements + expandAlternateElements(fListener, model, true); - // Set a selection in view + // Set a selection in view fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("5.1"), model.findElement("5.1.1"), model.findElement("6.1.1") })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Do not reset to null, just reset input to the same object. + // Do not reset to null, just reset input to the same object. - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - // Extract the restored state from viewer - ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the restored state from viewer + ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); - if (!deltaMatches(originalState, restoredState)) { + if (!deltaMatches(originalState, restoredState)) { fail("Expected:\n" + originalState.toString() + "\nGot:\n" + restoredState); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + } + } public void testSaveAndRestoreInputInstanceEquals() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(6); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(6); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); + // Create the listener, only check the first level + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // Expand some, but not all elements - expandAlternateElements(fListener, model, true); + // Expand some, but not all elements + expandAlternateElements(fListener, model, true); - // Set a selection in view + // Set a selection in view fViewer.setSelection(new TreeSelection(new TreePath[] { model.findElement("5.1"), model.findElement("5.1.1"), model.findElement("6.1.1") })); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Create a copy of the input object and set it to model. - TestElement newRoot = new TestElement(model, model.getRootElement().getID(), model.getRootElement().getChildren()); - model.setRoot(newRoot); + // Create a copy of the input object and set it to model. + TestElement newRoot = new TestElement(model, model.getRootElement().getID(), model.getRootElement().getChildren()); + model.setRoot(newRoot); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - fViewer.setInput(model.getRootElement()); + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - // Extract the restored state from viewer - ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the restored state from viewer + ModelDelta restoredState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, restoredState, IModelDelta.EXPAND | IModelDelta.SELECT); - if (!deltaMatches(originalState, restoredState)) { + if (!deltaMatches(originalState, restoredState)) { fail("Expected:\n" + originalState.toString() + "\nGot:\n" + restoredState); //$NON-NLS-1$ //$NON-NLS-2$ - } - } + } + } public void testSaveAndRestoreLarge() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(100); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(100); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(); + // Create the listener, only check the first level + fListener.reset(); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - expandAlternateElements(fListener, model, false); + expandAlternateElements(fListener, model, false); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + fViewer.setSelection(originalSelection); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(); - fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + fViewer.setInput(null); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(); + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - // Validate data (only select visible elements). + // Validate data (only select visible elements). assertTrue(getInternalViewer().getExpandedState(model.findElement("1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("1.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ @@ -901,64 +901,64 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } - - /** - * This test saves state of a large tree. Then the tree is modified - * to contain much fewer elements. The restore logic should discard the - * rest of the saved state delta once all the elements are visible. - */ + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } + + /** + * This test saves state of a large tree. Then the tree is modified + * to contain much fewer elements. The restore logic should discard the + * rest of the saved state delta once all the elements are visible. + */ public void testSaveAndRestorePartialStateLarge() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = alternatingSubsreesModel(100); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = alternatingSubsreesModel(100); - // NOTE: WE ARE NOT EXPANDING ANY CHILDREN + // NOTE: WE ARE NOT EXPANDING ANY CHILDREN - // Create the listener, only check the first level - fListener.reset(); + // Create the listener, only check the first level + fListener.reset(); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE), createListenerErrorMessage()); - expandAlternateElements(fListener, model, false); + expandAlternateElements(fListener, model, false); - // Set a selection in view + // Set a selection in view TreeSelection originalSelection = new TreeSelection(model.findElement("5.1.1")); //$NON-NLS-1$ - fViewer.setSelection(originalSelection); - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + fViewer.setSelection(originalSelection); + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - // Extract the original state from viewer - ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); + // Extract the original state from viewer + ModelDelta originalState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, originalState, IModelDelta.EXPAND | IModelDelta.SELECT); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(); - fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(); + fListener.addStateUpdates(getInternalViewer(), originalState, IModelDelta.EXPAND | IModelDelta.SELECT | IModelDelta.REVEAL); - fViewer.setInput(null); + fViewer.setInput(null); TestUtil.waitForJobs(getName(), 300, 5000); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE | STATE_UPDATES), createListenerErrorMessage()); - TestElement[] elements = model.getRootElement().getChildren(); - TestElement[] newElements = new TestElement[10]; - System.arraycopy(elements, 0, newElements, 0, newElements.length); - model.setElementChildren(TreePath.EMPTY, newElements); + TestElement[] elements = model.getRootElement().getChildren(); + TestElement[] newElements = new TestElement[10]; + System.arraycopy(elements, 0, newElements, 0, newElements.length); + model.setElementChildren(TreePath.EMPTY, newElements); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(); + fViewer.setInput(model.getRootElement()); TestUtil.waitForJobs(getName(), 300, 5000); - // MONITOR FOR THE STATE RESTORE TO COMPLETE + // MONITOR FOR THE STATE RESTORE TO COMPLETE waitWhile(t -> !fListener.isFinished(CONTENT_SEQUENCE_COMPLETE | STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Validate data + // Validate data assertTrue(getInternalViewer().getExpandedState(model.findElement("1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("1.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ @@ -968,134 +968,134 @@ new TreePath[] { model.findElement("5"), model.findElement("5.1"), model.findEle assertTrue(getInternalViewer().getExpandedState(model.findElement("5")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("5.1")) == true); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("6")) == false); //$NON-NLS-1$ - assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); - } + assertTrue( areTreeSelectionsEqual(originalSelection, (ITreeSelection)fViewer.getSelection()) ); + } public void testPreserveCollapseAndSelectDeltaAfterSaveAndRestore() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); fViewer.setSelection(new TreeSelection(model.findElement("3"))); //$NON-NLS-1$ - // Turn off auto-expand - fViewer.setAutoExpandLevel(0); + // Turn off auto-expand + fViewer.setAutoExpandLevel(0); - // Set the viewer input to null. This will trigger the view to save the viewer state. - fListener.reset(false, false); - fViewer.setInput(null); + // Set the viewer input to null. This will trigger the view to save the viewer state. + fListener.reset(false, false); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(STATE_SAVE_COMPLETE), createListenerErrorMessage()); - // Set the viewer input back to the model. When view updates are complete - // the viewer - // Note: disable redundant updates because the reveal delta triggers one. - fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); - fViewer.setInput(model.getRootElement()); + // Set the viewer input back to the model. When view updates are complete + // the viewer + // Note: disable redundant updates because the reveal delta triggers one. + fListener.reset(TreePath.EMPTY, model.getRootElement(), 1, false, false); + fViewer.setInput(model.getRootElement()); TreePath path = model.findElement("2"); //$NON-NLS-1$ - fListener.addUpdates(null, path, (TestElement)path.getLastSegment(), 0, STATE_UPDATES); + fListener.addUpdates(null, path, (TestElement)path.getLastSegment(), 0, STATE_UPDATES); path = model.findElement("3"); //$NON-NLS-1$ - fListener.addUpdates(null, path, (TestElement)path.getLastSegment(), 0, STATE_UPDATES); + fListener.addUpdates(null, path, (TestElement)path.getLastSegment(), 0, STATE_UPDATES); - // Wait till we restore state of elements we want to collapse and select - // Bug 372619 - Need to wait until proxy installed delta is processed before - // posting the next delta. + // Wait till we restore state of elements we want to collapse and select + // Bug 372619 - Need to wait until proxy installed delta is processed before + // posting the next delta. waitWhile(t -> !fListener.isFinished(STATE_RESTORE_STARTED | STATE_UPDATES | CHILDREN_UPDATES | MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Post first collapse delta - fListener.resetModelChanged(); + // Post first collapse delta + fListener.resetModelChanged(); model.postDelta(model.makeElementDelta(model.findElement("2"), IModelDelta.COLLAPSE)); //$NON-NLS-1$ waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Post second collapse delta - fListener.resetModelChanged(); + // Post second collapse delta + fListener.resetModelChanged(); model.postDelta(model.makeElementDelta(model.findElement("3"), IModelDelta.COLLAPSE)); //$NON-NLS-1$ waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Post select delta + // Post select delta model.postDelta(model.makeElementDelta(model.findElement("1"), IModelDelta.SELECT)); //$NON-NLS-1$ waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - // Wait for all the updates to complete (note: we're not resetting the listener). + // Wait for all the updates to complete (note: we're not resetting the listener). waitWhile(t -> !fListener.isFinished(STATE_RESTORE_COMPLETE), createListenerErrorMessage()); - // Check to make sure that the state restore didn't change the selection. + // Check to make sure that the state restore didn't change the selection. assertTrue(getInternalViewer().getExpandedState(model.findElement("2")) == false); //$NON-NLS-1$ assertTrue(getInternalViewer().getExpandedState(model.findElement("3")) == false); //$NON-NLS-1$ assertEquals(new TreeSelection(model.findElement("1")), fViewer.getSelection()); //$NON-NLS-1$ - } + } - /** - * Test for bug 359859.<br> - * This test verifies that RESTORE state is handled after SAVE previous state was completed - */ + /** + * Test for bug 359859.<br> + * This test verifies that RESTORE state is handled after SAVE previous state was completed + */ public void testSaveRestoreOrder() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleMultiLevel(); - model.setDelayUpdates(true); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + TestModel model = TestModel.simpleMultiLevel(); + model.setDelayUpdates(true); - // Expand all - fViewer.setAutoExpandLevel(-1); + // Expand all + fViewer.setAutoExpandLevel(-1); - // Create the listener. - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener. + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY, true); + model.validateData(fViewer, TreePath.EMPTY, true); - // a new similar model - TestModel copyModel = TestModel.simpleMultiLevel(); + // a new similar model + TestModel copyModel = TestModel.simpleMultiLevel(); - // Trigger save - restore sequence. - fListener.reset(); - fListener.expectRestoreAfterSaveComplete(); - fViewer.setInput(copyModel.getRootElement()); + // Trigger save - restore sequence. + fListener.reset(); + fListener.expectRestoreAfterSaveComplete(); + fViewer.setInput(copyModel.getRootElement()); waitWhile(t -> !fListener.isFinished(STATE_RESTORE_STARTED), createListenerErrorMessage()); assertTrue("RESTORE started before SAVE to complete", fListener.isFinished(STATE_SAVE_COMPLETE)); //$NON-NLS-1$ - } + } - /** - * This test tries to restore a viewer state while input == null. - * See: Bug 380288 - NPE switching to the Breakpoints View - */ + /** + * This test tries to restore a viewer state while input == null. + * See: Bug 380288 - NPE switching to the Breakpoints View + */ public void testUpdateWithNullInput() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleMultiLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - ModelDelta expandedState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); - fViewer.saveElementState(TreePath.EMPTY, expandedState, IModelDelta.EXPAND); + ModelDelta expandedState = new ModelDelta(model.getRootElement(), IModelDelta.NO_CHANGE); + fViewer.saveElementState(TreePath.EMPTY, expandedState, IModelDelta.EXPAND); - // Refresh the viewer so that updates are generated. - fListener.reset(); - fListener.addChildreCountUpdate(TreePath.EMPTY); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh the viewer so that updates are generated. + fListener.reset(); + fListener.addChildreCountUpdate(TreePath.EMPTY); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES), createListenerErrorMessage()); - fViewer.setInput(null); - fViewer.updateViewer(expandedState); + fViewer.setInput(null); + fViewer.updateViewer(expandedState); waitWhile(t -> !fListener.isFinished(CONTENT_COMPLETE | VIEWER_UPDATES_RUNNING), createListenerErrorMessage()); - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TestModel.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TestModel.java index 572a92ea2..cb4da5b01 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TestModel.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TestModel.java @@ -60,891 +60,891 @@ import org.junit.Assert; */ public class TestModel implements IElementContentProvider, IElementLabelProvider, IModelProxyFactory2 , IElementMementoProvider, IModelSelectionPolicyFactory { - public static class TestElement extends PlatformObject { - private final TestModel fModel; - private final String fID; - TestElement[] fChildren; - String fLabelAppendix = ""; //$NON-NLS-1$ - boolean fExpanded; - boolean fChecked; - boolean fGrayed; - - public TestElement(TestModel model, String text, TestElement[] children) { - this (model, text, false, false, children); - } - - public TestElement(TestModel model, String text, boolean checked, boolean grayed, TestElement[] children) { - fModel = model; - fID = text; - fChildren = children; - fChecked = checked; - fGrayed = grayed; - } - - public TestModel getModel() { - return fModel; - } + public static class TestElement extends PlatformObject { + private final TestModel fModel; + private final String fID; + TestElement[] fChildren; + String fLabelAppendix = ""; //$NON-NLS-1$ + boolean fExpanded; + boolean fChecked; + boolean fGrayed; + + public TestElement(TestModel model, String text, TestElement[] children) { + this (model, text, false, false, children); + } + + public TestElement(TestModel model, String text, boolean checked, boolean grayed, TestElement[] children) { + fModel = model; + fID = text; + fChildren = children; + fChecked = checked; + fGrayed = grayed; + } + + public TestModel getModel() { + return fModel; + } @SuppressWarnings("unchecked") @Override public <T> T getAdapter(Class<T> adapter) { - if (adapter.isInstance(fModel)) { + if (adapter.isInstance(fModel)) { return (T) fModel; - } - return null; - } + } + return null; + } - public String getID() { - return fID; - } + public String getID() { + return fID; + } - public void setLabelAppendix(String appendix) { - fLabelAppendix = appendix; - } + public void setLabelAppendix(String appendix) { + fLabelAppendix = appendix; + } - public String getLabel() { - return fID + fLabelAppendix; - } + public String getLabel() { + return fID + fLabelAppendix; + } - public TestElement[] getChildren() { - return fChildren; - } + public TestElement[] getChildren() { + return fChildren; + } - public boolean isExpanded() { - return fExpanded; - } + public boolean isExpanded() { + return fExpanded; + } - public boolean getGrayed() { - return fGrayed; - } + public boolean getGrayed() { + return fGrayed; + } - public boolean getChecked() { - return fChecked; - } + public boolean getChecked() { + return fChecked; + } - public void setChecked(boolean checked, boolean grayed) { - fChecked = checked; - fGrayed = grayed; - } + public void setChecked(boolean checked, boolean grayed) { + fChecked = checked; + fGrayed = grayed; + } - @Override + @Override public boolean equals(Object obj) { - return obj instanceof TestElement && fID.equals(((TestElement)obj).fID); - } + return obj instanceof TestElement && fID.equals(((TestElement)obj).fID); + } - @Override + @Override public int hashCode() { - return fID.hashCode(); - } + return fID.hashCode(); + } - @Override + @Override public String toString() { - return getLabel(); - } + return getLabel(); + } - public int indexOf(TestElement child) { - return Arrays.asList(fChildren).indexOf(child); - } - } + public int indexOf(TestElement child) { + return Arrays.asList(fChildren).indexOf(child); + } + } - private class ModelProxy extends AbstractModelProxy { - @Override + private class ModelProxy extends AbstractModelProxy { + @Override public void installed(Viewer viewer) { - super.installed(viewer); - ModelDelta rootDelta = TestModel.this.getBaseDelta(new ModelDelta(fInput, IModelDelta.NO_CHANGE)); - installSubModelProxies(fRootPath, rootDelta); - fireModelChanged(rootDelta); - } - - private void installSubModelProxies(TreePath path, ModelDelta delta) { - TestElement element = getElement(path); - if (element.fModel != TestModel.this) { - // Found an element from a different model. Install its proxy and return. - delta.setFlags(delta.getFlags() | IModelDelta.INSTALL); - } else { - TestElement[] children = element.getChildren(); - - for (int i = 0; i < children.length; i++) { - installSubModelProxies(path.createChildPath(children[i]), delta.addNode(children[i], IModelDelta.NO_CHANGE)); - } - } - } - } - - private TestElement fRoot; - private Object fInput = null; - private TreePath fRootPath = TreePath.EMPTY; - private ModelProxy fModelProxy; - private IModelSelectionPolicy fModelSelectionPolicy; - private boolean fQueueingUpdates = false; - private boolean fDelayUpdates = false; + super.installed(viewer); + ModelDelta rootDelta = TestModel.this.getBaseDelta(new ModelDelta(fInput, IModelDelta.NO_CHANGE)); + installSubModelProxies(fRootPath, rootDelta); + fireModelChanged(rootDelta); + } + + private void installSubModelProxies(TreePath path, ModelDelta delta) { + TestElement element = getElement(path); + if (element.fModel != TestModel.this) { + // Found an element from a different model. Install its proxy and return. + delta.setFlags(delta.getFlags() | IModelDelta.INSTALL); + } else { + TestElement[] children = element.getChildren(); + + for (int i = 0; i < children.length; i++) { + installSubModelProxies(path.createChildPath(children[i]), delta.addNode(children[i], IModelDelta.NO_CHANGE)); + } + } + } + } + + private TestElement fRoot; + private Object fInput = null; + private TreePath fRootPath = TreePath.EMPTY; + private ModelProxy fModelProxy; + private IModelSelectionPolicy fModelSelectionPolicy; + private boolean fQueueingUpdates = false; + private boolean fDelayUpdates = false; private List<IViewerUpdate> fQueuedUpdates = new LinkedList<>(); - /** - * Constructor private. Use static factory methods instead. - */ - public TestModel() {} + /** + * Constructor private. Use static factory methods instead. + */ + public TestModel() {} - public TestElement getRootElement() { - return fRoot; - } + public TestElement getRootElement() { + return fRoot; + } - public void setSelectionPolicy(IModelSelectionPolicy modelSelectionPolicy) { - fModelSelectionPolicy = modelSelectionPolicy; - } + public void setSelectionPolicy(IModelSelectionPolicy modelSelectionPolicy) { + fModelSelectionPolicy = modelSelectionPolicy; + } - @Override + @Override public IModelSelectionPolicy createModelSelectionPolicyAdapter(Object element, IPresentationContext context) { - return fModelSelectionPolicy; - } - - public ModelDelta getBaseDelta(ModelDelta rootDelta) { - ModelDelta delta = rootDelta; - for (int i = 0; i < fRootPath.getSegmentCount(); i++) { - ModelDelta subDelta = delta.getChildDelta(fRootPath.getSegment(i)); - if (subDelta == null) { - subDelta = delta.addNode(fRootPath.getSegment(i), IModelDelta.NO_CHANGE); - } - delta = subDelta; - } - delta.setChildCount(getRootElement().getChildren().length); - return delta; - } - - public int getModelDepth() { - return getDepth(getRootElement(), 0); - } - - private int getDepth(TestElement element, int atDepth) { - TestElement[] children = element.getChildren(); - if (children.length == 0) { - return atDepth; - } - int depth = atDepth + 1; - for (int i = 0; i < children.length; i++) { - depth = Math.max(depth, getDepth(children[i], atDepth + 1)); - } - - return depth; - } - - public void setQeueueingUpdate(boolean queueingUpdates) { - fQueueingUpdates = queueingUpdates; - if (!fQueueingUpdates) { - processQueuedUpdates(); - } - } - - public void setDelayUpdates(boolean delayUpdates) { - fDelayUpdates = delayUpdates; - } + return fModelSelectionPolicy; + } + + public ModelDelta getBaseDelta(ModelDelta rootDelta) { + ModelDelta delta = rootDelta; + for (int i = 0; i < fRootPath.getSegmentCount(); i++) { + ModelDelta subDelta = delta.getChildDelta(fRootPath.getSegment(i)); + if (subDelta == null) { + subDelta = delta.addNode(fRootPath.getSegment(i), IModelDelta.NO_CHANGE); + } + delta = subDelta; + } + delta.setChildCount(getRootElement().getChildren().length); + return delta; + } + + public int getModelDepth() { + return getDepth(getRootElement(), 0); + } + + private int getDepth(TestElement element, int atDepth) { + TestElement[] children = element.getChildren(); + if (children.length == 0) { + return atDepth; + } + int depth = atDepth + 1; + for (int i = 0; i < children.length; i++) { + depth = Math.max(depth, getDepth(children[i], atDepth + 1)); + } + + return depth; + } + + public void setQeueueingUpdate(boolean queueingUpdates) { + fQueueingUpdates = queueingUpdates; + if (!fQueueingUpdates) { + processQueuedUpdates(); + } + } + + public void setDelayUpdates(boolean delayUpdates) { + fDelayUpdates = delayUpdates; + } public List<IViewerUpdate> getQueuedUpdates() { - return fQueuedUpdates; - } + return fQueuedUpdates; + } - public void processQueuedUpdates() { + public void processQueuedUpdates() { List<IViewerUpdate> updates = new ArrayList<>(fQueuedUpdates); - fQueuedUpdates.clear(); - for (int i = 0; i < updates.size(); i++) { - processUpdate(updates.get(i)); - } - } - - public void processUpdate(IViewerUpdate update) { - if (update instanceof IHasChildrenUpdate) { - doHasChildrenUpdate((IHasChildrenUpdate)update); - } else if (update instanceof IChildrenCountUpdate) { - doChildrenCountUpdate((IChildrenCountUpdate)update); - } else if (update instanceof IChildrenUpdate) { - doChildrenUpdate((IChildrenUpdate)update); - } else if (update instanceof ILabelUpdate) { - doLabelUpdate((ILabelUpdate)update); - } else if (update instanceof IElementCompareRequest) { - doCompareElements((IElementCompareRequest)update); - } else if (update instanceof IElementMementoRequest) { - doEncodeElements((IElementMementoRequest)update); - } - } - - private void processUpdates(IViewerUpdate[] updates) { - for (int i = 0; i < updates.length; i++) { - processUpdate(updates[i]); - } - } - - private void doUpdate(final IViewerUpdate[] updates) { - if (fQueueingUpdates) { - fQueuedUpdates.addAll(Arrays.asList(updates)); - } else if (fDelayUpdates) { + fQueuedUpdates.clear(); + for (int i = 0; i < updates.size(); i++) { + processUpdate(updates.get(i)); + } + } + + public void processUpdate(IViewerUpdate update) { + if (update instanceof IHasChildrenUpdate) { + doHasChildrenUpdate((IHasChildrenUpdate)update); + } else if (update instanceof IChildrenCountUpdate) { + doChildrenCountUpdate((IChildrenCountUpdate)update); + } else if (update instanceof IChildrenUpdate) { + doChildrenUpdate((IChildrenUpdate)update); + } else if (update instanceof ILabelUpdate) { + doLabelUpdate((ILabelUpdate)update); + } else if (update instanceof IElementCompareRequest) { + doCompareElements((IElementCompareRequest)update); + } else if (update instanceof IElementMementoRequest) { + doEncodeElements((IElementMementoRequest)update); + } + } + + private void processUpdates(IViewerUpdate[] updates) { + for (int i = 0; i < updates.length; i++) { + processUpdate(updates[i]); + } + } + + private void doUpdate(final IViewerUpdate[] updates) { + if (fQueueingUpdates) { + fQueuedUpdates.addAll(Arrays.asList(updates)); + } else if (fDelayUpdates) { Display.getDefault().asyncExec(() -> processUpdates(updates)); - } else { + } else { processUpdates(updates); - } - } + } + } - @Override + @Override public void update(IHasChildrenUpdate[] updates) { - doUpdate(updates); - } + doUpdate(updates); + } - private void doHasChildrenUpdate(IHasChildrenUpdate update) { - TestElement element = (TestElement)update.getElement(); - update.setHasChilren(element.getChildren().length > 0); - update.done(); - } + private void doHasChildrenUpdate(IHasChildrenUpdate update) { + TestElement element = (TestElement)update.getElement(); + update.setHasChilren(element.getChildren().length > 0); + update.done(); + } - @Override + @Override public void update(IChildrenCountUpdate[] updates) { - doUpdate(updates); - } + doUpdate(updates); + } - private void doChildrenCountUpdate(IChildrenCountUpdate update) { - TestElement element = (TestElement)update.getElement(); - update.setChildCount(element.getChildren().length); - update.done(); - } + private void doChildrenCountUpdate(IChildrenCountUpdate update) { + TestElement element = (TestElement)update.getElement(); + update.setChildCount(element.getChildren().length); + update.done(); + } - @Override + @Override public void update(IChildrenUpdate[] updates) { - doUpdate(updates); - } - - private void doChildrenUpdate(IChildrenUpdate update) { - TestElement element = (TestElement)update.getElement(); - int endOffset = update.getOffset() + update.getLength(); - for (int j = update.getOffset(); j < endOffset; j++) { - if (j < element.getChildren().length) { - update.setChild(element.getChildren()[j], j); - } - } - update.done(); - } - - @Override + doUpdate(updates); + } + + private void doChildrenUpdate(IChildrenUpdate update) { + TestElement element = (TestElement)update.getElement(); + int endOffset = update.getOffset() + update.getLength(); + for (int j = update.getOffset(); j < endOffset; j++) { + if (j < element.getChildren().length) { + update.setChild(element.getChildren()[j], j); + } + } + update.done(); + } + + @Override public void update(ILabelUpdate[] updates) { - doUpdate(updates); - } - - private void doLabelUpdate(ILabelUpdate update) { - TestElement element = (TestElement)update.getElement(); - update.setLabel(element.getLabel(), 0); - if (update instanceof ICheckUpdate && - Boolean.TRUE.equals(update.getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK))) - { - ((ICheckUpdate)update).setChecked(element.getChecked(), element.getGrayed()); - } - update.done(); - } - - public final static String ELEMENT_MEMENTO_ID = "id"; //$NON-NLS-1$ - - @Override + doUpdate(updates); + } + + private void doLabelUpdate(ILabelUpdate update) { + TestElement element = (TestElement)update.getElement(); + update.setLabel(element.getLabel(), 0); + if (update instanceof ICheckUpdate && + Boolean.TRUE.equals(update.getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK))) + { + ((ICheckUpdate)update).setChecked(element.getChecked(), element.getGrayed()); + } + update.done(); + } + + public final static String ELEMENT_MEMENTO_ID = "id"; //$NON-NLS-1$ + + @Override public void compareElements(final IElementCompareRequest[] updates) { - doUpdate(updates); - } + doUpdate(updates); + } - private void doCompareElements(IElementCompareRequest update) { - String elementID = ((TestElement)update.getElement()).getID(); - String mementoID = update.getMemento().getString(ELEMENT_MEMENTO_ID); - update.setEqual( elementID.equals(mementoID) ); - update.done(); - } + private void doCompareElements(IElementCompareRequest update) { + String elementID = ((TestElement)update.getElement()).getID(); + String mementoID = update.getMemento().getString(ELEMENT_MEMENTO_ID); + update.setEqual( elementID.equals(mementoID) ); + update.done(); + } - @Override + @Override public void encodeElements(IElementMementoRequest[] updates) { - doUpdate(updates); - } - - private void doEncodeElements(IElementMementoRequest update) { - String elementID = ((TestElement)update.getElement()).getID(); - update.getMemento().putString(ELEMENT_MEMENTO_ID, elementID); - update.done(); - } - - /** - * @param context the context - * @param viewerInput the input - * @param path the path - * @param checked the checked state - */ - public void elementChecked(IPresentationContext context, Object viewerInput, TreePath path, boolean checked) { - TestElement element = getElement(path); - Assert.assertFalse(element.getGrayed()); - element.setChecked(checked, false); - } - - @Override + doUpdate(updates); + } + + private void doEncodeElements(IElementMementoRequest update) { + String elementID = ((TestElement)update.getElement()).getID(); + update.getMemento().putString(ELEMENT_MEMENTO_ID, elementID); + update.done(); + } + + /** + * @param context the context + * @param viewerInput the input + * @param path the path + * @param checked the checked state + */ + public void elementChecked(IPresentationContext context, Object viewerInput, TreePath path, boolean checked) { + TestElement element = getElement(path); + Assert.assertFalse(element.getGrayed()); + element.setChecked(checked, false); + } + + @Override public IModelProxy createTreeModelProxy(Object input, TreePath path, IPresentationContext context) { - fModelProxy = new ModelProxy(); - fInput = input; - fRootPath = path; - return fModelProxy; - } - - public IModelProxy getModelProxy() { - return fModelProxy; - } - - public TestElement getElement(TreePath path) { - if (path.getSegmentCount() == 0) { - return getRootElement(); - } else { - return (TestElement)path.getLastSegment(); - } - } - - public void setAllExpanded() { - doSetExpanded(fRoot); - } - - private void doSetExpanded(TestElement element) { - element.fExpanded = true; - for (int i = 0; i < element.fChildren.length; i++) { - doSetExpanded(element.fChildren[i]); - } - } - - public void setAllAppendix(String appendix) { - doSetAllAppendix(fRoot, appendix); - } - - private void doSetAllAppendix(TestElement element, String appendix) { - element.setLabelAppendix(appendix); - for (int i = 0; i < element.fChildren.length; i++) { - doSetAllAppendix(element.fChildren[i], appendix); - } - } - - public void validateData(ITreeModelViewer viewer, TreePath path) { - validateData(viewer, path, false); - } - - public void validateData(ITreeModelViewer _viewer, TreePath path, boolean expandedElementsOnly) { - validateData(_viewer, path, expandedElementsOnly, TestModelUpdatesListener.EMPTY_FILTER_ARRAY); - } - - public void validateData(ITreeModelViewer _viewer, TreePath path, boolean expandedElementsOnly, ViewerFilter[] filters) { - IInternalTreeModelViewer viewer = (IInternalTreeModelViewer)_viewer; - TestElement element = getElement(path); - if ( Boolean.TRUE.equals(_viewer.getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK)) ) { - Assert.assertTrue(element.getChecked() == viewer.getElementChecked(path)); - Assert.assertTrue(element.getGrayed() == viewer.getElementGrayed(path)); - } - - if (!expandedElementsOnly || path.getSegmentCount() == 0 || viewer.getExpandedState(path) ) { - TestElement[] children = element.getChildren(); - - int viewerIndex = 0; - for (int i = 0; i < children.length; i++) { - if (TestModelUpdatesListener.isFiltered(children[i], filters)) { - continue; - } - Assert.assertEquals(children[i], viewer.getChildElement(path, viewerIndex)); - validateData(viewer, path.createChildPath(children[i]), expandedElementsOnly, filters); - viewerIndex++; - } - Assert.assertEquals(viewerIndex, viewer.getChildCount(path)); - } else if (!viewer.getExpandedState(path)) { - // If element not expanded, verify the plus sign. - Assert.assertTrue(viewer.getHasChildren(path) == element.getChildren().length > 0); - } - } - - public void setRoot(TestElement root) { - fRoot = root; - } - - public void postDelta(IModelDelta delta) { - fModelProxy.fireModelChanged(delta); - } - - /** Create or retrieve delta for given path - * @param combine if then new deltas for the given path are created. If false existing ones are reused. - */ - public ModelDelta getElementDelta(ModelDelta baseDelta, TreePath path, boolean combine) { - TestElement element = getRootElement(); - ModelDelta delta = baseDelta; - - for (int i = 0; i < path.getSegmentCount(); i++) { - TestElement[] children = element.getChildren(); - delta.setChildCount(children.length); - Object segment = path.getSegment(i); - int j; - for (j = 0; j < children.length; j++) { - if (segment.equals(children[j])) { - element = children[j]; - ModelDelta nextDelta = null; - if (combine) { - nextDelta = delta.getChildDelta(element); - } - if (nextDelta == null) { - nextDelta = delta.addNode(element, j, IModelDelta.NO_CHANGE, element.getChildren().length); - } - delta = nextDelta; - break; - } - } - if (j == children.length) { - throw new IllegalArgumentException("Invalid path"); //$NON-NLS-1$ - } - } - return delta; - - } - - private TreePath getRelativePath(TreePath path) { - Object[] segments = new Object[path.getSegmentCount() - fRootPath.getSegmentCount()]; - for (int i = fRootPath.getSegmentCount(), _i = 0; i < path.getSegmentCount(); i++, _i++) { - segments[_i] = path.getSegment(i); - } - return new TreePath(segments); - } - - public ModelDelta appendElementLabel(TreePath path, String labelAppendix) { - org.junit.Assert.assertTrue(path.startsWith(fRootPath, null)); - ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - ModelDelta baseDelta = getBaseDelta(rootDelta); - TreePath relativePath = getRelativePath(path); - TestElement element = getElement(relativePath); - ModelDelta delta = getElementDelta(baseDelta, relativePath, false); - element.setLabelAppendix(labelAppendix); - delta.setFlags(delta.getFlags() | IModelDelta.STATE); - - return rootDelta; - } - - public ModelDelta setElementChecked(TreePath path, boolean checked, boolean grayed) { - Assert.assertTrue(path.startsWith(fRootPath, null)); - ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - ModelDelta baseDelta = getBaseDelta(rootDelta); - TreePath relativePath = getRelativePath(path); - TestElement element = getElement(relativePath); - ModelDelta delta = getElementDelta(baseDelta, relativePath, false); - element.setChecked(checked, grayed); - delta.setFlags(delta.getFlags() | IModelDelta.STATE); - - return rootDelta; - } - - public ModelDelta setElementChildren(TreePath path, TestElement[] children) { - Assert.assertTrue(path.startsWith(fRootPath, null)); - ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - ModelDelta baseDelta = getBaseDelta(rootDelta); - TreePath relativePath = getRelativePath(path); - - // Find the parent element and generate the delta node for it. - TestElement element = getElement(relativePath); - ModelDelta delta = getElementDelta(baseDelta, relativePath, false); - - // Set the new children array - element.fChildren = children; - - // Add the delta flag and update the child count in the parent delta. - delta.setFlags(delta.getFlags() | IModelDelta.CONTENT); - delta.setChildCount(children.length); - - return rootDelta; - } - - public ModelDelta replaceElementChild(TreePath parentPath, int index, TestElement child) { - ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - ModelDelta baseDelta = getBaseDelta(rootDelta); - TreePath relativePath = getRelativePath(parentPath); - - TestElement element = getElement(relativePath); - ModelDelta delta= getElementDelta(baseDelta, relativePath, false); - TestElement oldChild = element.fChildren[index]; - element.fChildren[index] = child; - delta.addNode(oldChild, child, IModelDelta.REPLACED); - // TODO: set replacement index!?! - - return rootDelta; - } - - public ModelDelta addElementChild(TreePath parentPath, ModelDelta rootDelta, int index, TestElement newChild) { - if (rootDelta == null) { - rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - } - ModelDelta baseDelta = getBaseDelta(rootDelta); - TreePath relativePath = getRelativePath(parentPath); - - // Find the parent element and generate the delta node for it. - TestElement element = getElement(relativePath); - ModelDelta delta= getElementDelta(baseDelta, relativePath, true); - - // Add the new element - element.fChildren = doInsertElementInArray(element.fChildren, index, newChild); - - // Add the delta flag and update the child count in the parent delta. - delta.setChildCount(element.getChildren().length); - delta.addNode(newChild, index, IModelDelta.ADDED); - - return rootDelta; - } - - public ModelDelta insertElementChild(TreePath parentPath, int index, TestElement newChild) { - return insertElementChild(null, parentPath, index, newChild); - } - - public ModelDelta insertElementChild(ModelDelta rootDelta, TreePath parentPath, int index, TestElement newChild) { - if (rootDelta == null) { - rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - } - ModelDelta baseDelta = getBaseDelta(rootDelta); - TreePath relativePath = getRelativePath(parentPath); - - // Find the parent element and generate the delta node for it. - TestElement element = getElement(relativePath); - ModelDelta delta= getElementDelta(baseDelta, relativePath, false); - - // Add the new element - element.fChildren = doInsertElementInArray(element.fChildren, index, newChild); - - // Add the delta flag and update the child count in the parent delta. - delta.setChildCount(element.getChildren().length); - delta.addNode(newChild, index, IModelDelta.INSERTED); - - return rootDelta; - } - - private TestElement[] doInsertElementInArray(TestElement[] children, int index, TestElement newChild) { - // Create the new children array add the element to it and set it to - // the parent. - TestElement[] newChildren = new TestElement[children.length + 1]; - System.arraycopy(children, 0, newChildren, 0, index); - newChildren[index] = newChild; - System.arraycopy(children, index, newChildren, index + 1, children.length - index); - return newChildren; - } - - public ModelDelta removeElementChild(TreePath parentPath, int index) { - ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - ModelDelta baseDelta = getBaseDelta(rootDelta); - - // Find the parent element and generate the delta node for it. - TestElement element = getElement(parentPath); - ModelDelta delta= getElementDelta(baseDelta, parentPath, false); - - // Create a new child array with the element removed - TestElement[] children = element.getChildren(); - TestElement childToRemove = children[index]; - TestElement[] newChildren = new TestElement[children.length - 1]; - System.arraycopy(children, 0, newChildren, 0, index); - System.arraycopy(children, index + 1, newChildren, index, children.length - index - 1); - element.fChildren = newChildren; - - // Add the delta flag and update the child count in the parent delta. - delta.setChildCount(element.getChildren().length); - delta.addNode(childToRemove, index, IModelDelta.REMOVED); - - return rootDelta; - } - - public ModelDelta makeElementDelta(TreePath path, int flags) { - ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); - ModelDelta baseDelta = getBaseDelta(rootDelta); - - // Find the element and generate the delta node for it. - ModelDelta delta= getElementDelta(baseDelta, path, false); - - delta.setFlags(flags); - return rootDelta; - } - - public TreePath findElement(String label) { - return findElement(TreePath.EMPTY, label); - } - - public TreePath findElement(TreePath startPath, String label) { - TestElement element = getElement(startPath); - for (int i = 0; i < element.getChildren().length; i++) { - TestElement child = element.getChildren()[i]; - TreePath path = startPath.createChildPath(child); - if ( label.equals(child.getLabel()) ) { - return path; - } else { - TreePath subPath = findElement(path, label); - if (subPath != null) { - return subPath; - } - } - } - return null; - } - - @Override + fModelProxy = new ModelProxy(); + fInput = input; + fRootPath = path; + return fModelProxy; + } + + public IModelProxy getModelProxy() { + return fModelProxy; + } + + public TestElement getElement(TreePath path) { + if (path.getSegmentCount() == 0) { + return getRootElement(); + } else { + return (TestElement)path.getLastSegment(); + } + } + + public void setAllExpanded() { + doSetExpanded(fRoot); + } + + private void doSetExpanded(TestElement element) { + element.fExpanded = true; + for (int i = 0; i < element.fChildren.length; i++) { + doSetExpanded(element.fChildren[i]); + } + } + + public void setAllAppendix(String appendix) { + doSetAllAppendix(fRoot, appendix); + } + + private void doSetAllAppendix(TestElement element, String appendix) { + element.setLabelAppendix(appendix); + for (int i = 0; i < element.fChildren.length; i++) { + doSetAllAppendix(element.fChildren[i], appendix); + } + } + + public void validateData(ITreeModelViewer viewer, TreePath path) { + validateData(viewer, path, false); + } + + public void validateData(ITreeModelViewer _viewer, TreePath path, boolean expandedElementsOnly) { + validateData(_viewer, path, expandedElementsOnly, TestModelUpdatesListener.EMPTY_FILTER_ARRAY); + } + + public void validateData(ITreeModelViewer _viewer, TreePath path, boolean expandedElementsOnly, ViewerFilter[] filters) { + IInternalTreeModelViewer viewer = (IInternalTreeModelViewer)_viewer; + TestElement element = getElement(path); + if ( Boolean.TRUE.equals(_viewer.getPresentationContext().getProperty(ICheckUpdate.PROP_CHECK)) ) { + Assert.assertTrue(element.getChecked() == viewer.getElementChecked(path)); + Assert.assertTrue(element.getGrayed() == viewer.getElementGrayed(path)); + } + + if (!expandedElementsOnly || path.getSegmentCount() == 0 || viewer.getExpandedState(path) ) { + TestElement[] children = element.getChildren(); + + int viewerIndex = 0; + for (int i = 0; i < children.length; i++) { + if (TestModelUpdatesListener.isFiltered(children[i], filters)) { + continue; + } + Assert.assertEquals(children[i], viewer.getChildElement(path, viewerIndex)); + validateData(viewer, path.createChildPath(children[i]), expandedElementsOnly, filters); + viewerIndex++; + } + Assert.assertEquals(viewerIndex, viewer.getChildCount(path)); + } else if (!viewer.getExpandedState(path)) { + // If element not expanded, verify the plus sign. + Assert.assertTrue(viewer.getHasChildren(path) == element.getChildren().length > 0); + } + } + + public void setRoot(TestElement root) { + fRoot = root; + } + + public void postDelta(IModelDelta delta) { + fModelProxy.fireModelChanged(delta); + } + + /** Create or retrieve delta for given path + * @param combine if then new deltas for the given path are created. If false existing ones are reused. + */ + public ModelDelta getElementDelta(ModelDelta baseDelta, TreePath path, boolean combine) { + TestElement element = getRootElement(); + ModelDelta delta = baseDelta; + + for (int i = 0; i < path.getSegmentCount(); i++) { + TestElement[] children = element.getChildren(); + delta.setChildCount(children.length); + Object segment = path.getSegment(i); + int j; + for (j = 0; j < children.length; j++) { + if (segment.equals(children[j])) { + element = children[j]; + ModelDelta nextDelta = null; + if (combine) { + nextDelta = delta.getChildDelta(element); + } + if (nextDelta == null) { + nextDelta = delta.addNode(element, j, IModelDelta.NO_CHANGE, element.getChildren().length); + } + delta = nextDelta; + break; + } + } + if (j == children.length) { + throw new IllegalArgumentException("Invalid path"); //$NON-NLS-1$ + } + } + return delta; + + } + + private TreePath getRelativePath(TreePath path) { + Object[] segments = new Object[path.getSegmentCount() - fRootPath.getSegmentCount()]; + for (int i = fRootPath.getSegmentCount(), _i = 0; i < path.getSegmentCount(); i++, _i++) { + segments[_i] = path.getSegment(i); + } + return new TreePath(segments); + } + + public ModelDelta appendElementLabel(TreePath path, String labelAppendix) { + org.junit.Assert.assertTrue(path.startsWith(fRootPath, null)); + ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + ModelDelta baseDelta = getBaseDelta(rootDelta); + TreePath relativePath = getRelativePath(path); + TestElement element = getElement(relativePath); + ModelDelta delta = getElementDelta(baseDelta, relativePath, false); + element.setLabelAppendix(labelAppendix); + delta.setFlags(delta.getFlags() | IModelDelta.STATE); + + return rootDelta; + } + + public ModelDelta setElementChecked(TreePath path, boolean checked, boolean grayed) { + Assert.assertTrue(path.startsWith(fRootPath, null)); + ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + ModelDelta baseDelta = getBaseDelta(rootDelta); + TreePath relativePath = getRelativePath(path); + TestElement element = getElement(relativePath); + ModelDelta delta = getElementDelta(baseDelta, relativePath, false); + element.setChecked(checked, grayed); + delta.setFlags(delta.getFlags() | IModelDelta.STATE); + + return rootDelta; + } + + public ModelDelta setElementChildren(TreePath path, TestElement[] children) { + Assert.assertTrue(path.startsWith(fRootPath, null)); + ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + ModelDelta baseDelta = getBaseDelta(rootDelta); + TreePath relativePath = getRelativePath(path); + + // Find the parent element and generate the delta node for it. + TestElement element = getElement(relativePath); + ModelDelta delta = getElementDelta(baseDelta, relativePath, false); + + // Set the new children array + element.fChildren = children; + + // Add the delta flag and update the child count in the parent delta. + delta.setFlags(delta.getFlags() | IModelDelta.CONTENT); + delta.setChildCount(children.length); + + return rootDelta; + } + + public ModelDelta replaceElementChild(TreePath parentPath, int index, TestElement child) { + ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + ModelDelta baseDelta = getBaseDelta(rootDelta); + TreePath relativePath = getRelativePath(parentPath); + + TestElement element = getElement(relativePath); + ModelDelta delta= getElementDelta(baseDelta, relativePath, false); + TestElement oldChild = element.fChildren[index]; + element.fChildren[index] = child; + delta.addNode(oldChild, child, IModelDelta.REPLACED); + // TODO: set replacement index!?! + + return rootDelta; + } + + public ModelDelta addElementChild(TreePath parentPath, ModelDelta rootDelta, int index, TestElement newChild) { + if (rootDelta == null) { + rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + } + ModelDelta baseDelta = getBaseDelta(rootDelta); + TreePath relativePath = getRelativePath(parentPath); + + // Find the parent element and generate the delta node for it. + TestElement element = getElement(relativePath); + ModelDelta delta= getElementDelta(baseDelta, relativePath, true); + + // Add the new element + element.fChildren = doInsertElementInArray(element.fChildren, index, newChild); + + // Add the delta flag and update the child count in the parent delta. + delta.setChildCount(element.getChildren().length); + delta.addNode(newChild, index, IModelDelta.ADDED); + + return rootDelta; + } + + public ModelDelta insertElementChild(TreePath parentPath, int index, TestElement newChild) { + return insertElementChild(null, parentPath, index, newChild); + } + + public ModelDelta insertElementChild(ModelDelta rootDelta, TreePath parentPath, int index, TestElement newChild) { + if (rootDelta == null) { + rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + } + ModelDelta baseDelta = getBaseDelta(rootDelta); + TreePath relativePath = getRelativePath(parentPath); + + // Find the parent element and generate the delta node for it. + TestElement element = getElement(relativePath); + ModelDelta delta= getElementDelta(baseDelta, relativePath, false); + + // Add the new element + element.fChildren = doInsertElementInArray(element.fChildren, index, newChild); + + // Add the delta flag and update the child count in the parent delta. + delta.setChildCount(element.getChildren().length); + delta.addNode(newChild, index, IModelDelta.INSERTED); + + return rootDelta; + } + + private TestElement[] doInsertElementInArray(TestElement[] children, int index, TestElement newChild) { + // Create the new children array add the element to it and set it to + // the parent. + TestElement[] newChildren = new TestElement[children.length + 1]; + System.arraycopy(children, 0, newChildren, 0, index); + newChildren[index] = newChild; + System.arraycopy(children, index, newChildren, index + 1, children.length - index); + return newChildren; + } + + public ModelDelta removeElementChild(TreePath parentPath, int index) { + ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + ModelDelta baseDelta = getBaseDelta(rootDelta); + + // Find the parent element and generate the delta node for it. + TestElement element = getElement(parentPath); + ModelDelta delta= getElementDelta(baseDelta, parentPath, false); + + // Create a new child array with the element removed + TestElement[] children = element.getChildren(); + TestElement childToRemove = children[index]; + TestElement[] newChildren = new TestElement[children.length - 1]; + System.arraycopy(children, 0, newChildren, 0, index); + System.arraycopy(children, index + 1, newChildren, index, children.length - index - 1); + element.fChildren = newChildren; + + // Add the delta flag and update the child count in the parent delta. + delta.setChildCount(element.getChildren().length); + delta.addNode(childToRemove, index, IModelDelta.REMOVED); + + return rootDelta; + } + + public ModelDelta makeElementDelta(TreePath path, int flags) { + ModelDelta rootDelta = new ModelDelta(fInput, IModelDelta.NO_CHANGE); + ModelDelta baseDelta = getBaseDelta(rootDelta); + + // Find the element and generate the delta node for it. + ModelDelta delta= getElementDelta(baseDelta, path, false); + + delta.setFlags(flags); + return rootDelta; + } + + public TreePath findElement(String label) { + return findElement(TreePath.EMPTY, label); + } + + public TreePath findElement(TreePath startPath, String label) { + TestElement element = getElement(startPath); + for (int i = 0; i < element.getChildren().length; i++) { + TestElement child = element.getChildren()[i]; + TreePath path = startPath.createChildPath(child); + if ( label.equals(child.getLabel()) ) { + return path; + } else { + TreePath subPath = findElement(path, label); + if (subPath != null) { + return subPath; + } + } + } + return null; + } + + @Override public String toString() { - return getElementString(fRoot, ""); //$NON-NLS-1$ - } - - public String getElementString(TestElement element, String indent) { - StringBuilder builder = new StringBuilder(); - builder.append(indent); - builder.append(element.toString()); - builder.append('\n'); - TestElement[] children = element.getChildren(); - for (int i = 0; i < children.length; i++) { - builder.append(getElementString(children[i], indent + " ")); //$NON-NLS-1$ - } - return builder.toString(); - } - - public static TestModel simpleSingleLevel() { - TestModel model = new TestModel(); - model.setRoot( new TestElement(model, "root", makeSingleLevelModelElements(model, 6, ""))); //$NON-NLS-1$ //$NON-NLS-2$ - return model; - } - - public static TestElement[] makeSingleLevelModelElements(TestModel model, int length, String prefix) { - TestElement[] elements = new TestElement[length]; - for (int i = 1; i <= length; i++) { - String name = prefix + i; - elements[i - 1] = new TestElement(model, name, new TestElement[0]); - } - return elements; - } - - public static TestElement[] makeMultiLevelElements(TestModel model, int depth, String prefix) { - TestElement[] elements = new TestElement[depth]; - for (int i = 0; i < depth; i++) { - String name = prefix + i; - elements[i] = new TestElement(model, name, makeMultiLevelElements(model, i, name + ".")); //$NON-NLS-1$ - } - return elements; - } - - public static TestElement[] makeMultiLevelElements2(TestModel model, int[] levelCounts, String prefix) { - if (levelCounts.length == 0) { + return getElementString(fRoot, ""); //$NON-NLS-1$ + } + + public String getElementString(TestElement element, String indent) { + StringBuilder builder = new StringBuilder(); + builder.append(indent); + builder.append(element.toString()); + builder.append('\n'); + TestElement[] children = element.getChildren(); + for (int i = 0; i < children.length; i++) { + builder.append(getElementString(children[i], indent + " ")); //$NON-NLS-1$ + } + return builder.toString(); + } + + public static TestModel simpleSingleLevel() { + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", makeSingleLevelModelElements(model, 6, ""))); //$NON-NLS-1$ //$NON-NLS-2$ + return model; + } + + public static TestElement[] makeSingleLevelModelElements(TestModel model, int length, String prefix) { + TestElement[] elements = new TestElement[length]; + for (int i = 1; i <= length; i++) { + String name = prefix + i; + elements[i - 1] = new TestElement(model, name, new TestElement[0]); + } + return elements; + } + + public static TestElement[] makeMultiLevelElements(TestModel model, int depth, String prefix) { + TestElement[] elements = new TestElement[depth]; + for (int i = 0; i < depth; i++) { + String name = prefix + i; + elements[i] = new TestElement(model, name, makeMultiLevelElements(model, i, name + ".")); //$NON-NLS-1$ + } + return elements; + } + + public static TestElement[] makeMultiLevelElements2(TestModel model, int[] levelCounts, String prefix) { + if (levelCounts.length == 0) { return new TestElement[0]; } - int count = levelCounts[0]; - int[] oldLevelCounts = levelCounts; - levelCounts = new int[levelCounts.length - 1]; - System.arraycopy(oldLevelCounts, 1, levelCounts, 0, levelCounts.length); - TestElement[] elements = new TestElement[count]; - for (int i = 0; i < count; i++) { - String name = prefix + i; - elements[i] = new TestElement(model, name, makeMultiLevelElements2(model, levelCounts, name + ".")); //$NON-NLS-1$ - } - return elements; - } - - public static TestModel simpleMultiLevel() { - TestModel model = new TestModel(); - model.setRoot( new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "2", true, false, new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "2.1", true, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "2.2", false, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "2.3", true, false, new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.1", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.1.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.1.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.1.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.2", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.2.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.2.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.2.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.3", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.3.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.3.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.3.3", new TestElement[0]), //$NON-NLS-1$ - }), - }) - }) ); - return model; - } - - public static TestModel compositeMultiLevel() { - TestModel m2 = new TestModel(); - m2.setRoot( new TestElement(m2, "m2.root", new TestElement[] { //$NON-NLS-1$ - new TestElement(m2, "m2.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(m2, "m2.2", true, false, new TestElement[] { //$NON-NLS-1$ - new TestElement(m2, "m2.2.1", true, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(m2, "m2.2.2", false, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(m2, "m2.2.3", true, false, new TestElement[0]), //$NON-NLS-1$ - }), - }) ); - - TestModel m3 = new TestModel(); - m3.setRoot( new TestElement(m3, "m3.root", new TestElement[] { //$NON-NLS-1$ - new TestElement(m3, "m3.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(m3, "m3.2", true, false, new TestElement[] { //$NON-NLS-1$ - new TestElement(m3, "m3.2.1", true, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(m3, "m3.2.2", false, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(m3, "m3.2.3", true, false, new TestElement[0]), //$NON-NLS-1$ - }), - }) ); - - TestModel m4 = new TestModel(); - m4.setRoot( new TestElement(m4, "m4.root", new TestElement[] { //$NON-NLS-1$ - new TestElement(m4, "m4.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(m4, "m4.2", true, false, new TestElement[] { //$NON-NLS-1$ - new TestElement(m4, "m4.2.1", true, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(m4, "m4.2.2", false, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(m4, "m4.2.3", true, false, new TestElement[0]), //$NON-NLS-1$ - }), - }) ); - - TestModel m1 = new TestModel(); - m1.setRoot( new TestElement(m1, "m1.root", new TestElement[] { //$NON-NLS-1$ - new TestElement(m1, "m1.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(m1, "m1.2", true, false, new TestElement[] { //$NON-NLS-1$ - m2.fRoot, - m3.fRoot, - m4.fRoot, - }), - }) ); - - - return m1; - } - - public static TestModel simpleDeepMultiLevel() { - TestModel model = new TestModel(); - model.setRoot( new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "2", true, false, new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "2.1", true, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "2.2", false, true, new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "2.3", true, false, new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.1", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.1.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.1.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.1.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.2", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.2.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.2.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.2.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.3", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.3.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.3.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.3.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.4", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.4.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.4.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.4.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.5", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.5.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.5.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.5.3", new TestElement[0]), //$NON-NLS-1$ - }), - new TestElement(model, "3.6", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.3.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.4", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.5", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.6", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.7", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.8", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.9", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.10", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.11", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.12", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.13", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.14", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.15", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.4", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.5", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.6", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.7", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.8", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.9", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.10", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.11", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.12", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.13", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.14", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.15", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.4", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.5", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.6", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.7", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.8", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.9", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.10", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.11", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.12", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.13", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.14", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.15", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.4", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.5", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.6", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.7", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.8", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.9", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.10", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.11", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.12", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.13", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.14", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.15", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.4", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.5", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.6", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.7", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.8", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.9", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.10", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.11", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.12", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.13", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.14", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.15", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16", new TestElement[] { //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.1", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.2", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.4", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.5", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.6", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.7", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.8", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.9", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.10", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.11", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.12", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.13", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.14", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.15", new TestElement[0]), //$NON-NLS-1$ - new TestElement(model, "3.6.3.16.16.16.16.16.16", new TestElement[0]), //$NON-NLS-1$ - }), - }), - }), - }), - }), - }), - }), - }) - }) ); - return model; - } + int count = levelCounts[0]; + int[] oldLevelCounts = levelCounts; + levelCounts = new int[levelCounts.length - 1]; + System.arraycopy(oldLevelCounts, 1, levelCounts, 0, levelCounts.length); + TestElement[] elements = new TestElement[count]; + for (int i = 0; i < count; i++) { + String name = prefix + i; + elements[i] = new TestElement(model, name, makeMultiLevelElements2(model, levelCounts, name + ".")); //$NON-NLS-1$ + } + return elements; + } + + public static TestModel simpleMultiLevel() { + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "2", true, false, new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "2.1", true, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "2.2", false, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "2.3", true, false, new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.1", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.1.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.1.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.1.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.2", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.2.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.2.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.2.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.3", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.3.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.3.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.3.3", new TestElement[0]), //$NON-NLS-1$ + }), + }) + }) ); + return model; + } + + public static TestModel compositeMultiLevel() { + TestModel m2 = new TestModel(); + m2.setRoot( new TestElement(m2, "m2.root", new TestElement[] { //$NON-NLS-1$ + new TestElement(m2, "m2.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(m2, "m2.2", true, false, new TestElement[] { //$NON-NLS-1$ + new TestElement(m2, "m2.2.1", true, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(m2, "m2.2.2", false, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(m2, "m2.2.3", true, false, new TestElement[0]), //$NON-NLS-1$ + }), + }) ); + + TestModel m3 = new TestModel(); + m3.setRoot( new TestElement(m3, "m3.root", new TestElement[] { //$NON-NLS-1$ + new TestElement(m3, "m3.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(m3, "m3.2", true, false, new TestElement[] { //$NON-NLS-1$ + new TestElement(m3, "m3.2.1", true, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(m3, "m3.2.2", false, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(m3, "m3.2.3", true, false, new TestElement[0]), //$NON-NLS-1$ + }), + }) ); + + TestModel m4 = new TestModel(); + m4.setRoot( new TestElement(m4, "m4.root", new TestElement[] { //$NON-NLS-1$ + new TestElement(m4, "m4.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(m4, "m4.2", true, false, new TestElement[] { //$NON-NLS-1$ + new TestElement(m4, "m4.2.1", true, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(m4, "m4.2.2", false, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(m4, "m4.2.3", true, false, new TestElement[0]), //$NON-NLS-1$ + }), + }) ); + + TestModel m1 = new TestModel(); + m1.setRoot( new TestElement(m1, "m1.root", new TestElement[] { //$NON-NLS-1$ + new TestElement(m1, "m1.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(m1, "m1.2", true, false, new TestElement[] { //$NON-NLS-1$ + m2.fRoot, + m3.fRoot, + m4.fRoot, + }), + }) ); + + + return m1; + } + + public static TestModel simpleDeepMultiLevel() { + TestModel model = new TestModel(); + model.setRoot( new TestElement(model, "root", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "2", true, false, new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "2.1", true, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "2.2", false, true, new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "2.3", true, false, new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.1", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.1.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.1.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.1.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.2", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.2.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.2.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.2.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.3", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.3.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.3.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.3.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.4", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.4.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.4.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.4.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.5", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.5.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.5.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.5.3", new TestElement[0]), //$NON-NLS-1$ + }), + new TestElement(model, "3.6", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.3.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.4", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.5", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.6", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.7", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.8", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.9", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.10", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.11", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.12", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.13", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.14", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.15", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.4", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.5", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.6", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.7", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.8", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.9", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.10", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.11", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.12", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.13", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.14", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.15", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.4", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.5", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.6", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.7", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.8", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.9", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.10", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.11", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.12", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.13", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.14", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.15", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.4", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.5", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.6", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.7", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.8", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.9", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.10", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.11", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.12", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.13", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.14", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.15", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.4", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.5", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.6", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.7", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.8", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.9", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.10", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.11", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.12", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.13", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.14", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.15", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16", new TestElement[] { //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.1", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.2", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.4", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.5", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.6", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.7", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.8", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.9", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.10", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.11", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.12", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.13", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.14", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.15", new TestElement[0]), //$NON-NLS-1$ + new TestElement(model, "3.6.3.16.16.16.16.16.16", new TestElement[0]), //$NON-NLS-1$ + }), + }), + }), + }), + }), + }), + }), + }) + }) ); + return model; + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreeModelViewerAutopopulateAgent.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreeModelViewerAutopopulateAgent.java index 2798ee6cf..33b262caf 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreeModelViewerAutopopulateAgent.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreeModelViewerAutopopulateAgent.java @@ -29,76 +29,76 @@ import org.eclipse.swt.widgets.Widget; public class TreeModelViewerAutopopulateAgent implements IViewerUpdateListener { - private TreeModelViewer fViewer; + private TreeModelViewer fViewer; - public TreeModelViewerAutopopulateAgent(TreeModelViewer viewer) { - fViewer = viewer; - fViewer.addViewerUpdateListener(this); - } + public TreeModelViewerAutopopulateAgent(TreeModelViewer viewer) { + fViewer = viewer; + fViewer.addViewerUpdateListener(this); + } - public void dispose() { - fViewer.removeViewerUpdateListener(this); - fViewer = null; - } + public void dispose() { + fViewer.removeViewerUpdateListener(this); + fViewer = null; + } - @Override + @Override public void updateComplete(IViewerUpdate update) { - if (update instanceof IChildrenCountUpdate) { - TreePath path = update.getElementPath(); - ILazyTreePathContentProvider contentProvider = (ILazyTreePathContentProvider) fViewer.getContentProvider(); - - Widget[] items = fViewer.testFindItems(update.getElement()); - for (int i = 0; i < items.length; i++) { - if ( path.equals(getTreePath(items[i])) ) { - int itemCount = getItemChildCount(items[i]); - for (int j = 0; j < itemCount; j++) { - contentProvider.updateElement(path, j); - } - } - } - } - } - - @Override + if (update instanceof IChildrenCountUpdate) { + TreePath path = update.getElementPath(); + ILazyTreePathContentProvider contentProvider = (ILazyTreePathContentProvider) fViewer.getContentProvider(); + + Widget[] items = fViewer.testFindItems(update.getElement()); + for (int i = 0; i < items.length; i++) { + if ( path.equals(getTreePath(items[i])) ) { + int itemCount = getItemChildCount(items[i]); + for (int j = 0; j < itemCount; j++) { + contentProvider.updateElement(path, j); + } + } + } + } + } + + @Override public void updateStarted(IViewerUpdate update) { - // TODO Auto-generated method stub + // TODO Auto-generated method stub - } + } - @Override + @Override public void viewerUpdatesBegin() { - // TODO Auto-generated method stub + // TODO Auto-generated method stub - } + } - @Override + @Override public void viewerUpdatesComplete() { - // TODO Auto-generated method stub + // TODO Auto-generated method stub - } + } - private TreePath getTreePath(Widget w) { - if (w instanceof TreeItem) { - TreeItem item = (TreeItem)w; + private TreePath getTreePath(Widget w) { + if (w instanceof TreeItem) { + TreeItem item = (TreeItem)w; LinkedList<Object> segments = new LinkedList<>(); - while (item != null) { - Object segment = item.getData(); - Assert.isNotNull(segment); - segments.addFirst(segment); - item = item.getParentItem(); - } - return new TreePath(segments.toArray()); - } - return TreePath.EMPTY; - } - - private int getItemChildCount(Widget w) { - if (w instanceof Tree) { - return ((Tree)w).getItemCount(); - } else if (w instanceof TreeItem) { - return ((TreeItem)w).getItemCount(); - } - return 0; - } + while (item != null) { + Object segment = item.getData(); + Assert.isNotNull(segment); + segments.addFirst(segment); + item = item.getParentItem(); + } + return new TreePath(segments.toArray()); + } + return TreePath.EMPTY; + } + + private int getItemChildCount(Widget w) { + if (w instanceof Tree) { + return ((Tree)w).getItemCount(); + } else if (w instanceof TreeItem) { + return ((TreeItem)w).getItemCount(); + } + return 0; + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreePathWrapper.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreePathWrapper.java index b68c73280..306f020b8 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreePathWrapper.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/TreePathWrapper.java @@ -24,48 +24,48 @@ import org.junit.Assert; * @since 3.7 */ public class TreePathWrapper { - private final TreePath fPath; + private final TreePath fPath; - public TreePathWrapper(TreePath path) { - fPath = path; - } + public TreePathWrapper(TreePath path) { + fPath = path; + } - @Override + @Override public int hashCode() { - return fPath.hashCode(); - } + return fPath.hashCode(); + } - @Override + @Override public boolean equals(Object obj) { - return obj instanceof TreePathWrapper && - fPath.equals( ((TreePathWrapper)obj).fPath ); - } + return obj instanceof TreePathWrapper && + fPath.equals( ((TreePathWrapper)obj).fPath ); + } - @Override + @Override public String toString() { - if (fPath.getSegmentCount() == 0) { - return "TreePath:EMPTY"; //$NON-NLS-1$ - } + if (fPath.getSegmentCount() == 0) { + return "TreePath:EMPTY"; //$NON-NLS-1$ + } - StringBuilder buf = new StringBuilder("TreePath:["); //$NON-NLS-1$ + StringBuilder buf = new StringBuilder("TreePath:["); //$NON-NLS-1$ - for (int i = 0; i < fPath.getSegmentCount(); i++) { - if (i != 0) { - buf.append(", "); //$NON-NLS-1$ - } - buf.append(fPath.getSegment(i)); - } - buf.append(']'); - return buf.toString(); - } + for (int i = 0; i < fPath.getSegmentCount(); i++) { + if (i != 0) { + buf.append(", "); //$NON-NLS-1$ + } + buf.append(fPath.getSegment(i)); + } + buf.append(']'); + return buf.toString(); + } - /** - * Asserts that the two given tree paths are the same. In case of failure, the - * generated exception will contain a printout of the tree paths' contents. - */ - public static void assertEqual(TreePath expected, TreePath actual) { - Assert.assertEquals( - expected != null ? new TreePathWrapper(expected) : null, - actual != null ? new TreePathWrapper(actual) : null); - } + /** + * Asserts that the two given tree paths are the same. In case of failure, the + * generated exception will contain a printout of the tree paths' contents. + */ + public static void assertEqual(TreePath expected, TreePath actual) { + Assert.assertEquals( + expected != null ? new TreePathWrapper(expected) : null, + actual != null ? new TreePathWrapper(actual) : null); + } }
\ No newline at end of file diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/UpdateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/UpdateTests.java index b51907bc2..bba5dec82 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/UpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/UpdateTests.java @@ -39,235 +39,235 @@ import org.junit.Assert; */ abstract public class UpdateTests extends AbstractViewerModelTest implements ITestModelUpdatesListenerConstants { - public UpdateTests(String name) { - super(name); - } + public UpdateTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { return new TestModelUpdatesListener(viewer, false, false); } - /** - * This test: - * - creates a simple model - * - replaces the list of elements with a shorter list of elements - * - refreshes the viewer - */ + /** + * This test: + * - creates a simple model + * - replaces the list of elements with a shorter list of elements + * - refreshes the viewer + */ public void testRemoveElements() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - TestElement root = model.getRootElement(); - TreePath rootPath = new TreePath(new Object[] {}); - TestElement[] newElements = new TestElement[] { + // Update the model + TestElement root = model.getRootElement(); + TreePath rootPath = new TreePath(new Object[] {}); + TestElement[] newElements = new TestElement[] { new TestElement(model, "1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "2", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "3", new TestElement[0]), //$NON-NLS-1$ - }; - model.setElementChildren(rootPath, newElements); + }; + model.setElementChildren(rootPath, newElements); - // Reset the listener to NOT fail on redundant updates. - // When elements are remvoed from the model and the model is - // refreshed the viewer will issue an IChildrenUpdate for the - // missing elements as an optimization. - fListener.reset(rootPath, root, -1, false, false); + // Reset the listener to NOT fail on redundant updates. + // When elements are remvoed from the model and the model is + // refreshed the viewer will issue an IChildrenUpdate for the + // missing elements as an optimization. + fListener.reset(rootPath, root, -1, false, false); - model.postDelta(new ModelDelta(root, IModelDelta.CONTENT)); + model.postDelta(new ModelDelta(root, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } - - /** - * This test: - * - creates a simple model - * - sets a list of children to one of the elements - * - refreshes the viewer - */ + model.validateData(fViewer, TreePath.EMPTY); + } + + /** + * This test: + * - creates a simple model + * - sets a list of children to one of the elements + * - refreshes the viewer + */ public void testAddNewChildren() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, true, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - TestElement element = model.getRootElement().getChildren()[0]; - TreePath elementPath = new TreePath(new Object[] { element }); - TestElement[] newChildren = new TestElement[] { + // Update the model + TestElement element = model.getRootElement().getChildren()[0]; + TreePath elementPath = new TreePath(new Object[] { element }); + TestElement[] newChildren = new TestElement[] { new TestElement(model, "1.1", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "1.2", new TestElement[0]), //$NON-NLS-1$ new TestElement(model, "1.3", new TestElement[0]), //$NON-NLS-1$ - }; - model.setElementChildren(elementPath, newChildren); - - // Reset the viewer to ignore redundant updates. The '1' element - // will be updated for "hasChildren" before it is expanded, which is - // expected. - TreePath rootPath = TreePath.EMPTY; - TestElement rootElement = model.getRootElement(); - fListener.reset(rootPath, rootElement, -1, false, false); - - // Refresh the viewer - model.postDelta(new ModelDelta(rootElement, IModelDelta.CONTENT)); + }; + model.setElementChildren(elementPath, newChildren); + + // Reset the viewer to ignore redundant updates. The '1' element + // will be updated for "hasChildren" before it is expanded, which is + // expected. + TreePath rootPath = TreePath.EMPTY; + TestElement rootElement = model.getRootElement(); + fListener.reset(rootPath, rootElement, -1, false, false); + + // Refresh the viewer + model.postDelta(new ModelDelta(rootElement, IModelDelta.CONTENT)); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } + model.validateData(fViewer, TreePath.EMPTY); + } private void removeElement(TestModel model, int index, boolean validate) throws Exception { - ModelDelta delta = model.removeElementChild(TreePath.EMPTY, index); + ModelDelta delta = model.removeElementChild(TreePath.EMPTY, index); - // Remove delta should generate no new updates, but we still need to wait for the event to - // be processed. - fListener.reset(); - model.postDelta(delta); + // Remove delta should generate no new updates, but we still need to wait for the event to + // be processed. + fListener.reset(); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - if (validate) { - model.validateData(fViewer, TreePath.EMPTY); - } - } + if (validate) { + model.validateData(fViewer, TreePath.EMPTY); + } + } private void addElement(TestModel model, String label, int position, boolean validate) throws Exception { - ModelDelta delta = model.addElementChild(TreePath.EMPTY, null, position, new TestElement(model, label, new TestElement[0])); + ModelDelta delta = model.addElementChild(TreePath.EMPTY, null, position, new TestElement(model, label, new TestElement[0])); - // Remove delta should generate no new updates, but we still need to wait for the event to - // be processed. - fListener.reset(); - model.postDelta(delta); + // Remove delta should generate no new updates, but we still need to wait for the event to + // be processed. + fListener.reset(); + model.postDelta(delta); - if (validate) { + if (validate) { waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } else { + model.validateData(fViewer, TreePath.EMPTY); + } else { waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - } - } + } + } private void insertElement(TestModel model, String label, int position, boolean validate) throws Exception { - ModelDelta delta = model.insertElementChild(TreePath.EMPTY, position, new TestElement(model, label, new TestElement[0])); + ModelDelta delta = model.insertElementChild(TreePath.EMPTY, position, new TestElement(model, label, new TestElement[0])); - // Remove delta should generate no new updates, but we still need to wait for the event to - // be processed. - fListener.reset(); - model.postDelta(delta); + // Remove delta should generate no new updates, but we still need to wait for the event to + // be processed. + fListener.reset(); + model.postDelta(delta); - if (validate) { + if (validate) { waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } else { + model.validateData(fViewer, TreePath.EMPTY); + } else { waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - } - } + } + } public void testRepeatedAddRemoveElement() throws Exception { - //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); + //TreeModelViewerAutopopulateAgent autopopulateAgent = new TreeModelViewerAutopopulateAgent(fViewer); - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Update the model - removeElement(model, 2, true); + // Update the model + removeElement(model, 2, true); addElement(model, "3-new", 3, true); //$NON-NLS-1$ - removeElement(model, 4, true); + removeElement(model, 4, true); addElement(model, "5-new", 5, true); //$NON-NLS-1$ - removeElement(model, 1, true); + removeElement(model, 1, true); addElement(model, "1-new", 1, true); //$NON-NLS-1$ - removeElement(model, 3, true); + removeElement(model, 3, true); addElement(model, "4-new", 4, true); //$NON-NLS-1$ - } + } - /** - * This test verifies that when the viewer processes a delta that causes viewer - * updates it initiates the model update sequence before it finishes processing - * the delta. - */ + /** + * This test verifies that when the viewer processes a delta that causes viewer + * updates it initiates the model update sequence before it finishes processing + * the delta. + */ public void testNotifyUpdatesTartedOnModelChanged() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Refresh the viewer so that updates are generated. - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - Assert.assertTrue( fListener.isFinished(CONTENT_SEQUENCE_STARTED) ); - } + Assert.assertTrue( fListener.isFinished(CONTENT_SEQUENCE_STARTED) ); + } - /** - * This test case attempts to create a race condition between processing - * of the content updates and processing of add/remove model deltas. - * <br> - * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=304066">bug 304066</a> - */ + /** + * This test case attempts to create a race condition between processing + * of the content updates and processing of add/remove model deltas. + * <br> + * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=304066">bug 304066</a> + */ public void testContentPlusAddRemoveUpdateRaceConditionsElement() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Create a listener to listen only to a children count update for the root. - TestModelUpdatesListener childrenCountUpdateListener = new TestModelUpdatesListener(fViewer, false, false); + // Create a listener to listen only to a children count update for the root. + TestModelUpdatesListener childrenCountUpdateListener = new TestModelUpdatesListener(fViewer, false, false); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 10; i++) { String pass = "pass #" + i; //$NON-NLS-1$ - // Request a content update for view - childrenCountUpdateListener.reset(); - childrenCountUpdateListener.addChildreCountUpdate(TreePath.EMPTY); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait until the delta is processed + // Request a content update for view + childrenCountUpdateListener.reset(); + childrenCountUpdateListener.addChildreCountUpdate(TreePath.EMPTY); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Wait until the delta is processed waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - removeElement(model, 5, false); - removeElement(model, 4, false); - removeElement(model, 3, false); - removeElement(model, 2, false); - removeElement(model, 1, false); - removeElement(model, 0, false); + removeElement(model, 5, false); + removeElement(model, 4, false); + removeElement(model, 3, false); + removeElement(model, 2, false); + removeElement(model, 1, false); + removeElement(model, 0, false); - // Wait until the children count update is completed using the count from - // before elements were removed. + // Wait until the children count update is completed using the count from + // before elements were removed. waitWhile(t -> !childrenCountUpdateListener.isFinished(CHILD_COUNT_UPDATES), createListenerErrorMessage()); insertElement(model, "1 - " + pass, 0, false); //$NON-NLS-1$ @@ -278,37 +278,37 @@ abstract public class UpdateTests extends AbstractViewerModelTest implements ITe insertElement(model, "6 - " + pass, 5, false); //$NON-NLS-1$ waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - } + } - childrenCountUpdateListener.dispose(); - } + childrenCountUpdateListener.dispose(); + } - /** - * This test case attempts to create a race condition between processing - * of the content updates and processing of add/remove model deltas. - * <br> - * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=304066">bug 304066</a> - */ + /** + * This test case attempts to create a race condition between processing + * of the content updates and processing of add/remove model deltas. + * <br> + * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=304066">bug 304066</a> + */ public void testInsertAtInvalidIndex() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Insert element at the end of the list. - final int insertIndex = model.getRootElement().getChildren().length; + // Insert element at the end of the list. + final int insertIndex = model.getRootElement().getChildren().length; ModelDelta delta = model.insertElementChild(TreePath.EMPTY, insertIndex, new TestElement(model, "last - invalid index", new TestElement[0])); //$NON-NLS-1$ - // Change insert index to out of range - delta.accept(new IModelDeltaVisitor() { + // Change insert index to out of range + delta.accept(new IModelDeltaVisitor() { @Override public boolean visit(IModelDelta visitorDelta, int depth) { @@ -320,341 +320,341 @@ abstract public class UpdateTests extends AbstractViewerModelTest implements ITe } }); - // Remove delta should generate no new updates, but we still need to wait for the event to - // be processed. - fListener.reset(); - model.postDelta(delta); + // Remove delta should generate no new updates, but we still need to wait for the event to + // be processed. + fListener.reset(); + model.postDelta(delta); waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CONTENT_SEQUENCE_COMPLETE | LABEL_SEQUENCE_COMPLETE), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); - } - - /** - * This test forces the viewer to reschedule pending content updates - * due to a remove event from the model. - * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#rescheduleUpdates - */ + model.validateData(fViewer, TreePath.EMPTY); + } + + /** + * This test forces the viewer to reschedule pending content updates + * due to a remove event from the model. + * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#rescheduleUpdates + */ public void testRescheduleUpdates() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - for (int i = 0; i < 5; i++) { - // Refresh the viewer so that updates are generated. - TestElement rootElement = model.getRootElement(); - fListener.reset(); - fListener.addUpdates(TreePath.EMPTY, model.getRootElement(), 1, CHILD_COUNT_UPDATES); - model.postDelta(new ModelDelta(rootElement, IModelDelta.CONTENT)); + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + TestElement rootElement = model.getRootElement(); + fListener.reset(); + fListener.addUpdates(TreePath.EMPTY, model.getRootElement(), 1, CHILD_COUNT_UPDATES); + model.postDelta(new ModelDelta(rootElement, IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES | CHILDREN_UPDATES_STARTED), createListenerErrorMessage()); - // Update the model - removeElement(model, 0, true); + // Update the model + removeElement(model, 0, true); addElement(model, "1", 0, true); //$NON-NLS-1$ - } - } - - /** - * This test forces the viewer to cancel updates then process them at once. - * <p> - * - Wait until CHILDREN COUNT update started then refresh<br> - * - Process queued updates in order.<br> - * </p> - */ + } + } + + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN COUNT update started then refresh<br> + * - Process queued updates in order.<br> + * </p> + */ public void testCanceledUpdates1() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - model.setQeueueingUpdate(true); + model.setQeueueingUpdate(true); - for (int i = 0; i < 5; i++) { - // Refresh the viewer so that updates are generated. - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES_STARTED), createListenerErrorMessage()); - } + } - model.setQeueueingUpdate(false); + model.setQeueueingUpdate(false); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - } + } - /** - * This test forces the viewer to cancel updates then process them at once. - * <p> - * - Wait until CHILDREN COUNT update started then refresh<br> - * - Process queued updates in REVERSE order.<br> - * </p> - */ + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN COUNT update started then refresh<br> + * - Process queued updates in REVERSE order.<br> + * </p> + */ public void testCanceledUpdates2() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - model.setQeueueingUpdate(true); + model.setQeueueingUpdate(true); - for (int i = 0; i < 5; i++) { - // Refresh the viewer so that updates are generated. - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES_STARTED), createListenerErrorMessage()); - } + } ArrayList<IViewerUpdate> updates = new ArrayList<>(model.getQueuedUpdates()); - model.getQueuedUpdates().clear(); - for (int i = updates.size() - 1; i >= 0; i--) { - model.processUpdate(updates.get(i)); - } + model.getQueuedUpdates().clear(); + for (int i = updates.size() - 1; i >= 0; i--) { + model.processUpdate(updates.get(i)); + } - model.setQeueueingUpdate(false); + model.setQeueueingUpdate(false); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - } - - /** - * This test forces the viewer to cancel updates then process them at once. - * <p> - * - Wait until CHILDREN update started then refresh<br> - * - Process queued updates in order.<br> - * </p> - */ + } + + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN update started then refresh<br> + * - Process queued updates in order.<br> + * </p> + */ public void testCanceledUpdates3() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - model.setQeueueingUpdate(true); + model.setQeueueingUpdate(true); - for (int i = 0; i < 5; i++) { - // Refresh the viewer so that updates are generated. - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); long start = System.currentTimeMillis(); - // Wait for the delta to be processed. + // Wait for the delta to be processed. while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_UPDATES_STARTED) && System.currentTimeMillis() - start < testTimeout) { - completeQueuedUpdatesOfType(model, IChildrenCountUpdate.class); - completeQueuedUpdatesOfType(model, IHasChildrenUpdate.class); + completeQueuedUpdatesOfType(model, IChildrenCountUpdate.class); + completeQueuedUpdatesOfType(model, IHasChildrenUpdate.class); TestUtil.processUIEvents(); - } - } + } + } - model.setQeueueingUpdate(false); + model.setQeueueingUpdate(false); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - } + } - /** - * This test forces the viewer to cancel updates then process them at once. - * <p> - * - Wait until CHILDREN update started then refresh<br> - * - Process queued updates in REVERSE order.<br> - * </p> - */ + /** + * This test forces the viewer to cancel updates then process them at once. + * <p> + * - Wait until CHILDREN update started then refresh<br> + * - Process queued updates in REVERSE order.<br> + * </p> + */ public void testCanceledUpdates4() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - model.setQeueueingUpdate(true); + model.setQeueueingUpdate(true); - for (int i = 0; i < 5; i++) { - // Refresh the viewer so that updates are generated. - fListener.reset(); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + for (int i = 0; i < 5; i++) { + // Refresh the viewer so that updates are generated. + fListener.reset(); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - long start = System.currentTimeMillis(); - // Wait for the delta to be processed. - while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_UPDATES_STARTED) - && System.currentTimeMillis() - start < testTimeout) { - completeQueuedUpdatesOfType(model, IChildrenCountUpdate.class); - completeQueuedUpdatesOfType(model, IHasChildrenUpdate.class); - TestUtil.processUIEvents(); - } + long start = System.currentTimeMillis(); + // Wait for the delta to be processed. + while (!fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILDREN_UPDATES_STARTED) + && System.currentTimeMillis() - start < testTimeout) { + completeQueuedUpdatesOfType(model, IChildrenCountUpdate.class); + completeQueuedUpdatesOfType(model, IHasChildrenUpdate.class); + TestUtil.processUIEvents(); + } - } + } ArrayList<IViewerUpdate> updates = new ArrayList<>(model.getQueuedUpdates()); - model.getQueuedUpdates().clear(); - for (int i = updates.size() - 1; i >= 0; i--) { - model.processUpdate(updates.get(i)); - } + model.getQueuedUpdates().clear(); + for (int i = updates.size() - 1; i >= 0; i--) { + model.processUpdate(updates.get(i)); + } - model.setQeueueingUpdate(false); + model.setQeueueingUpdate(false); waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - } - - /** - * This test removes an element while there are updates running on its - * sub-tree. With a precise timing this operation caused Bug 373790. - * <p> - * See Bug 373790 - Debug view stays busy after Resume - * </p> - * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#rescheduleUpdates - */ + } + + /** + * This test removes an element while there are updates running on its + * sub-tree. With a precise timing this operation caused Bug 373790. + * <p> + * See Bug 373790 - Debug view stays busy after Resume + * </p> + * @see org.eclipse.debug.internal.ui.viewers.model.ModelContentProvider#rescheduleUpdates + */ public void testCancelUpdatesOnRemoveElementWhileUpdatingSubTree() throws Exception { - TestModel model = TestModel.simpleMultiLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleMultiLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - // Refresh the viewer so that updates are generated. - fListener.reset(); + // Refresh the viewer so that updates are generated. + fListener.reset(); TreePath path = model.findElement("2"); //$NON-NLS-1$ - fListener.addUpdates(path, model.getElement(path), 1, CHILD_COUNT_UPDATES); - fListener.addChildreUpdate(path, 0); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + fListener.addUpdates(path, model.getElement(path), 1, CHILD_COUNT_UPDATES); + fListener.addChildreUpdate(path, 0); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed and child updates for "2" to get started. + // Wait for the delta to be processed and child updates for "2" to get started. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES | CHILDREN_UPDATES_RUNNING), createListenerErrorMessage()); - // Remove element "2" - removeElement(model, 1, true); + // Remove element "2" + removeElement(model, 1, true); - // Wait for all updates to finish. - waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); - } + // Wait for all updates to finish. + waitWhile(t -> !fListener.isFinished(ALL_UPDATES_COMPLETE), createListenerErrorMessage()); + } - /** - * This test forces the viewer to cancel updates upon setInput(). - * <p> - * - Wait until CHILDREN update started then refresh<br> - * - Process queued updates in order.<br> - * </p> - */ + /** + * This test forces the viewer to cancel updates upon setInput(). + * <p> + * - Wait until CHILDREN update started then refresh<br> + * - Process queued updates in order.<br> + * </p> + */ public void testCanceledUpdatesOnSetInput() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - model.setQeueueingUpdate(false); + model.setQeueueingUpdate(false); - // Refresh the viewer so that updates are generated. - fListener.reset(); - fListener.addChildreCountUpdate(TreePath.EMPTY); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh the viewer so that updates are generated. + fListener.reset(); + fListener.addChildreCountUpdate(TreePath.EMPTY); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES), createListenerErrorMessage()); - TestModel model2 = new TestModel(); + TestModel model2 = new TestModel(); model2.setRoot(new TestElement(model2, "root", new TestElement[0])); //$NON-NLS-1$ - fViewer.setInput(model2.getRootElement()); + fViewer.setInput(model2.getRootElement()); waitWhile(t -> !fListener.isFinished(CONTENT_COMPLETE | VIEWER_UPDATES_RUNNING), createListenerErrorMessage()); - } + } - /** - * This test forces the viewer to cancel updates upon setInput(). - * <p> - * - Wait until CHILDREN update started then refresh<br> - * - Process queued updates in order.<br> - * </p> - */ + /** + * This test forces the viewer to cancel updates upon setInput(). + * <p> + * - Wait until CHILDREN update started then refresh<br> + * - Process queued updates in order.<br> + * </p> + */ public void testCanceledUpdatesOnSetNullInput() throws Exception { - TestModel model = TestModel.simpleSingleLevel(); - fViewer.setAutoExpandLevel(-1); + TestModel model = TestModel.simpleSingleLevel(); + fViewer.setAutoExpandLevel(-1); - // Create the listener - fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); + // Create the listener + fListener.reset(TreePath.EMPTY, model.getRootElement(), -1, false, false); - // Set the input into the view and update the view. - fViewer.setInput(model.getRootElement()); + // Set the input into the view and update the view. + fViewer.setInput(model.getRootElement()); waitWhile(t -> !fListener.isFinished(), createListenerErrorMessage()); - model.validateData(fViewer, TreePath.EMPTY); + model.validateData(fViewer, TreePath.EMPTY); - model.setQeueueingUpdate(false); + model.setQeueueingUpdate(false); - // Refresh the viewer so that updates are generated. - fListener.reset(); - fListener.addChildreCountUpdate(TreePath.EMPTY); - model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); + // Refresh the viewer so that updates are generated. + fListener.reset(); + fListener.addChildreCountUpdate(TreePath.EMPTY); + model.postDelta(new ModelDelta(model.getRootElement(), IModelDelta.CONTENT)); - // Wait for the delta to be processed. + // Wait for the delta to be processed. waitWhile(t -> !fListener.isFinished(MODEL_CHANGED_COMPLETE | CHILD_COUNT_UPDATES), createListenerErrorMessage()); - fViewer.setInput(null); + fViewer.setInput(null); waitWhile(t -> !fListener.isFinished(CONTENT_COMPLETE | VIEWER_UPDATES_RUNNING), createListenerErrorMessage()); - } + } private void completeQueuedUpdatesOfType(TestModel model, Class<?> updateClass) { List<IViewerUpdate> updatesToComplete = new LinkedList<>(); for (Iterator<IViewerUpdate> itr = model.getQueuedUpdates().iterator(); itr.hasNext();) { - IViewerUpdate update = itr.next(); - if (updateClass.isInstance(update)) { - updatesToComplete.add(update); - itr.remove(); - } - } - if (updatesToComplete != null) { + IViewerUpdate update = itr.next(); + if (updateClass.isInstance(update)) { + updatesToComplete.add(update); + itr.remove(); + } + } + if (updatesToComplete != null) { for (Iterator<IViewerUpdate> itr = updatesToComplete.iterator(); itr.hasNext();) { - model.processUpdate(itr.next()); - } - } - } + model.processUpdate(itr.next()); + } + } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerContentTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerContentTests.java index 6ac55ba4a..af1434896 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerContentTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerContentTests.java @@ -25,12 +25,12 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerContentTests extends ContentTests { - public VirtualViewerContentTests(String name) { - super(name); - } + public VirtualViewerContentTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerDeltaTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerDeltaTests.java index c53058364..2c68368f0 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerDeltaTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerDeltaTests.java @@ -25,12 +25,12 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerDeltaTests extends DeltaTests { - public VirtualViewerDeltaTests(String name) { - super(name); - } + public VirtualViewerDeltaTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerFilterTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerFilterTests.java index cc0f46095..f0aff25a4 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerFilterTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerFilterTests.java @@ -26,12 +26,12 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerFilterTests extends FilterTests { - public VirtualViewerFilterTests(String name) { - super(name); - } + public VirtualViewerFilterTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, SWT.VIRTUAL, new PresentationContext("TestViewer"), new VisibleVirtualItemValidator(0, 100)); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerLazyModeTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerLazyModeTests.java index 18653ec09..8c95b7fba 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerLazyModeTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerLazyModeTests.java @@ -30,9 +30,9 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerLazyModeTests extends AbstractViewerModelTest { - public VirtualViewerLazyModeTests(String name) { - super(name); - } + public VirtualViewerLazyModeTests(String name) { + super(name); + } @Override protected TestModelUpdatesListener createListener(IInternalTreeModelViewer viewer) { @@ -42,9 +42,9 @@ public class VirtualViewerLazyModeTests extends AbstractViewerModelTest { @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(display, SWT.VIRTUAL, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } - public void test() { - // TODO - } + public void test() { + // TODO + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPerformanceTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPerformanceTests.java index c70ec1706..6143a3184 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPerformanceTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPerformanceTests.java @@ -26,17 +26,17 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerPerformanceTests extends PerformanceTests { - public VirtualViewerPerformanceTests(String name) { - super(name); - } + public VirtualViewerPerformanceTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, SWT.VIRTUAL, new PresentationContext("TestViewer"), fVirtualItemValidator); //$NON-NLS-1$ - } + } - @Override + @Override protected int getTestModelDepth() { - return 7; - } + return 7; + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPopupTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPopupTests.java index 055cd88bd..fd07796f4 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPopupTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerPopupTests.java @@ -25,14 +25,14 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerPopupTests extends PopupTests { - public VirtualViewerPopupTests(String name) { - super(name); - } + public VirtualViewerPopupTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell, int style) { return new VirtualTreeModelViewer(fDisplay, style, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerSelectionTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerSelectionTests.java index f4edf0b01..68100fab3 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerSelectionTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerSelectionTests.java @@ -25,12 +25,12 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerSelectionTests extends SelectionTests { - public VirtualViewerSelectionTests(String name) { - super(name); - } + public VirtualViewerSelectionTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerStateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerStateTests.java index ff0e3e29a..1c39f0bb1 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerStateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerStateTests.java @@ -25,12 +25,12 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerStateTests extends StateTests { - public VirtualViewerStateTests(String name) { - super(name); - } + public VirtualViewerStateTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerUpdateTests.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerUpdateTests.java index 6e202e342..42a69e80c 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerUpdateTests.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VirtualViewerUpdateTests.java @@ -25,12 +25,12 @@ import org.eclipse.swt.widgets.Shell; */ public class VirtualViewerUpdateTests extends UpdateTests { - public VirtualViewerUpdateTests(String name) { - super(name); - } + public VirtualViewerUpdateTests(String name) { + super(name); + } - @Override + @Override protected IInternalTreeModelViewer createViewer(Display display, Shell shell) { return new VirtualTreeModelViewer(fDisplay, 0, new PresentationContext("TestViewer")); //$NON-NLS-1$ - } + } } diff --git a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VisibleVirtualItemValidator.java b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VisibleVirtualItemValidator.java index b59c02edb..02ebae98a 100644 --- a/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VisibleVirtualItemValidator.java +++ b/org.eclipse.debug.tests/src/org/eclipse/debug/tests/viewer/model/VisibleVirtualItemValidator.java @@ -23,78 +23,78 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTree; */ public class VisibleVirtualItemValidator implements IVirtualItemValidator { - private int fStart = 0; - private int fEnd = 0; + private int fStart = 0; + private int fEnd = 0; - public VisibleVirtualItemValidator(int startPosition, int length) { - setVisibleRange(startPosition, length); - } + public VisibleVirtualItemValidator(int startPosition, int length) { + setVisibleRange(startPosition, length); + } - public void setVisibleRange(int startPosition, int length) { - fStart = startPosition; - fEnd = startPosition + length; - } + public void setVisibleRange(int startPosition, int length) { + fStart = startPosition; + fEnd = startPosition + length; + } - public int getStartPosition() { - return fStart; - } + public int getStartPosition() { + return fStart; + } - public int getLength() { - return fEnd - fStart; - } + public int getLength() { + return fEnd - fStart; + } - @Override + @Override public boolean isItemVisible(VirtualItem item) { - int position = 0; - while (item.getParent() != null) { - position += item.getIndex().intValue(); - item = item.getParent(); - } - return position >= fStart && position < fEnd || isSelected(item); - } + int position = 0; + while (item.getParent() != null) { + position += item.getIndex().intValue(); + item = item.getParent(); + } + return position >= fStart && position < fEnd || isSelected(item); + } - @Override + @Override public void showItem(VirtualItem item) { - int length = fEnd - fStart; - fStart = calcPosition(item); - fEnd = fStart + length; - } + int length = fEnd - fStart; + fStart = calcPosition(item); + fEnd = fStart + length; + } - private int calcPosition(VirtualItem item) { - int position = 0; - while (item.getParent() != null) { - position += item.getIndex().intValue(); - item = item.getParent(); - } - return position; - } + private int calcPosition(VirtualItem item) { + int position = 0; + while (item.getParent() != null) { + position += item.getIndex().intValue(); + item = item.getParent(); + } + return position; + } - private boolean isSelected(VirtualItem item) { - VirtualItem[] selection = getSelection(item); - for (int i = 0; i < selection.length; i++) { - VirtualItem selectionItem = selection[i]; - while (selectionItem != null) { - if (item.equals(selectionItem)) { - return true; - } - selectionItem = selectionItem.getParent(); - } - } - return false; - } + private boolean isSelected(VirtualItem item) { + VirtualItem[] selection = getSelection(item); + for (int i = 0; i < selection.length; i++) { + VirtualItem selectionItem = selection[i]; + while (selectionItem != null) { + if (item.equals(selectionItem)) { + return true; + } + selectionItem = selectionItem.getParent(); + } + } + return false; + } - private VirtualItem[] getSelection(VirtualItem item) { - VirtualTree tree = getTree(item); - if (tree != null) { - return tree.getSelection(); - } - return new VirtualItem[0]; - } + private VirtualItem[] getSelection(VirtualItem item) { + VirtualTree tree = getTree(item); + if (tree != null) { + return tree.getSelection(); + } + return new VirtualItem[0]; + } - private VirtualTree getTree(VirtualItem item) { - while (item != null && !(item instanceof VirtualTree)) { - item = item.getParent(); - } - return (VirtualTree)item; - } + private VirtualTree getTree(VirtualItem item) { + while (item != null && !(item instanceof VirtualTree)) { + item = item.getParent(); + } + return (VirtualTree)item; + } } |