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.

GeneratedPropertyContainerBasicTest.java 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. package com.vaadin.data.util;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertNull;
  4. import static org.junit.Assert.assertTrue;
  5. import static org.junit.Assert.fail;
  6. import java.util.List;
  7. import org.easymock.Capture;
  8. import org.easymock.EasyMock;
  9. import org.junit.Assert;
  10. import org.junit.Test;
  11. import com.vaadin.data.Container;
  12. import com.vaadin.data.Container.Indexed.ItemAddEvent;
  13. import com.vaadin.data.Container.Indexed.ItemRemoveEvent;
  14. import com.vaadin.data.Container.ItemSetChangeListener;
  15. import com.vaadin.data.Container.ItemSetChangeNotifier;
  16. import com.vaadin.data.Item;
  17. import com.vaadin.data.util.filter.SimpleStringFilter;
  18. public class GeneratedPropertyContainerBasicTest
  19. extends AbstractInMemoryContainerTestBase {
  20. @Test
  21. public void testBasicOperations() {
  22. testBasicContainerOperations(createContainer());
  23. }
  24. private GeneratedPropertyContainer createContainer() {
  25. return new GeneratedPropertyContainer(new IndexedContainer());
  26. }
  27. @Test
  28. public void testFiltering() {
  29. testContainerFiltering(createContainer());
  30. }
  31. @Test
  32. public void testSorting() {
  33. testContainerSorting(createContainer());
  34. }
  35. @Test
  36. public void testSortingAndFiltering() {
  37. testContainerSortingAndFiltering(createContainer());
  38. }
  39. @Test
  40. public void testContainerOrdered() {
  41. testContainerOrdered(createContainer());
  42. }
  43. @Test
  44. public void testContainerIndexed() {
  45. testContainerIndexed(createContainer(), sampleData[2], 2, true,
  46. "newItemId", true);
  47. }
  48. @Test
  49. public void testItemSetChangeListeners() {
  50. GeneratedPropertyContainer container = createContainer();
  51. ItemSetChangeCounter counter = new ItemSetChangeCounter();
  52. container.addListener(counter);
  53. String id1 = "id1";
  54. String id2 = "id2";
  55. String id3 = "id3";
  56. initializeContainer(container);
  57. counter.reset();
  58. container.addItem();
  59. counter.assertOnce();
  60. container.addItem(id1);
  61. counter.assertOnce();
  62. initializeContainer(container);
  63. counter.reset();
  64. container.addItemAt(0);
  65. counter.assertOnce();
  66. container.addItemAt(0, id1);
  67. counter.assertOnce();
  68. container.addItemAt(0, id2);
  69. counter.assertOnce();
  70. container.addItemAt(container.size(), id3);
  71. counter.assertOnce();
  72. // no notification if already in container
  73. container.addItemAt(0, id1);
  74. counter.assertNone();
  75. initializeContainer(container);
  76. counter.reset();
  77. container.addItemAfter(null);
  78. counter.assertOnce();
  79. container.addItemAfter(null, id1);
  80. counter.assertOnce();
  81. container.addItemAfter(id1);
  82. counter.assertOnce();
  83. container.addItemAfter(id1, id2);
  84. counter.assertOnce();
  85. container.addItemAfter(container.firstItemId());
  86. counter.assertOnce();
  87. container.addItemAfter(container.lastItemId());
  88. counter.assertOnce();
  89. container.addItemAfter(container.lastItemId(), id3);
  90. counter.assertOnce();
  91. // no notification if already in container
  92. container.addItemAfter(0, id1);
  93. counter.assertNone();
  94. initializeContainer(container);
  95. counter.reset();
  96. container.removeItem(sampleData[0]);
  97. counter.assertOnce();
  98. initializeContainer(container);
  99. counter.reset();
  100. // no notification for removing a non-existing item
  101. container.removeItem(id1);
  102. counter.assertNone();
  103. initializeContainer(container);
  104. counter.reset();
  105. container.removeAllItems();
  106. counter.assertOnce();
  107. // already empty
  108. container.removeAllItems();
  109. counter.assertNone();
  110. }
  111. @Test
  112. public void testAddRemoveContainerFilter() {
  113. GeneratedPropertyContainer container = createContainer();
  114. ItemSetChangeCounter counter = new ItemSetChangeCounter();
  115. container.addListener(counter);
  116. // simply adding or removing container filters should cause events
  117. // (content changes)
  118. initializeContainer(container);
  119. counter.reset();
  120. SimpleStringFilter filter = new SimpleStringFilter(SIMPLE_NAME, "a",
  121. true, false);
  122. container.addContainerFilter(filter);
  123. counter.assertOnce();
  124. container.removeContainerFilter(filter);
  125. counter.assertOnce();
  126. container.addContainerFilter(
  127. new SimpleStringFilter(SIMPLE_NAME, "a", true, false));
  128. counter.assertOnce();
  129. container.removeAllContainerFilters();
  130. counter.assertOnce();
  131. }
  132. // TODO other tests should check positions after removing filter etc,
  133. // here concentrating on listeners
  134. @Test
  135. public void testItemSetChangeListenersFiltering() {
  136. Container.Indexed container = createContainer();
  137. ItemSetChangeCounter counter = new ItemSetChangeCounter();
  138. ((GeneratedPropertyContainer) container).addListener(counter);
  139. counter.reset();
  140. ((Container.Filterable) container)
  141. .addContainerFilter(new SimpleStringFilter(FULLY_QUALIFIED_NAME,
  142. "Test", true, false));
  143. // no real change, so no notification required
  144. counter.assertNone();
  145. String id1 = "com.example.Test1";
  146. String id2 = "com.example.Test2";
  147. String id3 = "com.example.Other";
  148. // perform operations while filtering container
  149. Item item;
  150. initializeContainer(container);
  151. counter.reset();
  152. // passes filter
  153. item = container.addItem(id1);
  154. // no event if filtered out
  155. counter.assertNone();
  156. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
  157. counter.assertOnce();
  158. // passes filter but already in the container
  159. item = container.addItem(id1);
  160. counter.assertNone();
  161. initializeContainer(container);
  162. counter.reset();
  163. // passes filter after change
  164. item = container.addItemAt(0, id1);
  165. counter.assertNone();
  166. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
  167. counter.assertOnce();
  168. item = container.addItemAt(container.size(), id2);
  169. counter.assertNone();
  170. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id2);
  171. counter.assertOnce();
  172. // passes filter but already in the container
  173. item = container.addItemAt(0, id1);
  174. counter.assertNone();
  175. item = container.addItemAt(container.size(), id2);
  176. counter.assertNone();
  177. initializeContainer(container);
  178. counter.reset();
  179. // passes filter
  180. item = container.addItemAfter(null, id1);
  181. counter.assertNone();
  182. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
  183. counter.assertOnce();
  184. item = container.addItemAfter(container.lastItemId(), id2);
  185. counter.assertNone();
  186. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id2);
  187. counter.assertOnce();
  188. // passes filter but already in the container
  189. item = container.addItemAfter(null, id1);
  190. counter.assertNone();
  191. item = container.addItemAfter(container.lastItemId(), id2);
  192. counter.assertNone();
  193. // does not pass filter
  194. // TODO implement rest
  195. initializeContainer(container);
  196. counter.reset();
  197. item = container.addItemAfter(null, id3);
  198. counter.assertNone();
  199. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  200. counter.assertNone();
  201. initializeContainer(container);
  202. counter.reset();
  203. item = container.addItemAfter(container.firstItemId(), id3);
  204. counter.assertNone();
  205. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  206. counter.assertNone();
  207. initializeContainer(container);
  208. counter.reset();
  209. item = container.addItemAfter(container.lastItemId(), id3);
  210. counter.assertNone();
  211. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  212. counter.assertNone();
  213. initializeContainer(container);
  214. counter.reset();
  215. item = container.addItemAt(0, id3);
  216. counter.assertNone();
  217. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  218. counter.assertNone();
  219. initializeContainer(container);
  220. counter.reset();
  221. item = container.addItemAt(1, id3);
  222. counter.assertNone();
  223. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  224. counter.assertNone();
  225. initializeContainer(container);
  226. counter.reset();
  227. item = container.addItemAt(container.size(), id3);
  228. counter.assertNone();
  229. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  230. counter.assertNone();
  231. // passes filter
  232. initializeContainer(container);
  233. counter.reset();
  234. item = container.addItem(id1);
  235. counter.assertNone();
  236. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
  237. counter.assertOnce();
  238. container.removeItem(id1);
  239. counter.assertOnce();
  240. // already removed
  241. container.removeItem(id1);
  242. counter.assertNone();
  243. item = container.addItem(id3);
  244. counter.assertNone();
  245. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id3);
  246. counter.assertNone();
  247. // not visible
  248. container.removeItem(id3);
  249. counter.assertNone();
  250. // remove all
  251. initializeContainer(container);
  252. item = container.addItem(id1);
  253. item.getItemProperty(FULLY_QUALIFIED_NAME).setValue(id1);
  254. counter.reset();
  255. container.removeAllItems();
  256. counter.assertOnce();
  257. // no visible items
  258. container.removeAllItems();
  259. counter.assertNone();
  260. }
  261. @Test
  262. public void testItemAdd_idSequence() {
  263. GeneratedPropertyContainer container = createContainer();
  264. Object itemId;
  265. itemId = container.addItem();
  266. assertEquals(Integer.valueOf(1), itemId);
  267. itemId = container.addItem();
  268. assertEquals(Integer.valueOf(2), itemId);
  269. itemId = container.addItemAfter(null);
  270. assertEquals(Integer.valueOf(3), itemId);
  271. itemId = container.addItemAt(2);
  272. assertEquals(Integer.valueOf(4), itemId);
  273. }
  274. @Test
  275. public void testItemAddRemove_idSequence() {
  276. GeneratedPropertyContainer container = createContainer();
  277. Object itemId;
  278. itemId = container.addItem();
  279. assertEquals(Integer.valueOf(1), itemId);
  280. container.removeItem(itemId);
  281. itemId = container.addItem();
  282. assertEquals(
  283. "Id sequence should continue from the previous value even if an item is removed",
  284. Integer.valueOf(2), itemId);
  285. }
  286. @Test
  287. public void testItemAddedEvent() {
  288. GeneratedPropertyContainer container = createContainer();
  289. ItemSetChangeListener addListener = createListenerMockFor(container);
  290. addListener.containerItemSetChange(EasyMock.isA(ItemAddEvent.class));
  291. EasyMock.replay(addListener);
  292. container.addItem();
  293. EasyMock.verify(addListener);
  294. }
  295. @Test
  296. public void testItemAddedEvent_AddedItem() {
  297. GeneratedPropertyContainer container = createContainer();
  298. ItemSetChangeListener addListener = createListenerMockFor(container);
  299. Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
  300. EasyMock.replay(addListener);
  301. Object itemId = container.addItem();
  302. assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
  303. }
  304. @Test
  305. public void testItemAddedEvent_IndexOfAddedItem() {
  306. GeneratedPropertyContainer container = createContainer();
  307. ItemSetChangeListener addListener = createListenerMockFor(container);
  308. container.addItem();
  309. Capture<ItemAddEvent> capturedEvent = captureAddEvent(addListener);
  310. EasyMock.replay(addListener);
  311. Object itemId = container.addItemAt(1);
  312. assertEquals(1, capturedEvent.getValue().getFirstIndex());
  313. }
  314. @Test
  315. public void testItemRemovedEvent() {
  316. GeneratedPropertyContainer container = createContainer();
  317. Object itemId = container.addItem();
  318. ItemSetChangeListener removeListener = createListenerMockFor(container);
  319. removeListener
  320. .containerItemSetChange(EasyMock.isA(ItemRemoveEvent.class));
  321. EasyMock.replay(removeListener);
  322. container.removeItem(itemId);
  323. EasyMock.verify(removeListener);
  324. }
  325. @Test
  326. public void testItemRemovedEvent_RemovedItem() {
  327. GeneratedPropertyContainer container = createContainer();
  328. Object itemId = container.addItem();
  329. ItemSetChangeListener removeListener = createListenerMockFor(container);
  330. Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(
  331. removeListener);
  332. EasyMock.replay(removeListener);
  333. container.removeItem(itemId);
  334. assertEquals(itemId, capturedEvent.getValue().getFirstItemId());
  335. }
  336. @Test
  337. public void testItemRemovedEvent_indexOfRemovedItem() {
  338. GeneratedPropertyContainer container = createContainer();
  339. container.addItem();
  340. Object secondItemId = container.addItem();
  341. ItemSetChangeListener removeListener = createListenerMockFor(container);
  342. Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(
  343. removeListener);
  344. EasyMock.replay(removeListener);
  345. container.removeItem(secondItemId);
  346. assertEquals(1, capturedEvent.getValue().getFirstIndex());
  347. }
  348. @Test
  349. public void testItemRemovedEvent_amountOfRemovedItems() {
  350. GeneratedPropertyContainer container = createContainer();
  351. container.addItem();
  352. container.addItem();
  353. ItemSetChangeListener removeListener = createListenerMockFor(container);
  354. Capture<ItemRemoveEvent> capturedEvent = captureRemoveEvent(
  355. removeListener);
  356. EasyMock.replay(removeListener);
  357. container.removeAllItems();
  358. assertEquals(2, capturedEvent.getValue().getRemovedItemsCount());
  359. }
  360. private Capture<ItemAddEvent> captureAddEvent(
  361. ItemSetChangeListener addListener) {
  362. Capture<ItemAddEvent> capturedEvent = new Capture<ItemAddEvent>();
  363. addListener.containerItemSetChange(EasyMock.capture(capturedEvent));
  364. return capturedEvent;
  365. }
  366. private Capture<ItemRemoveEvent> captureRemoveEvent(
  367. ItemSetChangeListener removeListener) {
  368. Capture<ItemRemoveEvent> capturedEvent = new Capture<ItemRemoveEvent>();
  369. removeListener.containerItemSetChange(EasyMock.capture(capturedEvent));
  370. return capturedEvent;
  371. }
  372. private ItemSetChangeListener createListenerMockFor(
  373. ItemSetChangeNotifier container) {
  374. ItemSetChangeListener listener = EasyMock
  375. .createNiceMock(ItemSetChangeListener.class);
  376. container.addItemSetChangeListener(listener);
  377. return listener;
  378. }
  379. // Ticket 8028
  380. @Test
  381. public void testGetItemIdsRangeIndexOutOfBounds() {
  382. GeneratedPropertyContainer ic = createContainer();
  383. try {
  384. ic.getItemIds(-1, 10);
  385. fail("Container returned items starting from index -1, something very wrong here!");
  386. } catch (IndexOutOfBoundsException e) {
  387. // This is expected...
  388. } catch (Exception e) {
  389. // Should not happen!
  390. fail("Container threw unspecified exception when fetching a range of items and the range started from -1");
  391. }
  392. }
  393. // Ticket 8028
  394. @Test
  395. public void testGetItemIdsRangeIndexOutOfBounds2() {
  396. GeneratedPropertyContainer ic = createContainer();
  397. ic.addItem(new Object());
  398. try {
  399. ic.getItemIds(2, 1);
  400. fail("Container returned items starting from index -1, something very wrong here!");
  401. } catch (IndexOutOfBoundsException e) {
  402. // This is expected...
  403. } catch (Exception e) {
  404. // Should not happen!
  405. fail("Container threw unspecified exception when fetching a out of bounds range of items");
  406. }
  407. }
  408. // Ticket 8028
  409. @Test
  410. public void testGetItemIdsRangeZeroRange() {
  411. GeneratedPropertyContainer ic = createContainer();
  412. ic.addItem(new Object());
  413. try {
  414. List<Object> itemIds = (List<Object>) ic.getItemIds(1, 0);
  415. assertTrue(
  416. "Container returned actual values when asking for 0 items...",
  417. itemIds.isEmpty());
  418. } catch (Exception e) {
  419. // Should not happen!
  420. fail("Container threw unspecified exception when fetching 0 items...");
  421. }
  422. }
  423. // Ticket 8028
  424. @Test
  425. public void testGetItemIdsRangeNegativeRange() {
  426. GeneratedPropertyContainer ic = createContainer();
  427. ic.addItem(new Object());
  428. try {
  429. List<Object> itemIds = (List<Object>) ic.getItemIds(1, -1);
  430. assertTrue(
  431. "Container returned actual values when asking for -1 items...",
  432. itemIds.isEmpty());
  433. } catch (IllegalArgumentException e) {
  434. // this is expected
  435. } catch (Exception e) {
  436. // Should not happen!
  437. fail("Container threw unspecified exception when fetching -1 items...");
  438. }
  439. }
  440. // Ticket 8028
  441. @Test
  442. public void testGetItemIdsRangeIndexOutOfBoundsDueToSizeChange() {
  443. GeneratedPropertyContainer ic = createContainer();
  444. ic.addItem(new Object());
  445. Assert.assertEquals(
  446. "Container returned too many items when the range was >> container size",
  447. 1, ic.getItemIds(0, 10).size());
  448. }
  449. // Ticket 8028
  450. @Test
  451. public void testGetItemIdsRangeBaseCase() {
  452. GeneratedPropertyContainer ic = createContainer();
  453. String object1 = new String("Obj1");
  454. String object2 = new String("Obj2");
  455. String object3 = new String("Obj3");
  456. String object4 = new String("Obj4");
  457. String object5 = new String("Obj5");
  458. ic.addItem(object1);
  459. ic.addItem(object2);
  460. ic.addItem(object3);
  461. ic.addItem(object4);
  462. ic.addItem(object5);
  463. try {
  464. List<Object> itemIds = (List<Object>) ic.getItemIds(1, 2);
  465. assertTrue(itemIds.contains(object2));
  466. assertTrue(itemIds.contains(object3));
  467. assertEquals(2, itemIds.size());
  468. } catch (Exception e) {
  469. // Should not happen!
  470. fail("Container threw exception when fetching a range of items ");
  471. }
  472. }
  473. // test getting non-existing property (#10445)
  474. @Test
  475. public void testNonExistingProperty() {
  476. Container ic = createContainer();
  477. String object1 = new String("Obj1");
  478. ic.addItem(object1);
  479. assertNull(ic.getContainerProperty(object1, "xyz"));
  480. }
  481. // test getting null property id (#10445)
  482. @Test
  483. public void testNullPropertyId() {
  484. Container ic = createContainer();
  485. String object1 = new String("Obj1");
  486. ic.addItem(object1);
  487. assertNull(ic.getContainerProperty(object1, null));
  488. }
  489. @Override
  490. protected void initializeContainer(Container container) {
  491. if (container instanceof GeneratedPropertyContainer) {
  492. super.initializeContainer(((GeneratedPropertyContainer) container)
  493. .getWrappedContainer());
  494. } else {
  495. super.initializeContainer(container);
  496. }
  497. }
  498. }