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.

GridColumnsTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. /*
  2. * Copyright 2000-2014 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 org.easymock.Capture;
  35. import org.easymock.EasyMock;
  36. import org.junit.Before;
  37. import org.junit.Test;
  38. import com.vaadin.data.util.IndexedContainer;
  39. import com.vaadin.legacy.ui.LegacyTextField;
  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.Grid;
  45. import com.vaadin.ui.Grid.Column;
  46. import com.vaadin.ui.Grid.ColumnResizeEvent;
  47. import com.vaadin.ui.Grid.ColumnResizeListener;
  48. public class GridColumnsTest {
  49. private Grid 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 Grid(ds);
  63. getStateMethod = Grid.class.getDeclaredMethod("getState");
  64. getStateMethod.setAccessible(true);
  65. state = (GridState) getStateMethod.invoke(grid);
  66. columnIdGeneratorField = Grid.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(), grid.getDefaultHeaderRow()
  91. .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(
  183. "Frozen column count should update when removing last row",
  184. containerSize - 1, grid.getFrozenColumnCount());
  185. }
  186. @Test
  187. public void testReorderColumns() {
  188. Set<?> containerProperties = new LinkedHashSet<Object>(grid
  189. .getContainerDataSource().getContainerPropertyIds());
  190. Object[] properties = new Object[] { "column3", "column2", "column6" };
  191. grid.setColumnOrder(properties);
  192. int i = 0;
  193. // Test sorted columns are first in order
  194. for (Object property : properties) {
  195. containerProperties.remove(property);
  196. assertEquals(columnIdMapper.key(property),
  197. state.columnOrder.get(i++));
  198. }
  199. // Test remaining columns are in original order
  200. for (Object property : containerProperties) {
  201. assertEquals(columnIdMapper.key(property),
  202. state.columnOrder.get(i++));
  203. }
  204. try {
  205. grid.setColumnOrder("foo", "bar", "baz");
  206. fail("Grid allowed sorting with non-existent properties");
  207. } catch (IllegalArgumentException e) {
  208. // All ok
  209. }
  210. }
  211. @Test(expected = IllegalArgumentException.class)
  212. public void testRemoveColumnThatDoesNotExist() {
  213. grid.removeColumn("banana phone");
  214. }
  215. @Test(expected = IllegalStateException.class)
  216. public void testSetNonSortableColumnSortable() {
  217. Column noSortColumn = grid.getColumn("noSort");
  218. assertFalse("Object property column should not be sortable.",
  219. noSortColumn.isSortable());
  220. noSortColumn.setSortable(true);
  221. }
  222. @Test
  223. public void testColumnsEditableByDefault() {
  224. for (Column c : grid.getColumns()) {
  225. assertTrue(c + " should be editable", c.isEditable());
  226. }
  227. }
  228. @Test
  229. public void testPropertyAndColumnEditorFieldsMatch() {
  230. Column column1 = grid.getColumn("column1");
  231. column1.setEditorField(new LegacyTextField());
  232. assertSame(column1.getEditorField(), grid.getColumn("column1")
  233. .getEditorField());
  234. Column column2 = grid.getColumn("column2");
  235. column2.setEditorField(new LegacyTextField());
  236. assertSame(column2.getEditorField(), column2.getEditorField());
  237. }
  238. @Test
  239. public void testUneditableColumnHasNoField() {
  240. Column col = grid.getColumn("column1");
  241. col.setEditable(false);
  242. assertFalse("Column should be uneditable", col.isEditable());
  243. assertNull("Uneditable column should not be auto-assigned a Field",
  244. col.getEditorField());
  245. }
  246. private GridColumnState getColumnState(Object propertyId) {
  247. String columnId = columnIdMapper.key(propertyId);
  248. for (GridColumnState columnState : state.columns) {
  249. if (columnState.id.equals(columnId)) {
  250. return columnState;
  251. }
  252. }
  253. return null;
  254. }
  255. @Test
  256. public void testAddAndRemoveSortableColumn() {
  257. boolean sortable = grid.getColumn("column1").isSortable();
  258. grid.removeColumn("column1");
  259. grid.addColumn("column1");
  260. assertEquals("Column sortability changed when re-adding", sortable,
  261. grid.getColumn("column1").isSortable());
  262. }
  263. @Test
  264. public void testSetColumns() {
  265. grid.setColumns("column7", "column0", "column9");
  266. Iterator<Column> it = grid.getColumns().iterator();
  267. assertEquals(it.next().getPropertyId(), "column7");
  268. assertEquals(it.next().getPropertyId(), "column0");
  269. assertEquals(it.next().getPropertyId(), "column9");
  270. assertFalse(it.hasNext());
  271. }
  272. @Test
  273. public void testAddingColumnsWithSetColumns() {
  274. Grid g = new Grid();
  275. g.setColumns("c1", "c2", "c3");
  276. Iterator<Column> it = g.getColumns().iterator();
  277. assertEquals(it.next().getPropertyId(), "c1");
  278. assertEquals(it.next().getPropertyId(), "c2");
  279. assertEquals(it.next().getPropertyId(), "c3");
  280. assertFalse(it.hasNext());
  281. }
  282. @Test(expected = IllegalStateException.class)
  283. public void testAddingColumnsWithSetColumnsNonDefaultContainer() {
  284. grid.setColumns("column1", "column2", "column50");
  285. }
  286. @Test
  287. public void testDefaultColumnHidingToggleCaption() {
  288. Column firstColumn = grid.getColumns().get(0);
  289. firstColumn.setHeaderCaption("headerCaption");
  290. assertEquals(null, firstColumn.getHidingToggleCaption());
  291. }
  292. @Test
  293. public void testOverriddenColumnHidingToggleCaption() {
  294. Column firstColumn = grid.getColumns().get(0);
  295. firstColumn.setHidingToggleCaption("hidingToggleCaption");
  296. firstColumn.setHeaderCaption("headerCaption");
  297. assertEquals("hidingToggleCaption",
  298. firstColumn.getHidingToggleCaption());
  299. }
  300. @Test
  301. public void testColumnSetWidthFiresResizeEvent() {
  302. final Column firstColumn = grid.getColumns().get(0);
  303. // prepare a listener mock that captures the argument
  304. ColumnResizeListener mock = EasyMock
  305. .createMock(ColumnResizeListener.class);
  306. Capture<ColumnResizeEvent> capturedEvent = new Capture<ColumnResizeEvent>();
  307. mock.columnResize(and(capture(capturedEvent),
  308. isA(ColumnResizeEvent.class)));
  309. EasyMock.expectLastCall().once();
  310. // Tell it to wait for the call
  311. EasyMock.replay(mock);
  312. // Cause a resize event
  313. grid.addColumnResizeListener(mock);
  314. firstColumn.setWidth(firstColumn.getWidth() + 10);
  315. // Verify the method was called
  316. EasyMock.verify(mock);
  317. // Asserts on the captured event
  318. ColumnResizeEvent event = capturedEvent.getValue();
  319. assertEquals("Event column was not first column.", firstColumn,
  320. event.getColumn());
  321. assertFalse("Event should not be userOriginated",
  322. event.isUserOriginated());
  323. }
  324. @Test
  325. public void textHeaderCaptionIsReturned() {
  326. Column firstColumn = grid.getColumns().get(0);
  327. firstColumn.setHeaderCaption("text");
  328. assertThat(firstColumn.getHeaderCaption(), is("text"));
  329. }
  330. @Test
  331. public void defaultCaptionIsReturnedForHtml() {
  332. Column firstColumn = grid.getColumns().get(0);
  333. grid.getDefaultHeaderRow().getCell("column0").setHtml("<b>html</b>");
  334. assertThat(firstColumn.getHeaderCaption(), is("Column0"));
  335. }
  336. }