package com.vaadin.tests.components.grid.basics;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.junit.Before;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.remote.DesiredCapabilities;
import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elements.GridElement;
import com.vaadin.testbench.elements.GridElement.GridCellElement;
import com.vaadin.testbench.elements.GridElement.GridEditorElement;
import com.vaadin.testbench.parallel.Browser;
import com.vaadin.tests.tb3.MultiBrowserTest;
import com.vaadin.v7.tests.components.grid.basicfeatures.GridBasicFeaturesTest.CellSide;
/**
* Base class for all {@link GridBasics} UI tests
*/
public abstract class GridBasicsTest extends MultiBrowserTest {
public static final int ROWS = 1000;
/* Identical List of test data */
private List<DataObject> testData;
@Override
public List<DesiredCapabilities> getBrowsersToTest() {
// Most tests are run with only one browser.
return getBrowserCapabilities(Browser.PHANTOMJS);
}
@Override
protected Class<?> getUIClass() {
return GridBasics.class;
}
@Before
public void setUp() {
openTestURL();
testData = DataObject.generateObjects();
}
protected GridElement getGridElement() {
return $(GridElement.class).first();
}
protected List<TestBenchElement> getGridHeaderRowCells() {
List<TestBenchElement> headerCells = new ArrayList<>();
for (int i = 0; i < getGridElement().getHeaderCount(); ++i) {
headerCells.addAll(getGridElement().getHeaderCells(i));
}
return headerCells;
}
protected Stream<DataObject> getTestData() {
return testData.stream();
}
protected void scrollGridVerticallyTo(double px) {
executeScript("arguments[0].scrollTop = " + px,
getGridVerticalScrollbar());
}
protected void scrollGridHorizontallyTo(double px) {
executeScript("arguments[0].scrollLeft = " + px,
getGridHorizontalScrollbar());
}
protected WebElement getGridVerticalScrollbar() {
return getDriver().findElement(By.xpath(
"//div[contains(@class, \"v-grid-scroller-vertical\")]"));
}
protected WebElement getGridHorizontalScrollbar() {
return getDriver().findElement(By.xpath(
"//div[contains(@class, \"v-grid-scroller-horizontal\")]"));
}
protected GridCellElement getDefaultColumnHeader(int index) {
List<GridCellElement> headerRowCells = getGridElement()
.getHeaderCells(0);
return headerRowCells.get(index);
}
protected void dragAndDropDefaultColumnHeader(int draggedColumnHeaderIndex,
int onTopOfColumnHeaderIndex, CellSide cellSide) {
GridCellElement columnHeader = getDefaultColumnHeader(
onTopOfColumnHeaderIndex);
new Actions(getDriver())
.clickAndHold(getDefaultColumnHeader(draggedColumnHeaderIndex))
.moveToElement(columnHeader, getHorizontalOffsetForDragAndDrop(
columnHeader, cellSide), 0)
.release().perform();
}
protected void dragAndDropColumnHeader(int headerRow,
int draggedColumnHeaderIndex, int onTopOfColumnHeaderIndex,
CellSide cellSide) {
GridCellElement headerCell = getGridElement().getHeaderCell(headerRow,
onTopOfColumnHeaderIndex);
new Actions(getDriver())
.clickAndHold(getGridElement().getHeaderCell(headerRow,
draggedColumnHeaderIndex))
.moveToElement(headerCell,
getHorizontalOffsetForDragAndDrop(headerCell, cellSide),
0)
.release().perform();
}
protected void dragAndDropColumnHeader(int headerRow,
int draggedColumnHeaderIndex, int onTopOfColumnHeaderIndex,
int horizontalOffset) {
GridCellElement headerCell = getGridElement().getHeaderCell(headerRow,
onTopOfColumnHeaderIndex);
new Actions(getDriver())
.clickAndHold(getGridElement().getHeaderCell(headerRow,
draggedColumnHeaderIndex))
.moveToElement(headerCell, horizontalOffset, 0).release()
.perform();
}
private int getHorizontalOffsetForDragAndDrop(GridCellElement columnHeader,
CellSide cellSide) {
if (cellSide == CellSide.LEFT) {
return 5;
} else {
int half = columnHeader.getSize().getWidth() / 2;
return half + half / 2;
}
}
protected void toggleColumnReorder() {
selectMenuPath("Component", "State", "Column Reordering");
}
protected void assertColumnHeaderOrder(int... indices) {
List<TestBenchElement> headers = getGridHeaderRowCells();
for (int i = 0; i < indices.length; i++) {
assertColumnHeader("HEADER CELL " + indices[i], headers.get(i));
}
}
protected void assertColumnHeader(String expectedHeaderCaption,
TestBenchElement testBenchElement) {
assertEquals(expectedHeaderCaption.toLowerCase(),
testBenchElement.getText().toLowerCase());
}
protected void assertColumnIsSorted(int index) {
WebElement columnHeader = getDefaultColumnHeader(index);
assertTrue(columnHeader.getAttribute("class").contains("sort"));
}
protected void assertFocusedCell(int row, int column) {
assertTrue(getGridElement().getCell(row, column).getAttribute("class")
.contains("focused"));
}
protected void focusCell(int row, int column) {
getGridElement().getCell(row, column).click();
}
protected WebElement getSidebarPopup() {
List<WebElement> elements = findElements(
By.className("v-grid-sidebar-popup"));
if (elements.isEmpty()) {
getSidebarOpenButton().click();
elements = findElements(By.className("v-grid-sidebar-popup"));
}
return elements.isEmpty() ? null : elements.get(0);
}
protected WebElement getSidebarPopupIfPresent() {
List<WebElement> elements = findElements(
By.className("v-grid-sidebar-popup"));
return elements.isEmpty() ? null : elements.get(0);
}
protected WebElement getSidebarOpenButton() {
List<WebElement> elements = findElements(
By.className("v-grid-sidebar-button"));
return elements.isEmpty() ? null : elements.get(0);
}
/**
* Returns the toggle inside the sidebar for hiding the column at the given
* index, or null if not found.
*/
protected WebElement getColumnHidingToggle(int columnIndex) {
WebElement sidebar = getSidebarPopup();
List<WebElement> elements = sidebar
.findElements(By.className("column-hiding-toggle"));
for (WebElement e : elements) {
if (e.getText().toLowerCase().startsWith("column " + columnIndex)) {
return e;
}
}
return null;
}
protected GridEditorElement getEditor() {
return getGridElement().getEditor();
}
protected int getGridVerticalScrollPos() {
return ((Number) executeScript("return arguments[0].scrollTop",
getGridVerticalScrollbar())).intValue();
}
protected void toggleFirstRowSelection() {
selectMenuPath("Component", "Body rows", "Toggle first row selection");
}
protected void selectAll() {
selectMenuPath("Component", "State", "Selection model", "Select All");
}
protected void deselectAll() {
selectMenuPath("Component", "State", "Selection model", "Deselect All");
}
protected void setSelectionModelMulti() {
selectMenuPath("Component", "State", "Selection model", "multi");
}
protected void setSelectionModelSingle() {
selectMenuPath("Component", "State", "Selection model", "single");
}
protected void setSelectionModelNone() {
selectMenuPath("Component", "State", "Selection model", "none");
}
protected void setSelectAllCheckBoxVisible() {
selectMenuPath("Component", "State", "Selection model",
"SelectAllCheckbox: Visible");
}
protected void setSelectAllCheckBoxHidden() {
selectMenuPath("Component", "State", "Selection model",
"SelectAllCheckbox: Hidden");
}
protected void setSelectAllCheckBoxDefault() {
selectMenuPath("Component", "State", "Selection model",
"SelectAllCheckbox: Default");
}
protected WebElement getSelectAllCheckbox() {
GridCellElement header = getGridElement().getHeaderCell(0, 0);
return header.findElement(By.tagName("input"));
}
}