選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

DataProviderTestBase.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. package com.vaadin.server.data.provider;
  2. import static org.junit.Assert.assertTrue;
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.LinkedList;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import org.junit.Assert;
  9. import org.junit.Before;
  10. import org.junit.Test;
  11. import com.vaadin.server.SerializablePredicate;
  12. import com.vaadin.server.data.DataChangeEvent;
  13. import com.vaadin.server.data.DataProvider;
  14. import com.vaadin.server.data.DataProviderListener;
  15. import com.vaadin.server.data.Query;
  16. import com.vaadin.server.data.Sort;
  17. import com.vaadin.server.data.SortOrder;
  18. public abstract class DataProviderTestBase<D extends DataProvider<StrBean, SerializablePredicate<StrBean>>> {
  19. protected static class CountingListener implements DataProviderListener {
  20. private int counter = 0;
  21. @Override
  22. public void onEvent(DataChangeEvent event) {
  23. ++counter;
  24. }
  25. public int getCounter() {
  26. return counter;
  27. }
  28. }
  29. protected final SerializablePredicate<StrBean> fooFilter = s -> s.getValue()
  30. .equals("Foo");
  31. protected final SerializablePredicate<StrBean> gt5Filter = s -> s
  32. .getRandomNumber() > 5;
  33. protected D dataProvider;
  34. protected List<StrBean> data = StrBean.generateRandomBeans(100);
  35. @Before
  36. public void setUp() {
  37. dataProvider = createDataProvider();
  38. }
  39. protected abstract D createDataProvider();
  40. protected final D getDataProvider() {
  41. return dataProvider;
  42. }
  43. protected abstract D sortingBy(List<SortOrder<String>> sortOrder,
  44. Comparator<StrBean> comp);
  45. private Query<StrBean, SerializablePredicate<StrBean>> createQuery(
  46. List<SortOrder<String>> sortOrder, Comparator<StrBean> comp) {
  47. return createQuery(sortOrder, comp, null);
  48. }
  49. private Query<StrBean, SerializablePredicate<StrBean>> createQuery(
  50. List<SortOrder<String>> sortOrder, Comparator<StrBean> comp,
  51. SerializablePredicate<StrBean> filter) {
  52. return new Query<StrBean, SerializablePredicate<StrBean>>(0,
  53. Integer.MAX_VALUE, sortOrder, comp, filter);
  54. }
  55. private Query<StrBean, SerializablePredicate<StrBean>> createQuery(
  56. SerializablePredicate<StrBean> filter) {
  57. return createQuery(Collections.emptyList(), null, filter);
  58. }
  59. // Tests start here.
  60. @Test
  61. public void testListContainsAllData() {
  62. List<StrBean> list = new LinkedList<>(data);
  63. dataProvider.fetch(new Query<>())
  64. .forEach(str -> assertTrue(
  65. "Data provider contained values not in original data",
  66. list.remove(str)));
  67. assertTrue("Not all values from original data were in data provider",
  68. list.isEmpty());
  69. }
  70. @Test
  71. public void testSortByComparatorListsDiffer() {
  72. Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
  73. .thenComparing(StrBean::getRandomNumber)
  74. .thenComparing(StrBean::getId);
  75. List<StrBean> list = dataProvider
  76. .fetch(createQuery(Sort.asc("value").thenAsc("randomNumber")
  77. .thenAsc("id").build(), comp))
  78. .collect(Collectors.toList());
  79. // First value in data is { Xyz, 10, 100 } which should be last in list
  80. Assert.assertNotEquals("First value should not match", data.get(0),
  81. list.get(0));
  82. Assert.assertEquals("Sorted data and original data sizes don't match",
  83. data.size(), list.size());
  84. data.sort(comp);
  85. for (int i = 0; i < data.size(); ++i) {
  86. Assert.assertEquals("Sorting result differed", data.get(i),
  87. list.get(i));
  88. }
  89. }
  90. @Test
  91. public void testDefaultSortWithSpecifiedPostSort() {
  92. Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
  93. .thenComparing(Comparator.comparing(StrBean::getId).reversed());
  94. List<StrBean> list = sortingBy(
  95. Sort.asc("value").thenDesc("id").build(), comp)
  96. .fetch(createQuery(Sort.asc("randomNumber").build(),
  97. Comparator.comparing(StrBean::getRandomNumber)))
  98. .collect(Collectors.toList());
  99. Assert.assertEquals("Sorted data and original data sizes don't match",
  100. data.size(), list.size());
  101. for (int i = 1; i < list.size(); ++i) {
  102. StrBean prev = list.get(i - 1);
  103. StrBean cur = list.get(i);
  104. // Test specific sort
  105. Assert.assertTrue(
  106. "Failure: " + prev.getRandomNumber() + " > "
  107. + cur.getRandomNumber(),
  108. prev.getRandomNumber() <= cur.getRandomNumber());
  109. if (prev.getRandomNumber() == cur.getRandomNumber()) {
  110. // Test default sort
  111. Assert.assertTrue(
  112. prev.getValue().compareTo(cur.getValue()) <= 0);
  113. if (prev.getValue().equals(cur.getValue())) {
  114. Assert.assertTrue(prev.getId() > cur.getId());
  115. }
  116. }
  117. }
  118. }
  119. @Test
  120. public void testDefaultSortWithFunction() {
  121. List<StrBean> list = sortingBy(Sort.asc("value").build(),
  122. Comparator.comparing(StrBean::getValue)).fetch(new Query<>())
  123. .collect(Collectors.toList());
  124. Assert.assertEquals("Sorted data and original data sizes don't match",
  125. data.size(), list.size());
  126. for (int i = 1; i < list.size(); ++i) {
  127. StrBean prev = list.get(i - 1);
  128. StrBean cur = list.get(i);
  129. // Test default sort
  130. Assert.assertTrue(prev.getValue().compareTo(cur.getValue()) <= 0);
  131. }
  132. }
  133. @Test
  134. public void refreshAll_changeBeanInstance() {
  135. StrBean bean = new StrBean("foo", -1, hashCode());
  136. int size = dataProvider.size(new Query<>());
  137. data.set(0, bean);
  138. dataProvider.refreshAll();
  139. List<StrBean> list = dataProvider.fetch(new Query<>())
  140. .collect(Collectors.toList());
  141. StrBean first = list.get(0);
  142. Assert.assertEquals(bean.getValue(), first.getValue());
  143. Assert.assertEquals(bean.getRandomNumber(), first.getRandomNumber());
  144. Assert.assertEquals(bean.getId(), first.getId());
  145. Assert.assertEquals(size, dataProvider.size(new Query<>()));
  146. }
  147. @Test
  148. public void refreshAll_updateBean() {
  149. int size = dataProvider.size(new Query<>());
  150. StrBean bean = data.get(0);
  151. bean.setValue("foo");
  152. dataProvider.refreshAll();
  153. List<StrBean> list = dataProvider.fetch(new Query<>())
  154. .collect(Collectors.toList());
  155. StrBean first = list.get(0);
  156. Assert.assertEquals("foo", first.getValue());
  157. Assert.assertEquals(size, dataProvider.size(new Query<>()));
  158. }
  159. @Test
  160. public void refreshAll_sortingBy_changeBeanInstance() {
  161. StrBean bean = new StrBean("foo", -1, hashCode());
  162. int size = dataProvider.size(new Query<>());
  163. data.set(0, bean);
  164. D dSource = sortingBy(Sort.asc("id").build(),
  165. Comparator.comparing(StrBean::getId));
  166. dSource.refreshAll();
  167. List<StrBean> list = dSource.fetch(new Query<>())
  168. .collect(Collectors.toList());
  169. StrBean first = list.get(0);
  170. Assert.assertEquals(bean.getValue(), first.getValue());
  171. Assert.assertEquals(bean.getRandomNumber(), first.getRandomNumber());
  172. Assert.assertEquals(bean.getId(), first.getId());
  173. Assert.assertEquals(size, dataProvider.size(new Query<>()));
  174. }
  175. @Test
  176. public void refreshAll_addBeanInstance() {
  177. StrBean bean = new StrBean("foo", -1, hashCode());
  178. int size = dataProvider.size(new Query<>());
  179. data.add(0, bean);
  180. dataProvider.refreshAll();
  181. List<StrBean> list = dataProvider.fetch(new Query<>())
  182. .collect(Collectors.toList());
  183. StrBean first = list.get(0);
  184. Assert.assertEquals(bean.getValue(), first.getValue());
  185. Assert.assertEquals(bean.getRandomNumber(), first.getRandomNumber());
  186. Assert.assertEquals(bean.getId(), first.getId());
  187. Assert.assertEquals(size + 1, dataProvider.size(new Query<>()));
  188. }
  189. @Test
  190. public void refreshAll_removeBeanInstance() {
  191. int size = dataProvider.size(new Query<>());
  192. data.remove(0);
  193. dataProvider.refreshAll();
  194. Assert.assertEquals(size - 1, dataProvider.size(new Query<>()));
  195. }
  196. @Test
  197. public void refreshAll_fromParentToSortedBy() {
  198. D sortedDataProvider = sortingBy(Sort.asc("randomNumber").build(),
  199. Comparator.comparing(StrBean::getRandomNumber));
  200. CountingListener listener = new CountingListener();
  201. sortedDataProvider.addDataProviderListener(listener);
  202. Assert.assertEquals("Listener was not called prematurely", 0,
  203. listener.getCounter());
  204. dataProvider.refreshAll();
  205. Assert.assertEquals("Listener was not called correctly", 1,
  206. listener.getCounter());
  207. sortedDataProvider.refreshAll();
  208. Assert.assertEquals("Listener was not called correctly", 2,
  209. listener.getCounter());
  210. }
  211. @Test
  212. public void filteringListDataProvider_convertFilter() {
  213. DataProvider<StrBean, String> strFilterDataProvider = dataProvider
  214. .convertFilter(
  215. text -> strBean -> strBean.getValue().contains(text));
  216. Assert.assertEquals("Only one item should match 'Xyz'", 1,
  217. strFilterDataProvider.size(new Query<>("Xyz")));
  218. Assert.assertEquals("No item should match 'Zyx'", 0,
  219. strFilterDataProvider.size(new Query<>("Zyx")));
  220. Assert.assertEquals("Unexpected number of matches for 'Foo'", 36,
  221. strFilterDataProvider.size(new Query<>("Foo")));
  222. Assert.assertEquals("No items should've been filtered out", data.size(),
  223. strFilterDataProvider.size(new Query<>()));
  224. }
  225. @Test
  226. public void filteringListDataProvider_defaultFilterType() {
  227. Assert.assertEquals("Only one item should match 'Xyz'", 1,
  228. dataProvider.size(new Query<>(
  229. strBean -> strBean.getValue().contains("Xyz"))));
  230. Assert.assertEquals("No item should match 'Zyx'", 0, dataProvider.size(
  231. new Query<>(strBean -> strBean.getValue().contains("Zyx"))));
  232. Assert.assertEquals("Unexpected number of matches for 'Foo'", 36,
  233. dataProvider.size(new Query<>(fooFilter)));
  234. }
  235. @Test
  236. public void filteringListDataProvider_defaultFilter() {
  237. // Intentionally lost filter type. Not actually filterable anymore.
  238. DataProvider<StrBean, ?> filtered = dataProvider.setFilter(gt5Filter);
  239. Assert.assertEquals("Filter not applied, unexpected item count",
  240. dataProvider.size(new Query<>(gt5Filter)),
  241. filtered.size(new Query<>()));
  242. Assert.assertEquals("Further filtering succeeded",
  243. filtered.size(new Query<>()),
  244. filtered.size((Query) new Query<>(fooFilter)));
  245. }
  246. }