/*
* 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.server;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import com.vaadin.testbench.TestBenchElement;
import com.vaadin.testbench.elements.GridElement.GridCellElement;
import com.vaadin.testbench.elements.GridElement.GridEditorElement;
import com.vaadin.v7.tests.components.grid.basicfeatures.GridBasicFeatures;
import com.vaadin.v7.tests.components.grid.basicfeatures.GridBasicFeaturesTest;
public abstract class GridEditorTest extends GridBasicFeaturesTest {
protected static final By BY_EDITOR_CANCEL = By
.className("v-grid-editor-cancel");
protected static final By BY_EDITOR_SAVE = By
.className("v-grid-editor-save");
protected static final String[] EDIT_ITEM_5 = new String[] { "Component",
"Editor", "Edit item 5" };
protected static final String[] EDIT_ITEM_100 = new String[] { "Component",
"Editor", "Edit item 100" };
protected static final String[] TOGGLE_EDIT_ENABLED = new String[] {
"Component", "Editor", "Enabled" };
@Before
public void setUp() {
setDebug(true);
openTestURL();
selectMenuPath(TOGGLE_EDIT_ENABLED);
}
@Test
public void testProgrammaticOpeningClosing() {
selectMenuPath(EDIT_ITEM_5);
assertEditorOpen();
selectMenuPath("Component", "Editor", "Cancel edit");
assertEditorClosed();
}
@Test
public void testProgrammaticOpeningWhenDisabled() {
selectMenuPath(TOGGLE_EDIT_ENABLED);
selectMenuPath(EDIT_ITEM_5);
assertEditorClosed();
boolean thrown = logContainsText(
"Exception occured, java.lang.IllegalStateException");
assertTrue("IllegalStateException thrown", thrown);
}
@Test
public void testDisablingWhileOpen() {
selectMenuPath(EDIT_ITEM_5);
selectMenuPath(TOGGLE_EDIT_ENABLED);
assertEditorOpen();
boolean thrown = logContainsText(
"Exception occured, java.lang.IllegalStateException");
assertTrue("IllegalStateException thrown", thrown);
}
@Test
public void testProgrammaticOpeningWithScroll() {
selectMenuPath(EDIT_ITEM_100);
assertEditorOpen();
}
@Test
public void testKeyboardOpeningClosing() {
getGridElement().getCell(4, 0).click();
assertEditorClosed();
new Actions(getDriver()).sendKeys(Keys.ENTER).perform();
assertEditorOpen();
new Actions(getDriver()).sendKeys(Keys.ESCAPE).perform();
assertEditorClosed();
// Disable Editor
selectMenuPath(TOGGLE_EDIT_ENABLED);
getGridElement().getCell(5, 0).click();
new Actions(getDriver()).sendKeys(Keys.ENTER).perform();
assertEditorClosed();
}
@Test
public void testComponentBinding() {
selectMenuPath(EDIT_ITEM_100);
List<WebElement> widgets = getEditorWidgets();
assertEquals("Number of widgets", GridBasicFeatures.EDITABLE_COLUMNS,
widgets.size());
assertEquals("(100, 0)", widgets.get(0).getAttribute("value"));
assertEquals("(100, 1)", widgets.get(1).getAttribute("value"));
assertEquals("(100, 2)", widgets.get(2).getAttribute("value"));
assertEquals("<b>100</b>", widgets.get(8).getAttribute("value"));
}
protected void assertEditorOpen() {
assertEquals("Unexpected number of widgets",
GridBasicFeatures.EDITABLE_COLUMNS, getEditorWidgets().size());
}
protected void assertEditorClosed() {
assertNull("Editor is supposed to be closed", getEditor());
}
protected List<WebElement> getEditorWidgets() {
assertNotNull("Editor is supposed to be open", getEditor());
return getEditor().findElements(By.className("v-textfield"));
}
@Test
public void testFocusOnMouseOpen() {
GridCellElement cell = getGridElement().getCell(4, 2);
cell.doubleClick();
WebElement focused = getFocusedElement();
assertEquals("", "input", focused.getTagName());
assertEquals("", cell.getText(), focused.getAttribute("value"));
}
@Test
public void testFocusOnKeyboardOpen() {
GridCellElement cell = getGridElement().getCell(4, 2);
cell.click();
new Actions(getDriver()).sendKeys(Keys.ENTER).perform();
WebElement focused = getFocusedElement();
assertEquals("", "input", focused.getTagName());
assertEquals("", cell.getText(), focused.getAttribute("value"));
}
@Test
public void testFocusOnProgrammaticOpenOnItemClick() {
selectMenuPath("Component", "State", "EditorOpeningItemClickListener");
GridCellElement cell = getGridElement().getCell(4, 2);
cell.click();
WebElement focused = getFocusedElement();
assertEquals("", "input", focused.getTagName());
assertEquals("", cell.getText(), focused.getAttribute("value"));
}
@Test
public void testNoFocusOnProgrammaticOpen() {
selectMenuPath(EDIT_ITEM_5);
WebElement focused = getFocusedElement();
assertEquals("Focus should remain in the menu", "menu",
focused.getAttribute("id"));
}
@Test
public void testUneditableColumn() {
selectMenuPath(EDIT_ITEM_5);
assertEditorOpen();
GridEditorElement editor = getGridElement().getEditor();
assertFalse("Uneditable column should not have an editor widget",
editor.isEditable(3));
String classNames = editor
.findElements(By.className("v-grid-editor-cells")).get(1)
.findElements(By.xpath("./div")).get(3).getAttribute("class");
assertTrue("Noneditable cell should contain not-editable classname",
classNames.contains("not-editable"));
assertTrue("Noneditable cell should contain v-grid-cell classname",
classNames.contains("v-grid-cell"));
assertNoErrorNotifications();
}
@Test
public void testNoOpenFromHeaderOrFooter() {
selectMenuPath("Component", "Footer", "Visible");
getGridElement().getHeaderCell(0, 0).doubleClick();
assertEditorClosed();
new Actions(getDriver()).sendKeys(Keys.ENTER).perform();
assertEditorClosed();
getGridElement().getFooterCell(0, 0).doubleClick();
assertEditorClosed();
new Actions(getDriver()).sendKeys(Keys.ENTER).perform();
assertEditorClosed();
}
public void testEditorMoveOnResize() {
selectMenuPath("Component", "Size", "Height", "500px");
getGridElement().getCell(22, 0).doubleClick();
assertEditorOpen();
GridEditorElement editor = getGridElement().getEditor();
TestBenchElement tableWrapper = getGridElement().getTableWrapper();
int tableWrapperBottom = tableWrapper.getLocation().getY()
+ tableWrapper.getSize().getHeight();
int editorBottom = editor.getLocation().getY()
+ editor.getSize().getHeight();
assertTrue("Editor should not be initially outside grid",
tableWrapperBottom - editorBottom <= 2);
selectMenuPath("Component", "Size", "Height", "300px");
assertEditorOpen();
tableWrapperBottom = tableWrapper.getLocation().getY()
+ tableWrapper.getSize().getHeight();
editorBottom = editor.getLocation().getY()
+ editor.getSize().getHeight();
assertTrue("Editor should not be outside grid after resize",
tableWrapperBottom - editorBottom <= 2);
}
public void testEditorDoesNotMoveOnResizeIfNotNeeded() {
selectMenuPath("Component", "Size", "Height", "500px");
selectMenuPath(EDIT_ITEM_5);
assertEditorOpen();
GridEditorElement editor = getGridElement().getEditor();
int editorPos = editor.getLocation().getY();
selectMenuPath("Component", "Size", "Height", "300px");
assertEditorOpen();
assertTrue("Editor should not have moved due to resize",
editorPos == editor.getLocation().getY());
}
@Test
public void testEditorClosedOnSort() {
selectMenuPath(EDIT_ITEM_5);
selectMenuPath("Component", "State", "Sort by column", "Column 0, ASC");
assertEditorClosed();
}
@Test
public void testEditorClosedOnFilter() {
selectMenuPath(EDIT_ITEM_5);
selectMenuPath("Component", "Filter", "Column 1 starts with \"(23\"");
assertEditorClosed();
}
protected WebElement getSaveButton() {
return getDriver().findElement(BY_EDITOR_SAVE);
}
protected WebElement getCancelButton() {
return getDriver().findElement(BY_EDITOR_CANCEL);
}
}