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.

TreeDataProviderTest.java 14KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377
  1. package com.vaadin.data.provider;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Comparator;
  5. import java.util.List;
  6. import java.util.stream.Collectors;
  7. import java.util.stream.Stream;
  8. import org.junit.Assert;
  9. import org.junit.Test;
  10. import com.vaadin.data.TreeData;
  11. import com.vaadin.server.SerializablePredicate;
  12. public class TreeDataProviderTest
  13. extends DataProviderTestBase<TreeDataProvider<StrBean>> {
  14. private TreeData<StrBean> data;
  15. private List<StrBean> flattenedData;
  16. private List<StrBean> rootData;
  17. @Override
  18. public void setUp() {
  19. List<StrBean> randomBeans = StrBean.generateRandomBeans(20);
  20. flattenedData = new ArrayList<>();
  21. rootData = new ArrayList<>();
  22. data = new TreeData<>();
  23. data.addItems(null, randomBeans.subList(0, 5));
  24. data.addItems(randomBeans.get(0), randomBeans.subList(5, 10));
  25. data.addItems(randomBeans.get(5), randomBeans.subList(10, 15));
  26. data.addItems(null, randomBeans.subList(15, 20));
  27. flattenedData.add(randomBeans.get(0));
  28. flattenedData.add(randomBeans.get(5));
  29. flattenedData.addAll(randomBeans.subList(10, 15));
  30. flattenedData.addAll(randomBeans.subList(6, 10));
  31. flattenedData.addAll(randomBeans.subList(1, 5));
  32. flattenedData.addAll(randomBeans.subList(15, 20));
  33. rootData.addAll(randomBeans.subList(0, 5));
  34. rootData.addAll(randomBeans.subList(15, 20));
  35. super.setUp();
  36. }
  37. @Test(expected = IllegalArgumentException.class)
  38. public void treeData_add_item_parent_not_in_hierarchy_throws() {
  39. new TreeData<>().addItem(new StrBean("", 0, 0), new StrBean("", 0, 0));
  40. }
  41. @Test(expected = NullPointerException.class)
  42. public void treeData_add_null_item_throws() {
  43. new TreeData<>().addItem(null, null);
  44. }
  45. @Test(expected = IllegalArgumentException.class)
  46. public void treeData_add_item_already_in_hierarchy_throws() {
  47. StrBean bean = new StrBean("", 0, 0);
  48. new TreeData<>().addItem(null, bean).addItem(null, bean);
  49. }
  50. @Test
  51. public void treeData_remove_root_item() {
  52. data.removeItem(null);
  53. Assert.assertTrue(data.getChildren(null).isEmpty());
  54. }
  55. @Test
  56. public void treeData_clear() {
  57. data.clear();
  58. Assert.assertTrue(data.getChildren(null).isEmpty());
  59. }
  60. @Test
  61. public void treeData_re_add_removed_item() {
  62. StrBean item = rootData.get(0);
  63. data.removeItem(item).addItem(null, item);
  64. Assert.assertTrue(data.getChildren(null).contains(item));
  65. }
  66. @Test
  67. public void treeData_set_parent() {
  68. StrBean item1 = rootData.get(0);
  69. StrBean item2 = rootData.get(1);
  70. Assert.assertEquals(0, data.getChildren(item2).size());
  71. Assert.assertEquals(10, data.getRootItems().size());
  72. // Move item1 as item2's child
  73. data.setParent(item1, item2);
  74. Assert.assertEquals(1, data.getChildren(item2).size());
  75. Assert.assertEquals(9, data.getRootItems().size());
  76. Assert.assertEquals(item1, data.getChildren(item2).get(0));
  77. // Move back to root
  78. data.setParent(item1, null);
  79. Assert.assertEquals(0, data.getChildren(item2).size());
  80. Assert.assertEquals(10, data.getRootItems().size());
  81. }
  82. @Test
  83. public void treeData_move_after_sibling() {
  84. StrBean root0 = rootData.get(0);
  85. StrBean root9 = rootData.get(9);
  86. Assert.assertEquals(root0, data.getRootItems().get(0));
  87. Assert.assertEquals(root9, data.getRootItems().get(9));
  88. // Move to last position
  89. data.moveAfterSibling(root0, root9);
  90. Assert.assertEquals(root0, data.getRootItems().get(9));
  91. Assert.assertEquals(root9, data.getRootItems().get(8));
  92. // Move back to first position
  93. data.moveAfterSibling(root0, null);
  94. Assert.assertEquals(root0, data.getRootItems().get(0));
  95. Assert.assertEquals(root9, data.getRootItems().get(9));
  96. }
  97. @Test(expected = IllegalArgumentException.class)
  98. public void treeData_move_after_sibling_different_parents() {
  99. StrBean root0 = rootData.get(0);
  100. StrBean wrongSibling = data.getChildren(root0).get(0);
  101. data.moveAfterSibling(root0, wrongSibling);
  102. }
  103. @Test
  104. public void treeData_root_items() {
  105. TreeData<String> data = new TreeData<>();
  106. TreeData<String> dataVarargs = new TreeData<>();
  107. TreeData<String> dataCollection = new TreeData<>();
  108. TreeData<String> dataStream = new TreeData<>();
  109. data.addItems(null, "a", "b", "c");
  110. dataVarargs.addRootItems("a", "b", "c");
  111. dataCollection.addRootItems(Arrays.asList("a", "b", "c"));
  112. dataStream.addRootItems(Arrays.asList("a", "b", "c").stream());
  113. Assert.assertEquals(data.getRootItems(), dataVarargs.getRootItems());
  114. Assert.assertEquals(data.getRootItems(), dataCollection.getRootItems());
  115. Assert.assertEquals(data.getRootItems(), dataStream.getRootItems());
  116. }
  117. @Test
  118. public void populate_treeData_with_child_item_provider() {
  119. TreeData<String> stringData = new TreeData<>();
  120. List<String> rootItems = Arrays.asList("a", "b", "c");
  121. stringData.addItems(rootItems, item -> {
  122. if (item.length() >= 3 || item.startsWith("c")) {
  123. return Arrays.asList();
  124. }
  125. return Arrays.asList(item + "/a", item + "/b", item + "/c");
  126. });
  127. Assert.assertEquals(stringData.getChildren("a"),
  128. Arrays.asList("a/a", "a/b", "a/c"));
  129. Assert.assertEquals(stringData.getChildren("b"),
  130. Arrays.asList("b/a", "b/b", "b/c"));
  131. Assert.assertEquals(stringData.getChildren("c"), Arrays.asList());
  132. Assert.assertEquals(stringData.getChildren("a/b"), Arrays.asList());
  133. }
  134. @Test
  135. public void populate_treeData_with_stream_child_item_provider() {
  136. TreeData<String> stringData = new TreeData<>();
  137. Stream<String> rootItems = Stream.of("a", "b", "c");
  138. stringData.addItems(rootItems, item -> {
  139. if (item.length() >= 3 || item.startsWith("c")) {
  140. return Stream.empty();
  141. }
  142. return Stream.of(item + "/a", item + "/b", item + "/c");
  143. });
  144. Assert.assertEquals(stringData.getChildren("a"),
  145. Arrays.asList("a/a", "a/b", "a/c"));
  146. Assert.assertEquals(stringData.getChildren("b"),
  147. Arrays.asList("b/a", "b/b", "b/c"));
  148. Assert.assertEquals(stringData.getChildren("c"), Arrays.asList());
  149. Assert.assertEquals(stringData.getChildren("a/b"), Arrays.asList());
  150. }
  151. @Test
  152. public void setFilter() {
  153. getDataProvider().setFilter(item -> item.getValue().equals("Xyz")
  154. || item.getValue().equals("Baz"));
  155. Assert.assertEquals(10, sizeWithUnfilteredQuery());
  156. getDataProvider().setFilter(item -> !item.getValue().equals("Foo")
  157. && !item.getValue().equals("Xyz"));
  158. Assert.assertEquals(
  159. "Previous filter should be replaced when setting a new one", 6,
  160. sizeWithUnfilteredQuery());
  161. getDataProvider().setFilter(null);
  162. Assert.assertEquals("Setting filter to null should remove all filters",
  163. 20, sizeWithUnfilteredQuery());
  164. }
  165. @Test
  166. public void addFilter() {
  167. getDataProvider().addFilter(item -> item.getId() <= 10);
  168. getDataProvider().addFilter(item -> item.getId() >= 5);
  169. Assert.assertEquals(5, sizeWithUnfilteredQuery());
  170. }
  171. @Override
  172. public void filteringListDataProvider_convertFilter() {
  173. DataProvider<StrBean, String> strFilterDataProvider = getDataProvider()
  174. .withConvertedFilter(
  175. text -> strBean -> strBean.getValue().contains(text));
  176. Assert.assertEquals("Only one item should match 'Xyz'", 1,
  177. strFilterDataProvider
  178. .size(new HierarchicalQuery<>("Xyz", null)));
  179. Assert.assertEquals("No item should match 'Zyx'", 0,
  180. strFilterDataProvider
  181. .size(new HierarchicalQuery<>("Zyx", null)));
  182. Assert.assertEquals("Unexpected number of matches for 'Foo'", 3,
  183. strFilterDataProvider
  184. .size(new HierarchicalQuery<>("Foo", null)));
  185. Assert.assertEquals("No items should've been filtered out",
  186. rootData.size(), strFilterDataProvider
  187. .size(new HierarchicalQuery<>(null, null)));
  188. }
  189. @Override
  190. public void filteringListDataProvider_defaultFilterType() {
  191. Assert.assertEquals("Only one item should match 'Xyz'", 1,
  192. getDataProvider().size(new HierarchicalQuery<>(
  193. strBean -> strBean.getValue().contains("Xyz"), null)));
  194. Assert.assertEquals("No item should match 'Zyx'", 0,
  195. dataProvider.size(new HierarchicalQuery<>(
  196. strBean -> strBean.getValue().contains("Zyx"), null)));
  197. Assert.assertEquals("Unexpected number of matches for 'Foo'", 3,
  198. getDataProvider()
  199. .size(new HierarchicalQuery<>(fooFilter, null)));
  200. }
  201. @Override
  202. public void testDefaultSortWithSpecifiedPostSort() {
  203. Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
  204. .thenComparing(Comparator.comparing(StrBean::getId).reversed());
  205. setSortOrder(QuerySortOrder.asc("value").thenDesc("id").build(), comp);
  206. List<StrBean> list = getDataProvider()
  207. .fetch(createQuery(QuerySortOrder.asc("randomNumber").build(),
  208. Comparator.comparing(StrBean::getRandomNumber), null,
  209. null))
  210. .collect(Collectors.toList());
  211. Assert.assertEquals("Sorted data and original data sizes don't match",
  212. getDataProvider().fetch(new HierarchicalQuery<>(null, null))
  213. .count(),
  214. list.size());
  215. for (int i = 1; i < list.size(); ++i) {
  216. StrBean prev = list.get(i - 1);
  217. StrBean cur = list.get(i);
  218. // Test specific sort
  219. Assert.assertTrue(
  220. "Failure: " + prev.getRandomNumber() + " > "
  221. + cur.getRandomNumber(),
  222. prev.getRandomNumber() <= cur.getRandomNumber());
  223. if (prev.getRandomNumber() == cur.getRandomNumber()) {
  224. // Test default sort
  225. Assert.assertTrue(
  226. prev.getValue().compareTo(cur.getValue()) <= 0);
  227. if (prev.getValue().equals(cur.getValue())) {
  228. Assert.assertTrue(prev.getId() > cur.getId());
  229. }
  230. }
  231. }
  232. }
  233. @Override
  234. public void testDefaultSortWithFunction() {
  235. setSortOrder(QuerySortOrder.asc("value").build(),
  236. Comparator.comparing(StrBean::getValue));
  237. List<StrBean> list = getDataProvider()
  238. .fetch(new HierarchicalQuery<>(null, null))
  239. .collect(Collectors.toList());
  240. Assert.assertEquals("Sorted data and original data sizes don't match",
  241. rootData.size(), list.size());
  242. for (int i = 1; i < list.size(); ++i) {
  243. StrBean prev = list.get(i - 1);
  244. StrBean cur = list.get(i);
  245. // Test default sort
  246. Assert.assertTrue(prev.getValue().compareTo(cur.getValue()) <= 0);
  247. }
  248. }
  249. @Override
  250. public void testListContainsAllData() {
  251. assertHierarchyCorrect();
  252. }
  253. @Override
  254. public void testSortByComparatorListsDiffer() {
  255. Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
  256. .thenComparing(StrBean::getRandomNumber)
  257. .thenComparing(StrBean::getId);
  258. List<StrBean> list = getDataProvider().fetch(
  259. createQuery(QuerySortOrder.asc("value").thenAsc("randomNumber")
  260. .thenAsc("id").build(), comp, null, null))
  261. .collect(Collectors.toList());
  262. Assert.assertNotEquals("First value should not match", rootData.get(0),
  263. list.get(0));
  264. Assert.assertEquals("Sorted data and original data sizes don't match",
  265. rootData.size(), list.size());
  266. rootData.sort(comp);
  267. for (int i = 0; i < rootData.size(); ++i) {
  268. Assert.assertEquals("Sorting result differed", rootData.get(i),
  269. list.get(i));
  270. }
  271. }
  272. @Override
  273. protected TreeDataProvider<StrBean> createDataProvider() {
  274. return new TreeDataProvider<>(data);
  275. }
  276. @Override
  277. protected void setSortOrder(List<QuerySortOrder> sortOrder,
  278. Comparator<StrBean> comp) {
  279. getDataProvider().setSortComparator(comp::compare);
  280. }
  281. @Override
  282. protected long sizeWithUnfilteredQuery() {
  283. return getFlattenedDataFromProvider(new ArrayList<>(), null).size();
  284. }
  285. private void assertHierarchyCorrect() {
  286. Assert.assertEquals(flattenedData,
  287. getFlattenedData(new ArrayList<>(), null));
  288. Assert.assertEquals(flattenedData,
  289. getFlattenedDataFromProvider(new ArrayList<>(), null));
  290. }
  291. private List<StrBean> getFlattenedData(List<StrBean> flattened,
  292. StrBean item) {
  293. if (item != null) {
  294. flattened.add(item);
  295. }
  296. data.getChildren(item)
  297. .forEach(child -> getFlattenedData(flattened, child));
  298. return flattened;
  299. }
  300. private List<StrBean> getFlattenedDataFromProvider(List<StrBean> flattened,
  301. StrBean item) {
  302. if (item != null) {
  303. flattened.add(item);
  304. }
  305. getDataProvider().fetchChildren(new HierarchicalQuery<>(null, item))
  306. .forEach(child -> getFlattenedDataFromProvider(flattened,
  307. child));
  308. return flattened;
  309. }
  310. private HierarchicalQuery<StrBean, SerializablePredicate<StrBean>> createQuery(
  311. List<QuerySortOrder> sortOrder, Comparator<StrBean> comp,
  312. SerializablePredicate<StrBean> filter, StrBean parent) {
  313. return new HierarchicalQuery<>(0, Integer.MAX_VALUE, sortOrder, comp,
  314. filter, parent);
  315. }
  316. }