Skip to content

Commit ba1643e

Browse files
committed
VirtualTableViewerTest: improve table update + force active shell #1005
Several test cases of VirtualTableViewerTest randomly fail. This includes explicit failures of testRenameWithSorter() and testContains() and silent failures of other test cases that simply return successfully even if the test actually failed. The reason is a missing processing of an update of the table data, which is most likely caused by the shell not having focus. With this change, the test execution ensures that in cases where an update of the table data is expected, the shell is forced active and events are processed until the data is finally set properly. In addition, early returns producing silent failures are replaced by assertions leading to explicit failures in case the condition is still not met. Contributes to #1583 May fix #1005
1 parent f44acf3 commit ba1643e

File tree

1 file changed

+23
-63
lines changed

1 file changed

+23
-63
lines changed

tests/org.eclipse.jface.tests/src/org/eclipse/jface/tests/viewers/VirtualTableViewerTest.java

Lines changed: 23 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static org.junit.Assert.assertNull;
2121
import static org.junit.Assert.assertTrue;
2222

23+
import java.time.Duration;
2324
import java.util.Arrays;
2425
import java.util.HashSet;
2526
import java.util.Set;
@@ -34,19 +35,14 @@
3435
import org.eclipse.swt.widgets.TableItem;
3536
import org.junit.Before;
3637
import org.junit.Ignore;
37-
import org.junit.Rule;
3838
import org.junit.Test;
39-
import org.junit.rules.TestName;
4039

4140
/**
4241
* The TableViewerTest is a test of the SWT#VIRTUAL support in TableViewers,
4342
*/
4443
public class VirtualTableViewerTest extends TableViewerTest {
4544

46-
@Rule
47-
public TestName testName = new TestName();
48-
49-
Set<TableItem> visibleItems = new HashSet<>();
45+
private static final Duration TABLE_DATA_UPDATE_TIMEOUT = Duration.ofSeconds(5);
5046

5147
/**
5248
* Checks if the virtual tree / table functionality can be tested in the current
@@ -57,13 +53,13 @@ public class VirtualTableViewerTest extends TableViewerTest {
5753
* automated tests to fail. See
5854
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=118919 .
5955
*/
60-
protected boolean setDataCalled = false;
56+
protected volatile boolean setDataCalled = false;
6157

6258
@Before
6359
@Override
6460
public void setUp() {
6561
super.setUp();
66-
processEvents(); // run events for SetData precondition test
62+
waitForDataToBeSet();
6763
}
6864

6965
@Override
@@ -73,32 +69,31 @@ protected int getShellStyle() {
7369

7470
@Override
7571
protected TableViewer createTableViewer(Composite parent) {
76-
visibleItems = new HashSet<>();
7772
TableViewer viewer = new TableViewer(parent, SWT.VIRTUAL | SWT.MULTI);
7873
viewer.setUseHashlookup(true);
7974
final Table table = viewer.getTable();
80-
table.addListener(SWT.SetData, event -> {
81-
setDataCalled = true;
82-
TableItem item = (TableItem) event.item;
83-
visibleItems.add(item);
84-
});
75+
table.addListener(SWT.SetData, event -> setDataCalled = true);
8576
return viewer;
8677
}
8778

8879
/**
89-
* Checks if update occurred. Updates for virtual items will be skipped if, for
90-
* instance, another window is in the foreground.
91-
*
92-
* @return <code>true</code> if update occurred
80+
* Updates the table, also forcing the containing shell to be active in order to
81+
* process according events.
9382
*/
94-
protected boolean updateTable() {
83+
private void updateTable() {
9584
setDataCalled = false;
96-
((TableViewer) fViewer).getControl().update();
97-
if (setDataCalled) {
98-
return true;
85+
fViewer.refresh();
86+
fViewer.getControl().update();
87+
waitForDataToBeSet();
88+
}
89+
90+
private void waitForDataToBeSet() {
91+
Duration timeoutEnd = Duration.ofMillis(System.currentTimeMillis()).plus(TABLE_DATA_UPDATE_TIMEOUT);
92+
while (!setDataCalled && !timeoutEnd.minusMillis(System.currentTimeMillis()).isNegative()) {
93+
fShell.forceActive();
94+
processEvents();
9995
}
100-
System.err.println("SWT.SetData is not received. Cancelled test " + testName.getMethodName());
101-
return false;
96+
assertTrue("waiting for setting table data timed out", setDataCalled);
10297
}
10398

10499
/**
@@ -107,7 +102,7 @@ protected boolean updateTable() {
107102
* @return TableItem[]
108103
*/
109104
private TableItem[] getVisibleItems() {
110-
return visibleItems.toArray(new TableItem[visibleItems.size()]);
105+
return ((TableViewer) fViewer).getTable().getItems();
111106
}
112107

113108
@Test
@@ -130,44 +125,24 @@ protected int getItemCount() {
130125
@Override
131126
public void testFilter() {
132127
ViewerFilter filter = new TestLabelFilter();
133-
visibleItems = new HashSet<>();
134128
fViewer.addFilter(filter);
135-
if (!updateTable()) {
136-
return;
137-
}
138129
assertEquals("filtered count", 5, getItemCount());
139130

140-
visibleItems = new HashSet<>();
141131
fViewer.removeFilter(filter);
142-
if (!updateTable()) {
143-
return;
144-
}
145132
assertEquals("unfiltered count", 10, getItemCount());
146133
}
147134

148135
@Test
149136
@Override
150137
public void testSetFilters() {
151138
ViewerFilter filter = new TestLabelFilter();
152-
visibleItems = new HashSet<>();
153139
fViewer.setFilters(filter, new TestLabelFilter2());
154-
if (!updateTable()) {
155-
return;
156-
}
157140
assertEquals("2 filters count", 1, getItemCount());
158141

159-
visibleItems = new HashSet<>();
160142
fViewer.setFilters(filter);
161-
if (!updateTable()) {
162-
return;
163-
}
164143
assertEquals("1 filtered count", 5, getItemCount());
165144

166-
visibleItems = new HashSet<>();
167145
fViewer.setFilters();
168-
if (!updateTable()) {
169-
return;
170-
}
171146
assertEquals("unfiltered count", 10, getItemCount());
172147
}
173148

@@ -204,21 +179,13 @@ public void testInsertSiblingWithSorter() {
204179
@Test
205180
@Override
206181
public void testRenameWithFilter() {
207-
if (!setDataCalled) {
208-
System.err.println("SWT.SetData is not received. Cancelled test " + testName.getMethodName());
209-
return;
210-
}
211182
fViewer.addFilter(new TestLabelFilter());
212-
if (!updateTable()) {
213-
return;
214-
}
215183
TestElement first = fRootElement.getFirstChild();
216184
first.setLabel("name-1111"); // should disappear
217-
((TableViewer) fViewer).getControl().update();
218-
assertNull("changed sibling is not visible", fViewer.testFindItem(first));
185+
updateTable();
186+
assertNull("changed sibling is still visible", fViewer.testFindItem(first));
219187
first.setLabel("name-2222"); // should reappear
220-
fViewer.refresh();
221-
((TableViewer) fViewer).getControl().update();
188+
updateTable();
222189
assertNotNull("changed sibling is not visible", fViewer.testFindItem(first));
223190
}
224191

@@ -230,14 +197,10 @@ public void testSetInput() {
230197
@Test
231198
@Override
232199
public void testRenameWithSorter() {
233-
// Call update to make sure the viewer is in a correct state
234-
// At least on MacOSX I get failures without this call
235-
((TableViewer) fViewer).getControl().update();
236200
fViewer.setComparator(new TestLabelComparator());
237201
TestElement first = fRootElement.getFirstChild();
238202
first.setLabel("name-9999");
239203
String newElementLabel = first.toString();
240-
((TableViewer) fViewer).getControl().update();
241204
assertEquals("sorted first", newElementLabel, getItemText(0));
242205
}
243206

@@ -249,15 +212,12 @@ public void testSorter() {
249212
String firstLabel = first.toString();
250213
String lastLabel = last.toString();
251214

252-
((TableViewer) fViewer).getControl().update();
253215
assertEquals("unsorted", firstLabel, getItemText(0));
254216
fViewer.setComparator(new TestLabelComparator());
255217

256-
((TableViewer) fViewer).getControl().update();
257218
assertEquals("reverse sorted", lastLabel, getItemText(0));
258219

259220
fViewer.setComparator(null);
260-
((TableViewer) fViewer).getControl().update();
261221
assertEquals("unsorted", firstLabel, getItemText(0));
262222
}
263223

0 commit comments

Comments
 (0)