Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

GridColumnsTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. /*
  2. * Copyright 2000-2016 Vaadin Ltd.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.vaadin.tests.server.component.grid;
  17. import static org.easymock.EasyMock.and;
  18. import static org.easymock.EasyMock.capture;
  19. import static org.easymock.EasyMock.isA;
  20. import static org.hamcrest.MatcherAssert.assertThat;
  21. import static org.hamcrest.core.Is.is;
  22. import static org.junit.Assert.assertEquals;
  23. import static org.junit.Assert.assertFalse;
  24. import static org.junit.Assert.assertNotNull;
  25. import static org.junit.Assert.assertNull;
  26. import static org.junit.Assert.assertSame;
  27. import static org.junit.Assert.assertTrue;
  28. import static org.junit.Assert.fail;
  29. import java.lang.reflect.Field;
  30. import java.lang.reflect.Method;
  31. import java.util.Iterator;
  32. import java.util.LinkedHashSet;
  33. import java.util.Set;
  34. import com.vaadin.ui.LegacyGrid;
  35. import org.easymock.Capture;
  36. import org.easymock.EasyMock;
  37. import org.junit.Before;
  38. import org.junit.Test;
  39. import com.vaadin.data.util.IndexedContainer;
  40. import com.vaadin.server.KeyMapper;
  41. import com.vaadin.shared.ui.grid.GridColumnState;
  42. import com.vaadin.shared.ui.grid.GridState;
  43. import com.vaadin.shared.util.SharedUtil;
  44. import com.vaadin.ui.LegacyGrid.Column;
  45. import com.vaadin.ui.LegacyGrid.ColumnResizeEvent;
  46. import com.vaadin.ui.LegacyGrid.ColumnResizeListener;
  47. import com.vaadin.v7.ui.LegacyTextField;
  48. public class GridColumnsTest {
  49. private LegacyGrid grid;
  50. private GridState state;
  51. private Method getStateMethod;
  52. private Field columnIdGeneratorField;
  53. private KeyMapper<Object> columnIdMapper;
  54. @Before
  55. @SuppressWarnings("unchecked")
  56. public void setup() throws Exception {
  57. IndexedContainer ds = new IndexedContainer();
  58. for (int c = 0; c < 10; c++) {
  59. ds.addContainerProperty("column" + c, String.class, "");
  60. }
  61. ds.addContainerProperty("noSort", Object.class, null);
  62. grid = new LegacyGrid(ds);
  63. getStateMethod = LegacyGrid.class.getDeclaredMethod("getState");
  64. getStateMethod.setAccessible(true);
  65. state = (GridState) getStateMethod.invoke(grid);
  66. columnIdGeneratorField = LegacyGrid.class.getDeclaredField("columnKeys");
  67. columnIdGeneratorField.setAccessible(true);
  68. columnIdMapper = (KeyMapper<Object>) columnIdGeneratorField.get(grid);
  69. }
  70. @Test
  71. public void testColumnGeneration() throws Exception {
  72. for (Object propertyId : grid.getContainerDataSource()
  73. .getContainerPropertyIds()) {
  74. // All property ids should get a column
  75. Column column = grid.getColumn(propertyId);
  76. assertNotNull(column);
  77. // Humanized property id should be the column header by default
  78. assertEquals(
  79. SharedUtil.camelCaseToHumanFriendly(propertyId.toString()),
  80. grid.getDefaultHeaderRow().getCell(propertyId).getText());
  81. }
  82. }
  83. @Test
  84. public void testModifyingColumnProperties() throws Exception {
  85. // Modify first column
  86. Column column = grid.getColumn("column1");
  87. assertNotNull(column);
  88. column.setHeaderCaption("CustomHeader");
  89. assertEquals("CustomHeader", column.getHeaderCaption());
  90. assertEquals(column.getHeaderCaption(),
  91. grid.getDefaultHeaderRow().getCell("column1").getText());
  92. column.setWidth(100);
  93. assertEquals(100, column.getWidth(), 0.49d);
  94. assertEquals(column.getWidth(), getColumnState("column1").width, 0.49d);
  95. try {
  96. column.setWidth(-1);
  97. fail("Setting width to -1 should throw exception");
  98. } catch (IllegalArgumentException iae) {
  99. // expected
  100. }
  101. assertEquals(100, column.getWidth(), 0.49d);
  102. assertEquals(100, getColumnState("column1").width, 0.49d);
  103. }
  104. @Test
  105. public void testRemovingColumnByRemovingPropertyFromContainer()
  106. throws Exception {
  107. Column column = grid.getColumn("column1");
  108. assertNotNull(column);
  109. // Remove column
  110. grid.getContainerDataSource().removeContainerProperty("column1");
  111. try {
  112. column.setHeaderCaption("asd");
  113. fail("Succeeded in modifying a detached column");
  114. } catch (IllegalStateException ise) {
  115. // Detached state should throw exception
  116. }
  117. try {
  118. column.setWidth(123);
  119. fail("Succeeded in modifying a detached column");
  120. } catch (IllegalStateException ise) {
  121. // Detached state should throw exception
  122. }
  123. assertNull(grid.getColumn("column1"));
  124. assertNull(getColumnState("column1"));
  125. }
  126. @Test
  127. public void testAddingColumnByAddingPropertyToContainer() throws Exception {
  128. grid.getContainerDataSource().addContainerProperty("columnX",
  129. String.class, "");
  130. Column column = grid.getColumn("columnX");
  131. assertNotNull(column);
  132. }
  133. @Test
  134. public void testHeaderVisiblility() throws Exception {
  135. assertTrue(grid.isHeaderVisible());
  136. assertTrue(state.header.visible);
  137. grid.setHeaderVisible(false);
  138. assertFalse(grid.isHeaderVisible());
  139. assertFalse(state.header.visible);
  140. grid.setHeaderVisible(true);
  141. assertTrue(grid.isHeaderVisible());
  142. assertTrue(state.header.visible);
  143. }
  144. @Test
  145. public void testFooterVisibility() throws Exception {
  146. assertTrue(grid.isFooterVisible());
  147. assertTrue(state.footer.visible);
  148. grid.setFooterVisible(false);
  149. assertFalse(grid.isFooterVisible());
  150. assertFalse(state.footer.visible);
  151. grid.setFooterVisible(true);
  152. assertTrue(grid.isFooterVisible());
  153. assertTrue(state.footer.visible);
  154. }
  155. @Test
  156. public void testSetFrozenColumnCount() {
  157. assertEquals("Grid should not start with a frozen column", 0,
  158. grid.getFrozenColumnCount());
  159. grid.setFrozenColumnCount(2);
  160. assertEquals("Freezing two columns should freeze two columns", 2,
  161. grid.getFrozenColumnCount());
  162. }
  163. @Test
  164. public void testSetFrozenColumnCountThroughColumn() {
  165. assertEquals("Grid should not start with a frozen column", 0,
  166. grid.getFrozenColumnCount());
  167. grid.getColumns().get(2).setLastFrozenColumn();
  168. assertEquals(
  169. "Setting the third column as last frozen should freeze three columns",
  170. 3, grid.getFrozenColumnCount());
  171. }
  172. @Test
  173. public void testFrozenColumnRemoveColumn() {
  174. assertEquals("Grid should not start with a frozen column", 0,
  175. grid.getFrozenColumnCount());
  176. int containerSize = grid.getContainerDataSource()
  177. .getContainerPropertyIds().size();
  178. grid.setFrozenColumnCount(containerSize);
  179. Object propertyId = grid.getContainerDataSource()
  180. .getContainerPropertyIds().iterator().next();
  181. grid.getContainerDataSource().removeContainerProperty(propertyId);
  182. assertEquals("Frozen column count should update when removing last row",
  183. containerSize - 1, grid.getFrozenColumnCount());
  184. }
  185. @Test
  186. public void testReorderColumns() {
  187. Set<?> containerProperties = new LinkedHashSet<Object>(
  188. grid.getContainerDataSource().getContainerPropertyIds());
  189. Object[] properties = new Object[] { "column3", "column2", "column6" };
  190. grid.setColumnOrder(properties);
  191. int i = 0;
  192. // Test sorted columns are first in order
  193. for (Object property : properties) {
  194. containerProperties.remove(property);
  195. assertEquals(columnIdMapper.key(property),
  196. state.columnOrder.get(i++));
  197. }
  198. // Test remaining columns are in original order
  199. for (Object property : containerProperties) {
  200. assertEquals(columnIdMapper.key(property),
  201. state.columnOrder.get(i++));
  202. }
  203. try {
  204. grid.setColumnOrder("foo", "bar", "baz");
  205. fail("Grid allowed sorting with non-existent properties");
  206. } catch (IllegalArgumentException e) {
  207. // All ok
  208. }
  209. }
  210. @Test(expected = IllegalArgumentException.class)
  211. public void testRemoveColumnThatDoesNotExist() {
  212. grid.removeColumn("banana phone");
  213. }
  214. @Test(expected = IllegalStateException.class)
  215. public void testSetNonSortableColumnSortable() {
  216. Column noSortColumn = grid.getColumn("noSort");
  217. assertFalse("Object property column should not be sortable.",
  218. noSortColumn.isSortable());
  219. noSortColumn.setSortable(true);
  220. }
  221. @Test
  222. public void testColumnsEditableByDefault() {
  223. for (Column c : grid.getColumns()) {
  224. assertTrue(c + " should be editable", c.isEditable());
  225. }
  226. }
  227. @Test
  228. public void testPropertyAndColumnEditorFieldsMatch() {
  229. Column column1 = grid.getColumn("column1");
  230. column1.setEditorField(new LegacyTextField());
  231. assertSame(column1.getEditorField(),
  232. grid.getColumn("column1").getEditorField());
  233. Column column2 = grid.getColumn("column2");
  234. column2.setEditorField(new LegacyTextField());
  235. assertSame(column2.getEditorField(), column2.getEditorField());
  236. }
  237. @Test
  238. public void testUneditableColumnHasNoField() {
  239. Column col = grid.getColumn("column1");
  240. col.setEditable(false);
  241. assertFalse("Column should be uneditable", col.isEditable());
  242. assertNull("Uneditable column should not be auto-assigned a Field",
  243. col.getEditorField());
  244. }
  245. private GridColumnState getColumnState(Object propertyId) {
  246. String columnId = columnIdMapper.key(propertyId);
  247. for (GridColumnState columnState : state.columns) {
  248. if (columnState.id.equals(columnId)) {
  249. return columnState;
  250. }
  251. }
  252. return null;
  253. }
  254. @Test
  255. public void testAddAndRemoveSortableColumn() {
  256. boolean sortable = grid.getColumn("column1").isSortable();
  257. grid.removeColumn("column1");
  258. grid.addColumn("column1");
  259. assertEquals("Column sortability changed when re-adding", sortable,
  260. grid.getColumn("column1").isSortable());
  261. }
  262. @Test
  263. public void testSetColumns() {
  264. grid.setColumns("column7", "column0", "column9");
  265. Iterator<Column> it = grid.getColumns().iterator();
  266. assertEquals(it.next().getPropertyId(), "column7");
  267. assertEquals(it.next().getPropertyId(), "column0");
  268. assertEquals(it.next().getPropertyId(), "column9");
  269. assertFalse(it.hasNext());
  270. }
  271. @Test
  272. public void testAddingColumnsWithSetColumns() {
  273. LegacyGrid g = new LegacyGrid();
  274. g.setColumns("c1", "c2", "c3");
  275. Iterator<Column> it = g.getColumns().iterator();
  276. assertEquals(it.next().getPropertyId(), "c1");
  277. assertEquals(it.next().getPropertyId(), "c2");
  278. assertEquals(it.next().getPropertyId(), "c3");
  279. assertFalse(it.hasNext());
  280. }
  281. @Test(expected = IllegalStateException.class)
  282. public void testAddingColumnsWithSetColumnsNonDefaultContainer() {
  283. grid.setColumns("column1", "column2", "column50");
  284. }
  285. @Test
  286. public void testDefaultColumnHidingToggleCaption() {
  287. Column firstColumn = grid.getColumns().get(0);
  288. firstColumn.setHeaderCaption("headerCaption");
  289. assertEquals(null, firstColumn.getHidingToggleCaption());
  290. }
  291. @Test
  292. public void testOverriddenColumnHidingToggleCaption() {
  293. Column firstColumn = grid.getColumns().get(0);
  294. firstColumn.setHidingToggleCaption("hidingToggleCaption");
  295. firstColumn.setHeaderCaption("headerCaption");
  296. assertEquals("hidingToggleCaption",
  297. firstColumn.getHidingToggleCaption());
  298. }
  299. @Test
  300. public void testColumnSetWidthFiresResizeEvent() {
  301. final Column firstColumn = grid.getColumns().get(0);
  302. // prepare a listener mock that captures the argument
  303. ColumnResizeListener mock = EasyMock
  304. .createMock(ColumnResizeListener.class);
  305. Capture<ColumnResizeEvent> capturedEvent = new Capture<ColumnResizeEvent>();
  306. mock.columnResize(
  307. and(capture(capturedEvent), isA(ColumnResizeEvent.class)));
  308. EasyMock.expectLastCall().once();
  309. // Tell it to wait for the call
  310. EasyMock.replay(mock);
  311. // Cause a resize event
  312. grid.addColumnResizeListener(mock);
  313. firstColumn.setWidth(firstColumn.getWidth() + 10);
  314. // Verify the method was called
  315. EasyMock.verify(mock);
  316. // Asserts on the captured event
  317. ColumnResizeEvent event = capturedEvent.getValue();
  318. assertEquals("Event column was not first column.", firstColumn,
  319. event.getColumn());
  320. assertFalse("Event should not be userOriginated",
  321. event.isUserOriginated());
  322. }
  323. @Test
  324. public void textHeaderCaptionIsReturned() {
  325. Column firstColumn = grid.getColumns().get(0);
  326. firstColumn.setHeaderCaption("text");
  327. assertThat(firstColumn.getHeaderCaption(), is("text"));
  328. }
  329. @Test
  330. public void defaultCaptionIsReturnedForHtml() {
  331. Column firstColumn = grid.getColumns().get(0);
  332. grid.getDefaultHeaderRow().getCell("column0").setHtml("<b>html</b>");
  333. assertThat(firstColumn.getHeaderCaption(), is("Column0"));
  334. }
  335. }