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

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