Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

GridSelectionTest.java 19KB

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