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.

MultiSelectionModelTest.java 7.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package com.vaadin.v7.tests.server.component.grid;
  2. import static org.junit.Assert.assertFalse;
  3. import static org.junit.Assert.assertTrue;
  4. import static org.junit.Assert.fail;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.Collections;
  8. import java.util.List;
  9. import org.junit.After;
  10. import org.junit.Before;
  11. import org.junit.Test;
  12. import com.vaadin.ui.ComponentTest;
  13. import com.vaadin.v7.data.Container;
  14. import com.vaadin.v7.data.util.IndexedContainer;
  15. import com.vaadin.v7.event.SelectionEvent;
  16. import com.vaadin.v7.event.SelectionEvent.SelectionListener;
  17. import com.vaadin.v7.shared.ui.grid.selection.MultiSelectionModelServerRpc;
  18. import com.vaadin.v7.shared.ui.grid.selection.MultiSelectionModelState;
  19. import com.vaadin.v7.ui.Grid;
  20. import com.vaadin.v7.ui.Grid.SelectionModel.HasUserSelectionAllowed;
  21. public class MultiSelectionModelTest {
  22. private static class MultiSelectionModel
  23. extends com.vaadin.v7.ui.Grid.MultiSelectionModel {
  24. @Override
  25. protected MultiSelectionModelState getState() {
  26. // Overridden to be accessible from test
  27. return super.getState();
  28. }
  29. }
  30. private Object itemId1Present = "itemId1Present";
  31. private Object itemId2Present = "itemId2Present";
  32. private Object itemId3Present = "itemId3Present";
  33. private Object itemIdNotPresent = "itemIdNotPresent";
  34. private Container.Indexed dataSource;
  35. private MultiSelectionModel model;
  36. private Grid grid;
  37. private boolean expectingEvent = false;
  38. private boolean expectingDeselectEvent;
  39. private List<Object> select = new ArrayList<Object>();
  40. private List<Object> deselect = new ArrayList<Object>();
  41. @Before
  42. public void setUp() {
  43. dataSource = createDataSource();
  44. grid = new Grid(dataSource);
  45. model = new MultiSelectionModel();
  46. grid.setSelectionModel(model);
  47. }
  48. @After
  49. public void tearDown() {
  50. assertFalse("Some expected select event did not happen.",
  51. expectingEvent);
  52. assertFalse("Some expected deselect event did not happen.",
  53. expectingDeselectEvent);
  54. }
  55. private IndexedContainer createDataSource() {
  56. final IndexedContainer container = new IndexedContainer();
  57. container.addItem(itemId1Present);
  58. container.addItem(itemId2Present);
  59. container.addItem(itemId3Present);
  60. for (int i = 3; i < 10; i++) {
  61. container.addItem(new Object());
  62. }
  63. return container;
  64. }
  65. @Test
  66. public void testSelectAndDeselectRow() throws Throwable {
  67. try {
  68. expectSelectEvent(itemId1Present);
  69. model.select(itemId1Present);
  70. expectDeselectEvent(itemId1Present);
  71. model.deselect(itemId1Present);
  72. } catch (Exception e) {
  73. throw e.getCause();
  74. }
  75. verifyCurrentSelection();
  76. }
  77. @Test
  78. public void testAddSelection() throws Throwable {
  79. try {
  80. expectSelectEvent(itemId1Present);
  81. model.select(itemId1Present);
  82. expectSelectEvent(itemId2Present);
  83. model.select(itemId2Present);
  84. } catch (Exception e) {
  85. throw e.getCause();
  86. }
  87. verifyCurrentSelection(itemId1Present, itemId2Present);
  88. }
  89. @Test
  90. public void testSelectAllWithoutItems() throws Throwable {
  91. assertFalse(model.getState().allSelected);
  92. dataSource.removeAllItems();
  93. assertFalse(model.getState().allSelected);
  94. model.select();
  95. assertFalse(model.getState().allSelected);
  96. model.deselect();
  97. assertFalse(model.getState().allSelected);
  98. }
  99. @Test
  100. public void testSettingSelection() throws Throwable {
  101. try {
  102. expectSelectEvent(itemId2Present, itemId1Present);
  103. model.setSelected(Arrays
  104. .asList(new Object[] { itemId1Present, itemId2Present }));
  105. verifyCurrentSelection(itemId1Present, itemId2Present);
  106. expectDeselectEvent(itemId1Present);
  107. expectSelectEvent(itemId3Present);
  108. model.setSelected(Arrays
  109. .asList(new Object[] { itemId3Present, itemId2Present }));
  110. verifyCurrentSelection(itemId3Present, itemId2Present);
  111. } catch (Exception e) {
  112. throw e.getCause();
  113. }
  114. }
  115. private void expectSelectEvent(Object... selectArray) {
  116. select = Arrays.asList(selectArray);
  117. addListener();
  118. }
  119. private void expectDeselectEvent(Object... deselectArray) {
  120. deselect = Arrays.asList(deselectArray);
  121. addListener();
  122. }
  123. private void addListener() {
  124. if (expectingEvent) {
  125. return;
  126. }
  127. expectingEvent = true;
  128. grid.addSelectionListener(new SelectionListener() {
  129. @Override
  130. public void select(SelectionEvent event) {
  131. assertTrue("Selection did not contain expected items",
  132. event.getAdded().containsAll(select));
  133. assertTrue("Selection contained unexpected items",
  134. select.containsAll(event.getAdded()));
  135. select = new ArrayList<Object>();
  136. assertTrue("Deselection did not contain expected items",
  137. event.getRemoved().containsAll(deselect));
  138. assertTrue("Deselection contained unexpected items",
  139. deselect.containsAll(event.getRemoved()));
  140. deselect = new ArrayList<Object>();
  141. grid.removeSelectionListener(this);
  142. expectingEvent = false;
  143. }
  144. });
  145. }
  146. private void verifyCurrentSelection(Object... selection) {
  147. final List<Object> selected = Arrays.asList(selection);
  148. if (model.getSelectedRows().containsAll(selected)
  149. && selected.containsAll(model.getSelectedRows())) {
  150. return;
  151. }
  152. fail("Not all items were correctly selected");
  153. }
  154. @Test(expected = IllegalStateException.class)
  155. public void refuseSelectWhenUserSelectionDisallowed() {
  156. ((HasUserSelectionAllowed) grid.getSelectionModel())
  157. .setUserSelectionAllowed(false);
  158. MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
  159. grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
  160. serverRpc.select(Collections.singletonList("a"));
  161. }
  162. @Test(expected = IllegalStateException.class)
  163. public void refuseDeselectWhenUserSelectionDisallowed() {
  164. ((HasUserSelectionAllowed) grid.getSelectionModel())
  165. .setUserSelectionAllowed(false);
  166. MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
  167. grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
  168. serverRpc.deselect(Collections.singletonList("a"));
  169. }
  170. @Test(expected = IllegalStateException.class)
  171. public void refuseSelectAllWhenUserSelectionDisallowed() {
  172. ((HasUserSelectionAllowed) grid.getSelectionModel())
  173. .setUserSelectionAllowed(false);
  174. MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
  175. grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
  176. serverRpc.selectAll();
  177. }
  178. @Test(expected = IllegalStateException.class)
  179. public void refuseDeselectAllWhenUserSelectionDisallowed() {
  180. ((HasUserSelectionAllowed) grid.getSelectionModel())
  181. .setUserSelectionAllowed(false);
  182. MultiSelectionModelServerRpc serverRpc = ComponentTest.getRpcProxy(
  183. grid.getSelectionModel(), MultiSelectionModelServerRpc.class);
  184. serverRpc.deselectAll();
  185. }
  186. }