/* * 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; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; import org.openqa.selenium.Keys; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.remote.DesiredCapabilities; import com.vaadin.testbench.By; import com.vaadin.testbench.TestBenchElement; import com.vaadin.testbench.elements.GridElement; import com.vaadin.testbench.elements.GridElement.GridCellElement; import com.vaadin.testbench.elements.LabelElement; import com.vaadin.testbench.elements.NativeButtonElement; import com.vaadin.testbench.elements.NativeSelectElement; import com.vaadin.testbench.elementsbase.ServerClass; import com.vaadin.testbench.parallel.TestCategory; import com.vaadin.tests.tb3.MultiBrowserTest; import com.vaadin.tests.widgetset.client.v7.grid.GridClientColumnRendererConnector.Renderers; import com.vaadin.tests.widgetset.server.v7.grid.GridClientColumnRenderers; /** * Tests Grid client side renderers * * @since * @author Vaadin Ltd */ @TestCategory("grid") public class GridClientRenderers extends MultiBrowserTest { private static final double SLEEP_MULTIPLIER = 1.2; private int latency = 0; @Override protected Class<?> getUIClass() { return GridClientColumnRenderers.class; } @Override protected String getDeploymentPath(Class<?> uiClass) { String path = super.getDeploymentPath(uiClass); if (latency > 0) { path += (path.contains("?") ? "&" : "?") + "latency=" + latency; } return path; } @ServerClass("com.vaadin.tests.widgetset.server.grid.GridClientColumnRenderers.GridController") public static class MyClientGridElement extends GridElement { } @Override public void setup() throws Exception { latency = 0; // reset super.setup(); } @Test public void addWidgetRenderer() throws Exception { openTestURL(); // Add widget renderer column $(NativeSelectElement.class).first() .selectByText(Renderers.WIDGET_RENDERER.toString()); $(NativeButtonElement.class).caption("Add").first().click(); // Click the button in cell 1,1 TestBenchElement cell = getGrid().getCell(1, 2); WebElement gwtButton = cell.findElement(By.tagName("button")); gwtButton.click(); // Should be an alert visible assertEquals("Button did not contain text \"Clicked\"", "Clicked", gwtButton.getText()); } @Test public void detachAndAttachGrid() { openTestURL(); // Add widget renderer column $(NativeSelectElement.class).first() .selectByText(Renderers.WIDGET_RENDERER.toString()); $(NativeButtonElement.class).caption("Add").first().click(); // Detach and re-attach the Grid $(NativeButtonElement.class).caption("DetachAttach").first().click(); // Click the button in cell 1,1 TestBenchElement cell = getGrid().getCell(1, 2); WebElement gwtButton = cell.findElement(By.tagName("button")); gwtButton.click(); // Should be an alert visible assertEquals("Button did not contain text \"Clicked\"", gwtButton.getText(), "Clicked"); } @Test public void rowsWithDataHasStyleName() throws Exception { testBench().disableWaitForVaadin(); // Simulate network latency with 2000ms latency = 2000; openTestURL(); sleep((int) (latency * SLEEP_MULTIPLIER)); TestBenchElement row = getGrid().getRow(51); String className = row.getAttribute("class"); assertFalse("Row should not yet contain style name v-grid-row-has-data", className.contains("v-grid-row-has-data")); // Wait for data to arrive sleep((int) (latency * SLEEP_MULTIPLIER)); row = getGrid().getRow(51); className = row.getAttribute("class"); assertTrue("Row should now contain style name v-grid-row-has-data", className.contains("v-grid-row-has-data")); } @Test public void complexRendererSetVisibleContent() throws Exception { DesiredCapabilities desiredCapabilities = getDesiredCapabilities(); // Simulate network latency with 2000ms latency = 2000; // Chrome uses RGB instead of RGBA String colorRed = "rgba(255, 0, 0, 1)"; String colorWhite = "rgba(255, 255, 255, 1)"; String colorDark = "rgba(239, 240, 241, 1)"; openTestURL(); getGrid(); testBench().disableWaitForVaadin(); // Test initial renderering with contentVisible = False TestBenchElement cell = getGrid().getCell(51, 1); String backgroundColor = cell.getCssValue("backgroundColor"); assertEquals("Background color was not red.", colorRed, backgroundColor); // data arrives... sleep((int) (latency * SLEEP_MULTIPLIER)); // Content becomes visible cell = getGrid().getCell(51, 1); backgroundColor = cell.getCssValue("backgroundColor"); assertNotEquals("Background color was red.", colorRed, backgroundColor); // scroll down, new cells becomes contentVisible = False getGrid().scrollToRow(60); // Cell should be red (setContentVisible set cell red) cell = getGrid().getCell(55, 1); backgroundColor = cell.getCssValue("backgroundColor"); assertEquals("Background color was not red.", colorRed, backgroundColor); // data arrives... sleep((int) (latency * SLEEP_MULTIPLIER)); // Cell should no longer be red backgroundColor = cell.getCssValue("backgroundColor"); assertTrue("Background color was not reset", backgroundColor.equals(colorWhite) || backgroundColor.equals(colorDark)); } @Test public void testSortingEvent() throws Exception { openTestURL(); $(NativeButtonElement.class).caption("Trigger sorting event").first() .click(); String consoleText = $(LabelElement.class).id("testDebugConsole") .getText(); assertTrue("Console text as expected", consoleText.contains("Columns: 1, order: Column 1: ASCENDING")); } @Test public void testListSorter() throws Exception { openTestURL(); $(NativeButtonElement.class).caption("Shuffle").first().click(); GridElement gridElem = $(MyClientGridElement.class).first(); // XXX: DANGER! We'll need to know how many rows the Grid has! // XXX: Currently, this is impossible; hence the hardcoded value of 70. boolean shuffled = false; for (int i = 1, l = 70; i < l; ++i) { String str_a = gridElem.getCell(i - 1, 0).getAttribute("innerHTML"); String str_b = gridElem.getCell(i, 0).getAttribute("innerHTML"); int value_a = Integer.parseInt(str_a); int value_b = Integer.parseInt(str_b); if (value_a > value_b) { shuffled = true; break; } } assertTrue("Grid shuffled", shuffled); $(NativeButtonElement.class).caption("Test sorting").first().click(); for (int i = 1, l = 70; i < l; ++i) { String str_a = gridElem.getCell(i - 1, 0).getAttribute("innerHTML"); String str_b = gridElem.getCell(i, 0).getAttribute("innerHTML"); int value_a = Integer.parseInt(str_a); int value_b = Integer.parseInt(str_b); if (value_a > value_b) { assertTrue("Grid sorted", false); } } } @Test public void testComplexRendererOnActivate() { openTestURL(); GridCellElement cell = getGrid().getCell(3, 1); cell.click(); new Actions(getDriver()).sendKeys(Keys.ENTER).perform(); assertEquals("onActivate was not called on KeyDown Enter.", "Activated!", cell.getText()); cell = getGrid().getCell(4, 1); cell.click(); new Actions(getDriver()).moveToElement(cell).doubleClick().perform(); assertEquals("onActivate was not called on double click.", "Activated!", cell.getText()); } private GridElement getGrid() { return $(MyClientGridElement.class).first(); } private void addColumn(Renderers renderer) { // Add widget renderer column $(NativeSelectElement.class).first().selectByText(renderer.toString()); $(NativeButtonElement.class).caption("Add").first().click(); } }