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.

GridColumnReorderTest.java 15KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. /*
  2. * Copyright 2000-2014 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.tests.components.grid.basicfeatures;
  17. import static org.junit.Assert.assertEquals;
  18. import static org.junit.Assert.assertTrue;
  19. import org.junit.Before;
  20. import org.junit.Test;
  21. import org.openqa.selenium.By;
  22. import org.openqa.selenium.WebElement;
  23. import org.openqa.selenium.interactions.Actions;
  24. import com.vaadin.testbench.elements.GridElement.GridCellElement;
  25. import com.vaadin.tests.annotations.TestCategory;
  26. /**
  27. *
  28. * @since
  29. * @author Vaadin Ltd
  30. */
  31. @TestCategory("grid")
  32. public class GridColumnReorderTest extends GridBasicClientFeaturesTest {
  33. @Before
  34. public void before() {
  35. openTestURL();
  36. }
  37. @Test
  38. public void columnReorderEventTriggered() {
  39. final int firstIndex = 3;
  40. final int secondIndex = 4;
  41. final String firstHeaderText = getGridElement().getHeaderCell(0,
  42. firstIndex).getText();
  43. final String secondHeaderText = getGridElement().getHeaderCell(0,
  44. secondIndex).getText();
  45. selectMenuPath("Component", "Internals", "Listeners",
  46. "Add ColumnReorder listener");
  47. selectMenuPath("Component", "Columns", "Column " + secondIndex,
  48. "Move column left");
  49. // columns 3 and 4 should have swapped to 4 and 3
  50. GridCellElement headerCell = getGridElement().getHeaderCell(0,
  51. firstIndex);
  52. assertEquals(secondHeaderText, headerCell.getText());
  53. headerCell = getGridElement().getHeaderCell(0, secondIndex);
  54. assertEquals(firstHeaderText, headerCell.getText());
  55. // the reorder event should have typed the order to this label
  56. WebElement columnReorderElement = findElement(By.id("columnreorder"));
  57. int eventIndex = Integer.parseInt(columnReorderElement
  58. .getAttribute("columns"));
  59. assertEquals(1, eventIndex);
  60. // trigger another event
  61. selectMenuPath("Component", "Columns", "Column " + secondIndex,
  62. "Move column left");
  63. columnReorderElement = findElement(By.id("columnreorder"));
  64. eventIndex = Integer.parseInt(columnReorderElement
  65. .getAttribute("columns"));
  66. assertEquals(2, eventIndex);
  67. }
  68. @Test
  69. public void testColumnReorder_onReorder_columnReorderEventTriggered() {
  70. final int firstIndex = 3;
  71. final int secondIndex = 4;
  72. final String firstHeaderText = getGridElement().getHeaderCell(0,
  73. firstIndex).getText();
  74. final String secondHeaderText = getGridElement().getHeaderCell(0,
  75. secondIndex).getText();
  76. selectMenuPath("Component", "Internals", "Listeners",
  77. "Add ColumnReorder listener");
  78. selectMenuPath("Component", "Columns", "Column " + secondIndex,
  79. "Move column left");
  80. // columns 3 and 4 should have swapped to 4 and 3
  81. GridCellElement headerCell = getGridElement().getHeaderCell(0,
  82. firstIndex);
  83. assertEquals(secondHeaderText, headerCell.getText());
  84. headerCell = getGridElement().getHeaderCell(0, secondIndex);
  85. assertEquals(firstHeaderText, headerCell.getText());
  86. // the reorder event should have typed the order to this label
  87. WebElement columnReorderElement = findElement(By.id("columnreorder"));
  88. int eventIndex = Integer.parseInt(columnReorderElement
  89. .getAttribute("columns"));
  90. assertEquals(1, eventIndex);
  91. // trigger another event
  92. selectMenuPath("Component", "Columns", "Column " + secondIndex,
  93. "Move column left");
  94. columnReorderElement = findElement(By.id("columnreorder"));
  95. eventIndex = Integer.parseInt(columnReorderElement
  96. .getAttribute("columns"));
  97. assertEquals(2, eventIndex);
  98. }
  99. @Test
  100. public void testColumnReorder_draggingSortedColumn_sortIndicatorShownOnDraggedElement() {
  101. // given
  102. toggleColumnReorder();
  103. toggleSortableColumn(0);
  104. sortColumn(0);
  105. // when
  106. startDragButDontDropOnDefaultColumnHeader(0);
  107. // then
  108. WebElement draggedElement = getDraggedHeaderElement();
  109. assertTrue(draggedElement.getAttribute("class").contains("sort"));
  110. }
  111. @Test
  112. public void testColumnReorder_draggingSortedColumn_sortStays() {
  113. // given
  114. toggleColumnReorder();
  115. toggleSortableColumn(0);
  116. sortColumn(0);
  117. // when
  118. dragAndDropDefaultColumnHeader(0, 2, 10);
  119. // then
  120. assertColumnIsSorted(1);
  121. }
  122. @Test
  123. public void testColumnReorder_draggingFocusedHeader_focusShownOnDraggedElement() {
  124. // given
  125. toggleColumnReorder();
  126. focusDefaultHeader(0);
  127. // when
  128. startDragButDontDropOnDefaultColumnHeader(0);
  129. // then
  130. WebElement draggedElement = getDraggedHeaderElement();
  131. assertTrue(draggedElement.getAttribute("class").contains("focused"));
  132. }
  133. @Test
  134. public void testColumnReorder_draggingFocusedHeader_focusIsKeptOnHeader() {
  135. // given
  136. toggleColumnReorder();
  137. focusDefaultHeader(0);
  138. // when
  139. dragAndDropDefaultColumnHeader(0, 3, 10);
  140. // then
  141. WebElement defaultColumnHeader = getDefaultColumnHeader(2);
  142. String attribute = defaultColumnHeader.getAttribute("class");
  143. assertTrue(attribute.contains("focused"));
  144. }
  145. @Test
  146. public void testColumnReorder_draggingFocusedCellColumn_focusIsKeptOnCell() {
  147. // given
  148. toggleColumnReorder();
  149. focusCell(2, 2);
  150. // when
  151. dragAndDropDefaultColumnHeader(2, 0, 10);
  152. // then
  153. assertFocusedCell(2, 0);
  154. }
  155. @Test
  156. public void testColumnReorder_dragColumnFromRightToLeftOfFocusedCellColumn_focusIsKept() {
  157. // given
  158. toggleColumnReorder();
  159. focusCell(1, 3);
  160. // when
  161. dragAndDropDefaultColumnHeader(4, 1, 10);
  162. // then
  163. assertFocusedCell(1, 4);
  164. }
  165. @Test
  166. public void testColumnReorder_dragColumnFromLeftToRightOfFocusedCellColumn_focusIsKept() {
  167. // given
  168. toggleColumnReorder();
  169. focusCell(4, 2);
  170. // when
  171. dragAndDropDefaultColumnHeader(0, 4, 10);
  172. // then
  173. assertFocusedCell(4, 1);
  174. }
  175. @Test
  176. public void testColumnReorder_draggingHeaderRowThatHasColumnHeadersSpanned_cantDropInsideSpannedHeaderFromOutside() {
  177. // given
  178. toggleColumnReorder();
  179. selectMenuPath("Component", "Header", "Append row");
  180. selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
  181. assertColumnHeaderOrder(0, 1, 2, 3, 4);
  182. // when
  183. dragAndDropColumnHeader(1, 3, 1, 80);
  184. // then
  185. assertColumnHeaderOrder(0, 3, 1, 2, 4);
  186. }
  187. @Test
  188. public void testColumnReorder_anotherRowHasColumnHeadersSpanned_cantDropInsideSpannedHeaderFromOutside() {
  189. // given
  190. toggleColumnReorder();
  191. selectMenuPath("Component", "Header", "Append row");
  192. selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
  193. assertColumnHeaderOrder(0, 1, 2, 3, 4);
  194. // when
  195. dragAndDropColumnHeader(0, 0, 2, 20);
  196. // then
  197. assertColumnHeaderOrder(1, 2, 0, 3, 4);
  198. }
  199. @Test
  200. public void testColumnReorder_cellInsideSpannedHeader_cantBeDroppedOutsideSpannedArea() {
  201. // given
  202. toggleColumnReorder();
  203. selectMenuPath("Component", "Header", "Append row");
  204. selectMenuPath("Component", "Header", "Row 2", "Join columns 1, 2");
  205. assertColumnHeaderOrder(0, 1, 2, 3, 4);
  206. // when
  207. dragAndDropColumnHeader(0, 2, 0, 20);
  208. // then
  209. assertColumnHeaderOrder(0, 2, 1, 3, 4);
  210. }
  211. @Test
  212. public void testColumnReorder_cellInsideTwoCrossingSpanningHeaders_cantTouchThis() {
  213. // given
  214. toggleColumnReorder();
  215. selectMenuPath("Component", "Header", "Append row");
  216. selectMenuPath("Component", "Header", "Append row");
  217. selectMenuPath("Component", "Header", "Row 2", "Join column cells 0, 1");
  218. selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
  219. dragAndDropColumnHeader(0, 3, 0, 10);
  220. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  221. // when
  222. dragAndDropColumnHeader(0, 2, 0, 10);
  223. // then
  224. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  225. }
  226. @Test
  227. public void testColumnReorder_cellsInsideSpannedHeaderAndBlockedByOtherSpannedCells_cantTouchThose() {
  228. // given
  229. toggleColumnReorder();
  230. selectMenuPath("Component", "Header", "Append row");
  231. selectMenuPath("Component", "Header", "Append row");
  232. selectMenuPath("Component", "Header", "Row 2", "Join column cells 0, 1");
  233. selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
  234. dragAndDropColumnHeader(0, 3, 0, 10);
  235. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  236. // when then
  237. dragAndDropColumnHeader(0, 1, 3, 10);
  238. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  239. dragAndDropColumnHeader(1, 2, 1, 10);
  240. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  241. dragAndDropColumnHeader(2, 1, 3, -10);
  242. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  243. }
  244. @Test
  245. public void testColumnReorder_cellsInsideSpannedHeaderAndBlockedByOtherSpannedCells_reorderingLimited() {
  246. // given
  247. toggleColumnReorder();
  248. selectMenuPath("Component", "Header", "Append row");
  249. selectMenuPath("Component", "Header", "Append row");
  250. selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
  251. dragAndDropColumnHeader(0, 0, 4, 100);
  252. selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
  253. scrollGridHorizontallyTo(0);
  254. assertColumnHeaderOrder(1, 2, 3, 4, 5);
  255. // when then
  256. dragAndDropColumnHeader(0, 1, 4, 10);
  257. scrollGridHorizontallyTo(0);
  258. assertColumnHeaderOrder(1, 2, 3, 4, 5);
  259. dragAndDropColumnHeader(0, 2, 4, 10);
  260. scrollGridHorizontallyTo(0);
  261. assertColumnHeaderOrder(1, 2, 3, 4, 5);
  262. dragAndDropColumnHeader(0, 3, 4, 80);
  263. scrollGridHorizontallyTo(0);
  264. assertColumnHeaderOrder(1, 2, 3, 5, 4);
  265. dragAndDropColumnHeader(0, 4, 2, 100);
  266. scrollGridHorizontallyTo(0);
  267. assertColumnHeaderOrder(1, 2, 3, 4, 5);
  268. dragAndDropColumnHeader(2, 3, 4, 80);
  269. scrollGridHorizontallyTo(0);
  270. assertColumnHeaderOrder(1, 2, 3, 5, 4);
  271. dragAndDropColumnHeader(2, 4, 2, 100);
  272. scrollGridHorizontallyTo(0);
  273. assertColumnHeaderOrder(1, 2, 3, 4, 5);
  274. }
  275. @Test
  276. public void testColumnReorder_cellsInsideTwoAdjacentSpannedHeaders_reorderingLimited() {
  277. // given
  278. toggleColumnReorder();
  279. selectMenuPath("Component", "Header", "Append row");
  280. selectMenuPath("Component", "Header", "Append row");
  281. selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
  282. dragAndDropColumnHeader(0, 0, 4, 100);
  283. scrollGridHorizontallyTo(0);
  284. dragAndDropColumnHeader(0, 1, 4, 80);
  285. scrollGridHorizontallyTo(0);
  286. selectMenuPath("Component", "Header", "Row 3", "Join columns 1, 2");
  287. assertColumnHeaderOrder(1, 3, 4, 5, 2);
  288. // when then
  289. dragAndDropColumnHeader(0, 1, 3, 80);
  290. assertColumnHeaderOrder(1, 4, 3, 5, 2);
  291. dragAndDropColumnHeader(0, 2, 4, 10);
  292. assertColumnHeaderOrder(1, 4, 3, 5, 2);
  293. dragAndDropColumnHeader(0, 2, 0, 10);
  294. assertColumnHeaderOrder(1, 3, 4, 5, 2);
  295. }
  296. @Test
  297. public void testColumnReorder_footerHasSpannedCells_cantDropInside() {
  298. // given
  299. toggleColumnReorder();
  300. selectMenuPath("Component", "Footer", "Append row");
  301. selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
  302. assertColumnHeaderOrder(0, 1, 2, 3, 4);
  303. // when
  304. dragAndDropColumnHeader(0, 3, 1, 80);
  305. // then
  306. assertColumnHeaderOrder(0, 3, 1, 2, 4);
  307. }
  308. @Test
  309. public void testColumnReorder_cellInsideASpannedFooter_cantBeDroppedOutsideSpannedArea() {
  310. // given
  311. toggleColumnReorder();
  312. selectMenuPath("Component", "Footer", "Append row");
  313. selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
  314. assertColumnHeaderOrder(0, 1, 2, 3, 4);
  315. // when
  316. dragAndDropColumnHeader(0, 2, 0, 20);
  317. // then
  318. assertColumnHeaderOrder(0, 2, 1, 3, 4);
  319. }
  320. @Test
  321. public void testColumnReorder_cellInsideTwoCrossingSpanningFooters_cantTouchThis() {
  322. // given
  323. toggleColumnReorder();
  324. selectMenuPath("Component", "Footer", "Append row");
  325. selectMenuPath("Component", "Footer", "Append row");
  326. selectMenuPath("Component", "Footer", "Row 1", "Join column cells 0, 1");
  327. selectMenuPath("Component", "Footer", "Row 2", "Join columns 1, 2");
  328. dragAndDropColumnHeader(0, 3, 0, 10);
  329. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  330. // when
  331. dragAndDropColumnHeader(0, 2, 0, 10);
  332. // then
  333. assertColumnHeaderOrder(3, 0, 1, 2, 4);
  334. }
  335. @Test
  336. public void testColumnReorder_cellsInsideTwoAdjacentSpannedHeaderAndFooter_reorderingLimited() {
  337. // given
  338. toggleColumnReorder();
  339. selectMenuPath("Component", "Header", "Append row");
  340. selectMenuPath("Component", "Footer", "Append row");
  341. selectMenuPath("Component", "Header", "Row 2", "Join columns 3, 4, 5");
  342. dragAndDropColumnHeader(0, 0, 4, 80);
  343. scrollGridHorizontallyTo(0);
  344. dragAndDropColumnHeader(0, 1, 4, 80);
  345. scrollGridHorizontallyTo(0);
  346. selectMenuPath("Component", "Footer", "Row 1", "Join columns 1, 2");
  347. assertColumnHeaderOrder(1, 3, 4, 5, 2);
  348. // when then
  349. dragAndDropColumnHeader(0, 1, 3, 80);
  350. assertColumnHeaderOrder(1, 4, 3, 5, 2);
  351. dragAndDropColumnHeader(0, 2, 4, 10);
  352. assertColumnHeaderOrder(1, 4, 3, 5, 2);
  353. dragAndDropColumnHeader(0, 2, 0, 10);
  354. assertColumnHeaderOrder(1, 3, 4, 5, 2);
  355. }
  356. private void toggleColumnReorder() {
  357. selectMenuPath("Component", "State", "Column Reordering");
  358. }
  359. private void toggleSortableColumn(int index) {
  360. selectMenuPath("Component", "Columns", "Column " + index, "Sortable");
  361. }
  362. private void startDragButDontDropOnDefaultColumnHeader(int index) {
  363. new Actions(getDriver())
  364. .clickAndHold(getGridHeaderRowCells().get(index))
  365. .moveByOffset(100, 0).perform();
  366. }
  367. private void sortColumn(int index) {
  368. getGridHeaderRowCells().get(index).click();
  369. }
  370. private void focusDefaultHeader(int index) {
  371. getGridHeaderRowCells().get(index).click();
  372. }
  373. private WebElement getDraggedHeaderElement() {
  374. return findElement(By.className("dragged-column-header"));
  375. }
  376. }