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.

GridSingleSelectionModelTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. package com.vaadin.tests.components.grid;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertNull;
  5. import static org.junit.Assert.assertSame;
  6. import static org.junit.Assert.assertTrue;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.LinkedHashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Optional;
  13. import java.util.concurrent.atomic.AtomicReference;
  14. import org.junit.Before;
  15. import org.junit.Test;
  16. import org.mockito.Mockito;
  17. import com.vaadin.data.HasValue.ValueChangeEvent;
  18. import com.vaadin.data.provider.bov.Person;
  19. import com.vaadin.event.selection.SingleSelectionEvent;
  20. import com.vaadin.event.selection.SingleSelectionListener;
  21. import com.vaadin.shared.Registration;
  22. import com.vaadin.ui.Grid;
  23. import com.vaadin.ui.Grid.SelectionMode;
  24. import com.vaadin.ui.components.grid.GridSelectionModel;
  25. import com.vaadin.ui.components.grid.SingleSelectionModelImpl;
  26. import elemental.json.JsonObject;
  27. public class GridSingleSelectionModelTest {
  28. public static final Person PERSON_C = new Person("c", 3);
  29. public static final Person PERSON_B = new Person("b", 2);
  30. public static final Person PERSON_A = new Person("a", 1);
  31. public static class CustomSingleSelectionModel
  32. extends SingleSelectionModelImpl<String> {
  33. public final Map<String, Boolean> generatedData = new LinkedHashMap<>();
  34. @Override
  35. public void generateData(String item, JsonObject jsonObject) {
  36. super.generateData(item, jsonObject);
  37. // capture updated row
  38. generatedData.put(item, isSelected(item));
  39. }
  40. }
  41. private static class TestSingleSelectionModel
  42. extends SingleSelectionModelImpl<Object> {
  43. public TestSingleSelectionModel() {
  44. getState(false).selectionAllowed = false;
  45. }
  46. @Override
  47. protected void setSelectedFromClient(String key) {
  48. super.setSelectedFromClient(key);
  49. }
  50. }
  51. private List<Person> selectionChanges;
  52. private Grid<Person> grid;
  53. private SingleSelectionModelImpl<Person> selectionModel;
  54. @Before
  55. public void setUp() {
  56. grid = new Grid<>();
  57. grid.setItems(PERSON_A, PERSON_B, PERSON_C);
  58. selectionModel = (SingleSelectionModelImpl<Person>) grid
  59. .getSelectionModel();
  60. selectionChanges = new ArrayList<>();
  61. selectionModel.addSingleSelectionListener(
  62. event -> selectionChanges.add(event.getValue()));
  63. }
  64. @Test(expected = IllegalStateException.class)
  65. public void throwExceptionWhenSelectionIsDisallowed() {
  66. TestSingleSelectionModel model = new TestSingleSelectionModel();
  67. model.setSelectedFromClient("foo");
  68. }
  69. @Test(expected = IllegalStateException.class)
  70. public void selectionModelChanged_usingPreviousSelectionModel_throws() {
  71. grid.setSelectionMode(SelectionMode.MULTI);
  72. selectionModel.select(PERSON_A);
  73. }
  74. @Test
  75. public void gridChangingSelectionModel_firesSelectionChangeEvent() {
  76. Grid<String> customGrid = new Grid<>();
  77. customGrid.setItems("Foo", "Bar", "Baz");
  78. List<String> selectionChanges = new ArrayList<>();
  79. List<String> oldSelectionValues = new ArrayList<>();
  80. ((SingleSelectionModelImpl<String>) customGrid.getSelectionModel())
  81. .addSingleSelectionListener(event -> {
  82. selectionChanges.add(event.getValue());
  83. oldSelectionValues.add(event.getOldValue());
  84. });
  85. customGrid.getSelectionModel().select("Foo");
  86. assertEquals("Foo",
  87. customGrid.getSelectionModel().getFirstSelectedItem().get());
  88. assertEquals(Arrays.asList("Foo"), selectionChanges);
  89. assertEquals(Arrays.asList((String) null), oldSelectionValues);
  90. customGrid.setSelectionMode(SelectionMode.MULTI);
  91. assertEquals(Arrays.asList("Foo", null), selectionChanges);
  92. assertEquals(Arrays.asList(null, "Foo"), oldSelectionValues);
  93. }
  94. @Test
  95. public void serverSideSelection_GridChangingSelectionModel_sendsUpdatedRowsToClient() {
  96. CustomSingleSelectionModel customModel = new CustomSingleSelectionModel();
  97. Grid<String> customGrid = new Grid<String>() {
  98. {
  99. setSelectionModel(customModel);
  100. }
  101. };
  102. customGrid.setItems("Foo", "Bar", "Baz");
  103. customGrid.getDataCommunicator().beforeClientResponse(true);
  104. assertFalse("Item should have been updated as selected",
  105. customModel.generatedData.get("Foo"));
  106. assertFalse("Item should have been updated as NOT selected",
  107. customModel.generatedData.get("Bar"));
  108. assertFalse("Item should have been updated as NOT selected",
  109. customModel.generatedData.get("Baz"));
  110. customModel.generatedData.clear();
  111. customGrid.getSelectionModel().select("Foo");
  112. customGrid.getDataCommunicator().beforeClientResponse(false);
  113. assertTrue("Item should have been updated as selected",
  114. customModel.generatedData.get("Foo"));
  115. assertFalse("Item should have NOT been updated",
  116. customModel.generatedData.containsKey("Bar"));
  117. assertFalse("Item should have NOT been updated",
  118. customModel.generatedData.containsKey("Baz"));
  119. // switch to another selection model to cause event
  120. customModel.generatedData.clear();
  121. customGrid.setSelectionMode(SelectionMode.MULTI);
  122. customGrid.getDataCommunicator().beforeClientResponse(false);
  123. // since the selection model has been removed, it is no longer a data
  124. // generator for the data communicator, would need to verify somehow
  125. // that row is not marked as selected anymore ? (done in UI tests)
  126. assertTrue(customModel.generatedData.isEmpty()); // at least
  127. // removed
  128. // selection
  129. // model is not
  130. // triggered
  131. }
  132. @Test
  133. public void testGridWithSingleSelection() {
  134. Grid<String> gridWithStrings = new Grid<>();
  135. gridWithStrings.setItems("Foo", "Bar", "Baz");
  136. GridSelectionModel<String> model = gridWithStrings.getSelectionModel();
  137. assertFalse(model.isSelected("Foo"));
  138. model.select("Foo");
  139. assertTrue(model.isSelected("Foo"));
  140. assertEquals(Optional.of("Foo"), model.getFirstSelectedItem());
  141. model.select("Bar");
  142. assertFalse(model.isSelected("Foo"));
  143. assertTrue(model.isSelected("Bar"));
  144. model.deselect("Bar");
  145. assertFalse(model.isSelected("Bar"));
  146. assertFalse(model.getFirstSelectedItem().isPresent());
  147. }
  148. @Test
  149. public void select_isSelected() {
  150. selectionModel.select(PERSON_B);
  151. assertTrue(selectionModel.getSelectedItem().isPresent());
  152. assertEquals(PERSON_B, selectionModel.getSelectedItem().orElse(null));
  153. assertFalse(selectionModel.isSelected(PERSON_A));
  154. assertTrue(selectionModel.isSelected(PERSON_B));
  155. assertFalse(selectionModel.isSelected(PERSON_C));
  156. assertEquals(Optional.of(PERSON_B), selectionModel.getSelectedItem());
  157. assertEquals(Arrays.asList(PERSON_B), selectionChanges);
  158. }
  159. @Test
  160. public void selectDeselect() {
  161. selectionModel.select(PERSON_B);
  162. selectionModel.deselect(PERSON_B);
  163. assertFalse(selectionModel.getSelectedItem().isPresent());
  164. assertFalse(selectionModel.isSelected(PERSON_A));
  165. assertFalse(selectionModel.isSelected(PERSON_B));
  166. assertFalse(selectionModel.isSelected(PERSON_C));
  167. assertFalse(selectionModel.getSelectedItem().isPresent());
  168. assertEquals(Arrays.asList(PERSON_B, null), selectionChanges);
  169. }
  170. @Test
  171. public void reselect() {
  172. selectionModel.select(PERSON_B);
  173. selectionModel.select(PERSON_C);
  174. assertEquals(PERSON_C, selectionModel.getSelectedItem().orElse(null));
  175. assertFalse(selectionModel.isSelected(PERSON_A));
  176. assertFalse(selectionModel.isSelected(PERSON_B));
  177. assertTrue(selectionModel.isSelected(PERSON_C));
  178. assertEquals(Optional.of(PERSON_C), selectionModel.getSelectedItem());
  179. assertEquals(Arrays.asList(PERSON_B, PERSON_C), selectionChanges);
  180. }
  181. @Test
  182. public void selectTwice() {
  183. selectionModel.select(PERSON_C);
  184. selectionModel.select(PERSON_C);
  185. assertEquals(PERSON_C, selectionModel.getSelectedItem().orElse(null));
  186. assertFalse(selectionModel.isSelected(PERSON_A));
  187. assertFalse(selectionModel.isSelected(PERSON_B));
  188. assertTrue(selectionModel.isSelected(PERSON_C));
  189. assertEquals(Optional.of(PERSON_C), selectionModel.getSelectedItem());
  190. assertEquals(Arrays.asList(PERSON_C), selectionChanges);
  191. }
  192. @Test
  193. public void deselectTwice() {
  194. selectionModel.select(PERSON_C);
  195. selectionModel.deselect(PERSON_C);
  196. selectionModel.deselect(PERSON_C);
  197. assertFalse(selectionModel.getSelectedItem().isPresent());
  198. assertFalse(selectionModel.isSelected(PERSON_A));
  199. assertFalse(selectionModel.isSelected(PERSON_B));
  200. assertFalse(selectionModel.isSelected(PERSON_C));
  201. assertFalse(selectionModel.getSelectedItem().isPresent());
  202. assertEquals(Arrays.asList(PERSON_C, null), selectionChanges);
  203. }
  204. @Test
  205. public void getSelectedItem() {
  206. selectionModel.setSelectedItem(PERSON_B);
  207. assertEquals(PERSON_B, selectionModel.getSelectedItem().get());
  208. selectionModel.deselect(PERSON_B);
  209. assertFalse(selectionModel.getSelectedItem().isPresent());
  210. }
  211. @Test
  212. public void select_deselect_getSelectedItem() {
  213. selectionModel.select(PERSON_C);
  214. assertEquals(PERSON_C, selectionModel.getSelectedItem().get());
  215. selectionModel.deselect(PERSON_C);
  216. assertFalse(selectionModel.getSelectedItem().isPresent());
  217. }
  218. @SuppressWarnings({ "serial" })
  219. @Test
  220. public void addValueChangeListener() {
  221. AtomicReference<SingleSelectionListener<String>> selectionListener = new AtomicReference<>();
  222. Registration registration = Mockito.mock(Registration.class);
  223. Grid<String> grid = new Grid<>();
  224. grid.setItems("foo", "bar");
  225. String value = "foo";
  226. SingleSelectionModelImpl<String> select = new SingleSelectionModelImpl<String>() {
  227. @Override
  228. public Registration addSingleSelectionListener(
  229. SingleSelectionListener<String> listener) {
  230. selectionListener.set(listener);
  231. return registration;
  232. }
  233. @Override
  234. public Optional<String> getSelectedItem() {
  235. return Optional.of(value);
  236. }
  237. };
  238. AtomicReference<ValueChangeEvent<?>> event = new AtomicReference<>();
  239. Registration actualRegistration = select
  240. .addSingleSelectionListener(evt -> {
  241. assertNull(event.get());
  242. event.set(evt);
  243. });
  244. assertSame(registration, actualRegistration);
  245. selectionListener.get().selectionChange(new SingleSelectionEvent<>(grid,
  246. select.asSingleSelect(), null, true));
  247. assertEquals(grid, event.get().getComponent());
  248. assertEquals(value, event.get().getValue());
  249. assertEquals(null, event.get().getOldValue());
  250. assertTrue(event.get().isUserOriginated());
  251. }
  252. }