/*
* Copyright 2000-2016 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.v7.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;
import com.vaadin.testbench.parallel.TestCategory;
/**
*
* @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, CellSide.LEFT);
// 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, CellSide.LEFT);
// 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, CellSide.LEFT);
// then
assertFocusedCell(2, 0);
}
@Test
public void testColumnReorderWithHiddenColumn_draggingFocusedCellColumnOverHiddenColumn_focusIsKeptOnCell() {
// given
toggleColumnReorder();
selectMenuPath("Component", "Columns", "Column 1", "Hidden");
focusCell(2, 2);
assertFocusedCell(2, 2);
// when
dragAndDropDefaultColumnHeader(1, 0, CellSide.LEFT);
// then
assertFocusedCell(2, 2);
// when
dragAndDropDefaultColumnHeader(0, 2, CellSide.LEFT);
// then
assertFocusedCell(2, 2);
}
@Test
public void testColumnReorder_dragColumnFromRightToLeftOfFocusedCellColumn_focusIsKept() {
// given
toggleColumnReorder();
focusCell(1, 3);
// when
dragAndDropDefaultColumnHeader(4, 1, CellSide.LEFT);
// then
assertFocusedCell(1, 4);
}
@Test
public void testColumnReorder_dragColumnFromLeftToRightOfFocusedCellColumn_focusIsKept() {
// given
toggleColumnReorder();
focusCell(4, 2);
// when
dragAndDropDefaultColumnHeader(0, 4, CellSide.LEFT);
// 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
int horizontalOffset = (getGridElement().getHeaderCell(1, 1).getSize()
.getWidth() / 2) - 10;
dragAndDropColumnHeader(1, 3, 1, horizontalOffset);
// 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
int horizontalOffset = (getGridElement().getHeaderCell(1, 1).getSize()
.getWidth() / 2) + 10;
dragAndDropColumnHeader(0, 0, 2, horizontalOffset);
// 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, CellSide.LEFT);
// 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, CellSide.LEFT);
assertColumnHeaderOrder(3, 0, 1, 2, 4);
// when
dragAndDropColumnHeader(0, 2, 0, CellSide.LEFT);
// 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, CellSide.LEFT);
assertColumnHeaderOrder(3, 0, 1, 2, 4);
// when then
dragAndDropColumnHeader(0, 1, 3, CellSide.LEFT);
assertColumnHeaderOrder(3, 0, 1, 2, 4);
dragAndDropColumnHeader(1, 2, 1, CellSide.LEFT);
assertColumnHeaderOrder(3, 0, 1, 2, 4);
dragAndDropColumnHeader(2, 1, 2, CellSide.RIGHT);
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, CellSide.RIGHT);
selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
scrollGridHorizontallyTo(0);
assertColumnHeaderOrder(1, 2, 3, 4, 5);
// when then
dragAndDropColumnHeader(0, 1, 4, CellSide.LEFT);
scrollGridHorizontallyTo(0);
assertColumnHeaderOrder(1, 2, 3, 4, 5);
dragAndDropColumnHeader(0, 2, 4, CellSide.LEFT);
scrollGridHorizontallyTo(0);
assertColumnHeaderOrder(1, 2, 3, 4, 5);
dragAndDropColumnHeader(0, 3, 4, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
assertColumnHeaderOrder(1, 2, 3, 5, 4);
dragAndDropColumnHeader(0, 4, 2, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
assertColumnHeaderOrder(1, 2, 3, 4, 5);
dragAndDropColumnHeader(2, 3, 4, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
assertColumnHeaderOrder(1, 2, 3, 5, 4);
dragAndDropColumnHeader(2, 4, 2, CellSide.RIGHT);
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, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
dragAndDropColumnHeader(0, 1, 4, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
assertColumnHeaderOrder(1, 3, 4, 5, 2);
// when then
dragAndDropColumnHeader(0, 1, 4, CellSide.LEFT);
assertColumnHeaderOrder(1, 4, 3, 5, 2);
dragAndDropColumnHeader(0, 2, 4, CellSide.LEFT);
assertColumnHeaderOrder(1, 4, 3, 5, 2);
dragAndDropColumnHeader(0, 2, 0, CellSide.LEFT);
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, CellSide.RIGHT);
// 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, CellSide.LEFT);
// 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, CellSide.LEFT);
assertColumnHeaderOrder(3, 0, 1, 2, 4);
// when
dragAndDropColumnHeader(0, 2, 0, CellSide.LEFT);
// 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, 5, CellSide.LEFT);
scrollGridHorizontallyTo(0);
dragAndDropColumnHeader(0, 1, 5, CellSide.LEFT);
scrollGridHorizontallyTo(0);
selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
assertColumnHeaderOrder(1, 3, 4, 5, 2);
// when then
dragAndDropColumnHeader(0, 1, 3, CellSide.RIGHT);
assertColumnHeaderOrder(1, 4, 3, 5, 2);
dragAndDropColumnHeader(0, 2, 4, CellSide.RIGHT);
assertColumnHeaderOrder(1, 4, 3, 5, 2);
dragAndDropColumnHeader(0, 2, 0, CellSide.RIGHT);
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, CellSide.LEFT);
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, CellSide.LEFT);
scrollGridHorizontallyTo(0);
// then
assertColumnHeaderOrder(0, 3, 1, 2, 4);
// when
dragAndDropColumnHeader(2, 3, 0, CellSide.LEFT);
// 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, CellSide.LEFT);
// then
assertColumnHeaderOrder(0, 1, 2, 3, 4);
// when
dragAndDropColumnHeader(2, 0, 3, CellSide.RIGHT);
// 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, CellSide.LEFT);
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, CellSide.LEFT);
// 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, CellSide.LEFT);
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, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
// then
assertColumnHeaderOrder(0, 5, 3, 4, 1);
// when
dragAndDropColumnHeader(2, 2, 0, CellSide.LEFT);
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, CellSide.LEFT);
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, CellSide.LEFT);
scrollGridHorizontallyTo(0);
// then
assertColumnHeaderOrder(0, 5, 3, 4, 1);
// when
dragAndDropColumnHeader(2, 1, 4, CellSide.LEFT);
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, 1, CellSide.RIGHT);
scrollGridHorizontallyTo(0);
// then
assertColumnHeaderOrder(0, 3, 4, 5, 1);
// when
scrollGridHorizontallyTo(100);
dragAndDropColumnHeader(2, 4, 2, CellSide.LEFT);
scrollGridHorizontallyTo(0);
// then
assertColumnHeaderOrder(0, 1, 2, 3, 4);
// when
dragAndDropColumnHeader(0, 0, 3, CellSide.LEFT);
scrollGridHorizontallyTo(0);
// then
assertColumnHeaderOrder(1, 2, 0, 3, 4);
}
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"));
}
}