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.

GeneratedPropertyContainerTest.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. package com.vaadin.v7.data.util;
  2. import static org.junit.Assert.assertEquals;
  3. import static org.junit.Assert.assertFalse;
  4. import static org.junit.Assert.assertTrue;
  5. import static org.junit.Assert.fail;
  6. import org.junit.Before;
  7. import org.junit.Test;
  8. import com.vaadin.v7.data.Container.Filter;
  9. import com.vaadin.v7.data.Container.Indexed;
  10. import com.vaadin.v7.data.Container.ItemSetChangeEvent;
  11. import com.vaadin.v7.data.Container.ItemSetChangeListener;
  12. import com.vaadin.v7.data.Container.PropertySetChangeEvent;
  13. import com.vaadin.v7.data.Container.PropertySetChangeListener;
  14. import com.vaadin.v7.data.Item;
  15. import com.vaadin.v7.data.sort.SortOrder;
  16. import com.vaadin.v7.data.util.GeneratedPropertyContainer.GeneratedPropertyItem;
  17. import com.vaadin.v7.data.util.filter.Compare;
  18. import com.vaadin.v7.data.util.filter.UnsupportedFilterException;
  19. public class GeneratedPropertyContainerTest {
  20. GeneratedPropertyContainer container;
  21. Indexed wrappedContainer;
  22. private static double MILES_CONVERSION = 0.6214d;
  23. private class GeneratedPropertyListener
  24. implements PropertySetChangeListener {
  25. private int callCount = 0;
  26. public int getCallCount() {
  27. return callCount;
  28. }
  29. @Override
  30. public void containerPropertySetChange(PropertySetChangeEvent event) {
  31. ++callCount;
  32. assertEquals(
  33. "Container for event was not GeneratedPropertyContainer",
  34. event.getContainer(), container);
  35. }
  36. }
  37. private class GeneratedItemSetListener implements ItemSetChangeListener {
  38. private int callCount = 0;
  39. public int getCallCount() {
  40. return callCount;
  41. }
  42. @Override
  43. public void containerItemSetChange(ItemSetChangeEvent event) {
  44. ++callCount;
  45. assertEquals(
  46. "Container for event was not GeneratedPropertyContainer",
  47. event.getContainer(), container);
  48. }
  49. }
  50. @Before
  51. public void setUp() {
  52. container = new GeneratedPropertyContainer(createContainer());
  53. }
  54. @Test
  55. public void testSimpleGeneratedProperty() {
  56. container.addGeneratedProperty("hello",
  57. new PropertyValueGenerator<String>() {
  58. @Override
  59. public String getValue(Item item, Object itemId,
  60. Object propertyId) {
  61. return "Hello World!";
  62. }
  63. @Override
  64. public Class<String> getType() {
  65. return String.class;
  66. }
  67. });
  68. Object itemId = container.addItem();
  69. assertEquals("Expected value not in item.",
  70. container.getItem(itemId).getItemProperty("hello").getValue(),
  71. "Hello World!");
  72. }
  73. @Test
  74. public void testSortableProperties() {
  75. container.addGeneratedProperty("baz",
  76. new PropertyValueGenerator<String>() {
  77. @Override
  78. public String getValue(Item item, Object itemId,
  79. Object propertyId) {
  80. return item.getItemProperty("foo").getValue() + " "
  81. + item.getItemProperty("bar").getValue();
  82. }
  83. @Override
  84. public Class<String> getType() {
  85. return String.class;
  86. }
  87. @Override
  88. public SortOrder[] getSortProperties(SortOrder order) {
  89. SortOrder[] sortOrder = new SortOrder[1];
  90. sortOrder[0] = new SortOrder("bar",
  91. order.getDirection());
  92. return sortOrder;
  93. }
  94. });
  95. container.sort(new Object[] { "baz" }, new boolean[] { true });
  96. assertEquals("foo 0", container.getItem(container.getIdByIndex(0))
  97. .getItemProperty("baz").getValue());
  98. container.sort(new Object[] { "baz" }, new boolean[] { false });
  99. assertEquals("foo 10", container.getItem(container.getIdByIndex(0))
  100. .getItemProperty("baz").getValue());
  101. }
  102. @Test
  103. public void testOverrideSortableProperties() {
  104. assertTrue(container.getSortableContainerPropertyIds().contains("bar"));
  105. container.addGeneratedProperty("bar",
  106. new PropertyValueGenerator<String>() {
  107. @Override
  108. public String getValue(Item item, Object itemId,
  109. Object propertyId) {
  110. return item.getItemProperty("foo").getValue() + " "
  111. + item.getItemProperty("bar").getValue();
  112. }
  113. @Override
  114. public Class<String> getType() {
  115. return String.class;
  116. }
  117. });
  118. assertFalse(
  119. container.getSortableContainerPropertyIds().contains("bar"));
  120. }
  121. @Test
  122. public void testFilterByMiles() {
  123. container.addGeneratedProperty("miles",
  124. new PropertyValueGenerator<Double>() {
  125. @Override
  126. public Double getValue(Item item, Object itemId,
  127. Object propertyId) {
  128. return (Double) item.getItemProperty("km").getValue()
  129. * MILES_CONVERSION;
  130. }
  131. @Override
  132. public Class<Double> getType() {
  133. return Double.class;
  134. }
  135. @Override
  136. public Filter modifyFilter(Filter filter)
  137. throws UnsupportedFilterException {
  138. if (filter instanceof Compare.LessOrEqual) {
  139. Double value = (Double) ((Compare.LessOrEqual) filter)
  140. .getValue();
  141. value = value / MILES_CONVERSION;
  142. return new Compare.LessOrEqual("km", value);
  143. }
  144. return super.modifyFilter(filter);
  145. }
  146. });
  147. for (Object itemId : container.getItemIds()) {
  148. Item item = container.getItem(itemId);
  149. Double km = (Double) item.getItemProperty("km").getValue();
  150. Double miles = (Double) item.getItemProperty("miles").getValue();
  151. assertTrue(miles.equals(km * MILES_CONVERSION));
  152. }
  153. Filter filter = new Compare.LessOrEqual("miles", MILES_CONVERSION);
  154. container.addContainerFilter(filter);
  155. for (Object itemId : container.getItemIds()) {
  156. Item item = container.getItem(itemId);
  157. assertTrue("Item did not pass original filter.",
  158. filter.passesFilter(itemId, item));
  159. }
  160. assertTrue(container.getContainerFilters().contains(filter));
  161. container.removeContainerFilter(filter);
  162. assertFalse(container.getContainerFilters().contains(filter));
  163. boolean allPass = true;
  164. for (Object itemId : container.getItemIds()) {
  165. Item item = container.getItem(itemId);
  166. if (!filter.passesFilter(itemId, item)) {
  167. allPass = false;
  168. }
  169. }
  170. if (allPass) {
  171. fail("Removing filter did not introduce any previous filtered items");
  172. }
  173. }
  174. @Test
  175. public void testPropertySetChangeNotifier() {
  176. GeneratedPropertyListener listener = new GeneratedPropertyListener();
  177. GeneratedPropertyListener removedListener = new GeneratedPropertyListener();
  178. container.addPropertySetChangeListener(listener);
  179. container.addPropertySetChangeListener(removedListener);
  180. container.addGeneratedProperty("foo",
  181. new PropertyValueGenerator<String>() {
  182. @Override
  183. public String getValue(Item item, Object itemId,
  184. Object propertyId) {
  185. return "";
  186. }
  187. @Override
  188. public Class<String> getType() {
  189. return String.class;
  190. }
  191. });
  192. // Adding property to wrapped container should cause an event
  193. wrappedContainer.addContainerProperty("baz", String.class, "");
  194. container.removePropertySetChangeListener(removedListener);
  195. container.removeGeneratedProperty("foo");
  196. assertEquals("Listener was not called correctly.", 3,
  197. listener.getCallCount());
  198. assertEquals("Removed listener was not called correctly.", 2,
  199. removedListener.getCallCount());
  200. }
  201. @Test
  202. public void testItemSetChangeNotifier() {
  203. GeneratedItemSetListener listener = new GeneratedItemSetListener();
  204. container.addItemSetChangeListener(listener);
  205. container.sort(new Object[] { "foo" }, new boolean[] { true });
  206. container.sort(new Object[] { "foo" }, new boolean[] { false });
  207. assertEquals("Listener was not called correctly.", 2,
  208. listener.getCallCount());
  209. }
  210. @Test
  211. public void testRemoveProperty() {
  212. container.removeContainerProperty("foo");
  213. assertFalse("Container contained removed property",
  214. container.getContainerPropertyIds().contains("foo"));
  215. assertTrue("Wrapped container did not contain removed property",
  216. wrappedContainer.getContainerPropertyIds().contains("foo"));
  217. assertFalse(container.getItem(container.firstItemId())
  218. .getItemPropertyIds().contains("foo"));
  219. container.addContainerProperty("foo", null, null);
  220. assertTrue("Container did not contain returned property",
  221. container.getContainerPropertyIds().contains("foo"));
  222. }
  223. @Test
  224. public void testGetWrappedItem() {
  225. Object itemId = wrappedContainer.getItemIds().iterator().next();
  226. Item wrappedItem = wrappedContainer.getItem(itemId);
  227. GeneratedPropertyItem generatedPropertyItem = (GeneratedPropertyItem) container
  228. .getItem(itemId);
  229. assertEquals(wrappedItem, generatedPropertyItem.getWrappedItem());
  230. }
  231. private Indexed createContainer() {
  232. wrappedContainer = new IndexedContainer();
  233. wrappedContainer.addContainerProperty("foo", String.class, "foo");
  234. wrappedContainer.addContainerProperty("bar", Integer.class, 0);
  235. // km contains double values from 0.0 to 2.0
  236. wrappedContainer.addContainerProperty("km", Double.class, 0);
  237. for (int i = 0; i <= 10; ++i) {
  238. Object itemId = wrappedContainer.addItem();
  239. Item item = wrappedContainer.getItem(itemId);
  240. item.getItemProperty("foo").setValue("foo");
  241. item.getItemProperty("bar").setValue(i);
  242. item.getItemProperty("km").setValue(i / 5.0d);
  243. }
  244. return wrappedContainer;
  245. }
  246. }