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.

GridRowDraggerOneGridTest.java 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. package com.vaadin.tests.server.component.grid;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collection;
  5. import java.util.List;
  6. import java.util.concurrent.atomic.AtomicInteger;
  7. import java.util.stream.Stream;
  8. import org.junit.Assert;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11. import com.vaadin.data.provider.ListDataProvider;
  12. import com.vaadin.shared.ui.grid.DropLocation;
  13. import com.vaadin.ui.Grid;
  14. import com.vaadin.ui.components.grid.DropIndexCalculator;
  15. import com.vaadin.ui.components.grid.GridDropEvent;
  16. import com.vaadin.ui.components.grid.GridRowDragger;
  17. import com.vaadin.ui.components.grid.SourceDataProviderUpdater;
  18. public class GridRowDraggerOneGridTest {
  19. public class TestGridRowDragger extends GridRowDragger<String> {
  20. public TestGridRowDragger(Grid<String> grid) {
  21. super(grid);
  22. }
  23. @Override
  24. public void handleDrop(GridDropEvent<String> event) {
  25. super.handleDrop(event);
  26. }
  27. @Override
  28. public List<String> getDraggedItems() {
  29. return draggedItems;
  30. }
  31. }
  32. private Grid<String> source;
  33. private TestGridRowDragger dragger;
  34. private List<String> draggedItems;
  35. @Before
  36. public void setupListCase() {
  37. source = new Grid<>();
  38. source.addColumn(s -> s).setId("1");
  39. dragger = new TestGridRowDragger(source);
  40. }
  41. private void drop(String dropIndex, DropLocation dropLocation,
  42. String... items) {
  43. draggedItems = new ArrayList<>(Arrays.asList(items));
  44. dragger.handleDrop(new GridDropEvent<>(source, null, null, null,
  45. dropIndex, dropLocation, null));
  46. }
  47. private void verifyDataProvider(String... items) {
  48. Collection<String> list = ((ListDataProvider<String>) source
  49. .getDataProvider()).getItems();
  50. Assert.assertArrayEquals("Invalid items in target data provider", items,
  51. list.toArray());
  52. }
  53. private static void setCustomDataProvider(Grid<String> grid) {
  54. grid.setDataProvider((so, i, l) -> null, null);
  55. }
  56. private static void setCustomDataProvider(Grid<String> grid,
  57. String... items) {
  58. grid.setDataProvider((so, i, l) -> Stream.of(items), null);
  59. }
  60. @Test
  61. public void listDataProviders_basicOperation() {
  62. source.setItems("0", "1", "2");
  63. drop(null, null, "0");
  64. verifyDataProvider("1", "2", "0");
  65. drop("0", DropLocation.BELOW, "1");
  66. verifyDataProvider("2", "0", "1");
  67. drop("1", DropLocation.ABOVE, "2");
  68. verifyDataProvider("0", "2", "1");
  69. }
  70. @Test
  71. public void listDataProvider_dropAboveFirst() {
  72. source.setItems("0", "1");
  73. drop("0", DropLocation.ABOVE, "1");
  74. verifyDataProvider("1", "0");
  75. }
  76. @Test
  77. public void listDataProvider_customCalculator() {
  78. source.setItems("0", "1");
  79. AtomicInteger trigger = new AtomicInteger();
  80. dragger.setDropIndexCalculator(event -> {
  81. trigger.incrementAndGet();
  82. return 0;
  83. });
  84. drop("1", DropLocation.BELOW, "0");
  85. Assert.assertEquals("Custom calculator should be invoked", 1,
  86. trigger.get());
  87. verifyDataProvider("0", "1");
  88. }
  89. @Test
  90. public void listDataProvider_customCalculatorReturnsMax_droppedToEnd() {
  91. source.setItems("0", "1", "2");
  92. dragger.setDropIndexCalculator(event -> {
  93. return Integer.MAX_VALUE;
  94. });
  95. drop("1", DropLocation.ABOVE, "0");
  96. verifyDataProvider("1", "2", "0");
  97. }
  98. @Test
  99. public void listDataProvider_calledOnlyOnce() {
  100. final int[] times = new int[1];
  101. source.setItems("0", "1", "2");
  102. source.getDataProvider().addDataProviderListener(ev -> times[0]++);
  103. dragger.setDropIndexCalculator(event -> {
  104. return Integer.MAX_VALUE;
  105. });
  106. drop("1", DropLocation.ABOVE, "0");
  107. verifyDataProvider("1", "2", "0");
  108. Assert.assertArrayEquals("DataProvider should be invoked only once", new int[] { 1 }, times);
  109. }
  110. @Test
  111. public void noopSourceUpdater() {
  112. source.setItems("0", "1", "2");
  113. dragger.setSourceDataProviderUpdater(SourceDataProviderUpdater.NOOP);
  114. drop("2", DropLocation.ABOVE, "0", "1");
  115. verifyDataProvider("0", "1", "0", "1", "2");
  116. }
  117. @Test
  118. public void alwaysDropToEndCalculator() {
  119. source.setItems("0", "1", "2");
  120. dragger.setDropIndexCalculator(DropIndexCalculator.alwaysDropToEnd());
  121. drop("1", DropLocation.ABOVE, "0");
  122. verifyDataProvider("1", "2", "0");
  123. }
  124. @Test
  125. public void dropTwoFromEnd_beginning() {
  126. source.setItems("0", "1", "2", "3");
  127. drop("0", DropLocation.ABOVE, "2", "3");
  128. verifyDataProvider("2", "3", "0", "1");
  129. }
  130. @Test
  131. public void dropTwoFromEnd_middle() {
  132. source.setItems("0", "1", "2", "3");
  133. drop("1", DropLocation.ABOVE, "2", "3");
  134. verifyDataProvider("0", "2", "3", "1");
  135. }
  136. @Test
  137. public void dropTwoFromEnd_aboveOneThatIsDragged_doesntExplode() {
  138. source.setItems("0", "1", "2", "3");
  139. drop("2", DropLocation.ABOVE, "2", "3");
  140. verifyDataProvider("0", "1", "2", "3");
  141. }
  142. @Test
  143. public void dragAndAboveFirst_thatIsAlsoDragged_doesntExplode() {
  144. source.setItems("0", "1", "2", "3");
  145. drop("2", DropLocation.ABOVE, "2", "3");
  146. verifyDataProvider("0", "1", "2", "3");
  147. }
  148. @Test
  149. public void dropFromBeginning_afterOneDragged_doesntExplode() {
  150. source.setItems("0", "1", "2", "3", "4");
  151. drop("3", DropLocation.BELOW, "0", "1", "3");
  152. verifyDataProvider("2", "0", "1", "3", "4");
  153. }
  154. @Test
  155. public void dropMixedSet_onOneOfTheDragged_doesntExplode() {
  156. source.setItems("0", "1", "2", "3", "4");
  157. drop("2", DropLocation.BELOW, "0", "2", "4");
  158. verifyDataProvider("1", "0", "2", "4", "3");
  159. }
  160. @Test
  161. public void dropOnSortedGrid_byDefault_dropsToTheEnd() {
  162. Assert.assertFalse(
  163. "Default drops on sorted grid rows should not be allowed",
  164. dragger.getGridDropTarget().isDropAllowedOnRowsWhenSorted());
  165. source.setItems("0", "1", "2", "3", "4");
  166. drop("3", DropLocation.BELOW, "1");
  167. verifyDataProvider("0", "2", "3", "1", "4");
  168. source.sort("1");
  169. drop(null, DropLocation.EMPTY, "0");
  170. verifyDataProvider("2", "3", "1", "4", "0");
  171. }
  172. }