package com.vaadin.tests.components.treegrid;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameters;
import org.openqa.selenium.Keys;
import org.openqa.selenium.interactions.Actions;
import com.vaadin.testbench.By;
import com.vaadin.testbench.elements.TreeGridElement;
import com.vaadin.tests.tb3.MultiBrowserTest;
import com.vaadin.tests.tb3.ParameterizedTB3Runner;
@RunWith(ParameterizedTB3Runner.class)
public class TreeGridBasicFeaturesTest extends MultiBrowserTest {
private TreeGridElement grid;
public void setDataProvider(String dataProviderString) {
selectMenuPath("Component", "Features", "Set data provider",
dataProviderString);
}
@Parameters
public static Collection<String> getDataProviders() {
return Arrays.asList("LazyHierarchicalDataProvider",
"InMemoryHierarchicalDataProvider");
}
@Before
public void before() {
setDebug(true);
openTestURL();
grid = $(TreeGridElement.class).first();
}
@Test
public void toggle_collapse_server_side() {
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
selectMenuPath("Component", "Features", "Server-side expand",
"Expand 0 | 0");
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
// expanding already expanded item should have no effect
selectMenuPath("Component", "Features", "Server-side expand",
"Expand 0 | 0");
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
selectMenuPath("Component", "Features", "Server-side collapse",
"Collapse 0 | 0");
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
// collapsing the same item twice should have no effect
selectMenuPath("Component", "Features", "Server-side collapse",
"Collapse 0 | 0");
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
selectMenuPath("Component", "Features", "Server-side expand",
"Expand 1 | 1");
// 1 | 1 not yet visible, shouldn't immediately expand anything
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
selectMenuPath("Component", "Features", "Server-side expand",
"Expand 0 | 0");
// 1 | 1 becomes visible and is also expanded
assertEquals(9, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "2 | 0", "2 | 1",
"2 | 2", "1 | 2" });
// collapsing a leaf should have no effect
selectMenuPath("Component", "Features", "Server-side collapse",
"Collapse 2 | 1");
assertEquals(9, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "2 | 0", "2 | 1",
"2 | 2", "1 | 2" });
// collapsing 0 | 0 should collapse the expanded 1 | 1
selectMenuPath("Component", "Features", "Server-side collapse",
"Collapse 0 | 0");
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
assertNoSystemNotifications();
assertNoErrorNotifications();
}
@Test
public void pending_expands_cleared_when_data_provider_set() {
selectMenuPath("Component", "Features", "Server-side expand",
"Expand 1 | 1");
selectMenuPath("Component", "Features", "Set data provider",
"LazyHierarchicalDataProvider");
grid.expandWithClick(0);
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
}
@Test
public void non_leaf_collapse_on_click() {
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
// Should expand "0 | 0"
grid.getRow(0).getCell(0)
.findElement(By.className("v-treegrid-expander")).click();
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
// Should collapse "0 | 0"
grid.getRow(0).getCell(0)
.findElement(By.className("v-treegrid-expander")).click();
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
}
@Test
public void keyboard_navigation() {
grid.getRow(0).getCell(0).click();
// Should expand "0 | 0" without moving focus
new Actions(getDriver()).sendKeys(Keys.RIGHT).perform();
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
assertTrue(
grid.getRow(0).hasClassName("v-treegrid-rowmode-row-focused"));
assertFalse(
grid.getRow(1).hasClassName("v-treegrid-rowmode-row-focused"));
// Should navigate 2 times down to "1 | 1"
new Actions(getDriver()).sendKeys(Keys.DOWN, Keys.DOWN).perform();
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
assertFalse(
grid.getRow(0).hasClassName("v-treegrid-rowmode-row-focused"));
assertFalse(
grid.getRow(1).hasClassName("v-treegrid-rowmode-row-focused"));
assertTrue(
grid.getRow(2).hasClassName("v-treegrid-rowmode-row-focused"));
// Should expand "1 | 1" without moving focus
new Actions(getDriver()).sendKeys(Keys.RIGHT).perform();
assertEquals(9, grid.getRowCount());
assertCellTexts(2, 0,
new String[] { "1 | 1", "2 | 0", "2 | 1", "2 | 2", "1 | 2" });
assertTrue(
grid.getRow(2).hasClassName("v-treegrid-rowmode-row-focused"));
// Should collapse "1 | 1"
new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
assertEquals(6, grid.getRowCount());
assertCellTexts(2, 0, new String[] { "1 | 1", "1 | 2", "0 | 1" });
assertTrue(
grid.getRow(2).hasClassName("v-treegrid-rowmode-row-focused"));
// Should navigate to "0 | 0"
new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
assertEquals(6, grid.getRowCount());
assertCellTexts(0, 0,
new String[] { "0 | 0", "1 | 0", "1 | 1", "1 | 2", "0 | 1" });
assertTrue(
grid.getRow(0).hasClassName("v-treegrid-rowmode-row-focused"));
// Should collapse "0 | 0"
new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
assertTrue(
grid.getRow(0).hasClassName("v-treegrid-rowmode-row-focused"));
// Nothing should happen
new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
assertEquals(3, grid.getRowCount());
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
assertTrue(
grid.getRow(0).hasClassName("v-treegrid-rowmode-row-focused"));
assertNoErrorNotifications();
}
@Test
public void keyboard_selection() {
grid.getRow(0).getCell(0).click();
// Should expand "0 | 0" without moving focus
new Actions(getDriver()).sendKeys(Keys.RIGHT).perform();
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
// Should navigate 2 times down to "1 | 1"
new Actions(getDriver()).sendKeys(Keys.DOWN, Keys.DOWN).perform();
assertEquals(6, grid.getRowCount());
assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
assertFalse(
grid.getRow(0).hasClassName("v-treegrid-rowmode-row-focused"));
assertFalse(
grid.getRow(1).hasClassName("v-treegrid-rowmode-row-focused"));
assertTrue(
grid.getRow(2).hasClassName("v-treegrid-rowmode-row-focused"));
// Should select "1 | 1" without moving focus
new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-selected"));
// Should move focus but not selection
new Actions(getDriver()).sendKeys(Keys.UP).perform();
assertTrue(
grid.getRow(1).hasClassName("v-treegrid-rowmode-row-focused"));
assertFalse(
grid.getRow(2).hasClassName("v-treegrid-rowmode-row-focused"));
assertFalse(grid.getRow(1).hasClassName("v-treegrid-row-selected"));
assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-selected"));
// Should select "1 | 0" without moving focus
new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
assertTrue(
grid.getRow(1).hasClassName("v-treegrid-rowmode-row-focused"));
assertFalse(
grid.getRow(2).hasClassName("v-treegrid-rowmode-row-focused"));
assertTrue(grid.getRow(1).hasClassName("v-treegrid-row-selected"));
assertFalse(grid.getRow(2).hasClassName("v-treegrid-row-selected"));
assertNoErrorNotifications();
}
@Test
public void changing_hierarchy_column() {
assertTrue(grid.getRow(0).getCell(0)
.isElementPresent(By.className("v-treegrid-expander")));
assertFalse(grid.getRow(0).getCell(1)
.isElementPresent(By.className("v-treegrid-expander")));
selectMenuPath("Component", "Features", "Set hierarchy column",
"depth");
assertFalse(grid.getRow(0).getCell(0)
.isElementPresent(By.className("v-treegrid-expander")));
assertTrue(grid.getRow(0).getCell(1)
.isElementPresent(By.className("v-treegrid-expander")));
selectMenuPath("Component", "Features", "Set hierarchy column",
"string");
assertTrue(grid.getRow(0).getCell(0)
.isElementPresent(By.className("v-treegrid-expander")));
assertFalse(grid.getRow(0).getCell(1)
.isElementPresent(By.className("v-treegrid-expander")));
}
@Override
protected boolean useNativeEventsForIE() {
// Fixes IE11 selectMenuPath troubles
return false;
}
@Test
public void expand_and_collapse_listeners() {
selectMenuPath("Component", "State", "Expand listener");
selectMenuPath("Component", "State", "Collapse listener");
assertFalse(logContainsText(
"Item expanded (user originated: true): 0 | 0"));
assertFalse(logContainsText(
"Item collapsed (user originated: true): 0 | 0"));
grid.expandWithClick(0);
assertTrue(logContainsText(
"Item expanded (user originated: true): 0 | 0"));
assertFalse(logContainsText(
"Item collapsed (user originated: true): 0 | 0"));
grid.collapseWithClick(0);
assertTrue(logContainsText(
"Item expanded (user originated: true): 0 | 0"));
assertTrue(logContainsText(
"Item collapsed (user originated: true): 0 | 0"));
selectMenuPath("Component", "Features", "Server-side expand",
"Expand 0 | 0");
assertTrue(logContainsText(
"Item expanded (user originated: false): 0 | 0"));
assertFalse(logContainsText(
"Item collapsed (user originated: false): 0 | 0"));
selectMenuPath("Component", "Features", "Server-side collapse",
"Collapse 0 | 0");
assertTrue(logContainsText(
"Item expanded (user originated: false): 0 | 0"));
assertTrue(logContainsText(
"Item collapsed (user originated: false): 0 | 0"));
selectMenuPath("Component", "State", "Expand listener");
selectMenuPath("Component", "State", "Collapse listener");
grid.expandWithClick(1);
grid.collapseWithClick(1);
assertFalse(logContainsText(
"Item expanded (user originated: true): 0 | 1"));
assertFalse(logContainsText(
"Item collapsed (user originated: true): 0 | 1"));
}
@Test
public void expanded_nodes_stay_expanded_when_parent_expand_state_is_toggled() {
grid.expandWithClick(0);
grid.expandWithClick(1);
grid.collapseWithClick(0);
grid.expandWithClick(0);
assertCellTexts(0, 0, new String[] { "0 | 0", "1 | 0", "2 | 0", "2 | 1",
"2 | 2", "1 | 1", "1 | 2", "0 | 1", "0 | 2" });
assertEquals(9, grid.getRowCount());
grid.expandWithClick(7);
grid.expandWithClick(8);
grid.collapseWithClick(7);
grid.collapseWithClick(0);
grid.expandWithClick(1);
assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "1 | 0", "2 | 0",
"2 | 1", "2 | 2", "1 | 1", "1 | 2", "0 | 2" });
assertEquals(9, grid.getRowCount());
}
private void assertCellTexts(int startRowIndex, int cellIndex,
String[] cellTexts) {
int index = startRowIndex;
for (String cellText : cellTexts) {
assertEquals(cellText,
grid.getRow(index).getCell(cellIndex).getText());
index++;
}
}
}