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.

GridRowDraggerTwoGridsTest.java 8.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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 GridRowDraggerTwoGridsTest {
  19. public class TestGridRowDragger extends GridRowDragger<String> {
  20. public TestGridRowDragger(Grid<String> source, Grid<String> target) {
  21. super(source, target);
  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 Grid<String> target;
  34. private TestGridRowDragger dragger;
  35. private List<String> draggedItems;
  36. @Before
  37. public void setupListCase() {
  38. source = new Grid<>();
  39. target = new Grid<>();
  40. target.addColumn(s -> s).setId("1");
  41. dragger = new TestGridRowDragger(source, target);
  42. target.setItems(); // setup to use list data provider
  43. }
  44. private void drop(String dropIndex, DropLocation dropLocation,
  45. String... items) {
  46. draggedItems = new ArrayList<>(Arrays.asList(items));
  47. dragger.handleDrop(new GridDropEvent<>(target, null, null, null,
  48. dropIndex, dropLocation, null));
  49. }
  50. private void verifySourceDataProvider(String... items) {
  51. Collection<String> list = ((ListDataProvider<String>) source
  52. .getDataProvider()).getItems();
  53. Assert.assertArrayEquals("Invalid items in source data provider", items,
  54. list.toArray());
  55. }
  56. private void verifyTargetDataProvider(String... items) {
  57. Collection<String> list = ((ListDataProvider<String>) target
  58. .getDataProvider()).getItems();
  59. Assert.assertArrayEquals("Invalid items in target data provider", items,
  60. list.toArray());
  61. }
  62. private static void setCustomDataProvider(Grid<String> grid) {
  63. grid.setDataProvider((so, i, l) -> null, null);
  64. }
  65. private static void setCustomDataProvider(Grid<String> grid,
  66. String... items) {
  67. grid.setDataProvider((so, i, l) -> Stream.of(items), null);
  68. }
  69. @Test
  70. public void listDataProviders_basicOperation() {
  71. source.setItems("0", "1", "2");
  72. drop(null, null, "0");
  73. verifySourceDataProvider("1", "2");
  74. verifyTargetDataProvider("0");
  75. drop("0", DropLocation.BELOW, "1");
  76. verifySourceDataProvider("2");
  77. verifyTargetDataProvider("0", "1");
  78. drop("1", DropLocation.ABOVE, "2");
  79. verifySourceDataProvider();
  80. verifyTargetDataProvider("0", "2", "1");
  81. }
  82. @Test
  83. public void listDataProvider_dropAboveFirst() {
  84. source.setItems("0");
  85. target.setItems("1");
  86. drop("1", DropLocation.ABOVE, "0");
  87. verifySourceDataProvider();
  88. verifyTargetDataProvider("0", "1");
  89. }
  90. @Test
  91. public void listDataProvider_customCalculator() {
  92. source.setItems("0");
  93. target.setItems("1");
  94. AtomicInteger trigger = new AtomicInteger();
  95. dragger.setDropIndexCalculator(event -> {
  96. trigger.incrementAndGet();
  97. return 0;
  98. });
  99. drop("1", DropLocation.BELOW, "0");
  100. Assert.assertEquals("Custom calculator should be invoked", 1,
  101. trigger.get());
  102. verifySourceDataProvider();
  103. verifyTargetDataProvider("0", "1");
  104. }
  105. @Test
  106. public void listDataProvider_customCalculatorReturnsMax_droppedToEnd() {
  107. source.setItems("0");
  108. target.setItems("1", "2");
  109. dragger.setDropIndexCalculator(event -> {
  110. return Integer.MAX_VALUE;
  111. });
  112. drop("1", DropLocation.ABOVE, "0");
  113. verifySourceDataProvider();
  114. verifyTargetDataProvider("1", "2", "0");
  115. }
  116. @Test
  117. public void customSourceDataProvider_isInvoked() {
  118. setCustomDataProvider(source, "0", "1");
  119. target.setItems("2");
  120. AtomicInteger updaterTrigger = new AtomicInteger();
  121. List<String> droppedItems = new ArrayList<>();
  122. dragger.setSourceDataProviderUpdater((event, dp, items) -> {
  123. updaterTrigger.incrementAndGet();
  124. droppedItems.addAll(items);
  125. });
  126. drop("2", DropLocation.BELOW, "0", "1");
  127. Assert.assertEquals("source updater not triggered", 1,
  128. updaterTrigger.get());
  129. Assert.assertArrayEquals(droppedItems.toArray(),
  130. new Object[] { "0", "1" });
  131. verifyTargetDataProvider("2", "0", "1");
  132. }
  133. @Test
  134. public void noopSourceUpdater() {
  135. source.setItems("0", "1");
  136. target.setItems("2");
  137. dragger.setSourceDataProviderUpdater(SourceDataProviderUpdater.NOOP);
  138. drop("2", DropLocation.ABOVE, "0", "1");
  139. verifySourceDataProvider("0", "1");
  140. verifyTargetDataProvider("0", "1", "2");
  141. }
  142. @Test
  143. public void alwaysDropToEndCalculator() {
  144. source.setItems("0");
  145. target.setItems("1", "2");
  146. dragger.setDropIndexCalculator(DropIndexCalculator.alwaysDropToEnd());
  147. drop("1", DropLocation.ABOVE, "0");
  148. verifySourceDataProvider();
  149. verifyTargetDataProvider("1", "2", "0");
  150. }
  151. @Test(expected = UnsupportedOperationException.class)
  152. public void customSourceDataProvider_noCustomSourceUpdater_unsupportedOperationExceptionThrown() {
  153. setCustomDataProvider(source);
  154. drop(null, DropLocation.BELOW, "0");
  155. }
  156. @Test(expected = UnsupportedOperationException.class)
  157. public void customTargetDataProvider_noCustomCalculatorAndNoCustomTargetUpdater_unsupportedOperationExceptionThrown() {
  158. setCustomDataProvider(target);
  159. drop(null, DropLocation.BELOW, "0");
  160. }
  161. @Test(expected = UnsupportedOperationException.class)
  162. public void customTargetDataProvider_customCalculatorAndNoCustomTargetUpdater_unsupportedOperationExceptionThrown() {
  163. setCustomDataProvider(target);
  164. dragger.setDropIndexCalculator(event -> 0);
  165. drop(null, DropLocation.BELOW, "0");
  166. }
  167. @Test(expected = UnsupportedOperationException.class)
  168. public void customTargetDataProvider_noCustomCalculatorAndCustomTargetUpdater_unsupportedOperationExceptionThrown() {
  169. source.setItems("0");
  170. setCustomDataProvider(target);
  171. dragger.setTargetDataProviderUpdater((event, dp, index, items) -> {
  172. });
  173. drop(null, DropLocation.BELOW, "0");
  174. }
  175. @Test
  176. public void customTargetDataProvider_customCalculatorAndCustomTargetUpdater_triggeredWithMaxIndex() {
  177. source.setItems("0");
  178. setCustomDataProvider(target, "1", "2", "3");
  179. AtomicInteger updaterTrigger = new AtomicInteger(-1);
  180. dragger.setTargetDataProviderUpdater(
  181. (event, dp, index, items) -> updaterTrigger.set(index));
  182. AtomicInteger calculatorTrigger = new AtomicInteger();
  183. dragger.setDropIndexCalculator(event -> {
  184. calculatorTrigger.incrementAndGet();
  185. return 2;
  186. });
  187. drop("1", DropLocation.ABOVE, "2");
  188. Assert.assertEquals("custom calculator not triggered", 1,
  189. calculatorTrigger.get());
  190. // getting value from custom calculator
  191. Assert.assertEquals("given drop index to target updater is wrong", 2,
  192. updaterTrigger.get());
  193. }
  194. @Test
  195. public void dropOnSortedGrid_byDefault_dropsToTheEnd() {
  196. Assert.assertFalse(
  197. "Default drops on sorted grid rows should not be allowed",
  198. dragger.getGridDropTarget().isDropAllowedOnRowsWhenSorted());
  199. source.setItems("0", "1", "2");
  200. target.setItems("4", "5");
  201. target.sort("1");
  202. drop(null, DropLocation.EMPTY, "0");
  203. verifySourceDataProvider("1", "2");
  204. verifyTargetDataProvider("4", "5", "0");
  205. }
  206. }