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.

InMemoryHierarchicalDataProviderTest.java 9.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. package com.vaadin.data.provider;
  2. import java.util.ArrayList;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6. import org.junit.Assert;
  7. import org.junit.Test;
  8. import com.vaadin.data.HierarchyData;
  9. import com.vaadin.server.SerializablePredicate;
  10. public class InMemoryHierarchicalDataProviderTest extends
  11. DataProviderTestBase<InMemoryHierarchicalDataProvider<StrBean>> {
  12. private HierarchyData<StrBean> data;
  13. private List<StrBean> flattenedData;
  14. private List<StrBean> rootData;
  15. @Override
  16. public void setUp() {
  17. List<StrBean> randomBeans = StrBean.generateRandomBeans(20);
  18. flattenedData = new ArrayList<>();
  19. rootData = new ArrayList<>();
  20. data = new HierarchyData<>();
  21. data.addItems(null, randomBeans.subList(0, 5));
  22. data.addItems(randomBeans.get(0), randomBeans.subList(5, 10));
  23. data.addItems(randomBeans.get(5), randomBeans.subList(10, 15));
  24. data.addItems(null, randomBeans.subList(15, 20));
  25. flattenedData.add(randomBeans.get(0));
  26. flattenedData.add(randomBeans.get(5));
  27. flattenedData.addAll(randomBeans.subList(10, 15));
  28. flattenedData.addAll(randomBeans.subList(6, 10));
  29. flattenedData.addAll(randomBeans.subList(1, 5));
  30. flattenedData.addAll(randomBeans.subList(15, 20));
  31. rootData.addAll(randomBeans.subList(0, 5));
  32. rootData.addAll(randomBeans.subList(15, 20));
  33. super.setUp();
  34. }
  35. @Test(expected = IllegalArgumentException.class)
  36. public void hierarchyData_add_item_parent_not_in_hierarchy_throws() {
  37. new HierarchyData<>().addItem(new StrBean("", 0, 0),
  38. new StrBean("", 0, 0));
  39. }
  40. @Test(expected = NullPointerException.class)
  41. public void hierarchyData_add_null_item_throws() {
  42. new HierarchyData<>().addItem(null, null);
  43. }
  44. @Test(expected = IllegalArgumentException.class)
  45. public void hierarchyData_add_item_already_in_hierarchy_throws() {
  46. StrBean bean = new StrBean("", 0, 0);
  47. new HierarchyData<>().addItem(null, bean).addItem(null, bean);
  48. }
  49. @Test
  50. public void hierarchyData_remove_root_item() {
  51. data.removeItem(null);
  52. Assert.assertTrue(data.getChildren(null).isEmpty());
  53. }
  54. @Test
  55. public void hierarchyData_clear() {
  56. data.clear();
  57. Assert.assertTrue(data.getChildren(null).isEmpty());
  58. }
  59. @Test
  60. public void setFilter() {
  61. getDataProvider().setFilter(item -> item.getValue().equals("Xyz")
  62. || item.getValue().equals("Baz"));
  63. Assert.assertEquals(10, sizeWithUnfilteredQuery());
  64. getDataProvider().setFilter(item -> !item.getValue().equals("Foo")
  65. && !item.getValue().equals("Xyz"));
  66. Assert.assertEquals(
  67. "Previous filter should be replaced when setting a new one", 6,
  68. sizeWithUnfilteredQuery());
  69. getDataProvider().setFilter(null);
  70. Assert.assertEquals("Setting filter to null should remove all filters",
  71. 20, sizeWithUnfilteredQuery());
  72. }
  73. @Test
  74. public void addFilter() {
  75. getDataProvider().addFilter(item -> item.getId() <= 10);
  76. getDataProvider().addFilter(item -> item.getId() >= 5);
  77. Assert.assertEquals(5, sizeWithUnfilteredQuery());
  78. }
  79. @Override
  80. public void filteringListDataProvider_convertFilter() {
  81. DataProvider<StrBean, String> strFilterDataProvider = getDataProvider()
  82. .withConvertedFilter(
  83. text -> strBean -> strBean.getValue().contains(text));
  84. Assert.assertEquals("Only one item should match 'Xyz'", 1,
  85. strFilterDataProvider
  86. .size(new HierarchicalQuery<>("Xyz", null)));
  87. Assert.assertEquals("No item should match 'Zyx'", 0,
  88. strFilterDataProvider
  89. .size(new HierarchicalQuery<>("Zyx", null)));
  90. Assert.assertEquals("Unexpected number of matches for 'Foo'", 3,
  91. strFilterDataProvider
  92. .size(new HierarchicalQuery<>("Foo", null)));
  93. Assert.assertEquals("No items should've been filtered out",
  94. rootData.size(), strFilterDataProvider
  95. .size(new HierarchicalQuery<>(null, null)));
  96. }
  97. @Override
  98. public void filteringListDataProvider_defaultFilterType() {
  99. Assert.assertEquals("Only one item should match 'Xyz'", 1,
  100. getDataProvider().size(new HierarchicalQuery<>(
  101. strBean -> strBean.getValue().contains("Xyz"), null)));
  102. Assert.assertEquals("No item should match 'Zyx'", 0,
  103. dataProvider.size(new HierarchicalQuery<>(
  104. strBean -> strBean.getValue().contains("Zyx"), null)));
  105. Assert.assertEquals("Unexpected number of matches for 'Foo'", 3,
  106. getDataProvider()
  107. .size(new HierarchicalQuery<>(fooFilter, null)));
  108. }
  109. @Override
  110. public void testDefaultSortWithSpecifiedPostSort() {
  111. Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
  112. .thenComparing(Comparator.comparing(StrBean::getId).reversed());
  113. setSortOrder(QuerySortOrder.asc("value").thenDesc("id").build(), comp);
  114. List<StrBean> list = getDataProvider()
  115. .fetch(createQuery(QuerySortOrder.asc("randomNumber").build(),
  116. Comparator.comparing(StrBean::getRandomNumber), null,
  117. null))
  118. .collect(Collectors.toList());
  119. Assert.assertEquals("Sorted data and original data sizes don't match",
  120. getDataProvider().fetch(new HierarchicalQuery<>(null, null))
  121. .count(),
  122. list.size());
  123. for (int i = 1; i < list.size(); ++i) {
  124. StrBean prev = list.get(i - 1);
  125. StrBean cur = list.get(i);
  126. // Test specific sort
  127. Assert.assertTrue(
  128. "Failure: " + prev.getRandomNumber() + " > "
  129. + cur.getRandomNumber(),
  130. prev.getRandomNumber() <= cur.getRandomNumber());
  131. if (prev.getRandomNumber() == cur.getRandomNumber()) {
  132. // Test default sort
  133. Assert.assertTrue(
  134. prev.getValue().compareTo(cur.getValue()) <= 0);
  135. if (prev.getValue().equals(cur.getValue())) {
  136. Assert.assertTrue(prev.getId() > cur.getId());
  137. }
  138. }
  139. }
  140. }
  141. @Override
  142. public void testDefaultSortWithFunction() {
  143. setSortOrder(QuerySortOrder.asc("value").build(),
  144. Comparator.comparing(StrBean::getValue));
  145. List<StrBean> list = getDataProvider()
  146. .fetch(new HierarchicalQuery<>(null, null))
  147. .collect(Collectors.toList());
  148. Assert.assertEquals("Sorted data and original data sizes don't match",
  149. rootData.size(), list.size());
  150. for (int i = 1; i < list.size(); ++i) {
  151. StrBean prev = list.get(i - 1);
  152. StrBean cur = list.get(i);
  153. // Test default sort
  154. Assert.assertTrue(prev.getValue().compareTo(cur.getValue()) <= 0);
  155. }
  156. }
  157. @Override
  158. public void testListContainsAllData() {
  159. assertHierarchyCorrect();
  160. }
  161. @Override
  162. public void testSortByComparatorListsDiffer() {
  163. Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
  164. .thenComparing(StrBean::getRandomNumber)
  165. .thenComparing(StrBean::getId);
  166. List<StrBean> list = getDataProvider().fetch(
  167. createQuery(QuerySortOrder.asc("value").thenAsc("randomNumber")
  168. .thenAsc("id").build(), comp, null, null))
  169. .collect(Collectors.toList());
  170. Assert.assertNotEquals("First value should not match", rootData.get(0),
  171. list.get(0));
  172. Assert.assertEquals("Sorted data and original data sizes don't match",
  173. rootData.size(), list.size());
  174. rootData.sort(comp);
  175. for (int i = 0; i < rootData.size(); ++i) {
  176. Assert.assertEquals("Sorting result differed", rootData.get(i),
  177. list.get(i));
  178. }
  179. }
  180. @Override
  181. protected InMemoryHierarchicalDataProvider<StrBean> createDataProvider() {
  182. return new InMemoryHierarchicalDataProvider<>(data);
  183. }
  184. @Override
  185. protected void setSortOrder(List<QuerySortOrder> sortOrder,
  186. Comparator<StrBean> comp) {
  187. getDataProvider().setSortComparator(comp::compare);
  188. }
  189. @Override
  190. protected long sizeWithUnfilteredQuery() {
  191. return getFlattenedDataFromProvider(new ArrayList<>(), null).size();
  192. }
  193. private void assertHierarchyCorrect() {
  194. Assert.assertEquals(flattenedData,
  195. getFlattenedData(new ArrayList<>(), null));
  196. Assert.assertEquals(flattenedData,
  197. getFlattenedDataFromProvider(new ArrayList<>(), null));
  198. }
  199. private List<StrBean> getFlattenedData(List<StrBean> flattened,
  200. StrBean item) {
  201. if (item != null) {
  202. flattened.add(item);
  203. }
  204. data.getChildren(item)
  205. .forEach(child -> getFlattenedData(flattened, child));
  206. return flattened;
  207. }
  208. private List<StrBean> getFlattenedDataFromProvider(List<StrBean> flattened,
  209. StrBean item) {
  210. if (item != null) {
  211. flattened.add(item);
  212. }
  213. getDataProvider().fetchChildren(new HierarchicalQuery<>(null, item))
  214. .forEach(child -> getFlattenedDataFromProvider(flattened,
  215. child));
  216. return flattened;
  217. }
  218. private HierarchicalQuery<StrBean, SerializablePredicate<StrBean>> createQuery(
  219. List<QuerySortOrder> sortOrder, Comparator<StrBean> comp,
  220. SerializablePredicate<StrBean> filter, StrBean parent) {
  221. return new HierarchicalQuery<>(0, Integer.MAX_VALUE, sortOrder, comp,
  222. filter, parent);
  223. }
  224. }