--- /dev/null
- import com.vaadin.tests.annotations.TestCategory;
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.grid.basicfeatures;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.interactions.Actions;
+
+import com.vaadin.testbench.elements.GridElement.GridCellElement;
- dragAndDropColumnHeader(0, 3, 4, 80);
++import com.vaadin.testbench.parallel.TestCategory;
+
+/**
+ *
+ * @since
+ * @author Vaadin Ltd
+ */
+@TestCategory("grid")
+public class GridColumnReorderTest extends GridBasicClientFeaturesTest {
+
+ @Before
+ public void before() {
+ openTestURL();
+ }
+
+ @Test
+ public void columnReorderEventTriggered() {
+ final int firstIndex = 3;
+ final int secondIndex = 4;
+ final String firstHeaderText = getGridElement().getHeaderCell(0,
+ firstIndex).getText();
+ final String secondHeaderText = getGridElement().getHeaderCell(0,
+ secondIndex).getText();
+ selectMenuPath("Component", "Internals", "Listeners",
+ "Add ColumnReorder listener");
+ selectMenuPath("Component", "Columns", "Column " + secondIndex,
+ "Move column left");
+ // columns 3 and 4 should have swapped to 4 and 3
+ GridCellElement headerCell = getGridElement().getHeaderCell(0,
+ firstIndex);
+ assertEquals(secondHeaderText, headerCell.getText());
+ headerCell = getGridElement().getHeaderCell(0, secondIndex);
+ assertEquals(firstHeaderText, headerCell.getText());
+
+ // the reorder event should have typed the order to this label
+ WebElement columnReorderElement = findElement(By.id("columnreorder"));
+ int eventIndex = Integer.parseInt(columnReorderElement
+ .getAttribute("columns"));
+ assertEquals(1, eventIndex);
+
+ // trigger another event
+ selectMenuPath("Component", "Columns", "Column " + secondIndex,
+ "Move column left");
+ columnReorderElement = findElement(By.id("columnreorder"));
+ eventIndex = Integer.parseInt(columnReorderElement
+ .getAttribute("columns"));
+ assertEquals(2, eventIndex);
+ }
+
+ @Test
+ public void testColumnReorder_onReorder_columnReorderEventTriggered() {
+ final int firstIndex = 3;
+ final int secondIndex = 4;
+ final String firstHeaderText = getGridElement().getHeaderCell(0,
+ firstIndex).getText();
+ final String secondHeaderText = getGridElement().getHeaderCell(0,
+ secondIndex).getText();
+ selectMenuPath("Component", "Internals", "Listeners",
+ "Add ColumnReorder listener");
+ selectMenuPath("Component", "Columns", "Column " + secondIndex,
+ "Move column left");
+ // columns 3 and 4 should have swapped to 4 and 3
+ GridCellElement headerCell = getGridElement().getHeaderCell(0,
+ firstIndex);
+ assertEquals(secondHeaderText, headerCell.getText());
+ headerCell = getGridElement().getHeaderCell(0, secondIndex);
+ assertEquals(firstHeaderText, headerCell.getText());
+
+ // the reorder event should have typed the order to this label
+ WebElement columnReorderElement = findElement(By.id("columnreorder"));
+ int eventIndex = Integer.parseInt(columnReorderElement
+ .getAttribute("columns"));
+ assertEquals(1, eventIndex);
+
+ // trigger another event
+ selectMenuPath("Component", "Columns", "Column " + secondIndex,
+ "Move column left");
+ columnReorderElement = findElement(By.id("columnreorder"));
+ eventIndex = Integer.parseInt(columnReorderElement
+ .getAttribute("columns"));
+ assertEquals(2, eventIndex);
+ }
+
+ @Test
+ public void testColumnReorder_draggingSortedColumn_sortIndicatorShownOnDraggedElement() {
+ // given
+ toggleColumnReorder();
+ toggleSortableColumn(0);
+ sortColumn(0);
+
+ // when
+ startDragButDontDropOnDefaultColumnHeader(0);
+
+ // then
+ WebElement draggedElement = getDraggedHeaderElement();
+ assertTrue(draggedElement.getAttribute("class").contains("sort"));
+ }
+
+ @Test
+ public void testColumnReorder_draggingSortedColumn_sortStays() {
+ // given
+ toggleColumnReorder();
+ toggleSortableColumn(0);
+ sortColumn(0);
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 2, 10);
+
+ // then
+ assertColumnIsSorted(1);
+ }
+
+ @Test
+ public void testColumnReorder_draggingFocusedHeader_focusShownOnDraggedElement() {
+ // given
+ toggleColumnReorder();
+ focusDefaultHeader(0);
+
+ // when
+ startDragButDontDropOnDefaultColumnHeader(0);
+
+ // then
+ WebElement draggedElement = getDraggedHeaderElement();
+ assertTrue(draggedElement.getAttribute("class").contains("focused"));
+ }
+
+ @Test
+ public void testColumnReorder_draggingFocusedHeader_focusIsKeptOnHeader() {
+ // given
+ toggleColumnReorder();
+ focusDefaultHeader(0);
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 3, 10);
+
+ // then
+ WebElement defaultColumnHeader = getDefaultColumnHeader(2);
+ String attribute = defaultColumnHeader.getAttribute("class");
+ assertTrue(attribute.contains("focused"));
+ }
+
+ @Test
+ public void testColumnReorder_draggingFocusedCellColumn_focusIsKeptOnCell() {
+ // given
+ toggleColumnReorder();
+ focusCell(2, 2);
+
+ // when
+ dragAndDropDefaultColumnHeader(2, 0, 10);
+
+ // then
+ assertFocusedCell(2, 0);
+ }
+
+ @Test
+ public void testColumnReorder_dragColumnFromRightToLeftOfFocusedCellColumn_focusIsKept() {
+ // given
+ toggleColumnReorder();
+ focusCell(1, 3);
+
+ // when
+ dragAndDropDefaultColumnHeader(4, 1, 10);
+
+ // then
+ assertFocusedCell(1, 4);
+ }
+
+ @Test
+ public void testColumnReorder_dragColumnFromLeftToRightOfFocusedCellColumn_focusIsKept() {
+ // given
+ toggleColumnReorder();
+ focusCell(4, 2);
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 4, 10);
+
+ // then
+ assertFocusedCell(4, 1);
+ }
+
+ @Test
+ public void testColumnReorder_draggingHeaderRowThatHasColumnHeadersSpanned_cantDropInsideSpannedHeaderFromOutside() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(1, 3, 1, 80);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 1, 2, 4);
+ }
+
+ @Test
+ public void testColumnReorder_anotherRowHasColumnHeadersSpanned_cantDropInsideSpannedHeaderFromOutside() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 0, 2, 20);
+
+ // then
+ assertColumnHeaderOrder(1, 2, 0, 3, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellInsideSpannedHeader_cantBeDroppedOutsideSpannedArea() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 2, 0, 20);
+
+ // then
+ assertColumnHeaderOrder(0, 2, 1, 3, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellInsideTwoCrossingSpanningHeaders_cantTouchThis() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join column cells 0, 1");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ dragAndDropColumnHeader(0, 3, 0, 10);
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 2, 0, 10);
+
+ // then
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellsInsideSpannedHeaderAndBlockedByOtherSpannedCells_cantTouchThose() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join column cells 0, 1");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ dragAndDropColumnHeader(0, 3, 0, 10);
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+
+ // when then
+ dragAndDropColumnHeader(0, 1, 3, 10);
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+
+ dragAndDropColumnHeader(1, 2, 1, 10);
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+
+ dragAndDropColumnHeader(2, 1, 3, -10);
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellsInsideSpannedHeaderAndBlockedByOtherSpannedCells_reorderingLimited() {
+ // given
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ dragAndDropColumnHeader(0, 0, 4, 100);
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 4, 5);
+
+ // when then
+ dragAndDropColumnHeader(0, 1, 4, 10);
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 4, 5);
+
+ dragAndDropColumnHeader(0, 2, 4, 10);
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 4, 5);
+
- dragAndDropColumnHeader(2, 3, 4, 80);
++ dragAndDropColumnHeader(0, 3, 4, 100);
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 5, 4);
+
+ dragAndDropColumnHeader(0, 4, 2, 100);
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 4, 5);
+
++ dragAndDropColumnHeader(2, 3, 4, 100);
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 5, 4);
+
+ dragAndDropColumnHeader(2, 4, 2, 100);
+ scrollGridHorizontallyTo(0);
+ assertColumnHeaderOrder(1, 2, 3, 4, 5);
+ }
+
+ @Test
+ public void testColumnReorder_cellsInsideTwoAdjacentSpannedHeaders_reorderingLimited() {
+ // given
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ dragAndDropColumnHeader(0, 0, 4, 100);
+ scrollGridHorizontallyTo(0);
+ dragAndDropColumnHeader(0, 1, 4, 80);
+ scrollGridHorizontallyTo(0);
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ assertColumnHeaderOrder(1, 3, 4, 5, 2);
+
+ // when then
+ dragAndDropColumnHeader(0, 1, 3, 80);
+ assertColumnHeaderOrder(1, 4, 3, 5, 2);
+
+ dragAndDropColumnHeader(0, 2, 4, 10);
+ assertColumnHeaderOrder(1, 4, 3, 5, 2);
+
+ dragAndDropColumnHeader(0, 2, 0, 10);
+ assertColumnHeaderOrder(1, 3, 4, 5, 2);
+ }
+
+ @Test
+ public void testColumnReorder_footerHasSpannedCells_cantDropInside() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Footer", "Append row");
+ selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 3, 1, 80);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 1, 2, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellInsideASpannedFooter_cantBeDroppedOutsideSpannedArea() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Footer", "Append row");
+ selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 2, 0, 20);
+
+ // then
+ assertColumnHeaderOrder(0, 2, 1, 3, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellInsideTwoCrossingSpanningFooters_cantTouchThis() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Footer", "Append row");
+ selectMenuPath("Component", "Footer", "Append row");
+ selectMenuPath("Component", "Footer", "Row 1", "Join column cells 0, 1");
+ selectMenuPath("Component", "Footer", "Row 2", "Join columns 1, 2");
+ dragAndDropColumnHeader(0, 3, 0, 10);
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 2, 0, 10);
+
+ // then
+ assertColumnHeaderOrder(3, 0, 1, 2, 4);
+ }
+
+ @Test
+ public void testColumnReorder_cellsInsideTwoAdjacentSpannedHeaderAndFooter_reorderingLimited() {
+ // given
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Footer", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ dragAndDropColumnHeader(0, 0, 4, 80);
+ scrollGridHorizontallyTo(0);
+ dragAndDropColumnHeader(0, 1, 4, 80);
+ scrollGridHorizontallyTo(0);
+ selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
+ assertColumnHeaderOrder(1, 3, 4, 5, 2);
+
+ // when then
+ dragAndDropColumnHeader(0, 1, 3, 80);
+ assertColumnHeaderOrder(1, 4, 3, 5, 2);
+
+ dragAndDropColumnHeader(0, 2, 4, 10);
+ assertColumnHeaderOrder(1, 4, 3, 5, 2);
+
+ dragAndDropColumnHeader(0, 2, 0, 10);
+ assertColumnHeaderOrder(1, 3, 4, 5, 2);
+ }
+
+ @Test
+ public void testColumnReorder_draggingASpannedCell_dragWorksNormally() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(1, 1, 4, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 1, 2, 4);
+ }
+
+ @Test
+ public void testColumnReorder_twoEqualSpannedCells_bothCanBeDragged() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(1, 1, 4, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 1, 2, 4);
+
+ // when
+ dragAndDropColumnHeader(2, 3, 0, 10);
+
+ // then
+ assertColumnHeaderOrder(1, 2, 0, 3, 4);
+ }
+
+ @Test
+ public void testColumReorder_twoCrossingSpanningHeaders_neitherCanBeDragged() {
+ // given
+ toggleColumnReorder();
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 3", "Join column cells 0, 1");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(1, 1, 4, 10);
+
+ // then
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(2, 0, 3, 100);
+
+ // then
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+ }
+
+ @Test
+ public void testColumnReorder_spannedCellHasAnotherSpannedCellInside_canBeDraggedNormally() {
+ // given
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ dragAndDropColumnHeader(1, 3, 1, 10);
+ scrollGridHorizontallyTo(0);
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 3, 4, 5, 1);
+
+ // when
+ dragAndDropColumnHeader(1, 1, 0, 10);
+
+ // then
+ assertColumnHeaderOrder(3, 4, 5, 0, 1);
+ }
+
+ @Test
+ public void testColumnReorder_spannedCellInsideAnotherSpanned_canBeDraggedWithBoundaries() {
+ // given
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ dragAndDropColumnHeader(1, 3, 1, 10);
+ scrollGridHorizontallyTo(0);
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 3, 4, 5, 1);
+
+ // when
+ dragAndDropColumnHeader(2, 1, 3, 100);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 5, 3, 4, 1);
+
+ // when
+ dragAndDropColumnHeader(2, 2, 0, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 4, 5, 1);
+ }
+
+ @Test
+ public void testColumnReorder_cellInsideAndNextToSpannedCells_canBeDraggedWithBoundaries() {
+ // given
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ dragAndDropColumnHeader(1, 3, 1, 10);
+ scrollGridHorizontallyTo(0);
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 3, 4, 5, 1);
+
+ // when
+ dragAndDropColumnHeader(2, 3, 0, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 5, 3, 4, 1);
+
+ // when
+ dragAndDropColumnHeader(2, 1, 4, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 4, 5, 1);
+ }
+
+ @Test
+ public void testColumnReorder_multipleSpannedCells_dragWorksNormally() {
+ toggleColumnReorder();
++ selectMenuPath("Component", "State", "Width", "750px");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
+ selectMenuPath("Component", "Header", "Append row");
+ selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(1, 3, 2, -10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 3, 4, 5, 1);
+
+ // when
+ scrollGridHorizontallyTo(100);
+ dragAndDropColumnHeader(2, 4, 2, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+
+ // when
+ dragAndDropColumnHeader(0, 0, 3, 10);
+ scrollGridHorizontallyTo(0);
+
+ // then
+ assertColumnHeaderOrder(1, 2, 0, 3, 4);
+ }
+
+ private void toggleColumnReorder() {
+ selectMenuPath("Component", "State", "Column Reordering");
+ }
+
+ private void toggleSortableColumn(int index) {
+ selectMenuPath("Component", "Columns", "Column " + index, "Sortable");
+ }
+
+ private void startDragButDontDropOnDefaultColumnHeader(int index) {
+ new Actions(getDriver())
+ .clickAndHold(getGridHeaderRowCells().get(index))
+ .moveByOffset(100, 0).perform();
+ }
+
+ private void sortColumn(int index) {
+ getGridHeaderRowCells().get(index).click();
+ }
+
+ private void focusDefaultHeader(int index) {
+ getGridHeaderRowCells().get(index).click();
+ }
+
+ private WebElement getDraggedHeaderElement() {
+ return findElement(By.className("dragged-column-header"));
+ }
+}
--- /dev/null
- assertColumnHeaderOrder(0, 1, 2);
+/*
+ * Copyright 2000-2014 Vaadin Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.grid.basicfeatures.server;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import com.vaadin.testbench.TestBenchElement;
+import com.vaadin.tests.components.grid.basicfeatures.GridBasicFeaturesTest;
+
+/**
+ * Tests that Grid columns can be reordered by user with drag and drop #16643.
+ *
+ * @author Vaadin Ltd
+ */
+public class GridColumnReorderTest extends GridBasicFeaturesTest {
+
+ private static final String[] COLUMN_REORDERING_PATH = { "Component",
+ "State", "Column Reordering Allowed" };
+ private static final String[] COLUMN_REORDER_LISTENER_PATH = { "Component",
+ "State", "ColumnReorderListener" };
+
+ @Before
+ public void setUp() {
+ setDebug(true);
+ }
+
+ @Test
+ public void testColumnReordering_firstColumnDroppedOnThird_dropOnLeftSide() {
+ // given
+ openTestURL();
+ assertColumnHeaderOrder(0, 1, 2);
+ toggleColumnReordering();
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 2, 10);
+
+ // then
+ assertColumnHeaderOrder(1, 0, 2);
+ }
+
+ @Test
+ public void testColumnReordering_firstColumnDroppedOnThird_dropOnRightSide() {
+ // given
+ openTestURL();
+ assertColumnHeaderOrder(0, 1, 2);
+ toggleColumnReordering();
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 2, 110);
+
+ // then
+ assertColumnHeaderOrder(1, 2, 0);
+ }
+
+ @Test
+ public void testColumnReordering_reorderingTwiceBackForth_reordered() {
+ // given
+ openTestURL();
- assertColumnHeaderOrder(2, 0, 1, 3);
++ selectMenuPath("Component", "Size", "Width", "800px");
++ assertColumnHeaderOrder(0, 1, 2, 3, 4);
+ toggleColumnReordering();
+
+ // when
+ dragAndDropDefaultColumnHeader(2, 0, 10);
+
+ // then
- dragAndDropDefaultColumnHeader(1, 3, 110);
++ assertColumnHeaderOrder(2, 0, 1, 3, 4);
+
+ // when
++ dragAndDropDefaultColumnHeader(1, 3, 150);
+
+ // then
+ assertColumnHeaderOrder(2, 1, 3, 0);
+ }
+
+ @Test
+ public void testColumnReordering_notEnabled_noReordering() {
+ // given
+ openTestURL();
+ assertColumnHeaderOrder(0, 1, 2);
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 2, 110);
+
+ // then
+ assertColumnHeaderOrder(0, 1, 2);
+ }
+
+ @Test
+ public void testColumnReordering_userChangesRevertedByServer_columnsAreUpdated() {
+ // given
+ openTestURL();
+ assertColumnHeaderOrder(0, 1, 2);
+ toggleColumnReordering();
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 2, 10);
+ assertColumnHeaderOrder(1, 0, 2);
+ moveColumnManuallyLeftByOne(0);
+
+ // then
+ assertColumnHeaderOrder(0, 1, 2);
+ }
+
+ @Test
+ public void testColumnReordering_concurrentUpdatesFromServer_columnOrderFromServerUsed() {
+ // given
+ openTestURL();
+ assertColumnHeaderOrder(0, 1, 2);
+ toggleColumnReordering();
+
+ // when
+ selectMenuPath(new String[] { "Component", "Internals",
+ "Update column order without updating client" });
+ dragAndDropDefaultColumnHeader(2, 0, 10);
+
+ // then
+ assertColumnHeaderOrder(1, 0, 2);
+ }
+
+ @Test
+ public void testColumnReordering_triggersReorderEvent_isUserInitiated() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+
+ // when
+ toggleColumnReorderListener();
+ dragAndDropDefaultColumnHeader(0, 2, 10);
+
+ // then
+ assertColumnReorderEvent(true);
+ }
+
+ @Test
+ public void testColumnReordering_addAndRemoveListener_registerUnRegisterWorks() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ dragAndDropDefaultColumnHeader(0, 2, 10);
+ assertNoColumnReorderEvent();
+
+ // when
+ toggleColumnReorderListener();
+ dragAndDropDefaultColumnHeader(0, 2, 110);
+
+ // then
+ assertColumnReorderEvent(true);
+
+ // when
+ toggleColumnReorderListener();
+ dragAndDropDefaultColumnHeader(0, 3, 10);
+
+ // then
+ assertNoColumnReorderEvent();
+ }
+
+ @Test
+ public void testColumnReorderingEvent_serverSideReorder_triggersReorderEvent() {
+ openTestURL();
+
+ // when
+ toggleColumnReorderListener();
+ moveColumnManuallyLeftByOne(3);
+
+ // then
+ assertColumnReorderEvent(false);
+ }
+
+ @Test
+ public void testColumnReorder_draggingFrozenColumns_impossible() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ setFrozenColumns(2);
+ assertColumnHeaderOrder(0, 1, 2, 3);
+
+ // when
+ dragAndDropDefaultColumnHeader(0, 2, 10);
+
+ // then
+ assertColumnHeaderOrder(0, 1, 2, 3);
+ }
+
+ @Test
+ public void testColumnReorder_draggingColumnOnTopOfFrozenColumn_columnDroppedRightOfFrozenColumns() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ setFrozenColumns(1);
+ assertColumnHeaderOrder(0, 1, 2, 3);
+
+ // when
+ dragAndDropDefaultColumnHeader(2, 0, 10);
+
+ // then
+ assertColumnHeaderOrder(0, 2, 1, 3);
+ }
+
+ @Test
+ public void testColumnReorder_draggingColumnLeftOfMultiSelectionColumn_columnDroppedRight() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ selectMenuPath("Component", "State", "Selection mode", "multi");
+ List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
+ assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
+ assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
+ assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
+ assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
+
+ // when
+ dragAndDropDefaultColumnHeader(2, 0, 2);
+
+ // then
+ gridHeaderRowCells = getGridHeaderRowCells();
+ assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
+ assertColumnHeader("Column 1", gridHeaderRowCells.get(1));
+ assertColumnHeader("Column 0", gridHeaderRowCells.get(2));
+ assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
+ }
+
+ @Test
+ public void testColumnReorder_multiSelectionAndFrozenColumns_columnDroppedRight() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ selectMenuPath("Component", "State", "Selection mode", "multi");
+ setFrozenColumns(1);
+ List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
+ assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
+ assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
+ assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
+ assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
+
+ // when
+ dragAndDropDefaultColumnHeader(3, 0, 2);
+
+ // then
+ gridHeaderRowCells = getGridHeaderRowCells();
+ assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
+ assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
+ assertColumnHeader("Column 2", gridHeaderRowCells.get(2));
+ assertColumnHeader("Column 1", gridHeaderRowCells.get(3));
+ }
+
+ @Test
+ public void testColumnReordering_multiSelectionColumnNotFrozen_stillCantDropLeftSide() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ selectMenuPath("Component", "State", "Selection mode", "multi");
+ setFrozenColumns(-1);
+ List<TestBenchElement> gridHeaderRowCells = getGridHeaderRowCells();
+ assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
+ assertColumnHeader("Column 0", gridHeaderRowCells.get(1));
+ assertColumnHeader("Column 1", gridHeaderRowCells.get(2));
+ assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
+
+ // when
+ dragAndDropDefaultColumnHeader(2, 0, 2);
+
+ // then
+ gridHeaderRowCells = getGridHeaderRowCells();
+ assertTrue(gridHeaderRowCells.get(0).getText().equals(""));
+ assertColumnHeader("Column 1", gridHeaderRowCells.get(1));
+ assertColumnHeader("Column 0", gridHeaderRowCells.get(2));
+ assertColumnHeader("Column 2", gridHeaderRowCells.get(3));
+ }
+
+ @Test
+ public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromFirstRow() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ selectMenuPath("Component", "Header", "Append row");
+ assertColumnHeaderOrder(0, 1, 2, 3);
+
+ // when
+ dragAndDropColumnHeader(0, 0, 2, 100);
+
+ // then
+ assertColumnHeaderOrder(1, 2, 0, 3);
+ }
+
+ @Test
+ public void testColumnReordering_twoHeaderRows_dndReorderingPossibleFromSecondRow() {
+ // given
+ openTestURL();
+ toggleColumnReordering();
+ selectMenuPath("Component", "Header", "Append row");
+ assertColumnHeaderOrder(0, 1, 2, 3);
+
+ // when
+ dragAndDropColumnHeader(1, 0, 2, 100);
+
+ // then
+ assertColumnHeaderOrder(1, 2, 0, 3);
+ }
+
+ private void toggleColumnReordering() {
+ selectMenuPath(COLUMN_REORDERING_PATH);
+ }
+
+ private void toggleColumnReorderListener() {
+ selectMenuPath(COLUMN_REORDER_LISTENER_PATH);
+ }
+
+ private void moveColumnManuallyLeftByOne(int index) {
+ selectMenuPath(new String[] { "Component", "Columns",
+ "Column " + index, "Move left" });
+ }
+
+ private void assertColumnReorderEvent(boolean userOriginated) {
+ final String logRow = getLogRow(0);
+ assertTrue(logRow.contains("Columns reordered, userOriginated: "
+ + userOriginated));
+ }
+
+ private void assertNoColumnReorderEvent() {
+ final String logRow = getLogRow(0);
+ assertFalse(logRow.contains("Columns reordered"));
+ }
+
+}