2020import static org .junit .Assert .assertNull ;
2121import static org .junit .Assert .assertTrue ;
2222
23+ import java .time .Duration ;
2324import java .util .Arrays ;
2425import java .util .HashSet ;
2526import java .util .Set ;
3435import org .eclipse .swt .widgets .TableItem ;
3536import org .junit .Before ;
3637import org .junit .Ignore ;
37- import org .junit .Rule ;
3838import 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 */
4443public 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