]> source.dussan.org Git - vaadin-framework.git/blob
d07222e35ddf021d01e0c24ae149076db532a5bd
[vaadin-framework.git] /
1 package com.vaadin.v7.tests.components.grid.basicfeatures.server;
2
3 import static org.junit.Assert.assertFalse;
4 import static org.junit.Assert.assertTrue;
5
6 import java.util.List;
7
8 import org.junit.Before;
9 import org.junit.Test;
10 import org.openqa.selenium.By;
11 import org.openqa.selenium.WebElement;
12 import org.openqa.selenium.interactions.Actions;
13
14 import com.vaadin.testbench.TestBenchElement;
15 import com.vaadin.testbench.elements.GridElement.GridCellElement;
16 import com.vaadin.v7.tests.components.grid.basicfeatures.GridBasicFeaturesTest;
17
18 /**
19  * Tests that Grid columns can be reordered by user with drag and drop #16643.
20  *
21  * @author Vaadin Ltd
22  */
23 public class GridColumnReorderTest extends GridBasicFeaturesTest {
24
25     private static final String[] COLUMN_REORDERING_PATH = { "Component",
26             "State", "Column Reordering Allowed" };
27     private static final String[] COLUMN_REORDER_LISTENER_PATH = { "Component",
28             "State", "ColumnReorderListener" };
29
30     @Before
31     public void setUp() {
32         setDebug(true);
33     }
34
35     @Test
36     public void testColumnReordering_firstColumnDroppedOnThird_dropOnLeftSide() {
37         // given
38         openTestURL();
39         assertColumnHeaderOrder(0, 1, 2);
40         toggleColumnReordering();
41
42         // when
43         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
44
45         // then
46         assertColumnHeaderOrder(1, 0, 2);
47     }
48
49     @Test
50     public void testColumnReordering_firstColumnDroppedOnThird_dropOnRightSide() {
51         // given
52         openTestURL();
53         assertColumnHeaderOrder(0, 1, 2);
54         toggleColumnReordering();
55
56         // when
57         dragAndDropDefaultColumnHeader(0, 2, CellSide.RIGHT);
58
59         // then
60         assertColumnHeaderOrder(1, 2, 0);
61     }
62
63     @Test
64     public void testColumnReordering_reorderingTwiceBackForth_reordered() {
65         // given
66         openTestURL();
67         selectMenuPath("Component", "Size", "Width", "800px");
68         assertColumnHeaderOrder(0, 1, 2, 3, 4);
69         toggleColumnReordering();
70
71         // when
72         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
73
74         // then
75         assertColumnHeaderOrder(2, 0, 1, 3, 4);
76
77         // when
78         dragAndDropDefaultColumnHeader(1, 3, CellSide.RIGHT);
79
80         // then
81         assertColumnHeaderOrder(2, 1, 3, 0);
82     }
83
84     @Test
85     public void testColumnReordering_notEnabled_noReordering() {
86         // given
87         openTestURL();
88         assertColumnHeaderOrder(0, 1, 2);
89
90         // when
91         dragAndDropDefaultColumnHeader(0, 2, CellSide.RIGHT);
92
93         // then
94         assertColumnHeaderOrder(0, 1, 2);
95     }
96
97     @Test
98     public void testColumnReordering_userChangesRevertedByServer_columnsAreUpdated() {
99         // given
100         openTestURL();
101         assertColumnHeaderOrder(0, 1, 2);
102         toggleColumnReordering();
103
104         // when
105         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
106         assertColumnHeaderOrder(1, 0, 2);
107         moveColumnManuallyLeftByOne(0);
108
109         // then
110         assertColumnHeaderOrder(0, 1, 2);
111     }
112
113     @Test
114     public void testColumnReordering_concurrentUpdatesFromServer_columnOrderFromServerUsed() {
115         // given
116         openTestURL();
117         assertColumnHeaderOrder(0, 1, 2);
118         toggleColumnReordering();
119
120         // when
121         selectMenuPath(new String[] { "Component", "Internals",
122                 "Update column order without updating client" });
123         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
124
125         // then
126         assertColumnHeaderOrder(1, 0, 2);
127     }
128
129     @Test
130     public void testColumnReordering_triggersReorderEvent_isUserInitiated() {
131         // given
132         openTestURL();
133         toggleColumnReordering();
134
135         // when
136         toggleColumnReorderListener();
137         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
138
139         // then
140         assertColumnReorderEvent(true);
141     }
142
143     @Test
144     public void testColumnReordering_addAndRemoveListener_registerUnRegisterWorks() {
145         // given
146         openTestURL();
147         toggleColumnReordering();
148         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
149         assertNoColumnReorderEvent();
150
151         // when
152         toggleColumnReorderListener();
153         dragAndDropDefaultColumnHeader(0, 2, CellSide.RIGHT);
154
155         // then
156         assertColumnReorderEvent(true);
157
158         // when
159         toggleColumnReorderListener();
160         dragAndDropDefaultColumnHeader(0, 3, CellSide.LEFT);
161
162         // then
163         assertNoColumnReorderEvent();
164     }
165
166     @Test
167     public void testColumnReorderingEvent_serverSideReorder_triggersReorderEvent() {
168         openTestURL();
169
170         // when
171         toggleColumnReorderListener();
172         moveColumnManuallyLeftByOne(3);
173
174         // then
175         assertColumnReorderEvent(false);
176     }
177
178     @Test
179     public void testColumnReorder_draggingFrozenColumns_impossible() {
180         // given
181         openTestURL();
182         toggleColumnReordering();
183         setFrozenColumns(2);
184         assertColumnHeaderOrder(0, 1, 2, 3);
185
186         // when
187         dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
188
189         // then
190         assertColumnHeaderOrder(0, 1, 2, 3);
191         assertTrue(getGridElement().getHeaderCell(0, 0).isFrozen());
192         assertTrue(getGridElement().getHeaderCell(0, 1).isFrozen());
193         assertFalse(getGridElement().getHeaderCell(0, 2).isFrozen());
194     }
195
196     @Test
197     public void testColumnReorder_draggingFrozenColumnsContainingHiddenColumns_impossible() {
198         // given
199         openTestURL();
200         selectMenuPath("Component", "Size", "Width", "900px");
201         toggleColumnReordering();
202         setFrozenColumns(4);
203         toggleColumnHidden(1);
204         toggleColumnHidden(2);
205         assertColumnHeaderOrder(0, 3, 4, 5);
206
207         // when
208         // drag frozen column out between non-frozen columns
209         dragAndDropDefaultColumnHeader(1, 2, CellSide.RIGHT);
210
211         // then
212         // everything should be as before
213         assertColumnHeaderOrder(0, 3, 4, 5);
214         assertTrue(getGridElement().getHeaderCell(0, 0).isFrozen());
215         assertTrue(getGridElement().getHeaderCell(0, 1).isFrozen());
216         assertFalse(getGridElement().getHeaderCell(0, 2).isFrozen());
217     }
218
219     @Test
220     public void testColumnReorder_draggingColumnOnTopOfFrozenColumn_columnDroppedRightOfFrozenColumns() {
221         // given
222         openTestURL();
223         toggleColumnReordering();
224         setFrozenColumns(1);
225         assertColumnHeaderOrder(0, 1, 2, 3);
226
227         // when
228         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
229
230         // then
231         assertColumnHeaderOrder(0, 2, 1, 3);
232     }
233
234     @Test
235     public void testColumnReorder_draggingColumnLeftOfMultiSelectionColumn_columnDroppedRight() {
236         // given
237         openTestURL();
238         toggleColumnReordering();
239         selectMenuPath("Component", "State", "Selection mode", "multi");
240         List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
241         assertTrue(gridHeaderRowCells.get(0).getText().isEmpty());
242         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
243         assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
244         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
245
246         // when
247         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
248
249         // then
250         gridHeaderRowCells = getGridHeaderRowCells();
251         assertTrue(gridHeaderRowCells.get(0).getText().isEmpty());
252         assertColumnHeader("Column 1", gridHeaderRowCells.get(1));
253         assertColumnHeader("Column 0", gridHeaderRowCells.get(2));
254         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
255     }
256
257     @Test
258     public void testColumnReorder_multiSelectionAndFrozenColumns_columnDroppedRight() {
259         // given
260         openTestURL();
261         toggleColumnReordering();
262         selectMenuPath("Component", "State", "Selection mode", "multi");
263         setFrozenColumns(1);
264         List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
265         assertTrue(gridHeaderRowCells.get(0).getText().isEmpty());
266         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
267         assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
268         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
269
270         // when
271         dragAndDropDefaultColumnHeader(3, 0, CellSide.LEFT);
272
273         // then
274         gridHeaderRowCells = getGridHeaderRowCells();
275         assertTrue(gridHeaderRowCells.get(0).getText().isEmpty());
276         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
277         assertColumnHeader("Column 2", gridHeaderRowCells.get(2));
278         assertColumnHeader("Column 1", gridHeaderRowCells.get(3));
279     }
280
281     @Test
282     public void testColumnReordering_multiSelectionColumnNotFrozen_stillCantDropLeftSide() {
283         // given
284         openTestURL();
285         toggleColumnReordering();
286         selectMenuPath("Component", "State", "Selection mode", "multi");
287         setFrozenColumns(-1);
288         List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
289         assertTrue(gridHeaderRowCells.get(0).getText().isEmpty());
290         assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
291         assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
292         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
293
294         // when
295         dragAndDropDefaultColumnHeader(2, 0, CellSide.LEFT);
296
297         // then
298         gridHeaderRowCells = getGridHeaderRowCells();
299         assertTrue(gridHeaderRowCells.get(0).getText().isEmpty());
300         assertColumnHeader("Column 1", gridHeaderRowCells.get(1));
301         assertColumnHeader("Column 0", gridHeaderRowCells.get(2));
302         assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
303     }
304
305     @Test
306     public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromFirstRow() {
307         // given
308         openTestURL();
309         toggleColumnReordering();
310         selectMenuPath("Component", "Header", "Append row");
311         assertColumnHeaderOrder(0, 1, 2, 3);
312
313         // when
314         dragAndDropColumnHeader(0, 0, 2, CellSide.RIGHT);
315
316         // then
317         assertColumnHeaderOrder(1, 2, 0, 3);
318     }
319
320     @Test
321     public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromSecondRow() {
322         // given
323         openTestURL();
324         toggleColumnReordering();
325         selectMenuPath("Component", "Header", "Append row");
326         assertColumnHeaderOrder(0, 1, 2, 3);
327
328         // when
329         dragAndDropColumnHeader(1, 0, 2, CellSide.RIGHT);
330
331         // then
332         assertColumnHeaderOrder(1, 2, 0, 3);
333     }
334
335     @Test
336     public void testColumnReordering_bigWidth_dragElementPositionCorrect() {
337         openTestURL();
338         toggleColumnReordering();
339         selectMenuPath("Component", "Size", "Width", "900px");
340         assertColumnHeaderOrder(0, 1, 2, 3);
341
342         GridCellElement draggedHeaderCell = getGridElement().getHeaderCell(0,
343                 1);
344         final int xOffset = 500;
345         new Actions(getDriver()).moveToElement(draggedHeaderCell, 20, 10)
346                 .clickAndHold().moveByOffset(xOffset, 0).build().perform();
347
348         WebElement floatingDragElement = findElement(
349                 By.className("dragged-column-header"));
350
351         int expectedLeft = draggedHeaderCell.getLocation().getX() + xOffset + 20
352                 - (floatingDragElement.getSize().getWidth() / 2);
353         int realLeft = floatingDragElement.getLocation().getX();
354
355         assertTrue(
356                 "Dragged element location wrong, expected " + expectedLeft
357                         + " was " + realLeft,
358                 Math.abs(expectedLeft - realLeft) < 10);
359     }
360
361     @Test
362     public void testDropMarker_sidebarOpenButtonVisible_dropMarkerOnCorrectPosition() {
363         // using runo since there the sidebar opening button is wider than the
364         // scroll deco, and because using Valo has some TB issues
365         openTestURL("theme=runo");
366
367         selectMenuPath("Component", "Size", "Width", "100%");
368         selectMenuPath("Component", "Columns", "All columns hidable");
369         toggleColumnReordering();
370         scrollGridHorizontallyTo(100000);
371
372         new Actions(getDriver()).clickAndHold(getDefaultColumnHeader(10))
373                 .moveByOffset(800, 0).build().perform();
374
375         WebElement dragDropMarker = findElement(
376                 By.className("v-grid-drop-marker"));
377         WebElement sidebar = findElement(By.className("v-grid-sidebar"));
378
379         int dragDropMarkerX = dragDropMarker.getLocation().getX();
380         int sidebarX = sidebar.getLocation().getX();
381         assertTrue(
382                 "Drop marker misplaced " + dragDropMarkerX
383                         + " compared to sidebar open button " + sidebarX,
384                 dragDropMarkerX <= sidebarX);
385     }
386
387     private void toggleColumnReordering() {
388         selectMenuPath(COLUMN_REORDERING_PATH);
389     }
390
391     private void toggleColumnReorderListener() {
392         selectMenuPath(COLUMN_REORDER_LISTENER_PATH);
393     }
394
395     private void moveColumnManuallyLeftByOne(int index) {
396         selectMenuPath(new String[] { "Component", "Columns", "Column " + index,
397                 "Move left" });
398     }
399
400     private void assertColumnReorderEvent(boolean userOriginated) {
401         final String logRow = getLogRow(0);
402         assertTrue(logRow.contains(
403                 "Columns reordered, userOriginated: " + userOriginated));
404     }
405
406     private void assertNoColumnReorderEvent() {
407         final String logRow = getLogRow(0);
408         assertFalse(logRow.contains("Columns reordered"));
409     }
410
411 }