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.

GridTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. package com.vaadin.tests.server.component.grid;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertNotNull;
  5. import java.util.ArrayList;
  6. import java.util.Arrays;
  7. import java.util.HashSet;
  8. import java.util.List;
  9. import java.util.Optional;
  10. import java.util.Set;
  11. import java.util.concurrent.atomic.AtomicReference;
  12. import java.util.stream.Collectors;
  13. import java.util.stream.Stream;
  14. import org.easymock.Capture;
  15. import org.junit.Assert;
  16. import org.junit.Before;
  17. import org.junit.Test;
  18. import com.vaadin.data.Binder.Binding;
  19. import com.vaadin.data.ValidationException;
  20. import com.vaadin.data.ValueProvider;
  21. import com.vaadin.data.provider.GridSortOrder;
  22. import com.vaadin.data.provider.bov.Person;
  23. import com.vaadin.event.selection.SelectionEvent;
  24. import com.vaadin.shared.data.sort.SortDirection;
  25. import com.vaadin.shared.ui.grid.HeightMode;
  26. import com.vaadin.tests.util.MockUI;
  27. import com.vaadin.ui.Grid;
  28. import com.vaadin.ui.Grid.Column;
  29. import com.vaadin.ui.Grid.SelectionMode;
  30. import com.vaadin.ui.TextField;
  31. import com.vaadin.ui.renderers.NumberRenderer;
  32. import elemental.json.Json;
  33. import elemental.json.JsonObject;
  34. public class GridTest {
  35. private Grid<String> grid;
  36. @Before
  37. public void setUp() {
  38. grid = new Grid<>();
  39. grid.addColumn(ValueProvider.identity()).setId("foo");
  40. grid.addColumn(String::length, new NumberRenderer());
  41. grid.addColumn(string -> new Object());
  42. grid.addColumn(ValueProvider.identity()).setId("randomColumnId");
  43. }
  44. @Test
  45. public void testGridHeightModeChange() {
  46. assertEquals("Initial height mode was not CSS", HeightMode.CSS,
  47. grid.getHeightMode());
  48. grid.setHeightByRows(13.24);
  49. assertEquals("Setting height by rows did not change height mode",
  50. HeightMode.ROW, grid.getHeightMode());
  51. grid.setHeight("100px");
  52. assertEquals("Setting height did not change height mode.",
  53. HeightMode.CSS, grid.getHeightMode());
  54. }
  55. @Test(expected = IllegalArgumentException.class)
  56. public void testFrozenColumnCountTooBig() {
  57. grid.setFrozenColumnCount(5);
  58. }
  59. @Test(expected = IllegalArgumentException.class)
  60. public void testFrozenColumnCountTooSmall() {
  61. grid.setFrozenColumnCount(-2);
  62. }
  63. @Test()
  64. public void testSetFrozenColumnCount() {
  65. for (int i = -1; i < 2; ++i) {
  66. grid.setFrozenColumnCount(i);
  67. assertEquals("Frozen column count not updated", i,
  68. grid.getFrozenColumnCount());
  69. }
  70. }
  71. @Test
  72. public void testGridColumnIdentifier() {
  73. grid.getColumn("foo").setCaption("Bar");
  74. assertEquals("Column header not updated correctly", "Bar",
  75. grid.getHeaderRow(0).getCell("foo").getText());
  76. }
  77. @Test(expected = IllegalArgumentException.class)
  78. public void testGridMultipleColumnsWithSameIdentifier() {
  79. grid.addColumn(t -> t).setId("foo");
  80. }
  81. @Test
  82. public void testAddSelectionListener_singleSelectMode() {
  83. grid.setItems("foo", "bar", "baz");
  84. Capture<SelectionEvent<String>> eventCapture = new Capture<>();
  85. grid.addSelectionListener(event -> eventCapture.setValue(event));
  86. grid.getSelectionModel().select("foo");
  87. SelectionEvent<String> event = eventCapture.getValue();
  88. assertNotNull(event);
  89. assertFalse(event.isUserOriginated());
  90. assertEquals("foo", event.getFirstSelectedItem().get());
  91. assertEquals("foo",
  92. event.getAllSelectedItems().stream().findFirst().get());
  93. grid.getSelectionModel().select("bar");
  94. event = eventCapture.getValue();
  95. assertNotNull(event);
  96. assertFalse(event.isUserOriginated());
  97. assertEquals("bar", event.getFirstSelectedItem().get());
  98. assertEquals("bar",
  99. event.getAllSelectedItems().stream().findFirst().get());
  100. grid.getSelectionModel().deselect("bar");
  101. event = eventCapture.getValue();
  102. assertNotNull(event);
  103. assertFalse(event.isUserOriginated());
  104. assertEquals(Optional.empty(), event.getFirstSelectedItem());
  105. assertEquals(0, event.getAllSelectedItems().size());
  106. }
  107. @Test
  108. public void testAddSelectionListener_multiSelectMode() {
  109. grid.setItems("foo", "bar", "baz");
  110. grid.setSelectionMode(SelectionMode.MULTI);
  111. Capture<SelectionEvent<String>> eventCapture = new Capture<>();
  112. grid.addSelectionListener(event -> eventCapture.setValue(event));
  113. grid.getSelectionModel().select("foo");
  114. SelectionEvent<String> event = eventCapture.getValue();
  115. assertNotNull(event);
  116. assertFalse(event.isUserOriginated());
  117. assertEquals("foo", event.getFirstSelectedItem().get());
  118. assertEquals("foo",
  119. event.getAllSelectedItems().stream().findFirst().get());
  120. grid.getSelectionModel().select("bar");
  121. event = eventCapture.getValue();
  122. assertNotNull(event);
  123. assertFalse(event.isUserOriginated());
  124. assertEquals("foo", event.getFirstSelectedItem().get());
  125. assertEquals("foo",
  126. event.getAllSelectedItems().stream().findFirst().get());
  127. Assert.assertArrayEquals(new String[] { "foo", "bar" },
  128. event.getAllSelectedItems().toArray(new String[2]));
  129. grid.getSelectionModel().deselect("foo");
  130. event = eventCapture.getValue();
  131. assertNotNull(event);
  132. assertFalse(event.isUserOriginated());
  133. assertEquals("bar", event.getFirstSelectedItem().get());
  134. assertEquals("bar",
  135. event.getAllSelectedItems().stream().findFirst().get());
  136. Assert.assertArrayEquals(new String[] { "bar" },
  137. event.getAllSelectedItems().toArray(new String[1]));
  138. grid.getSelectionModel().deselectAll();
  139. event = eventCapture.getValue();
  140. assertNotNull(event);
  141. assertFalse(event.isUserOriginated());
  142. assertEquals(Optional.empty(), event.getFirstSelectedItem());
  143. assertEquals(0, event.getAllSelectedItems().size());
  144. }
  145. @Test(expected = UnsupportedOperationException.class)
  146. public void testAddSelectionListener_noSelectionMode() {
  147. grid.setSelectionMode(SelectionMode.NONE);
  148. grid.addSelectionListener(
  149. event -> Assert.fail("never ever happens (tm)"));
  150. }
  151. @Test
  152. public void sortByColumn_sortOrderIsAscendingOneColumn() {
  153. Column<String, ?> column = grid.getColumns().get(1);
  154. grid.sort(column);
  155. GridSortOrder<String> sortOrder = grid.getSortOrder().get(0);
  156. Assert.assertEquals(column, sortOrder.getSorted());
  157. Assert.assertEquals(SortDirection.ASCENDING, sortOrder.getDirection());
  158. }
  159. @Test
  160. public void sortByColumnDesc_sortOrderIsDescendingOneColumn() {
  161. Column<String, ?> column = grid.getColumns().get(1);
  162. grid.sort(column, SortDirection.DESCENDING);
  163. GridSortOrder<String> sortOrder = grid.getSortOrder().get(0);
  164. Assert.assertEquals(column, sortOrder.getSorted());
  165. Assert.assertEquals(SortDirection.DESCENDING, sortOrder.getDirection());
  166. }
  167. @Test
  168. public void setSortOrder() {
  169. Column<String, ?> column1 = grid.getColumns().get(1);
  170. Column<String, ?> column2 = grid.getColumns().get(2);
  171. List<GridSortOrder<String>> order = Arrays.asList(
  172. new GridSortOrder<>(column2, SortDirection.DESCENDING),
  173. new GridSortOrder<>(column1, SortDirection.ASCENDING));
  174. grid.setSortOrder(order);
  175. List<GridSortOrder<String>> sortOrder = grid.getSortOrder();
  176. Assert.assertEquals(column2, sortOrder.get(0).getSorted());
  177. Assert.assertEquals(SortDirection.DESCENDING,
  178. sortOrder.get(0).getDirection());
  179. Assert.assertEquals(column1, sortOrder.get(1).getSorted());
  180. Assert.assertEquals(SortDirection.ASCENDING,
  181. sortOrder.get(1).getDirection());
  182. }
  183. @Test
  184. public void clearSortOrder() {
  185. Column<String, ?> column = grid.getColumns().get(1);
  186. grid.sort(column);
  187. grid.clearSortOrder();
  188. assertEquals(0, grid.getSortOrder().size());
  189. }
  190. @Test
  191. public void sortListener_eventIsFired() {
  192. Column<String, ?> column1 = grid.getColumns().get(1);
  193. Column<String, ?> column2 = grid.getColumns().get(2);
  194. List<GridSortOrder<String>> list = new ArrayList<>();
  195. AtomicReference<Boolean> fired = new AtomicReference<>();
  196. grid.addSortListener(event -> {
  197. Assert.assertTrue(list.isEmpty());
  198. fired.set(true);
  199. list.addAll(event.getSortOrder());
  200. });
  201. grid.sort(column1, SortDirection.DESCENDING);
  202. Assert.assertEquals(column1, list.get(0).getSorted());
  203. Assert.assertEquals(SortDirection.DESCENDING,
  204. list.get(0).getDirection());
  205. List<GridSortOrder<String>> order = Arrays.asList(
  206. new GridSortOrder<>(column2, SortDirection.DESCENDING),
  207. new GridSortOrder<>(column1, SortDirection.ASCENDING));
  208. list.clear();
  209. grid.setSortOrder(order);
  210. Assert.assertEquals(column2, list.get(0).getSorted());
  211. Assert.assertEquals(SortDirection.DESCENDING,
  212. list.get(0).getDirection());
  213. Assert.assertEquals(column1, list.get(1).getSorted());
  214. Assert.assertEquals(SortDirection.ASCENDING,
  215. list.get(1).getDirection());
  216. list.clear();
  217. fired.set(false);
  218. grid.clearSortOrder();
  219. Assert.assertEquals(0, list.size());
  220. Assert.assertTrue(fired.get());
  221. }
  222. @Test
  223. public void beanGrid() {
  224. Grid<Person> grid = new Grid<>(Person.class);
  225. Column<Person, ?> nameColumn = grid.getColumn("name");
  226. Column<Person, ?> bornColumn = grid.getColumn("born");
  227. Assert.assertNotNull(nameColumn);
  228. Assert.assertNotNull(bornColumn);
  229. Assert.assertEquals("Name", nameColumn.getCaption());
  230. Assert.assertEquals("Born", bornColumn.getCaption());
  231. JsonObject json = getRowData(grid, new Person("Lorem", 2000));
  232. Set<String> values = Stream.of(json.keys()).map(json::getString)
  233. .collect(Collectors.toSet());
  234. Assert.assertEquals(new HashSet<>(Arrays.asList("Lorem", "2000")),
  235. values);
  236. }
  237. @Test
  238. public void beanGrid_editor() throws ValidationException {
  239. Grid<Person> grid = new Grid<>(Person.class);
  240. Column<Person, ?> nameColumn = grid.getColumn("name");
  241. TextField nameField = new TextField();
  242. nameColumn.setEditorComponent(nameField);
  243. Optional<Binding<Person, ?>> maybeBinding = grid.getEditor().getBinder()
  244. .getBinding("name");
  245. Assert.assertTrue(maybeBinding.isPresent());
  246. Binding<Person, ?> binding = maybeBinding.get();
  247. Assert.assertSame(nameField, binding.getField());
  248. Person person = new Person("Lorem", 2000);
  249. grid.getEditor().getBinder().setBean(person);
  250. Assert.assertEquals("Lorem", nameField.getValue());
  251. nameField.setValue("Ipsum");
  252. Assert.assertEquals("Ipsum", person.getName());
  253. }
  254. @Test(expected = IllegalStateException.class)
  255. public void oneArgSetEditor_nonBeanGrid() {
  256. Grid<Person> grid = new Grid<>();
  257. Column<Person, String> nameCol = grid.addColumn(Person::getName)
  258. .setId("name");
  259. nameCol.setEditorComponent(new TextField());
  260. }
  261. @Test(expected = IllegalStateException.class)
  262. public void addExistingColumnById_throws() {
  263. Grid<Person> grid = new Grid<>(Person.class);
  264. grid.addColumn("name");
  265. }
  266. private static <T> JsonObject getRowData(Grid<T> grid, T row) {
  267. JsonObject json = Json.createObject();
  268. if (grid.getColumns().isEmpty()) {
  269. return json;
  270. }
  271. // generateData only works if Grid is attached
  272. new MockUI().setContent(grid);
  273. grid.getColumns().forEach(column -> column.generateData(row, json));
  274. // Detach again
  275. grid.getUI().setContent(null);
  276. return json.getObject("d");
  277. }
  278. }