Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

BeanItemTest.java 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. package com.vaadin.data.util;
  2. import java.lang.reflect.Constructor;
  3. import java.lang.reflect.InvocationTargetException;
  4. import java.lang.reflect.Method;
  5. import java.util.ArrayList;
  6. import java.util.Collection;
  7. import java.util.Iterator;
  8. import java.util.LinkedHashMap;
  9. import java.util.Map;
  10. import org.junit.Assert;
  11. import org.junit.Test;
  12. import com.vaadin.data.Property;
  13. /**
  14. * Test BeanItem specific features.
  15. *
  16. * Only public API is tested, not the methods with package visibility.
  17. *
  18. * See also {@link PropertySetItemTest}, which tests the base class.
  19. */
  20. public class BeanItemTest {
  21. @SuppressWarnings("unused")
  22. protected static class MySuperClass {
  23. private int superPrivate = 1;
  24. private int superPrivate2 = 2;
  25. protected double superProtected = 3.0;
  26. private double superProtected2 = 4.0;
  27. public boolean superPublic = true;
  28. private boolean superPublic2 = true;
  29. public int getSuperPrivate() {
  30. return superPrivate;
  31. }
  32. public void setSuperPrivate(int superPrivate) {
  33. this.superPrivate = superPrivate;
  34. }
  35. public double getSuperProtected() {
  36. return superProtected;
  37. }
  38. public void setSuperProtected(double superProtected) {
  39. this.superProtected = superProtected;
  40. }
  41. public boolean isSuperPublic() {
  42. return superPublic;
  43. }
  44. public void setSuperPublic(boolean superPublic) {
  45. this.superPublic = superPublic;
  46. }
  47. }
  48. protected static class MyClass extends MySuperClass {
  49. private String name;
  50. public int value = 123;
  51. public MyClass(String name) {
  52. this.name = name;
  53. }
  54. public void setName(String name) {
  55. this.name = name;
  56. }
  57. public String getName() {
  58. return name;
  59. }
  60. public void setNoField(String name) {
  61. }
  62. public String getNoField() {
  63. return "no field backing this setter";
  64. }
  65. public String getName2() {
  66. return name;
  67. }
  68. }
  69. protected static class MyClass2 extends MyClass {
  70. public MyClass2(String name) {
  71. super(name);
  72. }
  73. @Override
  74. public void setName(String name) {
  75. super.setName(name + "2");
  76. }
  77. @Override
  78. public String getName() {
  79. return super.getName() + "2";
  80. }
  81. @Override
  82. public String getName2() {
  83. return super.getName();
  84. }
  85. public void setName2(String name) {
  86. super.setName(name);
  87. }
  88. }
  89. protected static interface MySuperInterface {
  90. public int getSuper1();
  91. public void setSuper1(int i);
  92. public int getOverride();
  93. }
  94. protected static interface MySuperInterface2 {
  95. public int getSuper2();
  96. }
  97. protected static class Generic<T> {
  98. public T getProperty() {
  99. return null;
  100. }
  101. public void setProperty(T t) {
  102. throw new UnsupportedOperationException();
  103. }
  104. }
  105. protected static class SubClass extends Generic<String> {
  106. @Override
  107. // Has a bridged method
  108. public String getProperty() {
  109. return "";
  110. }
  111. @Override
  112. // Has a bridged method
  113. public void setProperty(String t) {
  114. }
  115. }
  116. protected static interface MySubInterface extends MySuperInterface,
  117. MySuperInterface2 {
  118. public int getSub();
  119. public void setSub(int i);
  120. @Override
  121. public int getOverride();
  122. public void setOverride(int i);
  123. }
  124. @Test
  125. public void testGetProperties() {
  126. BeanItem<MySuperClass> item = new BeanItem<MySuperClass>(
  127. new MySuperClass());
  128. Collection<?> itemPropertyIds = item.getItemPropertyIds();
  129. Assert.assertEquals(3, itemPropertyIds.size());
  130. Assert.assertTrue(itemPropertyIds.contains("superPrivate"));
  131. Assert.assertTrue(itemPropertyIds.contains("superProtected"));
  132. Assert.assertTrue(itemPropertyIds.contains("superPublic"));
  133. }
  134. @Test
  135. public void testGetSuperClassProperties() {
  136. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"));
  137. Collection<?> itemPropertyIds = item.getItemPropertyIds();
  138. Assert.assertEquals(6, itemPropertyIds.size());
  139. Assert.assertTrue(itemPropertyIds.contains("superPrivate"));
  140. Assert.assertTrue(itemPropertyIds.contains("superProtected"));
  141. Assert.assertTrue(itemPropertyIds.contains("superPublic"));
  142. Assert.assertTrue(itemPropertyIds.contains("name"));
  143. Assert.assertTrue(itemPropertyIds.contains("noField"));
  144. Assert.assertTrue(itemPropertyIds.contains("name2"));
  145. }
  146. @Test
  147. public void testOverridingProperties() {
  148. BeanItem<MyClass2> item = new BeanItem<MyClass2>(new MyClass2("bean2"));
  149. Collection<?> itemPropertyIds = item.getItemPropertyIds();
  150. Assert.assertEquals(6, itemPropertyIds.size());
  151. Assert.assertTrue(MyClass2.class.equals(item.getBean().getClass()));
  152. // check that name2 accessed via MyClass2, not MyClass
  153. Assert.assertFalse(item.getItemProperty("name2").isReadOnly());
  154. }
  155. @Test
  156. public void testGetInterfaceProperties() throws SecurityException,
  157. NoSuchMethodException, IllegalArgumentException,
  158. IllegalAccessException, InvocationTargetException {
  159. Method method = BeanItem.class.getDeclaredMethod(
  160. "getPropertyDescriptors", Class.class);
  161. method.setAccessible(true);
  162. LinkedHashMap<String, VaadinPropertyDescriptor<Class>> propertyDescriptors = (LinkedHashMap<String, VaadinPropertyDescriptor<Class>>) method
  163. .invoke(null, MySuperInterface.class);
  164. Assert.assertEquals(2, propertyDescriptors.size());
  165. Assert.assertTrue(propertyDescriptors.containsKey("super1"));
  166. Assert.assertTrue(propertyDescriptors.containsKey("override"));
  167. MethodProperty<?> property = (MethodProperty<?>) propertyDescriptors
  168. .get("override").createProperty(getClass());
  169. Assert.assertTrue(property.isReadOnly());
  170. }
  171. @Test
  172. public void testGetSuperInterfaceProperties() throws SecurityException,
  173. NoSuchMethodException, IllegalArgumentException,
  174. IllegalAccessException, InvocationTargetException {
  175. Method method = BeanItem.class.getDeclaredMethod(
  176. "getPropertyDescriptors", Class.class);
  177. method.setAccessible(true);
  178. LinkedHashMap<String, VaadinPropertyDescriptor<Class>> propertyDescriptors = (LinkedHashMap<String, VaadinPropertyDescriptor<Class>>) method
  179. .invoke(null, MySubInterface.class);
  180. Assert.assertEquals(4, propertyDescriptors.size());
  181. Assert.assertTrue(propertyDescriptors.containsKey("sub"));
  182. Assert.assertTrue(propertyDescriptors.containsKey("super1"));
  183. Assert.assertTrue(propertyDescriptors.containsKey("super2"));
  184. Assert.assertTrue(propertyDescriptors.containsKey("override"));
  185. MethodProperty<?> property = (MethodProperty<?>) propertyDescriptors
  186. .get("override").createProperty(getClass());
  187. Assert.assertFalse(property.isReadOnly());
  188. }
  189. @Test
  190. public void testPropertyExplicitOrder() {
  191. Collection<String> ids = new ArrayList<String>();
  192. ids.add("name");
  193. ids.add("superPublic");
  194. ids.add("name2");
  195. ids.add("noField");
  196. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"),
  197. ids);
  198. Iterator<?> it = item.getItemPropertyIds().iterator();
  199. Assert.assertEquals("name", it.next());
  200. Assert.assertEquals("superPublic", it.next());
  201. Assert.assertEquals("name2", it.next());
  202. Assert.assertEquals("noField", it.next());
  203. Assert.assertFalse(it.hasNext());
  204. }
  205. @Test
  206. public void testPropertyExplicitOrder2() {
  207. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"),
  208. new String[] { "name", "superPublic", "name2", "noField" });
  209. Iterator<?> it = item.getItemPropertyIds().iterator();
  210. Assert.assertEquals("name", it.next());
  211. Assert.assertEquals("superPublic", it.next());
  212. Assert.assertEquals("name2", it.next());
  213. Assert.assertEquals("noField", it.next());
  214. Assert.assertFalse(it.hasNext());
  215. }
  216. @Test
  217. public void testPropertyBadPropertyName() {
  218. Collection<String> ids = new ArrayList<String>();
  219. ids.add("name3");
  220. ids.add("name");
  221. // currently silently ignores non-existent properties
  222. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"),
  223. ids);
  224. Iterator<?> it = item.getItemPropertyIds().iterator();
  225. Assert.assertEquals("name", it.next());
  226. Assert.assertFalse(it.hasNext());
  227. }
  228. @Test
  229. public void testRemoveProperty() {
  230. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"));
  231. Collection<?> itemPropertyIds = item.getItemPropertyIds();
  232. Assert.assertEquals(6, itemPropertyIds.size());
  233. item.removeItemProperty("name2");
  234. Assert.assertEquals(5, itemPropertyIds.size());
  235. Assert.assertFalse(itemPropertyIds.contains("name2"));
  236. }
  237. @Test
  238. public void testRemoveSuperProperty() {
  239. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"));
  240. Collection<?> itemPropertyIds = item.getItemPropertyIds();
  241. Assert.assertEquals(6, itemPropertyIds.size());
  242. item.removeItemProperty("superPrivate");
  243. Assert.assertEquals(5, itemPropertyIds.size());
  244. Assert.assertFalse(itemPropertyIds.contains("superPrivate"));
  245. }
  246. @Test
  247. public void testPropertyTypes() {
  248. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"));
  249. Assert.assertTrue(Integer.class.equals(item.getItemProperty(
  250. "superPrivate").getType()));
  251. Assert.assertTrue(Double.class.equals(item.getItemProperty(
  252. "superProtected").getType()));
  253. Assert.assertTrue(Boolean.class.equals(item.getItemProperty(
  254. "superPublic").getType()));
  255. Assert.assertTrue(String.class.equals(item.getItemProperty("name")
  256. .getType()));
  257. }
  258. @Test
  259. public void testPropertyReadOnly() {
  260. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"));
  261. Assert.assertFalse(item.getItemProperty("name").isReadOnly());
  262. Assert.assertTrue(item.getItemProperty("name2").isReadOnly());
  263. }
  264. @Test
  265. public void testCustomProperties() throws Exception {
  266. LinkedHashMap<String, VaadinPropertyDescriptor<MyClass>> propertyDescriptors = new LinkedHashMap<String, VaadinPropertyDescriptor<MyClass>>();
  267. propertyDescriptors.put(
  268. "myname",
  269. new MethodPropertyDescriptor<BeanItemTest.MyClass>("myname",
  270. MyClass.class, MyClass.class
  271. .getDeclaredMethod("getName"), MyClass.class
  272. .getDeclaredMethod("setName", String.class)));
  273. MyClass instance = new MyClass("bean1");
  274. Constructor<BeanItem> constructor = BeanItem.class
  275. .getDeclaredConstructor(Object.class, Map.class);
  276. constructor.setAccessible(true);
  277. BeanItem<MyClass> item = constructor.newInstance(instance,
  278. propertyDescriptors);
  279. Assert.assertEquals(1, item.getItemPropertyIds().size());
  280. Assert.assertEquals("bean1", item.getItemProperty("myname").getValue());
  281. }
  282. @Test
  283. public void testAddRemoveProperty() throws Exception {
  284. MethodPropertyDescriptor<BeanItemTest.MyClass> pd = new MethodPropertyDescriptor<BeanItemTest.MyClass>(
  285. "myname", MyClass.class,
  286. MyClass.class.getDeclaredMethod("getName"),
  287. MyClass.class.getDeclaredMethod("setName", String.class));
  288. BeanItem<MyClass> item = new BeanItem<MyClass>(new MyClass("bean1"));
  289. Assert.assertEquals(6, item.getItemPropertyIds().size());
  290. Assert.assertEquals(null, item.getItemProperty("myname"));
  291. item.addItemProperty("myname", pd.createProperty(item.getBean()));
  292. Assert.assertEquals(7, item.getItemPropertyIds().size());
  293. Assert.assertEquals("bean1", item.getItemProperty("myname").getValue());
  294. item.removeItemProperty("myname");
  295. Assert.assertEquals(6, item.getItemPropertyIds().size());
  296. Assert.assertEquals(null, item.getItemProperty("myname"));
  297. }
  298. @Test
  299. public void testOverridenGenericMethods() {
  300. BeanItem<SubClass> item = new BeanItem<SubClass>(new SubClass());
  301. Property<?> property = item.getItemProperty("property");
  302. Assert.assertEquals("Unexpected class for property type", String.class,
  303. property.getType());
  304. Assert.assertEquals("Unexpected property value", "",
  305. property.getValue());
  306. // Should not be exception
  307. property.setValue(null);
  308. }
  309. }