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.

BeanContainerTest.java 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. package com.vaadin.data.util;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertNotNull;
  4. import static org.junit.Assert.assertNull;
  5. import static org.junit.Assert.assertTrue;
  6. import static org.junit.Assert.fail;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.LinkedHashMap;
  10. import java.util.List;
  11. import java.util.Map;
  12. import java.util.Map.Entry;
  13. import org.junit.Assert;
  14. import org.junit.Before;
  15. import org.junit.Test;
  16. import com.vaadin.data.Container;
  17. import com.vaadin.data.Item;
  18. import com.vaadin.data.util.AbstractBeanContainer.BeanIdResolver;
  19. public class BeanContainerTest extends AbstractBeanContainerTestBase {
  20. protected static class PersonNameResolver
  21. implements BeanIdResolver<String, Person> {
  22. @Override
  23. public String getIdForBean(Person bean) {
  24. return bean != null ? bean.getName() : null;
  25. }
  26. }
  27. protected static class NullResolver
  28. implements BeanIdResolver<String, Person> {
  29. @Override
  30. public String getIdForBean(Person bean) {
  31. return null;
  32. }
  33. }
  34. private Map<String, ClassName> nameToBean = new LinkedHashMap<String, ClassName>();
  35. private BeanContainer<String, ClassName> getContainer() {
  36. return new BeanContainer<String, ClassName>(ClassName.class);
  37. }
  38. @Before
  39. public void setUp() {
  40. nameToBean.clear();
  41. for (int i = 0; i < sampleData.length; i++) {
  42. ClassName className = new ClassName(sampleData[i], i);
  43. nameToBean.put(sampleData[i], className);
  44. }
  45. }
  46. @Override
  47. @SuppressWarnings("unchecked")
  48. protected void initializeContainer(Container container) {
  49. BeanContainer<String, ClassName> beanItemContainer = (BeanContainer<String, ClassName>) container;
  50. beanItemContainer.removeAllItems();
  51. for (Entry<String, ClassName> entry : nameToBean.entrySet()) {
  52. beanItemContainer.addItem(entry.getKey(), entry.getValue());
  53. }
  54. }
  55. @Override
  56. protected boolean isFilteredOutItemNull() {
  57. return false;
  58. }
  59. @Test
  60. public void testGetType_existingProperty_typeReturned() {
  61. BeanContainer<String, ClassName> container = getContainer();
  62. Assert.assertEquals(
  63. "Unexpected type is returned for property 'simpleName'",
  64. String.class, container.getType("simpleName"));
  65. }
  66. @Test
  67. public void testGetType_notExistingProperty_nullReturned() {
  68. BeanContainer<String, ClassName> container = getContainer();
  69. Assert.assertNull("Not null type is returned for property ''",
  70. container.getType(""));
  71. }
  72. @Test
  73. public void testBasicOperations() {
  74. testBasicContainerOperations(getContainer());
  75. }
  76. @Test
  77. public void testFiltering() {
  78. testContainerFiltering(getContainer());
  79. }
  80. @Test
  81. public void testSorting() {
  82. testContainerSorting(getContainer());
  83. }
  84. @Test
  85. public void testSortingAndFiltering() {
  86. testContainerSortingAndFiltering(getContainer());
  87. }
  88. // duplicated from parent class and modified - adding items to
  89. // BeanContainer differs from other containers
  90. @Test
  91. public void testContainerOrdered() {
  92. BeanContainer<String, String> container = new BeanContainer<String, String>(
  93. String.class);
  94. String id = "test1";
  95. Item item = container.addItem(id, "value");
  96. assertNotNull(item);
  97. assertEquals(id, container.firstItemId());
  98. assertEquals(id, container.lastItemId());
  99. // isFirstId
  100. assertTrue(container.isFirstId(id));
  101. assertTrue(container.isFirstId(container.firstItemId()));
  102. // isLastId
  103. assertTrue(container.isLastId(id));
  104. assertTrue(container.isLastId(container.lastItemId()));
  105. // Add a new item before the first
  106. // addItemAfter
  107. String newFirstId = "newFirst";
  108. item = container.addItemAfter(null, newFirstId, "newFirstValue");
  109. assertNotNull(item);
  110. assertNotNull(container.getItem(newFirstId));
  111. // isFirstId
  112. assertTrue(container.isFirstId(newFirstId));
  113. assertTrue(container.isFirstId(container.firstItemId()));
  114. // isLastId
  115. assertTrue(container.isLastId(id));
  116. assertTrue(container.isLastId(container.lastItemId()));
  117. // nextItemId
  118. assertEquals(id, container.nextItemId(newFirstId));
  119. assertNull(container.nextItemId(id));
  120. assertNull(container.nextItemId("not-in-container"));
  121. // prevItemId
  122. assertEquals(newFirstId, container.prevItemId(id));
  123. assertNull(container.prevItemId(newFirstId));
  124. assertNull(container.prevItemId("not-in-container"));
  125. // addItemAfter(IDTYPE, IDTYPE, BT)
  126. String newSecondItemId = "newSecond";
  127. item = container.addItemAfter(newFirstId, newSecondItemId,
  128. "newSecondValue");
  129. // order is now: newFirstId, newSecondItemId, id
  130. assertNotNull(item);
  131. assertNotNull(container.getItem(newSecondItemId));
  132. assertEquals(id, container.nextItemId(newSecondItemId));
  133. assertEquals(newFirstId, container.prevItemId(newSecondItemId));
  134. // addItemAfter(IDTYPE, IDTYPE, BT)
  135. String fourthId = "id of the fourth item";
  136. Item fourth = container.addItemAfter(newFirstId, fourthId,
  137. "fourthValue");
  138. // order is now: newFirstId, fourthId, newSecondItemId, id
  139. assertNotNull(fourth);
  140. assertEquals(fourth, container.getItem(fourthId));
  141. assertEquals(newSecondItemId, container.nextItemId(fourthId));
  142. assertEquals(newFirstId, container.prevItemId(fourthId));
  143. // addItemAfter(IDTYPE, IDTYPE, BT)
  144. String fifthId = "fifth";
  145. Item fifth = container.addItemAfter(null, fifthId, "fifthValue");
  146. // order is now: fifthId, newFirstId, fourthId, newSecondItemId, id
  147. assertNotNull(fifth);
  148. assertEquals(fifth, container.getItem(fifthId));
  149. assertEquals(newFirstId, container.nextItemId(fifthId));
  150. assertNull(container.prevItemId(fifthId));
  151. }
  152. // TODO test Container.Indexed interface operation - testContainerIndexed()?
  153. @Test
  154. public void testAddItemAt() {
  155. BeanContainer<String, String> container = new BeanContainer<String, String>(
  156. String.class);
  157. container.addItem("id1", "value1");
  158. // id1
  159. container.addItemAt(0, "id2", "value2");
  160. // id2, id1
  161. container.addItemAt(1, "id3", "value3");
  162. // id2, id3, id1
  163. container.addItemAt(container.size(), "id4", "value4");
  164. // id2, id3, id1, id4
  165. assertNull(container.addItemAt(-1, "id5", "value5"));
  166. assertNull(container.addItemAt(container.size() + 1, "id6", "value6"));
  167. assertEquals(4, container.size());
  168. assertEquals("id2", container.getIdByIndex(0));
  169. assertEquals("id3", container.getIdByIndex(1));
  170. assertEquals("id1", container.getIdByIndex(2));
  171. assertEquals("id4", container.getIdByIndex(3));
  172. }
  173. @Test
  174. public void testUnsupportedMethods() {
  175. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  176. Person.class);
  177. container.addItem("John", new Person("John"));
  178. try {
  179. container.addItem();
  180. Assert.fail();
  181. } catch (UnsupportedOperationException e) {
  182. // should get exception
  183. }
  184. try {
  185. container.addItem(null);
  186. Assert.fail();
  187. } catch (UnsupportedOperationException e) {
  188. // should get exception
  189. }
  190. try {
  191. container.addItemAfter(null, null);
  192. Assert.fail();
  193. } catch (UnsupportedOperationException e) {
  194. // should get exception
  195. }
  196. try {
  197. container.addItemAfter(new Person("Jane"));
  198. Assert.fail();
  199. } catch (UnsupportedOperationException e) {
  200. // should get exception
  201. }
  202. try {
  203. container.addItemAt(0);
  204. Assert.fail();
  205. } catch (UnsupportedOperationException e) {
  206. // should get exception
  207. }
  208. try {
  209. container.addItemAt(0, new Person("Jane"));
  210. Assert.fail();
  211. } catch (UnsupportedOperationException e) {
  212. // should get exception
  213. }
  214. try {
  215. container.addContainerProperty("lastName", String.class, "");
  216. Assert.fail();
  217. } catch (UnsupportedOperationException e) {
  218. // should get exception
  219. }
  220. assertEquals(1, container.size());
  221. }
  222. @Test
  223. public void testRemoveContainerProperty() {
  224. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  225. Person.class);
  226. container.setBeanIdResolver(new PersonNameResolver());
  227. container.addBean(new Person("John"));
  228. Assert.assertEquals("John",
  229. container.getContainerProperty("John", "name").getValue());
  230. Assert.assertTrue(container.removeContainerProperty("name"));
  231. Assert.assertNull(container.getContainerProperty("John", "name"));
  232. Assert.assertNotNull(container.getItem("John"));
  233. // property removed also from item
  234. Assert.assertNull(container.getItem("John").getItemProperty("name"));
  235. }
  236. @Test
  237. public void testAddNullBeans() {
  238. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  239. Person.class);
  240. assertNull(container.addItem("id1", null));
  241. assertNull(container.addItemAfter(null, "id2", null));
  242. assertNull(container.addItemAt(0, "id3", null));
  243. assertEquals(0, container.size());
  244. }
  245. @Test
  246. public void testAddNullId() {
  247. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  248. Person.class);
  249. Person john = new Person("John");
  250. assertNull(container.addItem(null, john));
  251. assertNull(container.addItemAfter(null, null, john));
  252. assertNull(container.addItemAt(0, null, john));
  253. assertEquals(0, container.size());
  254. }
  255. @Test
  256. public void testEmptyContainer() {
  257. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  258. Person.class);
  259. assertNull(container.firstItemId());
  260. assertNull(container.lastItemId());
  261. assertEquals(0, container.size());
  262. // could test more about empty container
  263. }
  264. @Test
  265. public void testAddBeanWithoutResolver() {
  266. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  267. Person.class);
  268. try {
  269. container.addBean(new Person("John"));
  270. Assert.fail();
  271. } catch (IllegalStateException e) {
  272. // should get exception
  273. }
  274. try {
  275. container.addBeanAfter(null, new Person("Jane"));
  276. Assert.fail();
  277. } catch (IllegalStateException e) {
  278. // should get exception
  279. }
  280. try {
  281. container.addBeanAt(0, new Person("Jack"));
  282. Assert.fail();
  283. } catch (IllegalStateException e) {
  284. // should get exception
  285. }
  286. try {
  287. container
  288. .addAll(Arrays.asList(new Person[] { new Person("Jack") }));
  289. Assert.fail();
  290. } catch (IllegalStateException e) {
  291. // should get exception
  292. }
  293. assertEquals(0, container.size());
  294. }
  295. @Test
  296. public void testAddAllWithNullItemId() {
  297. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  298. Person.class);
  299. // resolver that returns null as item id
  300. container.setBeanIdResolver(
  301. new BeanIdResolver<String, AbstractBeanContainerTestBase.Person>() {
  302. @Override
  303. public String getIdForBean(Person bean) {
  304. return bean.getName();
  305. }
  306. });
  307. List<Person> persons = new ArrayList<Person>();
  308. persons.add(new Person("John"));
  309. persons.add(new Person("Marc"));
  310. persons.add(new Person(null));
  311. persons.add(new Person("foo"));
  312. try {
  313. container.addAll(persons);
  314. fail();
  315. } catch (IllegalArgumentException e) {
  316. // should get exception
  317. }
  318. container.removeAllItems();
  319. persons.remove(2);
  320. container.addAll(persons);
  321. assertEquals(3, container.size());
  322. }
  323. @Test
  324. public void testAddBeanWithNullResolver() {
  325. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  326. Person.class);
  327. // resolver that returns null as item id
  328. container.setBeanIdResolver(new NullResolver());
  329. try {
  330. container.addBean(new Person("John"));
  331. Assert.fail();
  332. } catch (IllegalArgumentException e) {
  333. // should get exception
  334. }
  335. try {
  336. container.addBeanAfter(null, new Person("Jane"));
  337. Assert.fail();
  338. } catch (IllegalArgumentException e) {
  339. // should get exception
  340. }
  341. try {
  342. container.addBeanAt(0, new Person("Jack"));
  343. Assert.fail();
  344. } catch (IllegalArgumentException e) {
  345. // should get exception
  346. }
  347. assertEquals(0, container.size());
  348. }
  349. @Test
  350. public void testAddBeanWithResolver() {
  351. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  352. Person.class);
  353. container.setBeanIdResolver(new PersonNameResolver());
  354. assertNotNull(container.addBean(new Person("John")));
  355. assertNotNull(container.addBeanAfter(null, new Person("Jane")));
  356. assertNotNull(container.addBeanAt(0, new Person("Jack")));
  357. container.addAll(Arrays.asList(
  358. new Person[] { new Person("Jill"), new Person("Joe") }));
  359. assertTrue(container.containsId("John"));
  360. assertTrue(container.containsId("Jane"));
  361. assertTrue(container.containsId("Jack"));
  362. assertTrue(container.containsId("Jill"));
  363. assertTrue(container.containsId("Joe"));
  364. assertEquals(3, container.indexOfId("Jill"));
  365. assertEquals(4, container.indexOfId("Joe"));
  366. assertEquals(5, container.size());
  367. }
  368. @Test
  369. public void testAddNullBeansWithResolver() {
  370. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  371. Person.class);
  372. container.setBeanIdResolver(new PersonNameResolver());
  373. assertNull(container.addBean(null));
  374. assertNull(container.addBeanAfter(null, null));
  375. assertNull(container.addBeanAt(0, null));
  376. assertEquals(0, container.size());
  377. }
  378. @Test
  379. public void testAddBeanWithPropertyResolver() {
  380. BeanContainer<String, Person> container = new BeanContainer<String, Person>(
  381. Person.class);
  382. container.setBeanIdProperty("name");
  383. assertNotNull(container.addBean(new Person("John")));
  384. assertNotNull(container.addBeanAfter(null, new Person("Jane")));
  385. assertNotNull(container.addBeanAt(0, new Person("Jack")));
  386. container.addAll(Arrays.asList(
  387. new Person[] { new Person("Jill"), new Person("Joe") }));
  388. assertTrue(container.containsId("John"));
  389. assertTrue(container.containsId("Jane"));
  390. assertTrue(container.containsId("Jack"));
  391. assertTrue(container.containsId("Jill"));
  392. assertTrue(container.containsId("Joe"));
  393. assertEquals(3, container.indexOfId("Jill"));
  394. assertEquals(4, container.indexOfId("Joe"));
  395. assertEquals(5, container.size());
  396. }
  397. @Test
  398. public void testAddNestedContainerProperty() {
  399. BeanContainer<String, NestedMethodPropertyTest.Person> container = new BeanContainer<String, NestedMethodPropertyTest.Person>(
  400. NestedMethodPropertyTest.Person.class);
  401. container.setBeanIdProperty("name");
  402. container.addBean(new NestedMethodPropertyTest.Person("John",
  403. new NestedMethodPropertyTest.Address("Ruukinkatu 2-4", 20540)));
  404. assertTrue(container.addNestedContainerProperty("address.street"));
  405. assertEquals("Ruukinkatu 2-4", container
  406. .getContainerProperty("John", "address.street").getValue());
  407. }
  408. @Test
  409. public void testNestedContainerPropertyWithNullBean() {
  410. BeanContainer<String, NestedMethodPropertyTest.Person> container = new BeanContainer<String, NestedMethodPropertyTest.Person>(
  411. NestedMethodPropertyTest.Person.class);
  412. container.setBeanIdProperty("name");
  413. container.addBean(new NestedMethodPropertyTest.Person("John", null));
  414. assertTrue(container
  415. .addNestedContainerProperty("address.postalCodeObject"));
  416. assertTrue(container.addNestedContainerProperty("address.street"));
  417. // the nested properties added with allowNullBean setting should return
  418. // null
  419. assertNull(container.getContainerProperty("John", "address.street")
  420. .getValue());
  421. }
  422. }