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.

GridSelectionTest.java 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. package com.vaadin.tests.components.grid;
  2. import static org.junit.Assert.assertFalse;
  3. import static org.junit.Assert.assertTrue;
  4. import java.util.Arrays;
  5. import java.util.HashSet;
  6. import org.junit.Ignore;
  7. import org.junit.Test;
  8. import org.openqa.selenium.Keys;
  9. import org.openqa.selenium.WebDriver;
  10. import org.openqa.selenium.WebElement;
  11. import org.openqa.selenium.interactions.Actions;
  12. import org.openqa.selenium.support.ui.ExpectedCondition;
  13. import com.vaadin.testbench.By;
  14. import com.vaadin.testbench.elements.GridElement;
  15. import com.vaadin.testbench.elements.GridElement.GridCellElement;
  16. import com.vaadin.testbench.elements.GridElement.GridRowElement;
  17. import com.vaadin.tests.components.grid.basics.GridBasicsTest;
  18. public class GridSelectionTest extends GridBasicsTest {
  19. @Test
  20. public void testSelectOnOff() throws Exception {
  21. openTestURL();
  22. setSelectionModelMulti();
  23. assertFalse("row shouldn't start out as selected",
  24. getRow(0).isSelected());
  25. toggleFirstRowSelection();
  26. assertTrue("row should become selected", getRow(0).isSelected());
  27. toggleFirstRowSelection();
  28. assertFalse("row shouldn't remain selected", getRow(0).isSelected());
  29. toggleFirstRowSelection();
  30. assertTrue("row should become selected", getRow(0).isSelected());
  31. getGridElement().getCell(0, 0).click();
  32. assertFalse("row shouldn't remain selected", getRow(0).isSelected());
  33. }
  34. @Test
  35. public void testSelectOnScrollOffScroll() throws Exception {
  36. openTestURL();
  37. setSelectionModelMulti();
  38. assertFalse("row shouldn't start out as selected",
  39. getRow(0).isSelected());
  40. toggleFirstRowSelection();
  41. assertTrue("row should become selected", getRow(0).isSelected());
  42. scrollGridVerticallyTo(10000); // make sure the row is out of cache
  43. scrollGridVerticallyTo(0); // scroll it back into view
  44. assertTrue("row should still be selected when scrolling "
  45. + "back into view", getRow(0).isSelected());
  46. }
  47. @Test
  48. public void testSelectScrollOnScrollOff() throws Exception {
  49. openTestURL();
  50. setSelectionModelMulti();
  51. assertFalse("row shouldn't start out as selected",
  52. getRow(0).isSelected());
  53. scrollGridVerticallyTo(10000); // make sure the row is out of cache
  54. toggleFirstRowSelection();
  55. scrollGridVerticallyTo(0); // scroll it back into view
  56. assertTrue("row should still be selected when scrolling "
  57. + "back into view", getRow(0).isSelected());
  58. toggleFirstRowSelection();
  59. assertFalse("row shouldn't remain selected", getRow(0).isSelected());
  60. }
  61. @Test
  62. public void testSelectScrollOnOffScroll() throws Exception {
  63. openTestURL();
  64. setSelectionModelMulti();
  65. assertFalse("row shouldn't start out as selected",
  66. getRow(0).isSelected());
  67. toggleFirstRowSelection();
  68. assertTrue("row should be selected", getRow(0).isSelected());
  69. scrollGridVerticallyTo(10000); // make sure the row is out of cache
  70. toggleFirstRowSelection();
  71. scrollGridVerticallyTo(0);
  72. assertFalse(
  73. "row shouldn't be selected when scrolling " + "back into view",
  74. getRow(0).isSelected());
  75. }
  76. @Test
  77. public void testSingleSelectionUpdatesFromServer() {
  78. openTestURL();
  79. setSelectionModelSingle();
  80. GridElement grid = getGridElement();
  81. assertFalse("First row was selected from start",
  82. grid.getRow(0).isSelected());
  83. toggleFirstRowSelection();
  84. assertTrue("First row was not selected.", getRow(0).isSelected());
  85. assertTrue("Selection event was not correct", logContainsText(
  86. "SingleSelectionEvent: Selected: DataObject[0]"));
  87. grid.getCell(0, 0).click();
  88. assertFalse("First row was not deselected.", getRow(0).isSelected());
  89. assertTrue("Deselection event was not correct",
  90. logContainsText("SingleSelectionEvent: Selected: none"));
  91. grid.getCell(5, 0).click();
  92. assertTrue("Fifth row was not selected.", getRow(5).isSelected());
  93. assertFalse("First row was still selected.", getRow(0).isSelected());
  94. assertTrue("Selection event was not correct", logContainsText(
  95. "SingleSelectionEvent: Selected: DataObject[5]"));
  96. grid.getCell(0, 6).click();
  97. assertTrue("Selection event was not correct", logContainsText(
  98. "SingleSelectionEvent: Selected: DataObject[0]"));
  99. toggleFirstRowSelection();
  100. assertTrue("Selection event was not correct",
  101. logContainsText("SingleSelectionEvent: Selected: none"));
  102. assertFalse("First row was still selected.", getRow(0).isSelected());
  103. assertFalse("Fifth row was still selected.", getRow(5).isSelected());
  104. grid.scrollToRow(600);
  105. grid.getCell(595, 4).click();
  106. assertTrue("Row 595 was not selected.", getRow(595).isSelected());
  107. assertTrue("Selection event was not correct", logContainsText(
  108. "SingleSelectionEvent: Selected: DataObject[595]"));
  109. toggleFirstRowSelection();
  110. assertFalse("Row 595 was still selected.", getRow(595).isSelected());
  111. assertTrue("First row was not selected.", getRow(0).isSelected());
  112. assertTrue("Selection event was not correct", logContainsText(
  113. "SingleSelectionEvent: Selected: DataObject[0]"));
  114. }
  115. @Test
  116. public void testKeyboardWithMultiSelection() {
  117. openTestURL();
  118. setSelectionModelMulti();
  119. GridElement grid = getGridElement();
  120. grid.getCell(3, 1).click();
  121. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  122. assertTrue("Grid row 3 was not selected with space key.",
  123. grid.getRow(3).isSelected());
  124. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  125. assertTrue("Grid row 3 was not deselected with space key.",
  126. !grid.getRow(3).isSelected());
  127. grid.scrollToRow(500);
  128. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  129. assertTrue("Grid row 3 was not selected with space key.",
  130. grid.getRow(3).isSelected());
  131. }
  132. @Test
  133. public void testKeyboardWithSingleSelection() {
  134. openTestURL();
  135. setSelectionModelSingle();
  136. GridElement grid = getGridElement();
  137. grid.getCell(3, 1).click();
  138. assertTrue("Grid row 3 was not selected with clicking.",
  139. grid.getRow(3).isSelected());
  140. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  141. assertTrue("Grid row 3 was not deselected with space key.",
  142. !grid.getRow(3).isSelected());
  143. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  144. assertTrue("Grid row 3 was not selected with space key.",
  145. grid.getRow(3).isSelected());
  146. grid.scrollToRow(500);
  147. new Actions(getDriver()).sendKeys(Keys.SPACE).perform();
  148. assertTrue("Grid row 3 was not deselected with space key.",
  149. !grid.getRow(3).isSelected());
  150. }
  151. @Test
  152. public void testChangeSelectionModelUpdatesUI() {
  153. openTestURL();
  154. setSelectionModelMulti();
  155. getGridElement().getCell(5, 0).click();
  156. assertTrue("Row should be selected after clicking",
  157. getRow(5).isSelected());
  158. setSelectionModelSingle();
  159. assertFalse("Row should not be selected after changing selection model",
  160. getRow(5).isSelected());
  161. }
  162. @Test
  163. public void testSelectionCheckBoxesHaveStyleNames() {
  164. openTestURL();
  165. setSelectionModelMulti();
  166. assertTrue(
  167. "Selection column CheckBox should have the proper style name set",
  168. getGridElement().getCell(0, 0).findElement(By.tagName("span"))
  169. .getAttribute("class")
  170. .contains("v-grid-selection-checkbox"));
  171. GridCellElement header = getGridElement().getHeaderCell(0, 0);
  172. assertTrue("Select all CheckBox should have the proper style name set",
  173. header.findElement(By.tagName("span")).getAttribute("class")
  174. .contains("v-grid-select-all-checkbox"));
  175. }
  176. @Test
  177. public void testServerSideSelectTogglesSelectAllCheckBox() {
  178. openTestURL();
  179. setSelectionModelMulti();
  180. assertFalse("Select all CheckBox should not be selected",
  181. getSelectAllCheckbox().isSelected());
  182. selectAll();
  183. waitUntilCheckBoxValue(getSelectAllCheckbox(), true);
  184. assertTrue("Select all CheckBox wasn't selected as expected",
  185. getSelectAllCheckbox().isSelected());
  186. deselectAll();
  187. waitUntilCheckBoxValue(getSelectAllCheckbox(), false);
  188. assertFalse("Select all CheckBox was selected unexpectedly",
  189. getSelectAllCheckbox().isSelected());
  190. selectAll();
  191. waitUntilCheckBoxValue(getSelectAllCheckbox(), true);
  192. getGridElement().getCell(5, 0).click();
  193. waitUntilCheckBoxValue(getSelectAllCheckbox(), false);
  194. assertFalse("Select all CheckBox was selected unexpectedly",
  195. getSelectAllCheckbox().isSelected());
  196. }
  197. @Test
  198. public void testRemoveSelectedRow() {
  199. openTestURL();
  200. setSelectionModelSingle();
  201. getGridElement().getCell(0, 0).click();
  202. selectMenuPath("Component", "Body rows", "Deselect all");
  203. assertFalse(
  204. "Unexpected NullPointerException when removing selected rows",
  205. logContainsText(
  206. "Exception occurred, java.lang.NullPointerException: null"));
  207. }
  208. @Test
  209. public void singleSelectUserSelectionDisallowedSpaceSelectionNoOp() {
  210. openTestURL();
  211. setSelectionModelSingle();
  212. getGridElement().focus();
  213. getGridElement().sendKeys(Keys.DOWN, Keys.SPACE);
  214. assertTrue("row was selected when selection was allowed",
  215. getRow(1).isSelected());
  216. toggleUserSelectionAllowed();
  217. getGridElement().sendKeys(Keys.SPACE);
  218. assertTrue("deselect disallowed", getRow(1).isSelected());
  219. getGridElement().sendKeys(Keys.DOWN, Keys.SPACE);
  220. assertFalse("select disallowed", getRow(2).isSelected());
  221. assertTrue("old selection remains", getRow(1).isSelected());
  222. toggleUserSelectionAllowed();
  223. getGridElement().sendKeys(Keys.SPACE);
  224. assertTrue("select allowed again", getRow(2).isSelected());
  225. assertFalse("old selection removed", getRow(1).isSelected());
  226. }
  227. @Test
  228. public void singleSelectUserSelectionDisallowedClickSelectionNoOp() {
  229. openTestURL();
  230. setSelectionModelSingle();
  231. getGridElement().getCell(1, 0).click();
  232. assertTrue("selection allowed, should have been selected",
  233. getRow(1).isSelected());
  234. toggleUserSelectionAllowed();
  235. getGridElement().getCell(1, 0).click();
  236. assertTrue("deselect disallowed, should remain selected",
  237. getRow(1).isSelected());
  238. getGridElement().getCell(2, 0).click();
  239. assertFalse("select disallowed, should not have been selected",
  240. getRow(2).isSelected());
  241. assertTrue("select disallowed, old selection should have remained",
  242. getRow(1).isSelected());
  243. toggleUserSelectionAllowed();
  244. getGridElement().getCell(2, 0).click();
  245. assertTrue("select allowed again, row should have been selected",
  246. getRow(2).isSelected());
  247. assertFalse("old selection removed", getRow(1).isSelected());
  248. }
  249. @Test
  250. public void multiSelectUserSelectionDisallowedSpaceSelectionNoOp() {
  251. openTestURL();
  252. setSelectionModelMulti();
  253. getGridElement().focus();
  254. getGridElement().sendKeys(Keys.DOWN, Keys.SPACE);
  255. assertTrue("selection allowed, should have been selected",
  256. getRow(1).isSelected());
  257. toggleUserSelectionAllowed();
  258. getGridElement().sendKeys(Keys.SPACE);
  259. assertTrue("deselect disallowed, should remain selected",
  260. getRow(1).isSelected());
  261. getGridElement().sendKeys(Keys.DOWN, Keys.SPACE);
  262. assertFalse("select disallowed, should not have been selected",
  263. getRow(2).isSelected());
  264. assertTrue("select disallowed, old selection should have remained",
  265. getRow(1).isSelected());
  266. toggleUserSelectionAllowed();
  267. getGridElement().sendKeys(Keys.SPACE);
  268. assertTrue("select allowed again, row should have been selected",
  269. getRow(2).isSelected());
  270. assertTrue(
  271. "select allowed again but old selection should have remained",
  272. getRow(1).isSelected());
  273. }
  274. @Test
  275. public void multiSelectUserSelectionDisallowedCheckboxSelectionNoOp() {
  276. openTestURL();
  277. setSelectionModelMulti();
  278. assertTrue(getSelectionCheckbox(0).isEnabled());
  279. toggleUserSelectionAllowed();
  280. assertFalse(getSelectionCheckbox(0).isEnabled());
  281. // Select by clicking on checkbox (should always fail as it is disabled)
  282. getSelectionCheckbox(0).click();
  283. assertFalse(getGridElement().getRow(0).isSelected());
  284. // Select by clicking on cell (should fail)
  285. getGridElement().getCell(0, 0).click();
  286. assertFalse(getGridElement().getRow(0).isSelected());
  287. toggleUserSelectionAllowed();
  288. assertTrue(getSelectionCheckbox(0).isEnabled());
  289. getSelectionCheckbox(0).click();
  290. assertTrue(getGridElement().getRow(0).isSelected());
  291. }
  292. @Test
  293. public void multiSelectUserSelectionDisallowedCheckboxSelectAllNoOp() {
  294. openTestURL();
  295. setSelectionModelMulti();
  296. assertTrue(getSelectAllCheckbox().isEnabled());
  297. toggleUserSelectionAllowed();
  298. assertFalse(getSelectAllCheckbox().isEnabled());
  299. // Select all by clicking on checkbox (should not select)
  300. getSelectAllCheckbox().click();
  301. assertFalse(getSelectAllCheckbox().isSelected());
  302. assertFalse(getGridElement().getRow(0).isSelected());
  303. assertFalse(getGridElement().getRow(10).isSelected());
  304. // Select all by clicking on header cell (should not select)
  305. getGridElement().getHeaderCell(0, 0).click();
  306. assertFalse(getSelectAllCheckbox().isSelected());
  307. assertFalse(getGridElement().getRow(0).isSelected());
  308. assertFalse(getGridElement().getRow(10).isSelected());
  309. // Select all by press SPACE on the header cell (should not select)
  310. getGridElement().getHeaderCell(0, 0).sendKeys(Keys.SPACE);
  311. assertFalse(getSelectAllCheckbox().isSelected());
  312. assertFalse(getGridElement().getRow(0).isSelected());
  313. assertFalse(getGridElement().getRow(10).isSelected());
  314. toggleUserSelectionAllowed();
  315. assertTrue(getSelectAllCheckbox().isEnabled());
  316. getSelectAllCheckbox().click();
  317. assertTrue(getGridElement().getRow(0).isSelected());
  318. assertTrue(getGridElement().getRow(10).isSelected());
  319. }
  320. @Test
  321. public void singleSelectUserSelectionDisallowedServerSelect() {
  322. openTestURL();
  323. setSelectionModelSingle();
  324. toggleUserSelectionAllowed();
  325. toggleFirstRowSelection();
  326. assertTrue(getGridElement().getRow(0).isSelected());
  327. }
  328. @Test
  329. public void multiSelectUserSelectionDisallowedServerSelect() {
  330. openTestURL();
  331. setSelectionModelMulti();
  332. toggleUserSelectionAllowed();
  333. toggleFirstRowSelection();
  334. assertTrue(getGridElement().getRow(0).isSelected());
  335. }
  336. @Test
  337. @Ignore("Removing rows is not implemented in the UI")
  338. public void testRemoveSelectedRowMulti() {
  339. openTestURL();
  340. setSelectionModelMulti();
  341. GridElement grid = getGridElement();
  342. grid.getCell(5, 0).click();
  343. selectMenuPath("Component", "Body rows", "Remove selected rows");
  344. assertSelected();
  345. grid.getCell(5, 0).click();
  346. assertSelected(5);
  347. grid.getCell(6, 0).click();
  348. assertSelected(5, 6);
  349. grid.getCell(5, 0).click();
  350. assertSelected(6);
  351. grid.getCell(5, 0).click();
  352. grid.getCell(4, 0).click();
  353. selectMenuPath("Component", "Body rows", "Remove selected rows");
  354. assertSelected();
  355. grid.getCell(0, 0).click();
  356. assertSelected(0);
  357. grid.getCell(5, 0).click();
  358. assertSelected(0, 5);
  359. grid.getCell(6, 0).click();
  360. assertSelected(0, 5, 6);
  361. }
  362. private void assertSelected(Integer... selected) {
  363. GridElement grid = getGridElement();
  364. HashSet<Integer> expected = new HashSet<Integer>(
  365. Arrays.asList(selected));
  366. for (int i = 0; i < 10; i++) {
  367. boolean rowSelected = grid.getRow(i).isSelected();
  368. if (expected.contains(i)) {
  369. assertTrue("Expected row " + i + " to be selected",
  370. rowSelected);
  371. } else {
  372. assertFalse("Expected row " + i + " not to be selected",
  373. rowSelected);
  374. }
  375. }
  376. }
  377. private void toggleUserSelectionAllowed() {
  378. selectMenuPath("Component", "State", "Disallow user selection");
  379. }
  380. private WebElement getSelectionCheckbox(int row) {
  381. return getGridElement().getCell(row, 0)
  382. .findElement(By.tagName("input"));
  383. }
  384. private void waitUntilCheckBoxValue(final WebElement checkBoxElememnt,
  385. final boolean expectedValue) {
  386. waitUntil(new ExpectedCondition<Boolean>() {
  387. @Override
  388. public Boolean apply(WebDriver input) {
  389. return expectedValue ? checkBoxElememnt.isSelected()
  390. : !checkBoxElememnt.isSelected();
  391. }
  392. }, 5);
  393. }
  394. private GridRowElement getRow(int i) {
  395. return getGridElement().getRow(i);
  396. }
  397. }