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.

GridMultiSelectionModelTest.java 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708
  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.Collections;
  10. import java.util.LinkedHashMap;
  11. import java.util.LinkedHashSet;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Optional;
  15. import java.util.Set;
  16. import java.util.concurrent.atomic.AtomicInteger;
  17. import java.util.concurrent.atomic.AtomicReference;
  18. import java.util.stream.IntStream;
  19. import org.easymock.Capture;
  20. import org.junit.Before;
  21. import org.junit.Test;
  22. import org.mockito.Mockito;
  23. import com.vaadin.data.provider.DataProvider;
  24. import com.vaadin.data.provider.bov.Person;
  25. import com.vaadin.event.selection.MultiSelectionEvent;
  26. import com.vaadin.event.selection.MultiSelectionListener;
  27. import com.vaadin.shared.Registration;
  28. import com.vaadin.tests.util.MockUI;
  29. import com.vaadin.ui.Grid;
  30. import com.vaadin.ui.Grid.SelectionMode;
  31. import com.vaadin.ui.UI;
  32. import com.vaadin.ui.components.grid.GridSelectionModel;
  33. import com.vaadin.ui.components.grid.MultiSelectionModel;
  34. import com.vaadin.ui.components.grid.MultiSelectionModel.SelectAllCheckBoxVisibility;
  35. import com.vaadin.ui.components.grid.MultiSelectionModelImpl;
  36. import elemental.json.JsonObject;
  37. public class GridMultiSelectionModelTest {
  38. public static final Person PERSON_C = new Person("c", 3);
  39. public static final Person PERSON_B = new Person("b", 2);
  40. public static final Person PERSON_A = new Person("a", 1);
  41. private Grid<Person> grid;
  42. private MultiSelectionModelImpl<Person> selectionModel;
  43. private Capture<List<Person>> currentSelectionCapture;
  44. private Capture<List<Person>> oldSelectionCapture;
  45. private AtomicInteger events;
  46. public static class CustomMultiSelectionModel
  47. extends MultiSelectionModelImpl<String> {
  48. public final Map<String, Boolean> generatedData = new LinkedHashMap<>();
  49. @Override
  50. public void generateData(String item, JsonObject jsonObject) {
  51. super.generateData(item, jsonObject);
  52. // capture updated row
  53. generatedData.put(item, isSelected(item));
  54. }
  55. }
  56. public static class CustomSelectionModelGrid extends Grid<String> {
  57. public CustomSelectionModelGrid() {
  58. this(new CustomMultiSelectionModel());
  59. }
  60. public CustomSelectionModelGrid(
  61. GridSelectionModel<String> selectionModel) {
  62. super();
  63. setSelectionModel(selectionModel);
  64. }
  65. }
  66. private static class TestMultiSelectionModel
  67. extends MultiSelectionModelImpl<Object> {
  68. public TestMultiSelectionModel() {
  69. getState(false).selectionAllowed = false;
  70. }
  71. @Override
  72. protected void updateSelection(Set<Object> addedItems,
  73. Set<Object> removedItems, boolean userOriginated) {
  74. super.updateSelection(addedItems, removedItems, userOriginated);
  75. }
  76. }
  77. @Before
  78. public void setUp() {
  79. grid = new Grid<>();
  80. selectionModel = (MultiSelectionModelImpl<Person>) grid
  81. .setSelectionMode(SelectionMode.MULTI);
  82. grid.setItems(PERSON_A, PERSON_B, PERSON_C);
  83. currentSelectionCapture = new Capture<>();
  84. oldSelectionCapture = new Capture<>();
  85. events = new AtomicInteger();
  86. selectionModel.addMultiSelectionListener(event -> {
  87. currentSelectionCapture
  88. .setValue(new ArrayList<>(event.getNewSelection()));
  89. oldSelectionCapture
  90. .setValue(new ArrayList<>(event.getOldSelection()));
  91. events.incrementAndGet();
  92. });
  93. }
  94. @Test(expected = IllegalStateException.class)
  95. public void throwExcpetionWhenSelectionIsDisallowed() {
  96. TestMultiSelectionModel model = new TestMultiSelectionModel();
  97. model.updateSelection(Collections.emptySet(), Collections.emptySet(),
  98. true);
  99. }
  100. @Test(expected = IllegalStateException.class)
  101. public void selectionModelChanged_usingPreviousSelectionModel_throws() {
  102. grid.setSelectionMode(SelectionMode.SINGLE);
  103. selectionModel.select(PERSON_A);
  104. }
  105. @Test
  106. public void changingSelectionModel_firesSelectionEvent() {
  107. Grid<String> customGrid = new Grid<>();
  108. customGrid.setSelectionMode(SelectionMode.MULTI);
  109. customGrid.setItems("Foo", "Bar", "Baz");
  110. List<String> selectionChanges = new ArrayList<>();
  111. Capture<List<String>> oldSelectionCapture = new Capture<>();
  112. ((MultiSelectionModelImpl<String>) customGrid.getSelectionModel())
  113. .addMultiSelectionListener(event -> {
  114. selectionChanges.addAll(event.getValue());
  115. oldSelectionCapture
  116. .setValue(new ArrayList<>(event.getOldSelection()));
  117. });
  118. customGrid.getSelectionModel().select("Foo");
  119. assertEquals(Arrays.asList("Foo"), selectionChanges);
  120. selectionChanges.clear();
  121. customGrid.getSelectionModel().select("Bar");
  122. assertEquals("Foo",
  123. customGrid.getSelectionModel().getFirstSelectedItem().get());
  124. assertEquals(Arrays.asList("Foo", "Bar"), selectionChanges);
  125. selectionChanges.clear();
  126. customGrid.setSelectionMode(SelectionMode.SINGLE);
  127. assertFalse(customGrid.getSelectionModel().getFirstSelectedItem()
  128. .isPresent());
  129. assertEquals(Arrays.asList(), selectionChanges);
  130. assertEquals(Arrays.asList("Foo", "Bar"),
  131. oldSelectionCapture.getValue());
  132. }
  133. @Test
  134. public void serverSideSelection_GridChangingSelectionModel_sendsUpdatedRowsToClient() {
  135. Grid<String> customGrid = new CustomSelectionModelGrid();
  136. CustomMultiSelectionModel customModel = (CustomMultiSelectionModel) customGrid
  137. .getSelectionModel();
  138. customGrid.setItems("Foo", "Bar", "Baz");
  139. customGrid.getDataCommunicator().beforeClientResponse(true);
  140. assertFalse("Item should have been updated as selected",
  141. customModel.generatedData.get("Foo"));
  142. assertFalse("Item should have been updated as NOT selected",
  143. customModel.generatedData.get("Bar"));
  144. assertFalse("Item should have been updated as NOT selected",
  145. customModel.generatedData.get("Baz"));
  146. customModel.generatedData.clear();
  147. customGrid.getSelectionModel().select("Foo");
  148. customGrid.getDataCommunicator().beforeClientResponse(false);
  149. assertTrue("Item should have been updated as selected",
  150. customModel.generatedData.get("Foo"));
  151. assertFalse("Item should have NOT been updated",
  152. customModel.generatedData.containsKey("Bar"));
  153. assertFalse("Item should have NOT been updated",
  154. customModel.generatedData.containsKey("Baz"));
  155. customModel.generatedData.clear();
  156. customModel.updateSelection(asSet("Bar"), asSet("Foo"));
  157. customGrid.getDataCommunicator().beforeClientResponse(false);
  158. assertFalse("Item should have been updated as NOT selected",
  159. customModel.generatedData.get("Foo"));
  160. assertTrue("Item should have been updated as selected",
  161. customModel.generatedData.get("Bar"));
  162. assertFalse("Item should have NOT been updated",
  163. customModel.generatedData.containsKey("Baz"));
  164. // switch to single to cause event
  165. customModel.generatedData.clear();
  166. customGrid.setSelectionMode(SelectionMode.SINGLE);
  167. customGrid.getDataCommunicator().beforeClientResponse(false);
  168. // changing selection model should trigger row updates, but the old
  169. // selection model is not triggered as it has been removed
  170. assertTrue(customModel.generatedData.isEmpty()); // not triggered
  171. }
  172. @Test
  173. public void select_gridWithStrings() {
  174. Grid<String> gridWithStrings = new Grid<>();
  175. gridWithStrings.setSelectionMode(SelectionMode.MULTI);
  176. gridWithStrings.setItems("Foo", "Bar", "Baz");
  177. GridSelectionModel<String> model = gridWithStrings.getSelectionModel();
  178. assertFalse(model.isSelected("Foo"));
  179. model.select("Foo");
  180. assertTrue(model.isSelected("Foo"));
  181. assertEquals(Optional.of("Foo"), model.getFirstSelectedItem());
  182. model.select("Bar");
  183. assertTrue(model.isSelected("Foo"));
  184. assertTrue(model.isSelected("Bar"));
  185. assertEquals(Arrays.asList("Foo", "Bar"),
  186. new ArrayList<>(model.getSelectedItems()));
  187. model.deselect("Bar");
  188. assertFalse(model.isSelected("Bar"));
  189. assertTrue(model.getFirstSelectedItem().isPresent());
  190. assertEquals(Arrays.asList("Foo"),
  191. new ArrayList<>(model.getSelectedItems()));
  192. }
  193. @Test
  194. public void select() {
  195. selectionModel.select(PERSON_B);
  196. assertEquals(PERSON_B,
  197. selectionModel.getFirstSelectedItem().orElse(null));
  198. assertEquals(Optional.of(PERSON_B),
  199. selectionModel.getFirstSelectedItem());
  200. assertFalse(selectionModel.isSelected(PERSON_A));
  201. assertTrue(selectionModel.isSelected(PERSON_B));
  202. assertFalse(selectionModel.isSelected(PERSON_C));
  203. assertEquals(Arrays.asList(PERSON_B),
  204. currentSelectionCapture.getValue());
  205. selectionModel.select(PERSON_A);
  206. assertEquals(PERSON_B,
  207. selectionModel.getFirstSelectedItem().orElse(null));
  208. assertTrue(selectionModel.isSelected(PERSON_A));
  209. assertTrue(selectionModel.isSelected(PERSON_B));
  210. assertFalse(selectionModel.isSelected(PERSON_C));
  211. assertEquals(Arrays.asList(PERSON_B, PERSON_A),
  212. currentSelectionCapture.getValue());
  213. assertEquals(2, events.get());
  214. }
  215. @Test
  216. public void deselect() {
  217. selectionModel.select(PERSON_B);
  218. selectionModel.deselect(PERSON_B);
  219. assertFalse(selectionModel.getFirstSelectedItem().isPresent());
  220. assertFalse(selectionModel.isSelected(PERSON_A));
  221. assertFalse(selectionModel.isSelected(PERSON_B));
  222. assertFalse(selectionModel.isSelected(PERSON_C));
  223. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  224. assertEquals(2, events.get());
  225. }
  226. @Test
  227. public void selectItems() {
  228. selectionModel.selectItems(PERSON_C, PERSON_B);
  229. assertEquals(PERSON_C,
  230. selectionModel.getFirstSelectedItem().orElse(null));
  231. assertEquals(Optional.of(PERSON_C),
  232. selectionModel.getFirstSelectedItem());
  233. assertFalse(selectionModel.isSelected(PERSON_A));
  234. assertTrue(selectionModel.isSelected(PERSON_B));
  235. assertTrue(selectionModel.isSelected(PERSON_C));
  236. assertEquals(Arrays.asList(PERSON_C, PERSON_B),
  237. currentSelectionCapture.getValue());
  238. selectionModel.selectItems(PERSON_A, PERSON_C); // partly NOOP
  239. assertTrue(selectionModel.isSelected(PERSON_A));
  240. assertTrue(selectionModel.isSelected(PERSON_B));
  241. assertTrue(selectionModel.isSelected(PERSON_C));
  242. assertEquals(Arrays.asList(PERSON_C, PERSON_B, PERSON_A),
  243. currentSelectionCapture.getValue());
  244. assertEquals(2, events.get());
  245. }
  246. @Test
  247. public void deselectItems() {
  248. selectionModel.selectItems(PERSON_C, PERSON_A, PERSON_B);
  249. selectionModel.deselectItems(PERSON_A);
  250. assertEquals(PERSON_C,
  251. selectionModel.getFirstSelectedItem().orElse(null));
  252. assertEquals(Optional.of(PERSON_C),
  253. selectionModel.getFirstSelectedItem());
  254. assertFalse(selectionModel.isSelected(PERSON_A));
  255. assertTrue(selectionModel.isSelected(PERSON_B));
  256. assertTrue(selectionModel.isSelected(PERSON_C));
  257. assertEquals(Arrays.asList(PERSON_C, PERSON_B),
  258. currentSelectionCapture.getValue());
  259. selectionModel.deselectItems(PERSON_A, PERSON_B, PERSON_C);
  260. assertNull(selectionModel.getFirstSelectedItem().orElse(null));
  261. assertEquals(Optional.empty(), selectionModel.getFirstSelectedItem());
  262. assertFalse(selectionModel.isSelected(PERSON_A));
  263. assertFalse(selectionModel.isSelected(PERSON_B));
  264. assertFalse(selectionModel.isSelected(PERSON_C));
  265. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  266. assertEquals(3, events.get());
  267. }
  268. @Test
  269. public void selectionEvent_newSelection_oldSelection() {
  270. selectionModel.selectItems(PERSON_C, PERSON_A, PERSON_B);
  271. assertEquals(Arrays.asList(PERSON_C, PERSON_A, PERSON_B),
  272. currentSelectionCapture.getValue());
  273. assertEquals(Arrays.asList(), oldSelectionCapture.getValue());
  274. selectionModel.deselect(PERSON_A);
  275. assertEquals(Arrays.asList(PERSON_C, PERSON_B),
  276. currentSelectionCapture.getValue());
  277. assertEquals(Arrays.asList(PERSON_C, PERSON_A, PERSON_B),
  278. oldSelectionCapture.getValue());
  279. selectionModel.deselectItems(PERSON_A, PERSON_B, PERSON_C);
  280. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  281. assertEquals(Arrays.asList(PERSON_C, PERSON_B),
  282. oldSelectionCapture.getValue());
  283. selectionModel.selectItems(PERSON_A);
  284. assertEquals(Arrays.asList(PERSON_A),
  285. currentSelectionCapture.getValue());
  286. assertEquals(Arrays.asList(), oldSelectionCapture.getValue());
  287. selectionModel.updateSelection(
  288. new LinkedHashSet<>(Arrays.asList(PERSON_B, PERSON_C)),
  289. new LinkedHashSet<>(Arrays.asList(PERSON_A)));
  290. assertEquals(Arrays.asList(PERSON_B, PERSON_C),
  291. currentSelectionCapture.getValue());
  292. assertEquals(Arrays.asList(PERSON_A), oldSelectionCapture.getValue());
  293. selectionModel.deselectAll();
  294. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  295. assertEquals(Arrays.asList(PERSON_B, PERSON_C),
  296. oldSelectionCapture.getValue());
  297. selectionModel.select(PERSON_C);
  298. assertEquals(Arrays.asList(PERSON_C),
  299. currentSelectionCapture.getValue());
  300. assertEquals(Arrays.asList(), oldSelectionCapture.getValue());
  301. selectionModel.deselect(PERSON_C);
  302. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  303. assertEquals(Arrays.asList(PERSON_C), oldSelectionCapture.getValue());
  304. }
  305. @Test
  306. public void deselectAll() {
  307. selectionModel.selectItems(PERSON_A, PERSON_C, PERSON_B);
  308. assertTrue(selectionModel.isSelected(PERSON_A));
  309. assertTrue(selectionModel.isSelected(PERSON_B));
  310. assertTrue(selectionModel.isSelected(PERSON_C));
  311. assertEquals(Arrays.asList(PERSON_A, PERSON_C, PERSON_B),
  312. currentSelectionCapture.getValue());
  313. assertEquals(1, events.get());
  314. selectionModel.deselectAll();
  315. assertFalse(selectionModel.isSelected(PERSON_A));
  316. assertFalse(selectionModel.isSelected(PERSON_B));
  317. assertFalse(selectionModel.isSelected(PERSON_C));
  318. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  319. assertEquals(Arrays.asList(PERSON_A, PERSON_C, PERSON_B),
  320. oldSelectionCapture.getValue());
  321. assertEquals(2, events.get());
  322. selectionModel.select(PERSON_C);
  323. assertFalse(selectionModel.isSelected(PERSON_A));
  324. assertFalse(selectionModel.isSelected(PERSON_B));
  325. assertTrue(selectionModel.isSelected(PERSON_C));
  326. assertEquals(Arrays.asList(PERSON_C),
  327. currentSelectionCapture.getValue());
  328. assertEquals(Arrays.asList(), oldSelectionCapture.getValue());
  329. assertEquals(3, events.get());
  330. selectionModel.deselectAll();
  331. assertFalse(selectionModel.isSelected(PERSON_A));
  332. assertFalse(selectionModel.isSelected(PERSON_B));
  333. assertFalse(selectionModel.isSelected(PERSON_C));
  334. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  335. assertEquals(Arrays.asList(PERSON_C), oldSelectionCapture.getValue());
  336. assertEquals(4, events.get());
  337. selectionModel.deselectAll();
  338. assertEquals(4, events.get());
  339. }
  340. @Test
  341. public void selectAll() {
  342. selectionModel.selectAll();
  343. assertTrue(selectionModel.isAllSelected());
  344. assertTrue(selectionModel.isSelected(PERSON_A));
  345. assertTrue(selectionModel.isSelected(PERSON_B));
  346. assertTrue(selectionModel.isSelected(PERSON_C));
  347. assertEquals(Arrays.asList(PERSON_A, PERSON_B, PERSON_C),
  348. currentSelectionCapture.getValue());
  349. assertEquals(1, events.get());
  350. selectionModel.deselectItems(PERSON_A, PERSON_C);
  351. assertFalse(selectionModel.isAllSelected());
  352. assertFalse(selectionModel.isSelected(PERSON_A));
  353. assertTrue(selectionModel.isSelected(PERSON_B));
  354. assertFalse(selectionModel.isSelected(PERSON_C));
  355. assertEquals(Arrays.asList(PERSON_A, PERSON_B, PERSON_C),
  356. oldSelectionCapture.getValue());
  357. selectionModel.selectAll();
  358. assertTrue(selectionModel.isAllSelected());
  359. assertTrue(selectionModel.isSelected(PERSON_A));
  360. assertTrue(selectionModel.isSelected(PERSON_B));
  361. assertTrue(selectionModel.isSelected(PERSON_C));
  362. assertEquals(Arrays.asList(PERSON_B, PERSON_A, PERSON_C),
  363. currentSelectionCapture.getValue());
  364. assertEquals(Arrays.asList(PERSON_B), oldSelectionCapture.getValue());
  365. assertEquals(3, events.get());
  366. }
  367. @Test
  368. public void updateSelection() {
  369. selectionModel.updateSelection(asSet(PERSON_A), Collections.emptySet());
  370. assertTrue(selectionModel.isSelected(PERSON_A));
  371. assertFalse(selectionModel.isSelected(PERSON_B));
  372. assertFalse(selectionModel.isSelected(PERSON_C));
  373. assertEquals(Arrays.asList(PERSON_A),
  374. currentSelectionCapture.getValue());
  375. assertEquals(1, events.get());
  376. selectionModel.updateSelection(asSet(PERSON_B), asSet(PERSON_A));
  377. assertFalse(selectionModel.isSelected(PERSON_A));
  378. assertTrue(selectionModel.isSelected(PERSON_B));
  379. assertFalse(selectionModel.isSelected(PERSON_C));
  380. assertEquals(Arrays.asList(PERSON_B),
  381. currentSelectionCapture.getValue());
  382. assertEquals(Arrays.asList(PERSON_A), oldSelectionCapture.getValue());
  383. assertEquals(2, events.get());
  384. selectionModel.updateSelection(asSet(PERSON_B), asSet(PERSON_A)); // NOOP
  385. assertFalse(selectionModel.isSelected(PERSON_A));
  386. assertTrue(selectionModel.isSelected(PERSON_B));
  387. assertFalse(selectionModel.isSelected(PERSON_C));
  388. assertEquals(Arrays.asList(PERSON_B),
  389. currentSelectionCapture.getValue());
  390. assertEquals(Arrays.asList(PERSON_A), oldSelectionCapture.getValue());
  391. assertEquals(2, events.get());
  392. selectionModel.updateSelection(asSet(PERSON_A, PERSON_C),
  393. asSet(PERSON_A)); // partly NOOP
  394. assertFalse(selectionModel.isSelected(PERSON_A));
  395. assertTrue(selectionModel.isSelected(PERSON_B));
  396. assertTrue(selectionModel.isSelected(PERSON_C));
  397. assertEquals(Arrays.asList(PERSON_B, PERSON_C),
  398. currentSelectionCapture.getValue());
  399. assertEquals(Arrays.asList(PERSON_B), oldSelectionCapture.getValue());
  400. assertEquals(3, events.get());
  401. selectionModel.updateSelection(asSet(PERSON_B, PERSON_A),
  402. asSet(PERSON_B)); // partly NOOP
  403. assertTrue(selectionModel.isSelected(PERSON_A));
  404. assertTrue(selectionModel.isSelected(PERSON_B));
  405. assertTrue(selectionModel.isSelected(PERSON_C));
  406. assertEquals(Arrays.asList(PERSON_B, PERSON_C, PERSON_A),
  407. currentSelectionCapture.getValue());
  408. assertEquals(Arrays.asList(PERSON_B, PERSON_C),
  409. oldSelectionCapture.getValue());
  410. assertEquals(4, events.get());
  411. selectionModel.updateSelection(asSet(),
  412. asSet(PERSON_B, PERSON_A, PERSON_C));
  413. assertFalse(selectionModel.isSelected(PERSON_A));
  414. assertFalse(selectionModel.isSelected(PERSON_B));
  415. assertFalse(selectionModel.isSelected(PERSON_C));
  416. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  417. assertEquals(Arrays.asList(PERSON_B, PERSON_C, PERSON_A),
  418. oldSelectionCapture.getValue());
  419. assertEquals(5, events.get());
  420. }
  421. private <T> Set<T> asSet(@SuppressWarnings("unchecked") T... people) {
  422. return new LinkedHashSet<>(Arrays.asList(people));
  423. }
  424. @Test
  425. public void selectTwice() {
  426. selectionModel.select(PERSON_C);
  427. selectionModel.select(PERSON_C);
  428. assertEquals(PERSON_C,
  429. selectionModel.getFirstSelectedItem().orElse(null));
  430. assertFalse(selectionModel.isSelected(PERSON_A));
  431. assertFalse(selectionModel.isSelected(PERSON_B));
  432. assertTrue(selectionModel.isSelected(PERSON_C));
  433. assertEquals(Optional.of(PERSON_C),
  434. selectionModel.getFirstSelectedItem());
  435. assertEquals(Arrays.asList(PERSON_C),
  436. currentSelectionCapture.getValue());
  437. assertEquals(1, events.get());
  438. }
  439. @Test
  440. public void deselectTwice() {
  441. selectionModel.select(PERSON_C);
  442. assertEquals(Arrays.asList(PERSON_C),
  443. currentSelectionCapture.getValue());
  444. assertEquals(1, events.get());
  445. selectionModel.deselect(PERSON_C);
  446. assertFalse(selectionModel.getFirstSelectedItem().isPresent());
  447. assertFalse(selectionModel.isSelected(PERSON_C));
  448. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  449. assertEquals(2, events.get());
  450. selectionModel.deselect(PERSON_C);
  451. assertFalse(selectionModel.getFirstSelectedItem().isPresent());
  452. assertFalse(selectionModel.isSelected(PERSON_A));
  453. assertFalse(selectionModel.isSelected(PERSON_B));
  454. assertFalse(selectionModel.isSelected(PERSON_C));
  455. assertEquals(Arrays.asList(), currentSelectionCapture.getValue());
  456. assertEquals(2, events.get());
  457. }
  458. @SuppressWarnings({ "serial" })
  459. @Test
  460. public void addValueChangeListener() {
  461. String value = "foo";
  462. AtomicReference<MultiSelectionListener<String>> selectionListener = new AtomicReference<>();
  463. Registration registration = Mockito.mock(Registration.class);
  464. MultiSelectionModelImpl<String> model = new MultiSelectionModelImpl<String>() {
  465. @Override
  466. public Registration addMultiSelectionListener(
  467. MultiSelectionListener<String> listener) {
  468. selectionListener.set(listener);
  469. return registration;
  470. }
  471. @Override
  472. public Set<String> getSelectedItems() {
  473. return new LinkedHashSet<>(Arrays.asList(value));
  474. }
  475. };
  476. Grid<String> grid = new CustomSelectionModelGrid(model);
  477. grid.setItems("foo", "bar");
  478. AtomicReference<MultiSelectionEvent<String>> event = new AtomicReference<>();
  479. Registration actualRegistration = model
  480. .addMultiSelectionListener(evt -> {
  481. assertNull(event.get());
  482. event.set(evt);
  483. });
  484. assertSame(registration, actualRegistration);
  485. selectionListener.get().selectionChange(new MultiSelectionEvent<>(grid,
  486. model.asMultiSelect(), Collections.emptySet(), true));
  487. assertEquals(grid, event.get().getComponent());
  488. assertEquals(new LinkedHashSet<>(Arrays.asList(value)),
  489. event.get().getValue());
  490. assertTrue(event.get().isUserOriginated());
  491. }
  492. @Test
  493. public void selectAllCheckboxVisible__inMemoryDataProvider() {
  494. UI ui = new MockUI();
  495. Grid<String> grid = new Grid<>();
  496. MultiSelectionModel<String> model = (MultiSelectionModel<String>) grid
  497. .setSelectionMode(SelectionMode.MULTI);
  498. ui.setContent(grid);
  499. // no items yet, default data provider is empty not in memory one
  500. assertFalse(model.isSelectAllCheckBoxVisible());
  501. assertEquals(SelectAllCheckBoxVisibility.DEFAULT,
  502. model.getSelectAllCheckBoxVisibility());
  503. grid.setItems("Foo", "Bar", "Baz");
  504. // in-memory container keeps default
  505. assertTrue(model.isSelectAllCheckBoxVisible());
  506. assertEquals(SelectAllCheckBoxVisibility.DEFAULT,
  507. model.getSelectAllCheckBoxVisibility());
  508. // change to explicit NO
  509. model.setSelectAllCheckBoxVisibility(
  510. SelectAllCheckBoxVisibility.HIDDEN);
  511. assertEquals(SelectAllCheckBoxVisibility.HIDDEN,
  512. model.getSelectAllCheckBoxVisibility());
  513. assertFalse(model.isSelectAllCheckBoxVisible());
  514. // change to explicit YES
  515. model.setSelectAllCheckBoxVisibility(
  516. SelectAllCheckBoxVisibility.VISIBLE);
  517. assertEquals(SelectAllCheckBoxVisibility.VISIBLE,
  518. model.getSelectAllCheckBoxVisibility());
  519. assertTrue(model.isSelectAllCheckBoxVisible());
  520. }
  521. @Test
  522. public void selectAllCheckboxVisible__lazyDataProvider() {
  523. Grid<String> grid = new Grid<>();
  524. UI ui = new MockUI();
  525. ui.setContent(grid);
  526. MultiSelectionModel<String> model = (MultiSelectionModel<String>) grid
  527. .setSelectionMode(SelectionMode.MULTI);
  528. // no items yet, default data provider is empty not in memory one
  529. assertFalse(model.isSelectAllCheckBoxVisible());
  530. assertEquals(SelectAllCheckBoxVisibility.DEFAULT,
  531. model.getSelectAllCheckBoxVisibility());
  532. grid.setDataProvider(
  533. DataProvider
  534. .fromCallbacks(
  535. query -> IntStream
  536. .range(query.getOffset(),
  537. Math.max(query.getOffset()
  538. + query.getLimit() + 1,
  539. 1000))
  540. .mapToObj(i -> "Item " + i),
  541. query -> 1000));
  542. // not in-memory -> checkbox is hidden
  543. assertFalse(model.isSelectAllCheckBoxVisible());
  544. assertEquals(SelectAllCheckBoxVisibility.DEFAULT,
  545. model.getSelectAllCheckBoxVisibility());
  546. // change to explicit YES
  547. model.setSelectAllCheckBoxVisibility(
  548. SelectAllCheckBoxVisibility.VISIBLE);
  549. assertEquals(SelectAllCheckBoxVisibility.VISIBLE,
  550. model.getSelectAllCheckBoxVisibility());
  551. assertTrue(model.isSelectAllCheckBoxVisible());
  552. // change to explicit NO
  553. model.setSelectAllCheckBoxVisibility(
  554. SelectAllCheckBoxVisibility.HIDDEN);
  555. assertEquals(SelectAllCheckBoxVisibility.HIDDEN,
  556. model.getSelectAllCheckBoxVisibility());
  557. assertFalse(model.isSelectAllCheckBoxVisible());
  558. // change back to depends on data provider
  559. model.setSelectAllCheckBoxVisibility(
  560. SelectAllCheckBoxVisibility.DEFAULT);
  561. assertFalse(model.isSelectAllCheckBoxVisible());
  562. assertEquals(SelectAllCheckBoxVisibility.DEFAULT,
  563. model.getSelectAllCheckBoxVisibility());
  564. }
  565. }