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.

TablePropertyValueConverterTest.java 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. package com.vaadin.v7.tests.server.component.table;
  2. import static org.junit.Assert.assertFalse;
  3. import static org.junit.Assert.assertTrue;
  4. import static org.junit.Assert.fail;
  5. import java.lang.reflect.Field;
  6. import java.util.Collection;
  7. import java.util.HashSet;
  8. import java.util.Locale;
  9. import java.util.Map;
  10. import java.util.Map.Entry;
  11. import java.util.Set;
  12. import org.junit.Before;
  13. import org.junit.Test;
  14. import com.vaadin.v7.data.Container;
  15. import com.vaadin.v7.data.Item;
  16. import com.vaadin.v7.data.Property;
  17. import com.vaadin.v7.data.util.IndexedContainer;
  18. import com.vaadin.v7.data.util.converter.Converter;
  19. import com.vaadin.v7.ui.Table;
  20. public class TablePropertyValueConverterTest {
  21. protected TestableTable table;
  22. protected Collection<?> initialProperties;
  23. @Test
  24. public void testRemovePropertyId() {
  25. Collection<Object> converters = table.getCurrentConverters();
  26. assertFalse("Set of converters was empty at the start.",
  27. converters.isEmpty());
  28. Object firstId = converters.iterator().next();
  29. table.removeContainerProperty(firstId);
  30. Collection<Object> converters2 = table.getCurrentConverters();
  31. assertTrue("FirstId was not removed", !converters2.contains(firstId));
  32. assertTrue("The number of removed converters was not one.",
  33. converters.size() - converters2.size() == 1);
  34. for (Object originalId : converters) {
  35. if (!originalId.equals(firstId)) {
  36. assertTrue("The wrong converter was removed.",
  37. converters2.contains(originalId));
  38. }
  39. }
  40. }
  41. @Test
  42. public void testSetContainer() {
  43. table.setContainerDataSource(createContainer(
  44. new String[] { "col1", "col3", "col4", "col5" }));
  45. Collection<Object> converters = table.getCurrentConverters();
  46. assertTrue("There should only have been one converter left.",
  47. converters.size() == 1);
  48. Object onlyKey = converters.iterator().next();
  49. assertTrue("The incorrect key was left.", onlyKey.equals("col1"));
  50. }
  51. @Test
  52. public void testSetContainerWithInexactButCompatibleTypes() {
  53. TestableTable customTable = new TestableTable("Test table",
  54. createContainer(new String[] { "col1", "col2", "col3" },
  55. new Class[] { String.class, BaseClass.class,
  56. DerivedClass.class }));
  57. customTable.setConverter("col1", new Converter<String, String>() {
  58. private static final long serialVersionUID = 1L;
  59. @Override
  60. public String convertToModel(String value,
  61. Class<? extends String> targetType, Locale locale)
  62. throws ConversionException {
  63. return "model";
  64. }
  65. @Override
  66. public String convertToPresentation(String value,
  67. Class<? extends String> targetType, Locale locale)
  68. throws ConversionException {
  69. return "presentation";
  70. }
  71. @Override
  72. public Class<String> getModelType() {
  73. return String.class;
  74. }
  75. @Override
  76. public Class<String> getPresentationType() {
  77. return String.class;
  78. }
  79. });
  80. customTable.setConverter("col2", new Converter<String, BaseClass>() {
  81. private static final long serialVersionUID = 1L;
  82. @Override
  83. public BaseClass convertToModel(String value,
  84. Class<? extends BaseClass> targetType, Locale locale)
  85. throws ConversionException {
  86. return new BaseClass("model");
  87. }
  88. @Override
  89. public Class<BaseClass> getModelType() {
  90. return BaseClass.class;
  91. }
  92. @Override
  93. public Class<String> getPresentationType() {
  94. return String.class;
  95. }
  96. @Override
  97. public String convertToPresentation(BaseClass value,
  98. Class<? extends String> targetType, Locale locale)
  99. throws ConversionException {
  100. return null;
  101. }
  102. });
  103. customTable.setConverter("col3", new Converter<String, DerivedClass>() {
  104. private static final long serialVersionUID = 1L;
  105. @Override
  106. public DerivedClass convertToModel(String value,
  107. Class<? extends DerivedClass> targetType, Locale locale)
  108. throws ConversionException {
  109. return new DerivedClass("derived" + 1001);
  110. }
  111. @Override
  112. public Class<DerivedClass> getModelType() {
  113. return DerivedClass.class;
  114. }
  115. @Override
  116. public Class<String> getPresentationType() {
  117. return String.class;
  118. }
  119. @Override
  120. public String convertToPresentation(DerivedClass value,
  121. Class<? extends String> targetType, Locale locale)
  122. throws ConversionException {
  123. return null;
  124. }
  125. });
  126. customTable.setContainerDataSource(
  127. createContainer(new String[] { "col1", "col2", "col3" },
  128. new Class[] { DerivedClass.class, DerivedClass.class,
  129. BaseClass.class }));
  130. Set<Object> converters = customTable.getCurrentConverters();
  131. // TODO Test temporarily disabled as this feature
  132. // is not yet implemented in Table
  133. /*
  134. * assertTrue("Incompatible types were not removed.", converters.size()
  135. * <= 1); assertTrue("Even compatible types were removed",
  136. * converters.size() == 1); assertTrue("Compatible type was missing.",
  137. * converters.contains("col2"));
  138. */
  139. }
  140. @Test
  141. public void testPrimitiveTypeConverters() {
  142. TestableTable customTable = new TestableTable("Test table",
  143. createContainer(new String[] { "col1", "col2", "col3" },
  144. new Class[] { int.class, BaseClass.class,
  145. DerivedClass.class }));
  146. customTable.setConverter("col1", new Converter<String, Integer>() {
  147. private static final long serialVersionUID = 1L;
  148. @Override
  149. public Integer convertToModel(String value,
  150. Class<? extends Integer> targetType, Locale locale)
  151. throws ConversionException {
  152. return 11;
  153. }
  154. @Override
  155. public String convertToPresentation(Integer value,
  156. Class<? extends String> targetType, Locale locale)
  157. throws ConversionException {
  158. return "presentation";
  159. }
  160. @Override
  161. public Class<Integer> getModelType() {
  162. return Integer.class;
  163. }
  164. @Override
  165. public Class<String> getPresentationType() {
  166. return String.class;
  167. }
  168. });
  169. Set<Object> converters = customTable.getCurrentConverters();
  170. assertFalse("Converter was not set.", converters.isEmpty());
  171. }
  172. @Test
  173. public void testInheritance() {
  174. assertTrue("BaseClass isn't assignable from DerivedClass",
  175. BaseClass.class.isAssignableFrom(DerivedClass.class));
  176. assertFalse("DerivedClass is assignable from BaseClass",
  177. DerivedClass.class.isAssignableFrom(BaseClass.class));
  178. }
  179. @Before
  180. public void setUp() {
  181. table = new TestableTable("Test table",
  182. createContainer(new String[] { "col1", "col2", "col3" }));
  183. table.setConverter("col1", new Converter<String, String>() {
  184. private static final long serialVersionUID = 1L;
  185. @Override
  186. public String convertToModel(String value,
  187. Class<? extends String> targetType, Locale locale)
  188. throws ConversionException {
  189. return "model";
  190. }
  191. @Override
  192. public String convertToPresentation(String value,
  193. Class<? extends String> targetType, Locale locale)
  194. throws ConversionException {
  195. return "presentation";
  196. }
  197. @Override
  198. public Class<String> getModelType() {
  199. return String.class;
  200. }
  201. @Override
  202. public Class<String> getPresentationType() {
  203. return String.class;
  204. }
  205. });
  206. table.setConverter("col2", new Converter<String, String>() {
  207. private static final long serialVersionUID = 1L;
  208. @Override
  209. public String convertToModel(String value,
  210. Class<? extends String> targetType, Locale locale)
  211. throws ConversionException {
  212. return "model2";
  213. }
  214. @Override
  215. public String convertToPresentation(String value,
  216. Class<? extends String> targetType, Locale locale)
  217. throws ConversionException {
  218. return "presentation2";
  219. }
  220. @Override
  221. public Class<String> getModelType() {
  222. return String.class;
  223. }
  224. @Override
  225. public Class<String> getPresentationType() {
  226. return String.class;
  227. }
  228. });
  229. initialProperties = table.getContainerPropertyIds();
  230. }
  231. private static Container createContainer(Object[] ids) {
  232. Class[] types = new Class[ids.length];
  233. for (int i = 0; i < types.length; ++i) {
  234. types[i] = String.class;
  235. }
  236. return createContainer(ids, types);
  237. }
  238. private static Container createContainer(Object[] ids, Class[] types) {
  239. IndexedContainer container = new IndexedContainer();
  240. if (ids.length > types.length) {
  241. throw new IllegalArgumentException("Too few defined types");
  242. }
  243. for (int i = 0; i < ids.length; ++i) {
  244. container.addContainerProperty(ids[i], types[i], "");
  245. }
  246. for (int i = 0; i < 100; i++) {
  247. Item item = container.addItem("item " + i);
  248. for (int j = 0; j < ids.length; ++j) {
  249. Property itemProperty = item.getItemProperty(ids[j]);
  250. if (types[j] == String.class) {
  251. itemProperty.setValue(ids[j].toString() + i);
  252. } else if (types[j] == BaseClass.class) {
  253. itemProperty.setValue(new BaseClass("base" + i));
  254. } else if (types[j] == DerivedClass.class) {
  255. itemProperty.setValue(new DerivedClass("derived" + i));
  256. } else if (types[j] == int.class) {
  257. // FIXME can't set values because the int is autoboxed into
  258. // an Integer and not unboxed prior to set
  259. // itemProperty.setValue(i);
  260. } else {
  261. throw new IllegalArgumentException(
  262. "Unhandled type in createContainer: " + types[j]);
  263. }
  264. }
  265. }
  266. return container;
  267. }
  268. private class TestableTable extends Table {
  269. /**
  270. * @param string
  271. * @param createContainer
  272. */
  273. public TestableTable(String string, Container container) {
  274. super(string, container);
  275. }
  276. Set<Object> getCurrentConverters() {
  277. try {
  278. Field f = Table.class
  279. .getDeclaredField("propertyValueConverters");
  280. f.setAccessible(true);
  281. Map<Object, Converter<String, Object>> pvc = (Map<Object, Converter<String, Object>>) f
  282. .get(this);
  283. Set<Object> currentConverters = new HashSet<Object>();
  284. for (Entry<Object, Converter<String, Object>> entry : pvc
  285. .entrySet()) {
  286. currentConverters.add(entry.getKey());
  287. }
  288. return currentConverters;
  289. } catch (Exception e) {
  290. fail("Unable to retrieve propertyValueConverters");
  291. return null;
  292. }
  293. }
  294. }
  295. private static class BaseClass {
  296. private String title;
  297. public BaseClass(String title) {
  298. this.title = title;
  299. }
  300. }
  301. private static class DerivedClass extends BaseClass {
  302. public DerivedClass(String title) {
  303. super(title);
  304. }
  305. }
  306. }