123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- package com.vaadin.data.provider;
-
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Comparator;
- import java.util.List;
- import java.util.stream.Collectors;
- import java.util.stream.Stream;
-
- import org.junit.Assert;
- import org.junit.Test;
-
- import com.vaadin.data.TreeData;
- import com.vaadin.server.SerializablePredicate;
-
- public class TreeDataProviderTest
- extends DataProviderTestBase<TreeDataProvider<StrBean>> {
-
- private TreeData<StrBean> data;
- private List<StrBean> flattenedData;
- private List<StrBean> rootData;
-
- @Override
- public void setUp() {
- List<StrBean> randomBeans = StrBean.generateRandomBeans(20);
- flattenedData = new ArrayList<>();
- rootData = new ArrayList<>();
-
- data = new TreeData<>();
- data.addItems(null, randomBeans.subList(0, 5));
- data.addItems(randomBeans.get(0), randomBeans.subList(5, 10));
- data.addItems(randomBeans.get(5), randomBeans.subList(10, 15));
- data.addItems(null, randomBeans.subList(15, 20));
-
- flattenedData.add(randomBeans.get(0));
- flattenedData.add(randomBeans.get(5));
- flattenedData.addAll(randomBeans.subList(10, 15));
- flattenedData.addAll(randomBeans.subList(6, 10));
- flattenedData.addAll(randomBeans.subList(1, 5));
- flattenedData.addAll(randomBeans.subList(15, 20));
-
- rootData.addAll(randomBeans.subList(0, 5));
- rootData.addAll(randomBeans.subList(15, 20));
-
- super.setUp();
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void treeData_add_item_parent_not_in_hierarchy_throws() {
- new TreeData<>().addItem(new StrBean("", 0, 0), new StrBean("", 0, 0));
- }
-
- @Test(expected = NullPointerException.class)
- public void treeData_add_null_item_throws() {
- new TreeData<>().addItem(null, null);
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void treeData_add_item_already_in_hierarchy_throws() {
- StrBean bean = new StrBean("", 0, 0);
- new TreeData<>().addItem(null, bean).addItem(null, bean);
- }
-
- @Test
- public void treeData_remove_root_item() {
- data.removeItem(null);
- Assert.assertTrue(data.getChildren(null).isEmpty());
- }
-
- @Test
- public void treeData_clear() {
- data.clear();
- Assert.assertTrue(data.getChildren(null).isEmpty());
- }
-
- @Test
- public void treeData_re_add_removed_item() {
- StrBean item = rootData.get(0);
- data.removeItem(item).addItem(null, item);
- Assert.assertTrue(data.getChildren(null).contains(item));
- }
-
- @Test
- public void treeData_set_parent() {
- StrBean item1 = rootData.get(0);
- StrBean item2 = rootData.get(1);
- Assert.assertEquals(0, data.getChildren(item2).size());
- Assert.assertEquals(10, data.getRootItems().size());
-
- // Move item1 as item2's child
- data.setParent(item1, item2);
- Assert.assertEquals(1, data.getChildren(item2).size());
- Assert.assertEquals(9, data.getRootItems().size());
- Assert.assertEquals(item1, data.getChildren(item2).get(0));
-
- // Move back to root
- data.setParent(item1, null);
- Assert.assertEquals(0, data.getChildren(item2).size());
- Assert.assertEquals(10, data.getRootItems().size());
- }
-
- @Test
- public void treeData_move_after_sibling() {
- StrBean root0 = rootData.get(0);
- StrBean root9 = rootData.get(9);
- Assert.assertEquals(root0, data.getRootItems().get(0));
- Assert.assertEquals(root9, data.getRootItems().get(9));
-
- // Move to last position
- data.moveAfterSibling(root0, root9);
- Assert.assertEquals(root0, data.getRootItems().get(9));
- Assert.assertEquals(root9, data.getRootItems().get(8));
-
- // Move back to first position
- data.moveAfterSibling(root0, null);
- Assert.assertEquals(root0, data.getRootItems().get(0));
- Assert.assertEquals(root9, data.getRootItems().get(9));
- }
-
- @Test(expected = IllegalArgumentException.class)
- public void treeData_move_after_sibling_different_parents() {
- StrBean root0 = rootData.get(0);
- StrBean wrongSibling = data.getChildren(root0).get(0);
-
- data.moveAfterSibling(root0, wrongSibling);
- }
-
- @Test
- public void treeData_root_items() {
- TreeData<String> data = new TreeData<>();
- TreeData<String> dataVarargs = new TreeData<>();
- TreeData<String> dataCollection = new TreeData<>();
- TreeData<String> dataStream = new TreeData<>();
-
- data.addItems(null, "a", "b", "c");
- dataVarargs.addRootItems("a", "b", "c");
- dataCollection.addRootItems(Arrays.asList("a", "b", "c"));
- dataStream.addRootItems(Arrays.asList("a", "b", "c").stream());
-
- Assert.assertEquals(data.getRootItems(), dataVarargs.getRootItems());
- Assert.assertEquals(data.getRootItems(), dataCollection.getRootItems());
- Assert.assertEquals(data.getRootItems(), dataStream.getRootItems());
- }
-
- @Test
- public void populate_treeData_with_child_item_provider() {
- TreeData<String> stringData = new TreeData<>();
- List<String> rootItems = Arrays.asList("a", "b", "c");
- stringData.addItems(rootItems, item -> {
- if (item.length() >= 3 || item.startsWith("c")) {
- return Arrays.asList();
- }
- return Arrays.asList(item + "/a", item + "/b", item + "/c");
- });
- Assert.assertEquals(stringData.getChildren("a"),
- Arrays.asList("a/a", "a/b", "a/c"));
- Assert.assertEquals(stringData.getChildren("b"),
- Arrays.asList("b/a", "b/b", "b/c"));
- Assert.assertEquals(stringData.getChildren("c"), Arrays.asList());
- Assert.assertEquals(stringData.getChildren("a/b"), Arrays.asList());
- }
-
- @Test
- public void populate_treeData_with_stream_child_item_provider() {
- TreeData<String> stringData = new TreeData<>();
- Stream<String> rootItems = Stream.of("a", "b", "c");
- stringData.addItems(rootItems, item -> {
- if (item.length() >= 3 || item.startsWith("c")) {
- return Stream.empty();
- }
- return Stream.of(item + "/a", item + "/b", item + "/c");
- });
- Assert.assertEquals(stringData.getChildren("a"),
- Arrays.asList("a/a", "a/b", "a/c"));
- Assert.assertEquals(stringData.getChildren("b"),
- Arrays.asList("b/a", "b/b", "b/c"));
- Assert.assertEquals(stringData.getChildren("c"), Arrays.asList());
- Assert.assertEquals(stringData.getChildren("a/b"), Arrays.asList());
- }
-
- @Test
- public void setFilter() {
- getDataProvider().setFilter(item -> item.getValue().equals("Xyz")
- || item.getValue().equals("Baz"));
-
- Assert.assertEquals(10, sizeWithUnfilteredQuery());
-
- getDataProvider().setFilter(item -> !item.getValue().equals("Foo")
- && !item.getValue().equals("Xyz"));
-
- Assert.assertEquals(
- "Previous filter should be replaced when setting a new one", 6,
- sizeWithUnfilteredQuery());
-
- getDataProvider().setFilter(null);
-
- Assert.assertEquals("Setting filter to null should remove all filters",
- 20, sizeWithUnfilteredQuery());
- }
-
- @Test
- public void addFilter() {
- getDataProvider().addFilter(item -> item.getId() <= 10);
- getDataProvider().addFilter(item -> item.getId() >= 5);
- Assert.assertEquals(5, sizeWithUnfilteredQuery());
- }
-
- @Override
- public void filteringListDataProvider_convertFilter() {
- DataProvider<StrBean, String> strFilterDataProvider = getDataProvider()
- .withConvertedFilter(
- text -> strBean -> strBean.getValue().contains(text));
- Assert.assertEquals("Only one item should match 'Xyz'", 1,
- strFilterDataProvider
- .size(new HierarchicalQuery<>("Xyz", null)));
- Assert.assertEquals("No item should match 'Zyx'", 0,
- strFilterDataProvider
- .size(new HierarchicalQuery<>("Zyx", null)));
- Assert.assertEquals("Unexpected number of matches for 'Foo'", 3,
- strFilterDataProvider
- .size(new HierarchicalQuery<>("Foo", null)));
- Assert.assertEquals("No items should've been filtered out",
- rootData.size(), strFilterDataProvider
- .size(new HierarchicalQuery<>(null, null)));
- }
-
- @Override
- public void filteringListDataProvider_defaultFilterType() {
- Assert.assertEquals("Only one item should match 'Xyz'", 1,
- getDataProvider().size(new HierarchicalQuery<>(
- strBean -> strBean.getValue().contains("Xyz"), null)));
- Assert.assertEquals("No item should match 'Zyx'", 0,
- dataProvider.size(new HierarchicalQuery<>(
- strBean -> strBean.getValue().contains("Zyx"), null)));
- Assert.assertEquals("Unexpected number of matches for 'Foo'", 3,
- getDataProvider()
- .size(new HierarchicalQuery<>(fooFilter, null)));
- }
-
- @Override
- public void testDefaultSortWithSpecifiedPostSort() {
- Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
- .thenComparing(Comparator.comparing(StrBean::getId).reversed());
- setSortOrder(QuerySortOrder.asc("value").thenDesc("id").build(), comp);
-
- List<StrBean> list = getDataProvider()
- .fetch(createQuery(QuerySortOrder.asc("randomNumber").build(),
- Comparator.comparing(StrBean::getRandomNumber), null,
- null))
- .collect(Collectors.toList());
-
- Assert.assertEquals("Sorted data and original data sizes don't match",
- getDataProvider().fetch(new HierarchicalQuery<>(null, null))
- .count(),
- list.size());
-
- for (int i = 1; i < list.size(); ++i) {
- StrBean prev = list.get(i - 1);
- StrBean cur = list.get(i);
- // Test specific sort
- Assert.assertTrue(
- "Failure: " + prev.getRandomNumber() + " > "
- + cur.getRandomNumber(),
- prev.getRandomNumber() <= cur.getRandomNumber());
-
- if (prev.getRandomNumber() == cur.getRandomNumber()) {
- // Test default sort
- Assert.assertTrue(
- prev.getValue().compareTo(cur.getValue()) <= 0);
- if (prev.getValue().equals(cur.getValue())) {
- Assert.assertTrue(prev.getId() > cur.getId());
- }
- }
- }
- }
-
- @Override
- public void testDefaultSortWithFunction() {
- setSortOrder(QuerySortOrder.asc("value").build(),
- Comparator.comparing(StrBean::getValue));
-
- List<StrBean> list = getDataProvider()
- .fetch(new HierarchicalQuery<>(null, null))
- .collect(Collectors.toList());
-
- Assert.assertEquals("Sorted data and original data sizes don't match",
- rootData.size(), list.size());
-
- for (int i = 1; i < list.size(); ++i) {
- StrBean prev = list.get(i - 1);
- StrBean cur = list.get(i);
-
- // Test default sort
- Assert.assertTrue(prev.getValue().compareTo(cur.getValue()) <= 0);
- }
- }
-
- @Override
- public void testListContainsAllData() {
- assertHierarchyCorrect();
- }
-
- @Override
- public void testSortByComparatorListsDiffer() {
- Comparator<StrBean> comp = Comparator.comparing(StrBean::getValue)
- .thenComparing(StrBean::getRandomNumber)
- .thenComparing(StrBean::getId);
-
- List<StrBean> list = getDataProvider().fetch(
- createQuery(QuerySortOrder.asc("value").thenAsc("randomNumber")
- .thenAsc("id").build(), comp, null, null))
- .collect(Collectors.toList());
-
- Assert.assertNotEquals("First value should not match", rootData.get(0),
- list.get(0));
-
- Assert.assertEquals("Sorted data and original data sizes don't match",
- rootData.size(), list.size());
-
- rootData.sort(comp);
- for (int i = 0; i < rootData.size(); ++i) {
- Assert.assertEquals("Sorting result differed", rootData.get(i),
- list.get(i));
- }
- }
-
- @Override
- protected TreeDataProvider<StrBean> createDataProvider() {
- return new TreeDataProvider<>(data);
- }
-
- @Override
- protected void setSortOrder(List<QuerySortOrder> sortOrder,
- Comparator<StrBean> comp) {
- getDataProvider().setSortComparator(comp::compare);
- }
-
- @Override
- protected long sizeWithUnfilteredQuery() {
- return getFlattenedDataFromProvider(new ArrayList<>(), null).size();
- }
-
- private void assertHierarchyCorrect() {
- Assert.assertEquals(flattenedData,
- getFlattenedData(new ArrayList<>(), null));
- Assert.assertEquals(flattenedData,
- getFlattenedDataFromProvider(new ArrayList<>(), null));
- }
-
- private List<StrBean> getFlattenedData(List<StrBean> flattened,
- StrBean item) {
- if (item != null) {
- flattened.add(item);
- }
- data.getChildren(item)
- .forEach(child -> getFlattenedData(flattened, child));
- return flattened;
- }
-
- private List<StrBean> getFlattenedDataFromProvider(List<StrBean> flattened,
- StrBean item) {
- if (item != null) {
- flattened.add(item);
- }
- getDataProvider().fetchChildren(new HierarchicalQuery<>(null, item))
- .forEach(child -> getFlattenedDataFromProvider(flattened,
- child));
- return flattened;
- }
-
- private HierarchicalQuery<StrBean, SerializablePredicate<StrBean>> createQuery(
- List<QuerySortOrder> sortOrder, Comparator<StrBean> comp,
- SerializablePredicate<StrBean> filter, StrBean parent) {
- return new HierarchicalQuery<>(0, Integer.MAX_VALUE, sortOrder, comp,
- filter, parent);
- }
- }
|