package com.vaadin.data.provider; import java.util.Comparator; import java.util.List; import java.util.Locale; import java.util.stream.Collectors; import org.junit.Assert; import org.junit.Test; import com.vaadin.server.SerializableComparator; import com.vaadin.shared.data.sort.SortDirection; public class ListDataProviderTest extends DataProviderTestBase<ListDataProvider<StrBean>> { @Override protected ListDataProvider<StrBean> createDataProvider() { return DataProvider.ofCollection(data); } @Test public void setSortByProperty_ascending() { ListDataProvider<StrBean> dataProvider = getDataProvider(); dataProvider.setSortOrder(StrBean::getId, SortDirection.ASCENDING); int[] threeFirstIds = dataProvider.fetch(new Query<>()) .mapToInt(StrBean::getId).limit(3).toArray(); Assert.assertArrayEquals(new int[] { 0, 1, 2 }, threeFirstIds); } @Test public void setSortByProperty_descending() { ListDataProvider<StrBean> dataProvider = getDataProvider(); dataProvider.setSortOrder(StrBean::getId, SortDirection.DESCENDING); int[] threeFirstIds = dataProvider.fetch(new Query<>()) .mapToInt(StrBean::getId).limit(3).toArray(); Assert.assertArrayEquals(new int[] { 98, 97, 96 }, threeFirstIds); } @Test public void testMultipleSortOrder_firstAddedWins() { ListDataProvider<StrBean> dataProvider = getDataProvider(); dataProvider.addSortOrder(StrBean::getValue, SortDirection.DESCENDING); dataProvider.addSortOrder(StrBean::getId, SortDirection.DESCENDING); List<StrBean> threeFirstItems = dataProvider.fetch(new Query<>()) .limit(3).collect(Collectors.toList()); // First one is Xyz Assert.assertEquals(new StrBean("Xyz", 10, 100), threeFirstItems.get(0)); // The following are Foos ordered by id Assert.assertEquals(new StrBean("Foo", 93, 2), threeFirstItems.get(1)); Assert.assertEquals(new StrBean("Foo", 91, 2), threeFirstItems.get(2)); } @Test public void setFilter() { dataProvider.setFilter(item -> item.getValue().equals("Foo")); Assert.assertEquals(36, sizeWithUnfilteredQuery()); dataProvider.setFilter(item -> !item.getValue().equals("Foo")); Assert.assertEquals( "Previous filter should be reset when setting a new one", 64, sizeWithUnfilteredQuery()); dataProvider.setFilter(null); Assert.assertEquals("Setting filter to null should remove all filters", 100, sizeWithUnfilteredQuery()); } @Test public void setFilter_valueProvider() { dataProvider.setFilter(StrBean::getValue, "Foo"::equals); Assert.assertEquals(36, sizeWithUnfilteredQuery()); dataProvider.setFilter(StrBean::getValue, value -> !value.equals("Foo")); Assert.assertEquals( "Previous filter should be reset when setting a new one", 64, sizeWithUnfilteredQuery()); } @Test public void setFilterEquals() { dataProvider.setFilterByValue(StrBean::getValue, "Foo"); Assert.assertEquals(36, sizeWithUnfilteredQuery()); dataProvider.setFilterByValue(StrBean::getValue, "Bar"); Assert.assertEquals(23, sizeWithUnfilteredQuery()); } @Test public void addFilter_withPreviousFilter() { dataProvider.setFilterByValue(StrBean::getValue, "Foo"); dataProvider.addFilter(item -> item.getId() > 50); Assert.assertEquals("Both filters should be used", 17, sizeWithUnfilteredQuery()); } @Test public void addFilter_noPreviousFilter() { dataProvider.addFilter(item -> item.getId() > 50); Assert.assertEquals(48, sizeWithUnfilteredQuery()); } @Test public void addFilter_valueProvider() { dataProvider.setFilter(item -> item.getId() > 50); dataProvider.addFilter(StrBean::getValue, "Foo"::equals); Assert.assertEquals("Both filters should be used", 17, sizeWithUnfilteredQuery()); } @Test public void addFilterEquals() { dataProvider.setFilter(item -> item.getId() > 50); dataProvider.addFilterByValue(StrBean::getValue, "Foo"); Assert.assertEquals("Both filters should be used", 17, sizeWithUnfilteredQuery()); } @Test public void addFilter_firstAddedUsedFirst() { dataProvider.addFilter(item -> false); dataProvider.addFilter(item -> { Assert.fail("This filter should never be invoked"); return true; }); Assert.assertEquals(0, sizeWithUnfilteredQuery()); } @Test public void combineProviderAndQueryFilters() { dataProvider.addFilterByValue(StrBean::getValue, "Foo"); int size = dataProvider.size(new Query<>(item -> item.getId() > 50)); Assert.assertEquals("Both filters should be used", 17, size); } @Test public void providerFilterBeforeQueryFilter() { dataProvider.setFilter(item -> false); int size = dataProvider.size(new Query<>(item -> { Assert.fail("This filter should never be invoked"); return true; })); Assert.assertEquals(0, size); } @Test public void filteringBy_itemPredicate() { DataProvider<StrBean, String> filteringBy = dataProvider.filteringBy( (item, filterValue) -> item.getValue().equals(filterValue)); assertSizeWithFilter(36, filteringBy, "Foo"); } @Test public void filteringBy_equals() { DataProvider<StrBean, String> filteringBy = dataProvider .filteringByEquals(StrBean::getValue); assertSizeWithFilter(36, filteringBy, "Foo"); } @Test public void filteringBy_propertyValuePredicate() { DataProvider<StrBean, Integer> filteringBy = dataProvider.filteringBy( StrBean::getId, (propertyValue, filterValue) -> propertyValue >= filterValue); assertSizeWithFilter(90, filteringBy, 10); } @Test public void filteringBy_caseInsensitiveSubstring() { DataProvider<StrBean, String> filteringBy = dataProvider .filteringBySubstring(StrBean::getValue, Locale.ENGLISH); assertSizeWithFilter(36, filteringBy, "oo"); assertSizeWithFilter(36, filteringBy, "Oo"); } @Test public void filterBy_caseInsensitivePrefix() { DataProvider<StrBean, String> filteringBy = dataProvider .filteringByPrefix(StrBean::getValue, Locale.ENGLISH); assertSizeWithFilter(36, filteringBy, "Fo"); assertSizeWithFilter(36, filteringBy, "fo"); assertSizeWithFilter(0, filteringBy, "oo"); } @Override protected void setSortOrder(List<QuerySortOrder> sortOrder, Comparator<StrBean> comp) { SerializableComparator<StrBean> serializableComp = comp::compare; getDataProvider().setSortComparator(serializableComp); } }