You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

TreeGridBasicFeaturesTest.java 16KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384
  1. package com.vaadin.tests.components.treegrid;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertTrue;
  5. import java.util.Arrays;
  6. import java.util.Collection;
  7. import org.junit.Before;
  8. import org.junit.Test;
  9. import org.junit.runner.RunWith;
  10. import org.junit.runners.Parameterized.Parameters;
  11. import org.openqa.selenium.Keys;
  12. import org.openqa.selenium.interactions.Actions;
  13. import com.vaadin.testbench.By;
  14. import com.vaadin.testbench.elements.TreeGridElement;
  15. import com.vaadin.tests.tb3.MultiBrowserTest;
  16. import com.vaadin.tests.tb3.ParameterizedTB3Runner;
  17. @RunWith(ParameterizedTB3Runner.class)
  18. public class TreeGridBasicFeaturesTest extends MultiBrowserTest {
  19. private TreeGridElement grid;
  20. public void setDataProvider(String dataProviderString) {
  21. selectMenuPath("Component", "Features", "Set data provider",
  22. dataProviderString);
  23. }
  24. @Parameters
  25. public static Collection<String> getDataProviders() {
  26. return Arrays.asList("LazyHierarchicalDataProvider",
  27. "TreeDataProvider");
  28. }
  29. @Before
  30. public void before() {
  31. setDebug(true);
  32. openTestURL();
  33. grid = $(TreeGridElement.class).first();
  34. }
  35. @Test
  36. public void toggle_collapse_server_side() {
  37. assertEquals(3, grid.getRowCount());
  38. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  39. selectMenuPath("Component", "Features", "Server-side expand",
  40. "Expand 0 | 0");
  41. assertEquals(6, grid.getRowCount());
  42. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  43. // expanding already expanded item should have no effect
  44. selectMenuPath("Component", "Features", "Server-side expand",
  45. "Expand 0 | 0");
  46. assertEquals(6, grid.getRowCount());
  47. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  48. selectMenuPath("Component", "Features", "Server-side collapse",
  49. "Collapse 0 | 0");
  50. assertEquals(3, grid.getRowCount());
  51. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  52. // collapsing the same item twice should have no effect
  53. selectMenuPath("Component", "Features", "Server-side collapse",
  54. "Collapse 0 | 0");
  55. assertEquals(3, grid.getRowCount());
  56. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  57. selectMenuPath("Component", "Features", "Server-side expand",
  58. "Expand 1 | 1");
  59. // 1 | 1 not yet visible, shouldn't immediately expand anything
  60. assertEquals(3, grid.getRowCount());
  61. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  62. selectMenuPath("Component", "Features", "Server-side expand",
  63. "Expand 0 | 0");
  64. // 1 | 1 becomes visible and is also expanded
  65. assertEquals(9, grid.getRowCount());
  66. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "2 | 0", "2 | 1",
  67. "2 | 2", "1 | 2" });
  68. // collapsing a leaf should have no effect
  69. selectMenuPath("Component", "Features", "Server-side collapse",
  70. "Collapse 2 | 1");
  71. assertEquals(9, grid.getRowCount());
  72. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "2 | 0", "2 | 1",
  73. "2 | 2", "1 | 2" });
  74. // collapsing 0 | 0 should collapse the expanded 1 | 1
  75. selectMenuPath("Component", "Features", "Server-side collapse",
  76. "Collapse 0 | 0");
  77. assertEquals(3, grid.getRowCount());
  78. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  79. // expand 0 | 0 recursively
  80. selectMenuPath("Component", "Features", "Server-side expand",
  81. "Expand 0 | 0 recursively");
  82. assertEquals(15, grid.getRowCount());
  83. assertCellTexts(0, 0, new String[] { "0 | 0", "1 | 0", "2 | 0" });
  84. // collapse 0 | 0 recursively
  85. selectMenuPath("Component", "Features", "Server-side collapse",
  86. "Collapse 0 | 0 recursively");
  87. assertEquals(3, grid.getRowCount());
  88. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  89. // expanding 0 | 0 should result in 3 additional nodes after recursive
  90. // collapse
  91. selectMenuPath("Component", "Features", "Server-side expand",
  92. "Expand 0 | 0");
  93. assertEquals(6, grid.getRowCount());
  94. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  95. assertNoSystemNotifications();
  96. assertNoErrorNotifications();
  97. }
  98. @Test
  99. public void pending_expands_cleared_when_data_provider_set() {
  100. selectMenuPath("Component", "Features", "Server-side expand",
  101. "Expand 1 | 1");
  102. selectMenuPath("Component", "Features", "Set data provider",
  103. "LazyHierarchicalDataProvider");
  104. grid.expandWithClick(0);
  105. assertEquals(6, grid.getRowCount());
  106. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  107. }
  108. @Test
  109. public void non_leaf_collapse_on_click() {
  110. assertEquals(3, grid.getRowCount());
  111. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  112. // Should expand "0 | 0"
  113. grid.getRow(0).getCell(0)
  114. .findElement(By.className("v-treegrid-expander")).click();
  115. assertEquals(6, grid.getRowCount());
  116. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  117. // Should collapse "0 | 0"
  118. grid.getRow(0).getCell(0)
  119. .findElement(By.className("v-treegrid-expander")).click();
  120. assertEquals(3, grid.getRowCount());
  121. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  122. }
  123. @Test
  124. public void keyboard_navigation() {
  125. grid.getRow(0).getCell(0).click();
  126. // Should expand "0 | 0" without moving focus
  127. new Actions(getDriver()).sendKeys(Keys.RIGHT).perform();
  128. assertEquals(6, grid.getRowCount());
  129. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  130. assertTrue(grid.getRow(0).hasClassName("v-treegrid-row-focused"));
  131. assertFalse(grid.getRow(1).hasClassName("v-treegrid-row-focused"));
  132. // Should navigate 2 times down to "1 | 1"
  133. new Actions(getDriver()).sendKeys(Keys.DOWN, Keys.DOWN).perform();
  134. assertEquals(6, grid.getRowCount());
  135. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  136. assertFalse(grid.getRow(0).hasClassName("v-treegrid-row-focused"));
  137. assertFalse(grid.getRow(1).hasClassName("v-treegrid-row-focused"));
  138. assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-focused"));
  139. // Should expand "1 | 1" without moving focus
  140. new Actions(getDriver()).sendKeys(Keys.RIGHT).perform();
  141. assertEquals(9, grid.getRowCount());
  142. assertCellTexts(2, 0,
  143. new String[] { "1 | 1", "2 | 0", "2 | 1", "2 | 2", "1 | 2" });
  144. assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-focused"));
  145. // Should collapse "1 | 1"
  146. new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
  147. assertEquals(6, grid.getRowCount());
  148. assertCellTexts(2, 0, new String[] { "1 | 1", "1 | 2", "0 | 1" });
  149. assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-focused"));
  150. // Should navigate to "0 | 0"
  151. new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
  152. assertEquals(6, grid.getRowCount());
  153. assertCellTexts(0, 0,
  154. new String[] { "0 | 0", "1 | 0", "1 | 1", "1 | 2", "0 | 1" });
  155. assertTrue(grid.getRow(0).hasClassName("v-treegrid-row-focused"));
  156. // Should collapse "0 | 0"
  157. new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
  158. assertEquals(3, grid.getRowCount());
  159. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  160. assertTrue(grid.getRow(0).hasClassName("v-treegrid-row-focused"));
  161. // Nothing should happen
  162. new Actions(getDriver()).sendKeys(Keys.LEFT).perform();
  163. assertEquals(3, grid.getRowCount());
  164. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "0 | 2" });
  165. assertTrue(grid.getRow(0).hasClassName("v-treegrid-row-focused"));
  166. assertNoErrorNotifications();
  167. }
  168. @Test
  169. public void keyboard_selection() {
  170. grid.getRow(0).getCell(0).click();
  171. // Should expand "0 | 0" without moving focus
  172. new Actions(getDriver()).sendKeys(Keys.RIGHT).perform();
  173. assertEquals(6, grid.getRowCount());
  174. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  175. // Should navigate 2 times down to "1 | 1"
  176. new Actions(getDriver()).sendKeys(Keys.DOWN, Keys.DOWN).perform();
  177. assertEquals(6, grid.getRowCount());
  178. assertCellTexts(1, 0, new String[] { "1 | 0", "1 | 1", "1 | 2" });
  179. assertFalse(grid.getRow(0).hasClassName("v-treegrid-row-focused"));
  180. assertFalse(grid.getRow(1).hasClassName("v-treegrid-row-focused"));
  181. assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-focused"));
  182. // Should select "1 | 1" without moving focus
  183. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  184. assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-selected"));
  185. // Should move focus but not selection
  186. new Actions(getDriver()).sendKeys(Keys.UP).perform();
  187. assertTrue(grid.getRow(1).hasClassName("v-treegrid-row-focused"));
  188. assertFalse(grid.getRow(2).hasClassName("v-treegrid-row-focused"));
  189. assertFalse(grid.getRow(1).hasClassName("v-treegrid-row-selected"));
  190. assertTrue(grid.getRow(2).hasClassName("v-treegrid-row-selected"));
  191. // Should select "1 | 0" without moving focus
  192. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  193. assertTrue(grid.getRow(1).hasClassName("v-treegrid-row-focused"));
  194. assertFalse(grid.getRow(2).hasClassName("v-treegrid-row-focused"));
  195. assertTrue(grid.getRow(1).hasClassName("v-treegrid-row-selected"));
  196. assertFalse(grid.getRow(2).hasClassName("v-treegrid-row-selected"));
  197. assertNoErrorNotifications();
  198. }
  199. @Test
  200. public void changing_hierarchy_column() {
  201. assertTrue(grid.getRow(0).getCell(0)
  202. .isElementPresent(By.className("v-treegrid-expander")));
  203. assertFalse(grid.getRow(0).getCell(1)
  204. .isElementPresent(By.className("v-treegrid-expander")));
  205. selectMenuPath("Component", "Features", "Set hierarchy column",
  206. "depth");
  207. assertFalse(grid.getRow(0).getCell(0)
  208. .isElementPresent(By.className("v-treegrid-expander")));
  209. assertTrue(grid.getRow(0).getCell(1)
  210. .isElementPresent(By.className("v-treegrid-expander")));
  211. selectMenuPath("Component", "Features", "Set hierarchy column",
  212. "string");
  213. assertTrue(grid.getRow(0).getCell(0)
  214. .isElementPresent(By.className("v-treegrid-expander")));
  215. assertFalse(grid.getRow(0).getCell(1)
  216. .isElementPresent(By.className("v-treegrid-expander")));
  217. }
  218. @Test
  219. public void expand_and_collapse_listeners() {
  220. selectMenuPath("Component", "State", "Expand listener");
  221. selectMenuPath("Component", "State", "Collapse listener");
  222. assertFalse(logContainsText(
  223. "Item expanded (user originated: true): 0 | 0"));
  224. assertFalse(logContainsText(
  225. "Item collapsed (user originated: true): 0 | 0"));
  226. grid.expandWithClick(0);
  227. assertTrue(logContainsText(
  228. "Item expanded (user originated: true): 0 | 0"));
  229. assertFalse(logContainsText(
  230. "Item collapsed (user originated: true): 0 | 0"));
  231. grid.collapseWithClick(0);
  232. assertTrue(logContainsText(
  233. "Item expanded (user originated: true): 0 | 0"));
  234. assertTrue(logContainsText(
  235. "Item collapsed (user originated: true): 0 | 0"));
  236. selectMenuPath("Component", "Features", "Server-side expand",
  237. "Expand 0 | 0");
  238. assertTrue(logContainsText(
  239. "Item expanded (user originated: false): 0 | 0"));
  240. assertFalse(logContainsText(
  241. "Item collapsed (user originated: false): 0 | 0"));
  242. selectMenuPath("Component", "Features", "Server-side collapse",
  243. "Collapse 0 | 0");
  244. assertTrue(logContainsText(
  245. "Item expanded (user originated: false): 0 | 0"));
  246. assertTrue(logContainsText(
  247. "Item collapsed (user originated: false): 0 | 0"));
  248. selectMenuPath("Component", "State", "Expand listener");
  249. selectMenuPath("Component", "State", "Collapse listener");
  250. grid.expandWithClick(1);
  251. grid.collapseWithClick(1);
  252. assertFalse(logContainsText(
  253. "Item expanded (user originated: true): 0 | 1"));
  254. assertFalse(logContainsText(
  255. "Item collapsed (user originated: true): 0 | 1"));
  256. }
  257. @Test
  258. public void expanded_nodes_stay_expanded_when_parent_expand_state_is_toggled() {
  259. grid.expandWithClick(0);
  260. grid.expandWithClick(1);
  261. grid.collapseWithClick(0);
  262. grid.expandWithClick(0);
  263. assertCellTexts(0, 0, new String[] { "0 | 0", "1 | 0", "2 | 0", "2 | 1",
  264. "2 | 2", "1 | 1", "1 | 2", "0 | 1", "0 | 2" });
  265. assertEquals(9, grid.getRowCount());
  266. grid.expandWithClick(7);
  267. grid.expandWithClick(8);
  268. grid.collapseWithClick(7);
  269. grid.collapseWithClick(0);
  270. grid.expandWithClick(1);
  271. assertCellTexts(0, 0, new String[] { "0 | 0", "0 | 1", "1 | 0", "2 | 0",
  272. "2 | 1", "2 | 2", "1 | 1", "1 | 2", "0 | 2" });
  273. assertEquals(9, grid.getRowCount());
  274. }
  275. @Test
  276. public void change_renderer_of_hierarchy_column() {
  277. assertTrue("Cell style names should contain renderer name", grid
  278. .getCell(0, 0).getAttribute("class").contains("TextRenderer"));
  279. selectMenuPath("Component", "Features", "Hierarchy column renderer",
  280. "html");
  281. assertTrue("Cell style names should contain renderer name", grid
  282. .getCell(0, 0).getAttribute("class").contains("HtmlRenderer"));
  283. grid.expandWithClick(0);
  284. assertEquals("Not expanded", "1 | 0", grid.getCell(1, 0).getText());
  285. }
  286. @Test
  287. public void disable_enable_expand_collapse() {
  288. TreeGridElement treeGrid = $(TreeGridElement.class).first();
  289. selectMenuPath("Component", "State", "Enabled");
  290. assertTrue(treeGrid.hasClassName("v-disabled"));
  291. // ensure expanding doesn't work
  292. treeGrid.expandWithClick(0);
  293. assertCellTexts(1, 0, new String[] { "0 | 1" });
  294. selectMenuPath("Component", "State", "Enabled");
  295. assertFalse(treeGrid.hasClassName("v-disabled"));
  296. // ensure expanding and collapsing works again
  297. treeGrid.expandWithClick(0);
  298. assertCellTexts(1, 0, new String[] { "1 | 0" });
  299. treeGrid.collapseWithClick(0);
  300. assertCellTexts(1, 0, new String[] { "0 | 1" });
  301. // same test for server-side expanding and collapsing
  302. selectMenuPath("Component", "Features", "Server-side expand",
  303. "Expand 0 | 0");
  304. assertCellTexts(1, 0, new String[] { "1 | 0" });
  305. selectMenuPath("Component", "Features", "Server-side collapse",
  306. "Collapse 0 | 0");
  307. assertCellTexts(1, 0, new String[] { "0 | 1" });
  308. }
  309. private void assertCellTexts(int startRowIndex, int cellIndex,
  310. String[] cellTexts) {
  311. int index = startRowIndex;
  312. for (String cellText : cellTexts) {
  313. assertEquals(cellText,
  314. grid.getRow(index).getCell(cellIndex).getText());
  315. index++;
  316. }
  317. }
  318. }